Refactor multibyte text code to use a TextMapper
This commit is contained in:
parent
ed6d66acd9
commit
93f77ddde3
415
Text.py
415
Text.py
|
@ -504,14 +504,14 @@ def string_to_alttp_core(s, pause=True, wrap=14):
|
|||
words.insert(0, word_rest)
|
||||
lines.insert(0, ' '.join(words))
|
||||
|
||||
write_word(outbuf, word_first)
|
||||
outbuf.extend(RawMBTextMapper.convert(word_first))
|
||||
break
|
||||
|
||||
if wordlen(word) <= (linespace if linespace == wrap else linespace - 1):
|
||||
if linespace < wrap:
|
||||
word = ' ' + word
|
||||
linespace -= wordlen(word)
|
||||
write_word(outbuf, word)
|
||||
outbuf.extend(RawMBTextMapper.convert(word))
|
||||
else:
|
||||
# ran out of space, push word and lines back and continue with next line
|
||||
words.insert(0, word)
|
||||
|
@ -607,214 +607,6 @@ def charlen(word, offset):
|
|||
return (2, offset+1)
|
||||
return (1, offset+1)
|
||||
|
||||
def write_word(buf, word):
|
||||
for char in word:
|
||||
res = char_to_alttp_char(char)
|
||||
if isinstance(res, int):
|
||||
buf.extend([0x00, res])
|
||||
else:
|
||||
buf.extend(res)
|
||||
|
||||
|
||||
char_map = {' ': 0xFF,
|
||||
'?': 0xC6,
|
||||
'!': 0xC7,
|
||||
',': 0xC8,
|
||||
'-': 0xC9,
|
||||
'…': 0xCC,
|
||||
'.': 0xCD,
|
||||
'~': 0xCE,
|
||||
'~': 0xCE,
|
||||
'@': [0x6A], # Links name (only works if compressed)
|
||||
'>': [0x00, 0xD2, 0x00, 0xD3], # Link's face
|
||||
"'": 0xD8,
|
||||
'’': 0xD8,
|
||||
'%': 0xDD, # Hylian Bird
|
||||
'^': 0xDE, # Hylian Ankh
|
||||
'=': 0xDF, # Hylian Wavy Lines
|
||||
'↑': 0xE0,
|
||||
'↓': 0xE1,
|
||||
'→': 0xE2,
|
||||
'←': 0xE3,
|
||||
'≥': 0xE4, # Cursor
|
||||
'¼': [0x00, 0xE5, 0x00, 0xE7], # ¼ heart
|
||||
'½': [0x00, 0xE6, 0x00, 0xE7], # ½ heart
|
||||
'¾': [0x00, 0xE8, 0x00, 0xE9], # ¾ heart
|
||||
'♥': [0x00, 0xEA, 0x00, 0xEB], # full heart
|
||||
'ᚋ': [0x6C, 0x00], # var 0
|
||||
'ᚌ': [0x6C, 0x01], # var 1
|
||||
'ᚍ': [0x6C, 0x02], # var 2
|
||||
'ᚎ': [0x6C, 0x03], # var 3
|
||||
'あ': 0x00,
|
||||
'い': 0x01,
|
||||
'う': 0x02,
|
||||
'え': 0x03,
|
||||
'お': 0x04,
|
||||
'や': 0x05,
|
||||
'ゆ': 0x06,
|
||||
'よ': 0x07,
|
||||
'か': 0x08,
|
||||
'き': 0x09,
|
||||
'く': 0x0A,
|
||||
'け': 0x0B,
|
||||
'こ': 0x0C,
|
||||
'わ': 0x0D,
|
||||
'を': 0x0E,
|
||||
'ん': 0x0F,
|
||||
'さ': 0x10,
|
||||
'し': 0x11,
|
||||
'す': 0x12,
|
||||
'せ': 0x13,
|
||||
'そ': 0x14,
|
||||
'が': 0x15,
|
||||
'ぎ': 0x16,
|
||||
'ぐ': 0x17,
|
||||
'た': 0x18,
|
||||
'ち': 0x19,
|
||||
'つ': 0x1A,
|
||||
'て': 0x1B,
|
||||
'と': 0x1C,
|
||||
'げ': 0x1D,
|
||||
'ご': 0x1E,
|
||||
'ざ': 0x1F,
|
||||
'な': 0x20,
|
||||
'に': 0x21,
|
||||
'ぬ': 0x22,
|
||||
'ね': 0x23,
|
||||
'の': 0x24,
|
||||
'じ': 0x25,
|
||||
'ず': 0x26,
|
||||
'ぜ': 0x27,
|
||||
'は': 0x28,
|
||||
'ひ': 0x29,
|
||||
'ふ': 0x2A,
|
||||
'へ': 0x2B,
|
||||
'ほ': 0x2C,
|
||||
'ぞ': 0x2D,
|
||||
'だ': 0x2E,
|
||||
'ぢ': 0x2F,
|
||||
'ま': 0x30,
|
||||
'み': 0x31,
|
||||
'む': 0x32,
|
||||
'め': 0x33,
|
||||
'も': 0x34,
|
||||
'づ': 0x35,
|
||||
'で': 0x36,
|
||||
'ど': 0x37,
|
||||
'ら': 0x38,
|
||||
'り': 0x39,
|
||||
'る': 0x3A,
|
||||
'れ': 0x3B,
|
||||
'ろ': 0x3C,
|
||||
'ば': 0x3D,
|
||||
'び': 0x3E,
|
||||
'ぶ': 0x3F,
|
||||
'べ': 0x40,
|
||||
'ぼ': 0x41,
|
||||
'ぱ': 0x42,
|
||||
'ぴ': 0x43,
|
||||
'ぷ': 0x44,
|
||||
'ぺ': 0x45,
|
||||
'ぽ': 0x46,
|
||||
'ゃ': 0x47,
|
||||
'ゅ': 0x48,
|
||||
'ょ': 0x49,
|
||||
'っ': 0x4A,
|
||||
'ぁ': 0x4B,
|
||||
'ぃ': 0x4C,
|
||||
'ぅ': 0x4D,
|
||||
'ぇ': 0x4E,
|
||||
'ぉ': 0x4F,
|
||||
'ア': 0x50,
|
||||
'イ': 0x51,
|
||||
'ウ': 0x52,
|
||||
'エ': 0x53,
|
||||
'オ': 0x54,
|
||||
'ヤ': 0x55,
|
||||
'ユ': 0x56,
|
||||
'ヨ': 0x57,
|
||||
'カ': 0x58,
|
||||
'キ': 0x59,
|
||||
'ク': 0x5A,
|
||||
'ケ': 0x5B,
|
||||
'コ': 0x5C,
|
||||
'ワ': 0x5D,
|
||||
'ヲ': 0x5E,
|
||||
'ン': 0x5F,
|
||||
'サ': 0x60,
|
||||
'シ': 0x61,
|
||||
'ス': 0x62,
|
||||
'セ': 0x63,
|
||||
'ソ': 0x64,
|
||||
'ガ': 0x65,
|
||||
'ギ': 0x66,
|
||||
'グ': 0x67,
|
||||
'タ': 0x68,
|
||||
'チ': 0x69,
|
||||
'ツ': 0x6A,
|
||||
'テ': 0x6B,
|
||||
'ト': 0x6C,
|
||||
'ゲ': 0x6D,
|
||||
'ゴ': 0x6E,
|
||||
'ザ': 0x6F,
|
||||
'ナ': 0x70,
|
||||
'ニ': 0x71,
|
||||
'ヌ': 0x72,
|
||||
'ネ': 0x73,
|
||||
'ノ': 0x74,
|
||||
'ジ': 0x75,
|
||||
'ズ': 0x76,
|
||||
'ゼ': 0x77,
|
||||
'ハ': 0x78,
|
||||
'ヒ': 0x79,
|
||||
'フ': 0x7A,
|
||||
'ヘ': 0x7B,
|
||||
'ホ': 0x7C,
|
||||
'ゾ': 0x7D,
|
||||
'ダ': 0x7E,
|
||||
'マ': 0x80,
|
||||
'ミ': 0x81,
|
||||
'ム': 0x82,
|
||||
'メ': 0x83,
|
||||
'モ': 0x84,
|
||||
'ヅ': 0x85,
|
||||
'デ': 0x86,
|
||||
'ド': 0x87,
|
||||
'ラ': 0x88,
|
||||
'リ': 0x89,
|
||||
'ル': 0x8A,
|
||||
'レ': 0x8B,
|
||||
'ロ': 0x8C,
|
||||
'バ': 0x8D,
|
||||
'ビ': 0x8E,
|
||||
'ブ': 0x8F,
|
||||
'ベ': 0x90,
|
||||
'ボ': 0x91,
|
||||
'パ': 0x92,
|
||||
'ピ': 0x93,
|
||||
'プ': 0x94,
|
||||
'ペ': 0x95,
|
||||
'ポ': 0x96,
|
||||
'ャ': 0x97,
|
||||
'ュ': 0x98,
|
||||
'ョ': 0x99,
|
||||
'ッ': 0x9A,
|
||||
'ァ': 0x9B,
|
||||
'ィ': 0x9C,
|
||||
'ゥ': 0x9D,
|
||||
'ェ': 0x9E,
|
||||
'ォ': 0x9F}
|
||||
|
||||
|
||||
def char_to_alttp_char(char):
|
||||
if 0x30 <= ord(char) <= 0x39:
|
||||
return ord(char) + 0x70
|
||||
|
||||
if 0x41 <= ord(char) <= 0x5A:
|
||||
return ord(char) + 0x69
|
||||
|
||||
return char_map.get(char, 0xFF)
|
||||
|
||||
class TextMapper(object):
|
||||
number_offset = None
|
||||
alpha_offset = 0
|
||||
|
@ -835,6 +627,209 @@ class TextMapper(object):
|
|||
buf.append(cls.map_char(char))
|
||||
return buf
|
||||
|
||||
class RawMBTextMapper(TextMapper):
|
||||
char_map = {' ': 0xFF,
|
||||
'?': 0xC6,
|
||||
'!': 0xC7,
|
||||
',': 0xC8,
|
||||
'-': 0xC9,
|
||||
'…': 0xCC,
|
||||
'.': 0xCD,
|
||||
'~': 0xCE,
|
||||
'~': 0xCE,
|
||||
'@': [0x6A], # Links name (only works if compressed)
|
||||
'>': [0x00, 0xD2, 0x00, 0xD3], # Link's face
|
||||
"'": 0xD8,
|
||||
'’': 0xD8,
|
||||
'%': 0xDD, # Hylian Bird
|
||||
'^': 0xDE, # Hylian Ankh
|
||||
'=': 0xDF, # Hylian Wavy Lines
|
||||
'↑': 0xE0,
|
||||
'↓': 0xE1,
|
||||
'→': 0xE2,
|
||||
'←': 0xE3,
|
||||
'≥': 0xE4, # Cursor
|
||||
'¼': [0x00, 0xE5, 0x00, 0xE7], # ¼ heart
|
||||
'½': [0x00, 0xE6, 0x00, 0xE7], # ½ heart
|
||||
'¾': [0x00, 0xE8, 0x00, 0xE9], # ¾ heart
|
||||
'♥': [0x00, 0xEA, 0x00, 0xEB], # full heart
|
||||
'ᚋ': [0x6C, 0x00], # var 0
|
||||
'ᚌ': [0x6C, 0x01], # var 1
|
||||
'ᚍ': [0x6C, 0x02], # var 2
|
||||
'ᚎ': [0x6C, 0x03], # var 3
|
||||
'あ': 0x00,
|
||||
'い': 0x01,
|
||||
'う': 0x02,
|
||||
'え': 0x03,
|
||||
'お': 0x04,
|
||||
'や': 0x05,
|
||||
'ゆ': 0x06,
|
||||
'よ': 0x07,
|
||||
'か': 0x08,
|
||||
'き': 0x09,
|
||||
'く': 0x0A,
|
||||
'け': 0x0B,
|
||||
'こ': 0x0C,
|
||||
'わ': 0x0D,
|
||||
'を': 0x0E,
|
||||
'ん': 0x0F,
|
||||
'さ': 0x10,
|
||||
'し': 0x11,
|
||||
'す': 0x12,
|
||||
'せ': 0x13,
|
||||
'そ': 0x14,
|
||||
'が': 0x15,
|
||||
'ぎ': 0x16,
|
||||
'ぐ': 0x17,
|
||||
'た': 0x18,
|
||||
'ち': 0x19,
|
||||
'つ': 0x1A,
|
||||
'て': 0x1B,
|
||||
'と': 0x1C,
|
||||
'げ': 0x1D,
|
||||
'ご': 0x1E,
|
||||
'ざ': 0x1F,
|
||||
'な': 0x20,
|
||||
'に': 0x21,
|
||||
'ぬ': 0x22,
|
||||
'ね': 0x23,
|
||||
'の': 0x24,
|
||||
'じ': 0x25,
|
||||
'ず': 0x26,
|
||||
'ぜ': 0x27,
|
||||
'は': 0x28,
|
||||
'ひ': 0x29,
|
||||
'ふ': 0x2A,
|
||||
'へ': 0x2B,
|
||||
'ほ': 0x2C,
|
||||
'ぞ': 0x2D,
|
||||
'だ': 0x2E,
|
||||
'ぢ': 0x2F,
|
||||
'ま': 0x30,
|
||||
'み': 0x31,
|
||||
'む': 0x32,
|
||||
'め': 0x33,
|
||||
'も': 0x34,
|
||||
'づ': 0x35,
|
||||
'で': 0x36,
|
||||
'ど': 0x37,
|
||||
'ら': 0x38,
|
||||
'り': 0x39,
|
||||
'る': 0x3A,
|
||||
'れ': 0x3B,
|
||||
'ろ': 0x3C,
|
||||
'ば': 0x3D,
|
||||
'び': 0x3E,
|
||||
'ぶ': 0x3F,
|
||||
'べ': 0x40,
|
||||
'ぼ': 0x41,
|
||||
'ぱ': 0x42,
|
||||
'ぴ': 0x43,
|
||||
'ぷ': 0x44,
|
||||
'ぺ': 0x45,
|
||||
'ぽ': 0x46,
|
||||
'ゃ': 0x47,
|
||||
'ゅ': 0x48,
|
||||
'ょ': 0x49,
|
||||
'っ': 0x4A,
|
||||
'ぁ': 0x4B,
|
||||
'ぃ': 0x4C,
|
||||
'ぅ': 0x4D,
|
||||
'ぇ': 0x4E,
|
||||
'ぉ': 0x4F,
|
||||
'ア': 0x50,
|
||||
'イ': 0x51,
|
||||
'ウ': 0x52,
|
||||
'エ': 0x53,
|
||||
'オ': 0x54,
|
||||
'ヤ': 0x55,
|
||||
'ユ': 0x56,
|
||||
'ヨ': 0x57,
|
||||
'カ': 0x58,
|
||||
'キ': 0x59,
|
||||
'ク': 0x5A,
|
||||
'ケ': 0x5B,
|
||||
'コ': 0x5C,
|
||||
'ワ': 0x5D,
|
||||
'ヲ': 0x5E,
|
||||
'ン': 0x5F,
|
||||
'サ': 0x60,
|
||||
'シ': 0x61,
|
||||
'ス': 0x62,
|
||||
'セ': 0x63,
|
||||
'ソ': 0x64,
|
||||
'ガ': 0x65,
|
||||
'ギ': 0x66,
|
||||
'グ': 0x67,
|
||||
'タ': 0x68,
|
||||
'チ': 0x69,
|
||||
'ツ': 0x6A,
|
||||
'テ': 0x6B,
|
||||
'ト': 0x6C,
|
||||
'ゲ': 0x6D,
|
||||
'ゴ': 0x6E,
|
||||
'ザ': 0x6F,
|
||||
'ナ': 0x70,
|
||||
'ニ': 0x71,
|
||||
'ヌ': 0x72,
|
||||
'ネ': 0x73,
|
||||
'ノ': 0x74,
|
||||
'ジ': 0x75,
|
||||
'ズ': 0x76,
|
||||
'ゼ': 0x77,
|
||||
'ハ': 0x78,
|
||||
'ヒ': 0x79,
|
||||
'フ': 0x7A,
|
||||
'ヘ': 0x7B,
|
||||
'ホ': 0x7C,
|
||||
'ゾ': 0x7D,
|
||||
'ダ': 0x7E,
|
||||
'マ': 0x80,
|
||||
'ミ': 0x81,
|
||||
'ム': 0x82,
|
||||
'メ': 0x83,
|
||||
'モ': 0x84,
|
||||
'ヅ': 0x85,
|
||||
'デ': 0x86,
|
||||
'ド': 0x87,
|
||||
'ラ': 0x88,
|
||||
'リ': 0x89,
|
||||
'ル': 0x8A,
|
||||
'レ': 0x8B,
|
||||
'ロ': 0x8C,
|
||||
'バ': 0x8D,
|
||||
'ビ': 0x8E,
|
||||
'ブ': 0x8F,
|
||||
'ベ': 0x90,
|
||||
'ボ': 0x91,
|
||||
'パ': 0x92,
|
||||
'ピ': 0x93,
|
||||
'プ': 0x94,
|
||||
'ペ': 0x95,
|
||||
'ポ': 0x96,
|
||||
'ャ': 0x97,
|
||||
'ュ': 0x98,
|
||||
'ョ': 0x99,
|
||||
'ッ': 0x9A,
|
||||
'ァ': 0x9B,
|
||||
'ィ': 0x9C,
|
||||
'ゥ': 0x9D,
|
||||
'ェ': 0x9E,
|
||||
'ォ': 0x9F}
|
||||
alpha_offset = 0x69
|
||||
number_offset = 0x70
|
||||
|
||||
@classmethod
|
||||
def convert(cls, text):
|
||||
buf = bytearray()
|
||||
for char in text.lower():
|
||||
res = cls.map_char(char)
|
||||
if isinstance(res, int):
|
||||
buf.extend([0x00, res])
|
||||
else:
|
||||
buf.extend(res)
|
||||
return buf
|
||||
|
||||
|
||||
class GoldCreditMapper(TextMapper):
|
||||
char_map = {' ': 0x9F,
|
||||
|
|
Loading…
Reference in New Issue