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
							 |