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
 |