Refactor multibyte text code to use a TextMapper

This commit is contained in:
Kevin Cathcart 2018-03-10 11:57:04 -05:00
parent ed6d66acd9
commit 93f77ddde3
1 changed files with 205 additions and 210 deletions

415
Text.py
View File

@ -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,