Guest User

Nayuta Script Dump v1.3

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