156 lines
3.3 KiB
Python
156 lines
3.3 KiB
Python
special_chars = {
|
||
"PKMN": 0x4A,
|
||
"LINE": 0x4F,
|
||
"PARA": 0x51,
|
||
"CONT": 0x55,
|
||
"DONE": 0x57,
|
||
"PROMPT": 0x58,
|
||
"'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,
|
||
"+": 0xEA,
|
||
"=": 0xEB,
|
||
"♂": 0xEF,
|
||
"¥": 0xF0,
|
||
"$": 0xF0,
|
||
"×": 0xF1,
|
||
"*": 0xF1, # alias
|
||
"/": 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", "LINE", "DONE", "CONT", "PROMPT"]
|
||
|
||
|
||
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 == ">":
|
||
try:
|
||
if spec_char in unsafe_chars and safety:
|
||
raise KeyError(f"Disallowed Pokemon text special character '<{spec_char}>'")
|
||
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:
|
||
try:
|
||
encoded_text.append(char_map[char])
|
||
if char in unsafe_chars and safety:
|
||
raise KeyError(f"Disallowed Pokemon text character '{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
|