Guest User

Nayuta Script Dump v1.5

a guest
Mar 11th, 2015
478
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. # v1.5: Add 0xC1 opcode
  2. # v1.4: Correct error in 41 opcode dumping
  3. # v1.3: Change the way 35 opcodes dump
  4. # v1.2: Previous version wasn't dumping all the text
  5. #       Added opcodes 6B, BC and 35...should be working now
  6. # v1.1: Previous version wasn't dumping all the text
  7. #       Added opcodes 3F, 40 and 06...should be working now
  8. # Dump Nayuta no Kiseki script file
  9. # Usage is python script.py mp_0000
  10. # Where mp_0000.bin is the file you want to dump
  11. # mp_0000.data is the output file (in this example), tab-separated
  12. import os
  13. import struct
  14. import sys
  15.  
  16. def get_data(filename):
  17.     totalbytes = os.path.getsize(filename)
  18.     infile = open(filename, 'rb')
  19.     totalfiledata = infile.read(totalbytes)
  20.     infile.close()
  21.     return totalfiledata
  22.  
  23. def myprogram(filename):
  24.     C1num = 0
  25.     filedata = get_data(filename + '.orig')
  26.  
  27.     # Analyze header -> store in indexdata
  28.     pos = 0x18
  29.     EOF = struct.unpack('<I',filedata[pos + 0x24:pos+ 0x28])[0]
  30.  
  31.     indexdata = []
  32.     flag = False
  33.     while pos < EOF:
  34.         addr = struct.unpack('<I',filedata[pos + 0x24:pos+ 0x28])[0]
  35.         if flag:
  36.             #Start address and end address are stored
  37.             indexdata.append([name, addrold, addr])
  38.         else:
  39.             flag = True
  40.         name = filedata[pos:filedata.find('\x00',pos)]
  41.         addrold = addr
  42.         pos += 0x28
  43.     indexdata.append([name, addr, len(filedata)])
  44.  
  45.     output = filename + "\n"
  46.     for name, addr, endaddr in indexdata:
  47.         data = filedata[addr:endaddr]
  48.         pos = 0
  49.         addrs = []
  50.         opcodelist = ('\x41\x80\xDD\x82','\x98\x80\xDF\x82',
  51.                       '\x07\x80\xDF\x82','\x3F\x80\xDF\x82','\x40\x80\xDF\x82',
  52.                       '\x06\x80\xDF\x82',
  53.                       '\xC9\x80\xDD\x82\x01\x00\x00\x00\xDF\x82',
  54.                       '\xCE\x80\xDD\x82',
  55.                       '\x36\x80\xDD\x82',
  56.                       '\xBC\x80\xDF\x82','\x6B\x80\xDF\x82',
  57.                       '\xC1\x80\xE0\x82')
  58.         for opcode in opcodelist:
  59.             pos = -1
  60.             while True:
  61.                 pos = data.find(opcode,pos + 1)
  62.                 if pos == -1:
  63.                     break
  64.                 addrs.append(addr + pos)
  65.  
  66.         output += name + '\n'
  67.         for addr in sorted(addrs):
  68.             if ord(filedata[addr]) == 0x41:
  69.                 output += hex(addr) + '\t' + '0x41' + '\t' + 'System' + '\t'
  70.                 pos = addr + 0x16
  71.                 for x in range(10):
  72.                     datalen = ord(filedata[pos])
  73.                     pos += 4
  74.                     text = filedata[pos:pos + datalen]
  75.                     output += text + '\n' + '\t'*3
  76.                     pos += datalen + 2
  77.                 output = output[:-3]
  78.             elif ord(filedata[addr]) in (0x98,0x40):
  79.                 opcode = hex(ord(filedata[addr]))
  80.                 pos = addr + 4
  81.                 datalen = ord(filedata[pos])
  82.                 pos += 4
  83.                 text = filedata[pos:pos + datalen]
  84.                 output += hex(addr) + '\t' + opcode + '\t' + text + '\t'
  85.                 pos += datalen + 2
  86.                 for x in range(3):
  87.                     datalen = ord(filedata[pos])
  88.                     pos += 4
  89.                     text = filedata[pos:pos + datalen]
  90.                     output += text + '\n' + '\t'*3
  91.                     pos += datalen + 2
  92.                 output = output[:-3]
  93.             elif ord(filedata[addr]) == 0x07:
  94.                 output += hex(addr) + '\t' + '0x07' + '\t' + 'System' + '\t'
  95.                 pos = addr + 4
  96.                 datalen = ord(filedata[pos])
  97.                 pos += 4
  98.                 text = filedata[pos:pos + datalen]
  99.                 while '\\n' in text:
  100.                     output += text[:text.find('\\n')] + '\n' + '\t'*3
  101.                     text = text[text.find('\\n') + 2:]
  102.                 output += text + '\n'
  103.             elif ord(filedata[addr]) in (0x3F,0xC9,0xCE):
  104.                 output += hex(addr) + '\t' + hex(ord(filedata[addr])) + '\t'
  105.                 if ord(filedata[addr]) == 0xCE:
  106.                     output += 'Obj.' + '\t'
  107.                 else:
  108.                     output += '\t'
  109.                 if ord(filedata[addr]) == 0x3F:
  110.                     pos = addr + 4
  111.                 else:
  112.                     pos = addr + 10
  113.                 datalen = ord(filedata[pos])
  114.                 pos += 4
  115.                 text = filedata[pos:pos + datalen]
  116.                 output += text + '\n'
  117.             elif ord(filedata[addr]) == 0x06:
  118.                 pos = addr + 4
  119.                 output += hex(addr) + '\t' + '0x06'
  120.                 for x in range(2):
  121.                     datalen = ord(filedata[pos])
  122.                     pos += 4
  123.                     text = filedata[pos:pos + datalen]
  124.                     output += '\t' + text
  125.                     pos += datalen + 2
  126.                 output += '\n'
  127.             elif ord(filedata[addr]) == 0x36:
  128.                 pos = addr + 10
  129.                 datalen = struct.unpack('<I',filedata[pos:pos+4])[0]
  130.                 pos += 4
  131.                 output += hex(addr) + '\t' + '0x36' + '\t' + 'Choice' + '\t' + filedata[pos:pos+datalen] + '\n'
  132.             elif ord(filedata[addr]) in (0xBC,0x6B):
  133.                 pos = addr + 2
  134.                 datalen = struct.unpack('<I',filedata[pos+2:pos+6])[0]
  135.                 pos += 6
  136.                 text = filedata[pos:pos + datalen]
  137.                 output += hex(addr) + '\t' + hex(ord(filedata[addr])) + '\t' \
  138.                           + text + '\t'
  139.                 pos += datalen + 8
  140.                 val = struct.unpack('<I',filedata[pos:pos+4])[0]
  141.                 if val == 0x0:
  142.                     text = 'Question'
  143.                 elif val == 0x2:
  144.                     text = 'Exclamation'
  145.                 elif val == 0x10:
  146.                     text = 'Sweatdrop'
  147.                 elif val == 0x14:
  148.                     text = 'Coldsweat'
  149.                 elif val == 0x18:
  150.                     text = 'Ellipsis'
  151.                 elif val == 0x27:
  152.                     text = 'Surprise'
  153.                 elif val == 0x39:
  154.                     text = 'Discovery/Findout'
  155.                 else:
  156.                     text = 'Unknown value %s.' % str(val)
  157.                 output += text + '\n'
  158.             elif ord(filedata[addr]) == 0xC1:
  159.                 C1num += 1
  160.                 pos = addr + 2
  161.                 for x in range(3):
  162.                     pos += 2
  163.                     datalen = struct.unpack('<I',filedata[pos:pos+4])[0]
  164.                     pos += datalen + 4
  165.                 pos += 2
  166.                 datalen = struct.unpack('<I',filedata[pos:pos+4])[0]
  167.                 pos += 4
  168.                 text = filedata[pos:pos+datalen]
  169.                 output += '\t'.join((hex(addr),hex(ord(filedata[addr])),'System',
  170.                                    text)) + '\n'
  171.             else:
  172.                 print 'Unknown opcode %s at address %s.' % \
  173.                       (filedata[addr].encode('hex'),hex(addr))
  174.  
  175.     outfile = open(filename + '.data','wb')
  176.     outfile.write(output)
  177.     outfile.close()
  178.     print '%d C1 opcodes.' % C1num
  179.  
  180. if __name__ == '__main__':
  181. ##    for testing in IDLE
  182. ##    sys.argv.append('mp_0110')
  183.     myprogram(sys.argv[1])
RAW Paste Data