mirror of
https://github.com/notblisy/RUBYSAPPHIREDLC.git
synced 2026-08-20 15:44:02 -05:00
Finshed adding source
This commit is contained in:
27
SOURCE/scripts/asmquote.py
Normal file
27
SOURCE/scripts/asmquote.py
Normal file
@@ -0,0 +1,27 @@
|
||||
asmProblemBytes = ['\x00', '\x09', '\x0A', '\x22']
|
||||
def asmQuote(t):
|
||||
result = ""
|
||||
quoted = False
|
||||
if t[0] in asmProblemBytes:
|
||||
result = '{0}'.format(ord(t[0]))
|
||||
else:
|
||||
result = '"' + t[0]
|
||||
quoted = True
|
||||
t = t[1:]
|
||||
|
||||
while len(t):
|
||||
if quoted and t[0] in asmProblemBytes:
|
||||
result += '",{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
elif quoted:
|
||||
result += t[0]
|
||||
elif t[0] in asmProblemBytes:
|
||||
result += ',{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
else:
|
||||
result += ',"' + t[0]
|
||||
quoted = True
|
||||
t = t[1:]
|
||||
if quoted:
|
||||
result += '"'
|
||||
return result
|
||||
BIN
SOURCE/scripts/asmquote.pyc
Normal file
BIN
SOURCE/scripts/asmquote.pyc
Normal file
Binary file not shown.
89
SOURCE/scripts/checksum.py
Normal file
89
SOURCE/scripts/checksum.py
Normal file
@@ -0,0 +1,89 @@
|
||||
import struct
|
||||
import sys
|
||||
|
||||
chunk_lengths = [0,0,0,6,2,5,12,5,3,1,2,5,5,5,1,13,13]
|
||||
|
||||
bytewises = []
|
||||
bytewise_results = []
|
||||
wordwises = []
|
||||
wordwise_results = []
|
||||
crcs = []
|
||||
crc_results = []
|
||||
|
||||
data = ""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
data = f.read()
|
||||
f.closed
|
||||
|
||||
base_address = struct.unpack('<I', data[1:5])[0]
|
||||
i = 0x11 # first chunk location
|
||||
while i < len(data):
|
||||
chunk_type = ord(data[i])
|
||||
if chunk_type == 0x02: # END_OF_CHUNKS
|
||||
break
|
||||
elif chunk_type == 0x07: # CUSTOM_BERRY
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
bytewises.append([start_address + 0x52C, start_address, start_address + 0x52C])
|
||||
elif chunk_type == 0x0D: # BATTLE_TRAINER
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
wordwises.append([start_address + 0xB8, start_address, start_address + 0xB8])
|
||||
elif chunk_type == 0x0F: # CHECKSUM_BYTES
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
|
||||
bytewise.append([i + 1, start_address, end_address])
|
||||
elif chunk_type == 0x10: # CHECKSUM_CRC
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
|
||||
crcs.append([i + 1, start_address, end_address])
|
||||
elif chunk_type < 0x02 or chunk_type > 0x10:
|
||||
print "Unknown chunk {0:X}".format(chunk_type)
|
||||
raise TypeError
|
||||
i += chunk_lengths[chunk_type]
|
||||
|
||||
|
||||
# calculate and insert all wordwise checksums
|
||||
for wordwise in wordwises:
|
||||
sum = 0
|
||||
for i in range(wordwise[1], wordwise[2], 4):
|
||||
sum = (sum + struct.unpack('<I', data[i:i+4])[0]) & 0xFFFFFFFF
|
||||
wordwise_results.append(sum)
|
||||
i = 0
|
||||
for wordwise in wordwises:
|
||||
data = data[0:wordwise[0]] + struct.pack('<I', wordwise_results[i]) + data[(wordwise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all bytewise checksums
|
||||
for bytewise in bytewises:
|
||||
sum = 0
|
||||
for i in range(bytewise[1], bytewise[2]):
|
||||
sum = (sum + ord(data[i])) & 0xFFFFFFFF
|
||||
bytewise_results.append(sum)
|
||||
i = 0
|
||||
for bytewise in bytewises:
|
||||
data = data[0:bytewise[0]] + struct.pack('<I', bytewise_results[i]) + data[(bytewise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all CRC checksums
|
||||
for crc in crcs:
|
||||
sum = 0x1121
|
||||
for i in range(crc[1], crc[2]):
|
||||
sum ^= ord(data[i])
|
||||
for j in range(8):
|
||||
if(sum & 1):
|
||||
sum = (sum >> 1) ^ 0x8408
|
||||
else:
|
||||
sum >>= 1
|
||||
sum = ~sum & 0xFFFF
|
||||
crc_results.append(sum)
|
||||
|
||||
i = 0
|
||||
for crc in crcs:
|
||||
data = data[0:crc[0]] + struct.pack('<I', crc_results[i]) + data[(crc[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# write the updated file
|
||||
out = open(sys.argv[2], 'w')
|
||||
out.write(data)
|
||||
105
SOURCE/scripts/checksum_regi.py
Normal file
105
SOURCE/scripts/checksum_regi.py
Normal file
@@ -0,0 +1,105 @@
|
||||
import struct
|
||||
import sys
|
||||
|
||||
chunk_lengths = [0,0,0,6,2,5,12,5,3,1,2,5,5,5,1,13,13,5]
|
||||
|
||||
bytewises = []
|
||||
bytewise_results = []
|
||||
wordwises = []
|
||||
wordwise_results = []
|
||||
crcs = []
|
||||
crc_results = []
|
||||
|
||||
data = ""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
data = f.read()
|
||||
f.closed
|
||||
|
||||
base_address = struct.unpack('<I', data[1:5])[0]
|
||||
|
||||
|
||||
def find_all(a_str, sub):
|
||||
start = 0
|
||||
while True:
|
||||
start = a_str.find(sub, start)
|
||||
if start == -1: return
|
||||
yield start
|
||||
start += len(sub) # use start += 1 to find overlapping matches
|
||||
|
||||
pos=list(find_all(data,b'\x01\x00\x00\x00\x02\x02\x00\x02\x00\x00\x00\x04\x00\x80\x01\x00\x00\x10'))
|
||||
|
||||
for i in pos:
|
||||
i=i+17
|
||||
chunk_type = ord(data[i])
|
||||
if chunk_type == 0x02: # END_OF_CHUNKS
|
||||
break
|
||||
elif chunk_type == 0x07: # CUSTOM_BERRY
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
bytewises.append([start_address + 0x52C, start_address, start_address + 0x52C])
|
||||
elif chunk_type == 0x0D: # BATTLE_TRAINER
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
wordwises.append([start_address + 0x13C, start_address, start_address + 0x13C])
|
||||
elif chunk_type == 0x0F: # CHECKSUM_BYTES
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address
|
||||
bytewise.append([i + 1, start_address, end_address])
|
||||
elif chunk_type == 0x10: # CHECKSUM_CRC
|
||||
start_address = struct.unpack('<I', data[i+5:i+9])[0] - base_address +i-0x11
|
||||
end_address = struct.unpack('<I', data[i+9:i+13])[0] - base_address +i-0x11
|
||||
crcs.append([i + 1, start_address, end_address])
|
||||
elif chunk_type == 0x11: # DOME_TRAINER
|
||||
start_address = struct.unpack('<I', data[i+1:i+5])[0] - base_address
|
||||
wordwises.append([start_address + 0x13C, start_address, start_address + 0x13C])
|
||||
elif chunk_type < 0x02 or chunk_type > 0x11:
|
||||
print "Unknown chunk {0:X}".format(chunk_type)
|
||||
raise TypeError
|
||||
i += chunk_lengths[chunk_type]
|
||||
|
||||
|
||||
|
||||
# calculate and insert all wordwise checksums
|
||||
for wordwise in wordwises:
|
||||
sum = 0
|
||||
for i in range(wordwise[1], wordwise[2], 4):
|
||||
sum = (sum + struct.unpack('<I', data[i:i+4])[0]) & 0xFFFFFFFF
|
||||
wordwise_results.append(sum)
|
||||
i = 0
|
||||
for wordwise in wordwises:
|
||||
data = data[0:wordwise[0]] + struct.pack('<I', wordwise_results[i]) + data[(wordwise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all bytewise checksums
|
||||
for bytewise in bytewises:
|
||||
sum = 0
|
||||
for i in range(bytewise[1], bytewise[2]):
|
||||
sum = (sum + ord(data[i])) & 0xFFFFFFFF
|
||||
bytewise_results.append(sum)
|
||||
i = 0
|
||||
for bytewise in bytewises:
|
||||
data = data[0:bytewise[0]] + struct.pack('<I', bytewise_results[i]) + data[(bytewise[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# calculate and insert all CRC checksums
|
||||
for crc in crcs:
|
||||
sum = 0x1121
|
||||
for i in range(crc[1], crc[2]):
|
||||
sum ^= ord(data[i])
|
||||
for j in range(8):
|
||||
if(sum & 1):
|
||||
sum = (sum >> 1) ^ 0x8408
|
||||
else:
|
||||
sum >>= 1
|
||||
sum = ~sum & 0xFFFF
|
||||
crc_results.append(sum)
|
||||
|
||||
i = 0
|
||||
for crc in crcs:
|
||||
data = data[0:crc[0]] + struct.pack('<I', crc_results[i]) + data[(crc[0] + 4):]
|
||||
i += 1
|
||||
|
||||
|
||||
# write the updated file
|
||||
out = open(sys.argv[2], 'w')
|
||||
out.write(data)
|
||||
26
SOURCE/scripts/ereadertext.py
Normal file
26
SOURCE/scripts/ereadertext.py
Normal file
@@ -0,0 +1,26 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
from asmquote import asmQuote
|
||||
|
||||
region = sys.argv[3]
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
for asm in f:
|
||||
asms = asm.split('"')
|
||||
command = asms[0].strip()
|
||||
if command == "db":
|
||||
# this is only for the American e-Reader; still need to deal with Japanese
|
||||
asms[1] = asms[1].replace('\\0', '\x00')
|
||||
asms[1] = asms[1].replace('\\n', '\n')
|
||||
asms[1] = asms[1].replace('é', '\x7F')
|
||||
|
||||
out.write("db " + asmQuote(asms[1]) + "\n")
|
||||
else:
|
||||
out.write(asm)
|
||||
if "macros.asm" in asm:
|
||||
out.write("REGION EQU REGION_{0}\n".format(region))
|
||||
out.write('REGION_NAME EQUS "{0}"\n'.format(region))
|
||||
|
||||
f.closed
|
||||
481
SOURCE/scripts/gen3text.py
Normal file
481
SOURCE/scripts/gen3text.py
Normal file
@@ -0,0 +1,481 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
|
||||
chars = {
|
||||
# Japanese character table
|
||||
' ': '\x00',
|
||||
'あ': '\x01',
|
||||
'い': '\x02',
|
||||
'う': '\x03',
|
||||
'え': '\x04',
|
||||
'お': '\x05',
|
||||
'か': '\x06',
|
||||
'き': '\x07',
|
||||
'く': '\x08',
|
||||
'け': '\x09',
|
||||
'こ': '\x0A',
|
||||
'さ': '\x0B',
|
||||
'し': '\x0C',
|
||||
'す': '\x0D',
|
||||
'せ': '\x0E',
|
||||
'そ': '\x0F',
|
||||
'た': '\x10',
|
||||
'ち': '\x11',
|
||||
'つ': '\x12',
|
||||
'て': '\x13',
|
||||
'と': '\x14',
|
||||
'な': '\x15',
|
||||
'に': '\x16',
|
||||
'ぬ': '\x17',
|
||||
'ね': '\x18',
|
||||
'の': '\x19',
|
||||
'は': '\x1A',
|
||||
'ひ': '\x1B',
|
||||
'ふ': '\x1C',
|
||||
'へ': '\x1D',
|
||||
'ほ': '\x1E',
|
||||
'ま': '\x1F',
|
||||
'み': '\x20',
|
||||
'む': '\x21',
|
||||
'め': '\x22',
|
||||
'も': '\x23',
|
||||
'や': '\x24',
|
||||
'ゆ': '\x25',
|
||||
'よ': '\x26',
|
||||
'ら': '\x27',
|
||||
'り': '\x28',
|
||||
'る': '\x29',
|
||||
'れ': '\x2A',
|
||||
'ろ': '\x2B',
|
||||
'わ': '\x2C',
|
||||
'を': '\x2D',
|
||||
'ん': '\x2E',
|
||||
'ぁ': '\x2F',
|
||||
'ぃ': '\x30',
|
||||
'ぅ': '\x31',
|
||||
'ぇ': '\x32',
|
||||
'ぉ': '\x33',
|
||||
'ゃ': '\x34',
|
||||
'ゅ': '\x35',
|
||||
'ょ': '\x36',
|
||||
'が': '\x37',
|
||||
'ぎ': '\x38',
|
||||
'ぐ': '\x39',
|
||||
'げ': '\x3A',
|
||||
'ご': '\x3B',
|
||||
'ざ': '\x3C',
|
||||
'じ': '\x3D',
|
||||
'ず': '\x3E',
|
||||
'ぜ': '\x3F',
|
||||
'ぞ': '\x40',
|
||||
'だ': '\x41',
|
||||
'ぢ': '\x42',
|
||||
'づ': '\x43',
|
||||
'で': '\x44',
|
||||
'ど': '\x45',
|
||||
'ば': '\x46',
|
||||
'び': '\x47',
|
||||
'ぶ': '\x48',
|
||||
'べ': '\x49',
|
||||
'ぼ': '\x4A',
|
||||
'ぱ': '\x4B',
|
||||
'ぴ': '\x4C',
|
||||
'ぷ': '\x4D',
|
||||
'ぺ': '\x4E',
|
||||
'ぽ': '\x4F',
|
||||
'っ': '\x50',
|
||||
|
||||
'ア': '\x51',
|
||||
'イ': '\x52',
|
||||
'ウ': '\x53',
|
||||
'エ': '\x54',
|
||||
'オ': '\x55',
|
||||
'カ': '\x56',
|
||||
'キ': '\x57',
|
||||
'ク': '\x58',
|
||||
'ケ': '\x59',
|
||||
'コ': '\x5A',
|
||||
'サ': '\x5B',
|
||||
'シ': '\x5C',
|
||||
'ス': '\x5D',
|
||||
'セ': '\x5E',
|
||||
'ソ': '\x5F',
|
||||
'タ': '\x60',
|
||||
'チ': '\x61',
|
||||
'ツ': '\x62',
|
||||
'テ': '\x63',
|
||||
'ト': '\x64',
|
||||
'ナ': '\x65',
|
||||
'ニ': '\x66',
|
||||
'ヌ': '\x67',
|
||||
'ネ': '\x68',
|
||||
'ノ': '\x69',
|
||||
'ハ': '\x6A',
|
||||
'ヒ': '\x6B',
|
||||
'フ': '\x6C',
|
||||
'ヘ': '\x6D',
|
||||
'ホ': '\x6E',
|
||||
'マ': '\x6F',
|
||||
'ミ': '\x70',
|
||||
'ム': '\x71',
|
||||
'メ': '\x72',
|
||||
'モ': '\x73',
|
||||
'ヤ': '\x74',
|
||||
'ユ': '\x75',
|
||||
'ヨ': '\x76',
|
||||
'ラ': '\x77',
|
||||
'リ': '\x78',
|
||||
'ル': '\x79',
|
||||
'レ': '\x7A',
|
||||
'ロ': '\x7B',
|
||||
'ワ': '\x7C',
|
||||
'ヲ': '\x7D',
|
||||
'ン': '\x7E',
|
||||
'ァ': '\x7F',
|
||||
'ィ': '\x80',
|
||||
'ゥ': '\x81',
|
||||
'ェ': '\x82',
|
||||
'ォ': '\x83',
|
||||
'ャ': '\x84',
|
||||
'ュ': '\x85',
|
||||
'ョ': '\x86',
|
||||
'ガ': '\x87',
|
||||
'ギ': '\x88',
|
||||
'グ': '\x89',
|
||||
'ゲ': '\x8A',
|
||||
'ゴ': '\x8B',
|
||||
'ザ': '\x8C',
|
||||
'ジ': '\x8D',
|
||||
'ズ': '\x8E',
|
||||
'ゼ': '\x8F',
|
||||
'ゾ': '\x90',
|
||||
'ダ': '\x91',
|
||||
'ヂ': '\x92',
|
||||
'ヅ': '\x93',
|
||||
'デ': '\x94',
|
||||
'ド': '\x95',
|
||||
'バ': '\x96',
|
||||
'ビ': '\x97',
|
||||
'ブ': '\x98',
|
||||
'ベ': '\x99',
|
||||
'ボ': '\x9A',
|
||||
'パ': '\x9B',
|
||||
'ピ': '\x9C',
|
||||
'プ': '\x9D',
|
||||
'ペ': '\x9E',
|
||||
'ポ': '\x9F',
|
||||
'ッ': '\xA0',
|
||||
|
||||
'0': '\xA1',
|
||||
'1': '\xA2',
|
||||
'2': '\xA3',
|
||||
'3': '\xA4',
|
||||
'4': '\xA5',
|
||||
'5': '\xA6',
|
||||
'6': '\xA7',
|
||||
'7': '\xA8',
|
||||
'8': '\xA9',
|
||||
'9': '\xAA',
|
||||
'!': '\xAB',
|
||||
'?': '\xAC',
|
||||
'。': '\xAD',
|
||||
'ー': '\xAE',
|
||||
'・': '\xAF',
|
||||
'⋯': '\xB0',
|
||||
'『': '\xB1',
|
||||
'』': '\xB2',
|
||||
'「': '\xB3',
|
||||
'」': '\xB4',
|
||||
'♂': '\xB5',
|
||||
'♀': '\xB6',
|
||||
'円': '\xB7',
|
||||
'.': '\xB8',
|
||||
'×': '\xB9',
|
||||
'/': '\xBA',
|
||||
|
||||
'A': '\xBB',
|
||||
'B': '\xBC',
|
||||
'C': '\xBD',
|
||||
'D': '\xBE',
|
||||
'E': '\xBF',
|
||||
'F': '\xC0',
|
||||
'G': '\xC1',
|
||||
'H': '\xC2',
|
||||
'I': '\xC3',
|
||||
'J': '\xC4',
|
||||
'K': '\xC5',
|
||||
'L': '\xC6',
|
||||
'M': '\xC7',
|
||||
'N': '\xC8',
|
||||
'O': '\xC9',
|
||||
'P': '\xCA',
|
||||
'Q': '\xCB',
|
||||
'R': '\xCC',
|
||||
'S': '\xCD',
|
||||
'T': '\xCE',
|
||||
'U': '\xCF',
|
||||
'V': '\xD0',
|
||||
'W': '\xD1',
|
||||
'X': '\xD2',
|
||||
'Y': '\xD3',
|
||||
'Z': '\xD4',
|
||||
'a': '\xD5',
|
||||
'b': '\xD6',
|
||||
'c': '\xD7',
|
||||
'd': '\xD8',
|
||||
'e': '\xD9',
|
||||
'f': '\xDA',
|
||||
'g': '\xDB',
|
||||
'h': '\xDC',
|
||||
'i': '\xDD',
|
||||
'j': '\xDE',
|
||||
'k': '\xDF',
|
||||
'l': '\xE0',
|
||||
'm': '\xE1',
|
||||
'n': '\xE2',
|
||||
'o': '\xE3',
|
||||
'p': '\xE4',
|
||||
'q': '\xE5',
|
||||
'r': '\xE6',
|
||||
's': '\xE7',
|
||||
't': '\xE8',
|
||||
'u': '\xE9',
|
||||
'v': '\xEA',
|
||||
'w': '\xEB',
|
||||
'x': '\xEC',
|
||||
'y': '\xED',
|
||||
'z': '\xEE',
|
||||
'▶': '\xEF',
|
||||
':': '\xF0',
|
||||
'Ä': '\xF1',
|
||||
'Ö': '\xF2',
|
||||
'Ü': '\xF3',
|
||||
'ä': '\xF4',
|
||||
'ö': '\xF5',
|
||||
'ü': '\xF6',
|
||||
#'⬆': '\xF7',
|
||||
#'⬇': '\xF8',
|
||||
#'⬅': '\xF9',
|
||||
'\\l': '\xFA',
|
||||
'\\p': '\xFB',
|
||||
'\{FC}': '\xFC',
|
||||
'\\v1': '\xFD\x01',
|
||||
'\\v2': '\xFD\x02',
|
||||
'\\v3': '\xFD\x03',
|
||||
'\\n': '\xFE',
|
||||
'@': '\xFF',
|
||||
|
||||
# characters changed for Western versions
|
||||
' ': '\x00',
|
||||
'À': '\x01',
|
||||
'Á': '\x02',
|
||||
'Â': '\x03',
|
||||
'Ç': '\x04',
|
||||
'È': '\x05',
|
||||
'É': '\x06',
|
||||
'Ê': '\x07',
|
||||
'Ë': '\x08',
|
||||
'Ì': '\x09',
|
||||
'Î': '\x0B',
|
||||
'Ï': '\x0C',
|
||||
'Ò': '\x0D',
|
||||
'Ó': '\x0E',
|
||||
'Ô': '\x0F',
|
||||
'Œ': '\x10',
|
||||
'Ù': '\x11',
|
||||
'Ú': '\x12',
|
||||
'Û': '\x13',
|
||||
'Ñ': '\x14',
|
||||
'ß': '\x15',
|
||||
'à': '\x16',
|
||||
'á': '\x17',
|
||||
'ç': '\x19',
|
||||
'è': '\x1A',
|
||||
'é': '\x1B',
|
||||
'ê': '\x1C',
|
||||
'ë': '\x1D',
|
||||
'ì': '\x1E',
|
||||
'î': '\x20',
|
||||
'ï': '\x21',
|
||||
'ò': '\x22',
|
||||
'ó': '\x23',
|
||||
'ô': '\x24',
|
||||
'œ': '\x25',
|
||||
'ù': '\x26',
|
||||
'ú': '\x27',
|
||||
'û': '\x28',
|
||||
'ñ': '\x29',
|
||||
'º': '\x2A',
|
||||
'ª': '\x2B',
|
||||
'\{er}': '\x2C',
|
||||
'&': '\x2D',
|
||||
'+': '\x2E',
|
||||
'\{L.}': '\x34', # Italian
|
||||
'\{Lv}': '\x34', # English
|
||||
'\{Lv.}': '\x34', # German
|
||||
'\{N.}': '\x34', # French
|
||||
'\{Nv}': '\x34', # Spanish
|
||||
'=': '\x35',
|
||||
';': '\x36', # European
|
||||
'¿': '\x51',
|
||||
'¡': '\x52',
|
||||
'\{PKMN}': '\x53\x54',
|
||||
'\{POKé}': '\x55\x56',
|
||||
'\{POKéBLOC}': '\x55\x56\x57\x58\x59', # French
|
||||
'\{POKéBLOCK}': '\x55\x56\x57\x58\x59', # English
|
||||
'\{POKéCUBO}': '\x55\x56\x57\x58\x59', # Spanish
|
||||
'\{POKéRIEGEL}': '\x55\x56\x57\x58\x59', # German
|
||||
'Í': '\x5A',
|
||||
'%': '\x5B',
|
||||
'(': '\x5C',
|
||||
')': '\x5D',
|
||||
'\{POKéMELLA}': '\x5E\x5F\x60\x61\x62', # Italian
|
||||
'\{POKéMELLE}': '\x5E\x5F\x60\x61\x63', # Italian
|
||||
'â': '\x68',
|
||||
'í': '\x6F',
|
||||
'⬆': '\x79',
|
||||
'⬇': '\x7A',
|
||||
'⬅': '\x7B',
|
||||
'➡': '\x7C',
|
||||
'\{e}': '\x84', # European
|
||||
'‹': '\x85', # European
|
||||
'›': '\x86', # European
|
||||
'\{re}': '\xA0', # European
|
||||
'0': '\xA1',
|
||||
'1': '\xA2',
|
||||
'2': '\xA3',
|
||||
'3': '\xA4',
|
||||
'4': '\xA5',
|
||||
'5': '\xA6',
|
||||
'6': '\xA7',
|
||||
'7': '\xA8',
|
||||
'8': '\xA9',
|
||||
'9': '\xAA',
|
||||
'!': '\xAB',
|
||||
'?': '\xAC',
|
||||
'.': '\xAD',
|
||||
'-': '\xAE',
|
||||
'…': '\xB0',
|
||||
'“': '\xB1', # English, Italian, Spanish
|
||||
'«': '\xB1', # French
|
||||
'„': '\xB1', # German
|
||||
'”': '\xB2', # English, Italian, Spanish
|
||||
'»': '\xB2', # French
|
||||
#'“': '\xB2', # German — clashes with English B1
|
||||
'‘': '\xB3',
|
||||
'’': '\xB4',
|
||||
'$': '\xB7',
|
||||
',': '\xB8',
|
||||
'/': '\xBA',
|
||||
'A': '\xBB',
|
||||
'B': '\xBC',
|
||||
'C': '\xBD',
|
||||
'D': '\xBE',
|
||||
'E': '\xBF',
|
||||
'F': '\xC0',
|
||||
'G': '\xC1',
|
||||
'H': '\xC2',
|
||||
'I': '\xC3',
|
||||
'J': '\xC4',
|
||||
'K': '\xC5',
|
||||
'L': '\xC6',
|
||||
'M': '\xC7',
|
||||
'N': '\xC8',
|
||||
'O': '\xC9',
|
||||
'P': '\xCA',
|
||||
'Q': '\xCB',
|
||||
'R': '\xCC',
|
||||
'S': '\xCD',
|
||||
'T': '\xCE',
|
||||
'U': '\xCF',
|
||||
'V': '\xD0',
|
||||
'W': '\xD1',
|
||||
'X': '\xD2',
|
||||
'Y': '\xD3',
|
||||
'Z': '\xD4',
|
||||
'a': '\xD5',
|
||||
'b': '\xD6',
|
||||
'c': '\xD7',
|
||||
'd': '\xD8',
|
||||
'e': '\xD9',
|
||||
'f': '\xDA',
|
||||
'g': '\xDB',
|
||||
'h': '\xDC',
|
||||
'i': '\xDD',
|
||||
'j': '\xDE',
|
||||
'k': '\xDF',
|
||||
'l': '\xE0',
|
||||
'm': '\xE1',
|
||||
'n': '\xE2',
|
||||
'o': '\xE3',
|
||||
'p': '\xE4',
|
||||
'q': '\xE5',
|
||||
'r': '\xE6',
|
||||
's': '\xE7',
|
||||
't': '\xE8',
|
||||
'u': '\xE9',
|
||||
'v': '\xEA',
|
||||
'w': '\xEB',
|
||||
'x': '\xEC',
|
||||
'y': '\xED',
|
||||
'z': '\xEE',
|
||||
':': '\xF0',
|
||||
}
|
||||
|
||||
asmProblemBytes = ['\x00', '\x09', '\x0A', '\x22']
|
||||
|
||||
|
||||
def utf8ToRSText(t, region = ""):
|
||||
currentChars = chars
|
||||
if region == "DE":
|
||||
chars['“'] = '\xB2'
|
||||
|
||||
characters = []
|
||||
char = ""
|
||||
while len(t):
|
||||
if ord(t[0]) >= 0xF0:
|
||||
char += t[0:4]
|
||||
t = t[4:]
|
||||
elif ord(t[0]) >= 0xE0:
|
||||
char += t[0:3]
|
||||
t = t[3:]
|
||||
elif ord(t[0]) >= 0xC0:
|
||||
char += t[0:2]
|
||||
t = t[2:]
|
||||
else:
|
||||
char += t[0:1]
|
||||
t = t[1:]
|
||||
if char != "\\" and char != "\\v" and (char[0:2] != "\\{" or char[-1] == "}"):
|
||||
characters.append(char)
|
||||
char = ""
|
||||
|
||||
result = ""
|
||||
for char in characters:
|
||||
result += chars[char]
|
||||
return result
|
||||
|
||||
def asmQuote(t):
|
||||
result = ""
|
||||
quoted = False
|
||||
if t[0] in asmProblemBytes:
|
||||
result = '{0}'.format(ord(t[0]))
|
||||
else:
|
||||
result = '"' + t[0]
|
||||
quoted = True
|
||||
|
||||
while len(t):
|
||||
if quoted and t[0] in asmProblemBytes:
|
||||
result += '",{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
elif quoted:
|
||||
result += t[0]
|
||||
elif t[0] in asmProblemBytes:
|
||||
result += ',{0}'.format(ord(t[0]))
|
||||
quoted = False
|
||||
else:
|
||||
result += ',"' + t[0]
|
||||
quoted = True
|
||||
t = t[1:]
|
||||
if quoted:
|
||||
result += '"'
|
||||
return result
|
||||
BIN
SOURCE/scripts/gen3text.pyc
Normal file
BIN
SOURCE/scripts/gen3text.pyc
Normal file
Binary file not shown.
210
SOURCE/scripts/pokemonstructure.py
Normal file
210
SOURCE/scripts/pokemonstructure.py
Normal file
@@ -0,0 +1,210 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import struct
|
||||
import sys
|
||||
|
||||
data = ""
|
||||
dataout=""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
data = f.read()
|
||||
f.closed
|
||||
|
||||
pv=struct.unpack('<I', data[36:40])[0]
|
||||
otid=struct.unpack('<I', data[40:44])[0]
|
||||
mask1=65280
|
||||
mask2=255
|
||||
mask=255
|
||||
key4 = (pv ^ otid) >> 24
|
||||
key3 = ((pv ^ otid) >> 16) & mask
|
||||
key2 = ((pv ^ otid) >> 8) & mask
|
||||
key1 = (pv ^ otid) & mask
|
||||
|
||||
substructG=[struct.unpack('<B', data[68])[0]]
|
||||
substructA=[struct.unpack('<B', data[80])[0]]
|
||||
substructE=[struct.unpack('<B', data[92])[0]]
|
||||
substructM=[struct.unpack('<B', data[104])[0]]
|
||||
for i in range(1,12):
|
||||
substructG.append(struct.unpack('<B', data[68+i])[0])
|
||||
substructA.append(struct.unpack('<B', data[80+i])[0])
|
||||
substructE.append(struct.unpack('<B', data[92+i])[0])
|
||||
substructM.append(struct.unpack('<B', data[104+i])[0])
|
||||
|
||||
|
||||
checksum=0
|
||||
i=68
|
||||
while i < 116:
|
||||
checksum=checksum+struct.unpack('<H', data[i:i+2])[0]
|
||||
i+=2
|
||||
|
||||
data = data[0:64] + struct.pack('<B', checksum & mask2) + struct.pack('<B', (checksum & mask1) >> 8) + data[66:]
|
||||
|
||||
i=0
|
||||
while i < 12:
|
||||
substructG[i] ^= key1
|
||||
substructA[i] ^= key1
|
||||
substructE[i] ^= key1
|
||||
substructM[i] ^= key1
|
||||
substructG[i+1] ^= key2
|
||||
substructA[i+1] ^= key2
|
||||
substructE[i+1] ^= key2
|
||||
substructM[i+1] ^= key2
|
||||
substructG[i+2] ^= key3
|
||||
substructA[i+2] ^= key3
|
||||
substructE[i+2] ^= key3
|
||||
substructM[i+2] ^= key3
|
||||
substructG[i+3] ^= key4
|
||||
substructA[i+3] ^= key4
|
||||
substructE[i+3] ^= key4
|
||||
substructM[i+3] ^= key4
|
||||
i+=4
|
||||
|
||||
|
||||
mod = pv % 24
|
||||
i=0
|
||||
if mod == 0:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 1:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 2:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 3:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 4:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 5:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructG[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 6:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 7:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 8:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 9:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 10:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 11:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructA[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 12:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 13:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 14:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructM[i]) + data[105+i:]
|
||||
elif mod == 15:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructM[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 16:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 17:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructE[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructM[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 18:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 19:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructG[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
elif mod == 20:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructE[i]) + data[105+i:]
|
||||
elif mod == 21:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructA[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructE[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
elif mod == 22:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructG[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructA[i]) + data[105+i:]
|
||||
else:
|
||||
for i in range(12):
|
||||
data = data[0:68+i] + struct.pack('<B', substructM[i]) + data[69+i:]
|
||||
data = data[0:80+i] + struct.pack('<B', substructE[i]) + data[81+i:]
|
||||
data = data[0:92+i] + struct.pack('<B', substructA[i]) + data[93+i:]
|
||||
data = data[0:104+i] + struct.pack('<B', substructG[i]) + data[105+i:]
|
||||
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
out.write(data)
|
||||
33
SOURCE/scripts/regionalize.py
Normal file
33
SOURCE/scripts/regionalize.py
Normal file
@@ -0,0 +1,33 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
from gen3text import utf8ToRSText
|
||||
from asmquote import asmQuote
|
||||
|
||||
data_region = sys.argv[3] # determines region code
|
||||
text_region = sys.argv[4] # determines string translation
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
for asm in f:
|
||||
asms = asm.split('"')
|
||||
command = asms[0].strip()
|
||||
if (command == "Text_" + text_region) or (command == "Text"):
|
||||
asms[1] = utf8ToRSText(asms[1], text_region)
|
||||
try:
|
||||
length = asms[2].split(';')[0] # strip trailing comment
|
||||
padding = int(length) - len(asms[1])
|
||||
if padding > 0:
|
||||
asms[1] += '\xFF'
|
||||
for i in range(padding - 1):
|
||||
asms[1] += "\x00"
|
||||
except ValueError:
|
||||
pass
|
||||
out.write("db " + asmQuote(asms[1]) + "\n")
|
||||
elif len(command) < 5 or command[0:5] != "Text_":
|
||||
out.write(asm)
|
||||
if "macros.asm" in asm:
|
||||
# can’t do this until after REGION_EN, etc. are loaded
|
||||
out.write("REGION EQU REGION_" + data_region + "\n")
|
||||
# else this is foreign text, delete it
|
||||
f.closed
|
||||
29
SOURCE/scripts/stripgbc.py
Normal file
29
SOURCE/scripts/stripgbc.py
Normal file
@@ -0,0 +1,29 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
import sys
|
||||
|
||||
out = open(sys.argv[2], 'w')
|
||||
buffering = False
|
||||
buf = ""
|
||||
with open(sys.argv[1], 'rb') as f:
|
||||
f.read(256) # skip to $0100
|
||||
while True:
|
||||
byte = f.read(1)
|
||||
if not byte:
|
||||
break
|
||||
|
||||
# the program shall end with $FF followed only by $00 bytes
|
||||
# for every $FF we hit, buffer until something that isn’t $00
|
||||
if (not buffering and ord(byte) == 0xFF) or (buffering and ord(byte) == 0x00):
|
||||
buf += byte
|
||||
buffering = True
|
||||
elif buffering and ord(byte) == 0xFF:
|
||||
out.write(buf)
|
||||
buf = byte
|
||||
elif buffering:
|
||||
out.write(buf)
|
||||
out.write(byte)
|
||||
buf = ""
|
||||
buffering = False
|
||||
else:
|
||||
out.write(byte)
|
||||
f.closed
|
||||
Reference in New Issue
Block a user