Archipelago/worlds/pokemon_rb/text.py

148 lines
3.1 KiB
Python
Raw Normal View History

special_chars = {
"PKMN": 0x4A,
"'d": 0xBB,
"'l": 0xBC,
"'t": 0xBE,
"'v": 0xBF,
"PK": 0xE1,
"MN": 0xE2,
"'r": 0xE4,
"'m": 0xE5,
"MALE": 0xEF,
"FEMALE": 0xF5,
}
char_map = {
"@": 0x50, # String terminator
"#": 0x54, # Poké
"": 0x70,
"": 0x71,
"": 0x72,
"": 0x73,
"·": 0x74,
"": 0x75,
" ": 0x7F,
"A": 0x80,
"B": 0x81,
"C": 0x82,
"D": 0x83,
"E": 0x84,
"F": 0x85,
"G": 0x86,
"H": 0x87,
"I": 0x88,
"J": 0x89,
"K": 0x8A,
"L": 0x8B,
"M": 0x8C,
"N": 0x8D,
"O": 0x8E,
"P": 0x8F,
"Q": 0x90,
"R": 0x91,
"S": 0x92,
"T": 0x93,
"U": 0x94,
"V": 0x95,
"W": 0x96,
"X": 0x97,
"Y": 0x98,
"Z": 0x99,
"(": 0x9A,
")": 0x9B,
":": 0x9C,
";": 0x9D,
"[": 0x9E,
"]": 0x9F,
"a": 0xA0,
"b": 0xA1,
"c": 0xA2,
"d": 0xA3,
"e": 0xA4,
"f": 0xA5,
"g": 0xA6,
"h": 0xA7,
"i": 0xA8,
"j": 0xA9,
"k": 0xAA,
"l": 0xAB,
"m": 0xAC,
"n": 0xAD,
"o": 0xAE,
"p": 0xAF,
"q": 0xB0,
"r": 0xB1,
"s": 0xB2,
"t": 0xB3,
"u": 0xB4,
"v": 0xB5,
"w": 0xB6,
"x": 0xB7,
"y": 0xB8,
"z": 0xB9,
"é": 0xBA,
"'": 0xE0,
"-": 0xE3,
"?": 0xE6,
"!": 0xE7,
".": 0xE8,
"": 0xEF,
"¥": 0xF0,
"$": 0xF0,
"×": 0xF1,
"/": 0xF3,
",": 0xF4,
"": 0xF5,
"0": 0xF6,
"1": 0xF7,
"2": 0xF8,
"3": 0xF9,
"4": 0xFA,
"5": 0xFB,
"6": 0xFC,
"7": 0xFD,
"8": 0xFE,
"9": 0xFF,
}
unsafe_chars = ["@", "#", "PKMN"]
def encode_text(text: str, length: int=0, whitespace=False, force=False, safety=False):
encoded_text = bytearray()
spec_char = ""
special = False
for char in text:
if char == ">":
if spec_char in unsafe_chars and safety:
raise KeyError(f"Disallowed Pokemon text special character '<{spec_char}>'")
try:
encoded_text.append(special_chars[spec_char])
except KeyError:
if force:
encoded_text.append(char_map[" "])
else:
raise KeyError(f"Invalid Pokemon text special character '<{spec_char}>'")
spec_char = ""
special = False
elif char == "<":
spec_char = ""
special = True
elif special is True:
spec_char += char
else:
if char in unsafe_chars and safety:
raise KeyError(f"Disallowed Pokemon text character '{char}'")
try:
encoded_text.append(char_map[char])
except KeyError:
if force:
encoded_text.append(char_map[" "])
else:
raise KeyError(f"Invalid Pokemon text character '{char}'")
if length > 0:
encoded_text = encoded_text[:length]
while whitespace and len(encoded_text) < length:
encoded_text.append(char_map[" " if whitespace is True else whitespace])
return encoded_text