148 lines
3.1 KiB
Python
148 lines
3.1 KiB
Python
|
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
|