Advertisement
Guest User

Untitled

a guest
Feb 12th, 2011
299
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 16.38 KB | None | 0 0
  1. # -*- coding: cp1252 -*-
  2. import os, sys, struct
  3.  
  4. # NOTA > # NO SCRIPT = * NO JOGO
  5. #-------------------------------
  6.  
  7. table = {
  8.                  '\x01\xFF': '*\n', '\x2D\xFF': '<begin>', '\x02\xFF': '<press>\n',
  9.                  '\x21\xFF': '<show>', '\xFF\xFF': '<end>\n', '\x03\xFF': '<center>', '\x16\xFF': '<space>\n',
  10.                  '\x23\xFF': '<wait>', '\x0F\xFF': '<blink>',
  11.  
  12.                  '\x16\x01': '<BACK>', '\x17\x01': '<TRICK>', '\x18\x01': '<GHOST>',
  13.                  '\x19\x01': '<TIME>', '\x14\x01': '<DPAD>', '\x1A\x01': '<MENU>',
  14.                  
  15.                  '\x0A\x00': 'A', '\x0B\x00': 'B', '\x0C\x00': 'C', '\x0D\x00': 'D',
  16.                  '\x0E\x00': 'E', '\x0F\x00': 'F', '\x10\x00': 'G', '\x11\x00': 'H', '\x12\x00': 'I', '\x13\x00': 'J',
  17.                  '\x14\x00': 'K', '\x15\x00': 'L', '\x16\x00': 'M', '\x17\x00': 'N', '\x18\x00': 'O', '\x19\x00': 'P',
  18.                  '\x1A\x00': 'Q', '\x1B\x00': 'R', '\x1C\x00': 'S', '\x1D\x00': 'T', '\x1E\x00': 'U', '\x1F\x00': 'V',
  19.                  '\x20\x00': 'W', '\x21\x00': 'X', '\x22\x00': 'Y', '\x23\x00': 'Z',
  20.                  
  21.                  '\x24\x00': 'a', '\x25\x00': 'b', '\x26\x00': 'c', '\x27\x00': 'd', '\x28\x00': 'e',
  22.                  '\x29\x00': 'f', '\x2A\x00': 'g', '\x2B\x00': 'h', '\x2C\x00': 'i', '\x2D\x00': 'j', '\x2E\x00': 'k',
  23.                  '\x2F\x00': 'l', '\x30\x00': 'm', '\x31\x00': 'n', '\x32\x00': 'o', '\x33\x00': 'p', '\x34\x00': 'q',
  24.                  '\x35\x00': 'r', '\x36\x00': 's', '\x37\x00': 't', '\x38\x00': 'u', '\x39\x00': 'v', '\x3A\x00': 'w',
  25.                  '\x3b\x00': 'x', '\x3c\x00': 'y', '\x3d\x00': 'z',
  26.                  '\x5E\x00': 'ç', '\x67\x00': 'ñ',
  27.  
  28.                  '\x5A\x00': 'á', '\x5B\x00': 'â', '\x5C\x00': 'ã', '\x5E\x00': 'ç',
  29.                  '\x60\x00': 'é', '\x61\x00': 'ê', '\x64\x00': 'í', '\x67\x00': 'ñ',
  30.                  '\x69\x00': 'ó', '\x6A\x00': 'ô', '\x6B\x00': 'õ', '\x6F\x00': 'ú',
  31.                  
  32.                  '\xEF\x00': ',', '\xE5\x00': '(', '\xE6\x00': ')', '\xF4\x00': '-',
  33.                  '\x3E\x00': '!', '\x3F\x00': '?', '\xEA\x00': '"', '\xE1\x00': '.',
  34.                  '\xFF\x00': ' ', '\xF3\x00': "'", '\xF2\x00': '#',
  35.                  
  36.                  '\x00\x00': '0', '\x01\x00': '1', '\x02\x00': '2', '\x03\x00': '3', '\x04\x00': '4',
  37.                  '\x05\x00': '5', '\x06\x00': '6', '\x07\x00': '7', '\x08\x00': '8', '\x09\x00': '9',
  38.                  
  39. }
  40.  
  41. table2 = {
  42.                   '*': '\x01\xFF', 'press': '\x02\xFF', 'show': '\x21\xFF', 'end': '\xFF\xFF',
  43.                   'center': '\x03\xFF', 'space': '\x16\xFF', 'wait': '\x23\xFF', 'blink': '\x0F\xFF',
  44.  
  45.                   'black': '\x05\xFF\x0F\x00', 'blue': '\x05\xFF\x09\x00',
  46.                   'red': '\x05\xFF\x06\x00',
  47.  
  48.                   'BACK': '\x16\x01', 'TRICK': '\x17\x01', 'GHOST': '\x18\x01', 'TIME': '\x19\x01',
  49.                   'DPAD': '\x14\x01', 'MENU': '\x1A\x01',
  50.  
  51.                   'A': '\x0A\x00', 'B': '\x0B\x00', 'C': '\x0C\x00', 'D': '\x0D\x00',
  52.                   'E': '\x0E\x00', 'F': '\x0F\x00', 'G': '\x10\x00', 'H': '\x11\x00',
  53.                   'I': '\x12\x00', 'J': '\x13\x00', 'K': '\x14\x00', 'L': '\x15\x00',
  54.                   'M': '\x16\x00', 'N': '\x17\x00', 'O': '\x18\x00', 'P': '\x19\x00',
  55.                   'Q': '\x1A\x00', 'R': '\x1B\x00', 'S': '\x1C\x00', 'T': '\x1D\x00',
  56.                   'U': '\x1E\x00', 'V': '\x1F\x00', 'W': '\x20\x00', 'X': '\x21\x00',
  57.                   'Y': '\x22\x00', 'Z': '\x23\x00',
  58.  
  59.                   'a': '\x24\x00', 'b': '\x25\x00', 'c': '\x26\x00', 'd': '\x27\x00',
  60.                   'e': '\x28\x00', 'f': '\x29\x00', 'g': '\x2A\x00', 'h': '\x2B\x00',
  61.                   'i': '\x2C\x00', 'j': '\x2D\x00', 'k': '\x2E\x00', 'l': '\x2F\x00',
  62.                   'm': '\x30\x00', 'n': '\x31\x00', 'o': '\x32\x00', 'p': '\x33\x00',
  63.                   'q': '\x34\x00', 'r': '\x35\x00', 's': '\x36\x00', 't': '\x37\x00',
  64.                   'u': '\x38\x00', 'v': '\x39\x00', 'w': '\x3A\x00', 'x': '\x3B\x00',
  65.                   'y': '\x3C\x00', 'z': '\x3D\x00',
  66.  
  67.                   'ç': '\x5E\x00', 'ñ': '\x67\x00', 'à': '\x59\x00', 'á': '\x5A\x00',
  68.                   'â': '\x5B\x00', 'ã': '\x5C\x00', 'é': '\x60\x00', 'ê': '\x61\x00',
  69.                   'í': '\x64\x00', 'ó': '\x69\x00', 'ô': '\x6A\x00', 'õ': '\x6B\x00',
  70.                   'ú': '\x6F\x00',
  71.  
  72.                   'Í': '\x4B\x00', 'Ñ': '\x4E\x00', 'Ó': '\x50\x00', 'Ô': '\x51\x00',
  73.                   'Õ': '\x52\x00', 'Ú': '\x56\x00',
  74.                  
  75.                   ',': '\xEF\x00', '(': '\xE5\x00', ')': '\xE6\x00', '-': '\xF4\x00',
  76.                   '!': '\x3E\x00', '?': '\x3F\x00', '"': '\xEA\x00', '.': '\xE1\x00',
  77.                   ' ': '\xFF\x00', "'": '\xF3\x00', '#': '\xF2\x00',
  78.  
  79.                   '0': '\x00\x00', '1': '\x01\x00', '2': '\x02\x00', '3': '\x03\x00', '4': '\x04\x00',
  80.                   '5': '\x05\x00', '6': '\x06\x00', '7': '\x07\x00', '8': '\x08\x00', '9': '\x09\x00',
  81.                  
  82. }
  83.  
  84. def extractMSG():
  85.     dir = "msg/"
  86.     outdir = "en/"
  87.     for name in os.listdir(dir):
  88.         try: os.mkdir(outdir)
  89.         except: pass
  90.         file = open(dir+name, "rb"); output = open(outdir+name+'.txt', "w")
  91.  
  92.         text_offset = []; pointer_offset = []; block_name = []
  93.  
  94.         file.read(8)
  95.         text_block_size = struct.unpack("<L", file.read(4))[0]
  96.         file.read(4)
  97.         pointers_block_size = struct.unpack("<L", file.read(4))[0]
  98.         file.read(32)
  99.         file.read(text_block_size)
  100.         file.read(4)
  101.         file_num = struct.unpack("<L", file.read(4))[0]
  102.        
  103.         for i in range(file_num):
  104.             pointer_offset.append(struct.unpack("<L", file.read(4))[0])
  105.             text_offset.append(struct.unpack("<L", file.read(4))[0])
  106.            
  107.         file.read(2)
  108.         x = file.tell()
  109.  
  110.         if file_num == 1:
  111.             block_name.append(file.read(pointers_block_size-12).replace('\x00', ''))
  112.         else:
  113.             for a in range(file_num-1):
  114.                 file.seek(x+pointer_offset[a]-2, 0)
  115.                 block_name.append(file.read(pointer_offset[a+1]-pointer_offset[a]).replace('\x00', ''))
  116.  
  117.             block_name.append(file.read(pointers_block_size-(file_num*8)-10-pointer_offset[a]).replace('\x00', ''))
  118.  
  119.         file.seek(52, 0)
  120.  
  121.         for i in range(file_num):
  122.             file.read(2)
  123.             b1 = file.read(2); b2 = file.read(2)
  124.             if b1 and b2 in table:
  125.                 output.write("[%s][%s%s]\n\n" % (block_name[i], table[b1], table[b2]))
  126.             elif b1 in table and not b2 in table:
  127.                 output.write("[%s][%s{%s}]\n\n" % (block_name[i], table[b1], hex(ord(b2[0]))[2:]) )
  128.             #elif b2 in table and not b1 in table:
  129.             #    output.write("[%s][{%s}%s]\n\n" % (block_name[i], hex(ord(b2[0]))[2:], table[b2]) )
  130.             while True:
  131.                 byte = file.read(2)
  132.                 if byte in table:
  133.                     output.write(table[byte])
  134.                 else:
  135.                     if byte == '\xFE\xFF':
  136.                         output.write('\n\n-------------------------------\n\n')
  137.                         break
  138.                     elif byte == '\x05\xFF':
  139.                         byte2 = file.read(2)
  140.                         if byte2 == '\x09\x00':
  141.                             output.write('<blue>')
  142.                         elif byte2 == '\x06\x00':
  143.                             output.write('<red>')
  144.                         elif byte2 == '\x0F\x00':
  145.                             output.write('<black>')
  146.                     elif byte == '\x0D\xFF':
  147.                         byte2 = file.read(2)
  148.                         if byte2 in table:
  149.                             output.write('<sound_%s>' % table[byte2])
  150.                         else:
  151.                             if byte2[1] == '\x00':
  152.                                 output.write('<sound_{%s}>' % hex(ord(byte2[0]))[2:] )
  153.                             else:
  154.                                 output.write('<sound_{%s}{%s}>' % (hex(ord(byte2[0]))[2:], hex(ord(byte2[1]))[2:]) )
  155.                     elif byte == '\x08\xFF':
  156.                         byte2 = file.read(2)
  157.                         if byte2 in table:
  158.                             output.write('<face_%s>\n' % table[byte2])
  159.                         else:
  160.                             if byte2[1] == '\x00':
  161.                                 output.write('<face_{%s}>\n' % hex(ord(byte2[0]))[2:] )
  162.                             else:
  163.                                 output.write('<face_{%s}{%s}>\n' % (hex(ord(byte2[0]))[2:], hex(ord(byte2[1]))[2:]) )
  164.                     elif byte == '\x10\xFF':
  165.                         byte2 = file.read(2); byte3 = file.read(2)
  166.                         if byte2 in table:
  167.                             output.write('<shake_%s%s>' % (table[byte2], table[byte3]) )
  168.                         else:
  169.                             output.write('<shake_%s%s>' % (hex(ord(byte2[0]))[2:], hex(ord(byte3[0]))[2:]) )
  170.                     elif byte == '\x19\xFF':
  171.                         byte2 = file.read(2)
  172.                         if byte2 in table:
  173.                             output.write('<change_%s>' % table[byte2])
  174.                         else:
  175.                             if byte2[1] == '\x00':
  176.                                 output.write('<change_{%s}>' % hex(ord(byte2[0]))[2:] )
  177.                             else:
  178.                                 output.write('<change_{%s}{%s}>' % (hex(ord(byte2[0]))[2:], hex(ord(byte2[1]))[2:]) )
  179.                     elif byte == '\x1B\xFF':
  180.                         byte2 = file.read(2)
  181.                         if byte2 in table:
  182.                             output.write('<fchat_%s>\n' % table[byte2])
  183.                         else:
  184.                             output.write('<fchat_{%s}\n' % hex(ord(byte2[0]))[2:] )
  185.                     elif byte == '\x24\xFF':
  186.                         byte2 = file.read(2)
  187.                         if byte2 in table:
  188.                             output.write('<NJ_%s>\n' % table[byte2])
  189.                         else:
  190.                             output.write('<NJ_%s>\n' % hex(ord(byte2[0]))[2:] )
  191.                     else:
  192.                         output.write('{%02X%02X}' % ( ord(byte[0]), ord(byte[1]) ) )
  193.        
  194.         print name; file.close; output.close
  195.  
  196. def insertMSG():
  197.     dir = "txt/"
  198.     outdir = "br_msg/"
  199.    
  200.     for name in os.listdir(dir):
  201.         try: os.mkdir(outdir)
  202.         except: pass
  203.        
  204.         file = open(dir+name, "rb"); output = open(outdir+name[:-4], "wb")
  205.        
  206.         file_num = text_size = block_size = pointer1 = pointer2 = 0
  207.         names = []; texts = []; ids = []
  208.         txts = ''
  209.  
  210.         for line in file:
  211.             line = line.strip()
  212.             if line:
  213.                 if '----------' in line:
  214.                     file_num += 1
  215.                     texts.append(txts)
  216.                     txts = ''
  217.                 elif '[' and ']' in line:
  218.                     split = line.split('][')
  219.                     names.append(split[0][1:])
  220.                     if '{' and '}' in line:
  221.                         ids.append( (table2[split[1][0]], struct.pack('<H', int(split[1][2:4],16)) ) )
  222.                     else:
  223.                         ids.append( (table2[split[1][0]], table2[split[1][1]] ) )
  224.                 else:
  225.                     x = 0
  226.                     while x < len(line):
  227.                         if line[x] == '<':
  228.                             y = x
  229.                             while True:
  230.                                 if line[y] != '>':
  231.                                     y += 1
  232.                                 else:
  233.                                     break
  234.                             if line[x+1:y] in table2:
  235.                                 txts += table2[line[x+1:y]]
  236.                             else:
  237.                                 tag = line[x+1:y].split('_')
  238.                                 if 'face' in tag[0]:
  239.                                     if '{' and '}' in tag[1]:
  240.                                         if tag[1].count('{') == 1:
  241.                                             txts += '\x08\xFF' + struct.pack('<H', int(tag[1][1:3],16))
  242.                                         else:
  243.                                             txts += '\x08\xFF' + struct.pack('<H', int(tag[1][1],16)) + struct.pack('<H', int(tag[1][4],16))
  244.                                     else:
  245.                                         txts += '\x08\xFF' + table2[tag[1]]
  246.                                 elif 'fchat' in tag[0]:
  247.                                     txts += '\x1B\xFF' + table2[tag[1]]
  248.                                 elif 'change' in tag[0]:
  249.                                     if '{' and '}' in tag[1]:
  250.                                         if tag[1].count('{') == 1:
  251.                                             txts += '\x19\xFF' + struct.pack('<H', int(tag[1][1:3],16))
  252.                                         else:
  253.                                             txts += '\x19\xFF' + struct.pack('<H', int(tag[1][1],16)) + struct.pack('<H', int(tag[1][4],16))
  254.                                     else:
  255.                                         txts += '\x19\xFF' + table2[tag[1]]
  256.                                 elif 'sound' in tag[0]:
  257.                                     if '{' and '}' in tag[1]:
  258.                                         if tag[1].count('{') == 1:
  259.                                             txts += '\x0D\xFF' + struct.pack('<H', int(tag[1][1:3],16))
  260.                                         else:
  261.                                             txts += '\x0D\xFF' + struct.pack('<B', int(tag[1][1:3],16)) + struct.pack('<B', int(tag[1][5],16))
  262.                                     else:
  263.                                         txts += '\x0D\xFF' + table2[tag[1]]
  264.                                 elif 'NJ' in tag[0]:
  265.                                     if tag[1] in table2:
  266.                                         txts += '\x24\xFF' + table2[tag[1]]
  267.                                     else:
  268.                                         txts += '\x24\xFF' + struct.pack('<H', int(tag[1],16) )
  269.                                 elif 'shake' in tag[0]:
  270.                                     txts += '\x10\xFF' + table2[tag[1][0]] + table2[tag[1][1]]
  271.                             x = y + 1
  272.                         elif line[x] == '{':
  273.                             z = x
  274.                             while True:
  275.                                 if line[z] != '}':
  276.                                     z += 1
  277.                                 else:
  278.                                     break
  279.                             txts += struct.pack('<B', int(line[x+1:z-2], 16)) + struct.pack('<B', int(line[x+3:z], 16))
  280.                             x = z + 1
  281.                         else:
  282.                             txts += table2[line[x]]
  283.                             x += 1
  284.  
  285.         output.write('1LMG' + '\x00'*8 + '\x04' + '\x00'*3 + '\x00'*4 + '\x00'*32)
  286.  
  287.         for i in range(file_num):
  288.             output.write('\x2D\xFF' + ids[i][0] + ids[i][1] + texts[i] + '\xFE\xFF')
  289.             text_size += 8 + len(texts[i])
  290.  
  291.         output.write('\x00'*(4 - text_size%4))
  292.         text_size += 4 - text_size%4
  293.  
  294.         output.write('\x2A\x00\x00\x00'+struct.pack('<L', file_num))
  295.  
  296.         for x in range(file_num):
  297.             output.write(struct.pack('<L', pointer1+2))
  298.             pointer1 += len(names[x]) + 1
  299.             output.write(struct.pack('<L', pointer2+52))
  300.             pointer2 += len(texts[x]) + 8
  301.  
  302.         block_size = file_num*8 + pointer1 + 6 + (4 - (pointer1+2)%4)
  303.  
  304.         output.write('\x2A\x00')
  305.  
  306.         for a in range(len(names)):
  307.             output.write(names[a]+'\x00')
  308.            
  309.         pad = 4 - (len(names[x])+1)%4
  310.         output.write('\x00'*pad)
  311.  
  312.         output.seek(8,0)
  313.         output.write(struct.pack('<L', text_size))
  314.         output.seek(16,0)
  315.         output.write(struct.pack('<L', block_size))
  316.  
  317.         print name; file.close; output.close
  318.        
  319. if __name__ == '__main__':
  320.     print "GHOST TRICK dumper/inserter v 0.2\nby alizor\nCrie uma pasta chamada 'msg' e coloque os arquivos dentro."
  321.     print "Para inserir, crie uma pasta chamada 'txt'.\nNao se esqueca de recomprimi-los depois.\n"
  322.     print "\t1 = Extrair textos\n\t2 = Inserir textos\n\t3 = Sair\n"
  323.     choice = raw_input(">>> ")
  324.     if int(choice) == 1: extractMSG()
  325.     elif int(choice) == 2: insertMSG()
  326.     else: sys.exit(1)
  327.     sys.exit(1)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement