Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # v1.5: Add 0xC1 opcode
- # v1.4: Correct error in 41 opcode dumping
- # v1.3: Change the way 35 opcodes dump
- # v1.2: Previous version wasn't dumping all the text
- # Added opcodes 6B, BC and 35...should be working now
- # v1.1: Previous version wasn't dumping all the text
- # Added opcodes 3F, 40 and 06...should be working now
- # Dump Nayuta no Kiseki script file
- # Usage is python script.py mp_0000
- # Where mp_0000.bin is the file you want to dump
- # mp_0000.data is the output file (in this example), tab-separated
- import os
- import struct
- import sys
- def get_data(filename):
- totalbytes = os.path.getsize(filename)
- infile = open(filename, 'rb')
- totalfiledata = infile.read(totalbytes)
- infile.close()
- return totalfiledata
- def myprogram(filename):
- C1num = 0
- filedata = get_data(filename + '.orig')
- # Analyze header -> store in indexdata
- pos = 0x18
- EOF = struct.unpack('<I',filedata[pos + 0x24:pos+ 0x28])[0]
- indexdata = []
- flag = False
- while pos < EOF:
- addr = struct.unpack('<I',filedata[pos + 0x24:pos+ 0x28])[0]
- if flag:
- #Start address and end address are stored
- indexdata.append([name, addrold, addr])
- else:
- flag = True
- name = filedata[pos:filedata.find('\x00',pos)]
- addrold = addr
- pos += 0x28
- indexdata.append([name, addr, len(filedata)])
- output = filename + "\n"
- for name, addr, endaddr in indexdata:
- data = filedata[addr:endaddr]
- pos = 0
- addrs = []
- opcodelist = ('\x41\x80\xDD\x82','\x98\x80\xDF\x82',
- '\x07\x80\xDF\x82','\x3F\x80\xDF\x82','\x40\x80\xDF\x82',
- '\x06\x80\xDF\x82',
- '\xC9\x80\xDD\x82\x01\x00\x00\x00\xDF\x82',
- '\xCE\x80\xDD\x82',
- '\x36\x80\xDD\x82',
- '\xBC\x80\xDF\x82','\x6B\x80\xDF\x82',
- '\xC1\x80\xE0\x82')
- for opcode in opcodelist:
- pos = -1
- while True:
- pos = data.find(opcode,pos + 1)
- if pos == -1:
- break
- addrs.append(addr + pos)
- output += name + '\n'
- for addr in sorted(addrs):
- if ord(filedata[addr]) == 0x41:
- output += hex(addr) + '\t' + '0x41' + '\t' + 'System' + '\t'
- pos = addr + 0x16
- for x in range(10):
- datalen = ord(filedata[pos])
- pos += 4
- text = filedata[pos:pos + datalen]
- output += text + '\n' + '\t'*3
- pos += datalen + 2
- output = output[:-3]
- elif ord(filedata[addr]) in (0x98,0x40):
- opcode = hex(ord(filedata[addr]))
- pos = addr + 4
- datalen = ord(filedata[pos])
- pos += 4
- text = filedata[pos:pos + datalen]
- output += hex(addr) + '\t' + opcode + '\t' + text + '\t'
- pos += datalen + 2
- for x in range(3):
- datalen = ord(filedata[pos])
- pos += 4
- text = filedata[pos:pos + datalen]
- output += text + '\n' + '\t'*3
- pos += datalen + 2
- output = output[:-3]
- elif ord(filedata[addr]) == 0x07:
- output += hex(addr) + '\t' + '0x07' + '\t' + 'System' + '\t'
- pos = addr + 4
- datalen = ord(filedata[pos])
- pos += 4
- text = filedata[pos:pos + datalen]
- while '\\n' in text:
- output += text[:text.find('\\n')] + '\n' + '\t'*3
- text = text[text.find('\\n') + 2:]
- output += text + '\n'
- elif ord(filedata[addr]) in (0x3F,0xC9,0xCE):
- output += hex(addr) + '\t' + hex(ord(filedata[addr])) + '\t'
- if ord(filedata[addr]) == 0xCE:
- output += 'Obj.' + '\t'
- else:
- output += '\t'
- if ord(filedata[addr]) == 0x3F:
- pos = addr + 4
- else:
- pos = addr + 10
- datalen = ord(filedata[pos])
- pos += 4
- text = filedata[pos:pos + datalen]
- output += text + '\n'
- elif ord(filedata[addr]) == 0x06:
- pos = addr + 4
- output += hex(addr) + '\t' + '0x06'
- for x in range(2):
- datalen = ord(filedata[pos])
- pos += 4
- text = filedata[pos:pos + datalen]
- output += '\t' + text
- pos += datalen + 2
- output += '\n'
- elif ord(filedata[addr]) == 0x36:
- pos = addr + 10
- datalen = struct.unpack('<I',filedata[pos:pos+4])[0]
- pos += 4
- output += hex(addr) + '\t' + '0x36' + '\t' + 'Choice' + '\t' + filedata[pos:pos+datalen] + '\n'
- elif ord(filedata[addr]) in (0xBC,0x6B):
- pos = addr + 2
- datalen = struct.unpack('<I',filedata[pos+2:pos+6])[0]
- pos += 6
- text = filedata[pos:pos + datalen]
- output += hex(addr) + '\t' + hex(ord(filedata[addr])) + '\t' \
- + text + '\t'
- pos += datalen + 8
- val = struct.unpack('<I',filedata[pos:pos+4])[0]
- if val == 0x0:
- text = 'Question'
- elif val == 0x2:
- text = 'Exclamation'
- elif val == 0x10:
- text = 'Sweatdrop'
- elif val == 0x14:
- text = 'Coldsweat'
- elif val == 0x18:
- text = 'Ellipsis'
- elif val == 0x27:
- text = 'Surprise'
- elif val == 0x39:
- text = 'Discovery/Findout'
- else:
- text = 'Unknown value %s.' % str(val)
- output += text + '\n'
- elif ord(filedata[addr]) == 0xC1:
- C1num += 1
- pos = addr + 2
- for x in range(3):
- pos += 2
- datalen = struct.unpack('<I',filedata[pos:pos+4])[0]
- pos += datalen + 4
- pos += 2
- datalen = struct.unpack('<I',filedata[pos:pos+4])[0]
- pos += 4
- text = filedata[pos:pos+datalen]
- output += '\t'.join((hex(addr),hex(ord(filedata[addr])),'System',
- text)) + '\n'
- else:
- print 'Unknown opcode %s at address %s.' % \
- (filedata[addr].encode('hex'),hex(addr))
- outfile = open(filename + '.data','wb')
- outfile.write(output)
- outfile.close()
- print '%d C1 opcodes.' % C1num
- if __name__ == '__main__':
- ## for testing in IDLE
- ## sys.argv.append('mp_0110')
- myprogram(sys.argv[1])
Add Comment
Please, Sign In to add comment