* move special cases to be outside strict * Update text.py * fix wily machine edge case, incorrect weapons, and time stopper failsafe * bump world version * weakness checking is inclusive * Update __init__.py * add air shooter to edge case validation
		
			
				
	
	
		
			91 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			91 lines
		
	
	
		
			1.7 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
from typing import DefaultDict
 | 
						|
from collections import defaultdict
 | 
						|
 | 
						|
MM2_WEAPON_ENCODING: DefaultDict[str, int] = defaultdict(lambda: 0x6F, {
 | 
						|
    ' ': 0x40,
 | 
						|
    'A': 0x41,
 | 
						|
    'B': 0x42,
 | 
						|
    'C': 0x43,
 | 
						|
    'D': 0x44,
 | 
						|
    'E': 0x45,
 | 
						|
    'F': 0x46,
 | 
						|
    'G': 0x47,
 | 
						|
    'H': 0x48,
 | 
						|
    'I': 0x49,
 | 
						|
    'J': 0x4A,
 | 
						|
    'K': 0x4B,
 | 
						|
    'L': 0x4C,
 | 
						|
    'M': 0x4D,
 | 
						|
    'N': 0x4E,
 | 
						|
    'O': 0x4F,
 | 
						|
    'P': 0x50,
 | 
						|
    'Q': 0x51,
 | 
						|
    'R': 0x52,
 | 
						|
    'S': 0x53,
 | 
						|
    'T': 0x54,
 | 
						|
    'U': 0x55,
 | 
						|
    'V': 0x56,
 | 
						|
    'W': 0x57,
 | 
						|
    'X': 0x58,
 | 
						|
    'Y': 0x59,
 | 
						|
    'Z': 0x5A,
 | 
						|
    # 0x5B is the small r in Dr Light
 | 
						|
    '.': 0x5C,
 | 
						|
    ',': 0x5D,
 | 
						|
    '\'': 0x5E,
 | 
						|
    '!': 0x5F,
 | 
						|
    '(': 0x60,
 | 
						|
    ')': 0x61,
 | 
						|
    '#': 0x62,
 | 
						|
    '$': 0x63,
 | 
						|
    '%': 0x64,
 | 
						|
    '&': 0x65,
 | 
						|
    '*': 0x66,
 | 
						|
    '+': 0x67,
 | 
						|
    '/': 0x68,
 | 
						|
    '\\': 0x69,
 | 
						|
    ':': 0x6A,
 | 
						|
    ';': 0x6B,
 | 
						|
    '<': 0x6C,
 | 
						|
    '>': 0x6D,
 | 
						|
    '=': 0x6E,
 | 
						|
    '?': 0x6F,
 | 
						|
    '@': 0x70,
 | 
						|
    '[': 0x71,
 | 
						|
    ']': 0x72,
 | 
						|
    '^': 0x73,
 | 
						|
    '_': 0x74,
 | 
						|
    '`': 0x75,
 | 
						|
    '{': 0x76,
 | 
						|
    '}': 0x77,
 | 
						|
    '|': 0x78,
 | 
						|
    '~': 0x79,
 | 
						|
    '\"': 0x92,
 | 
						|
    '-': 0x94,
 | 
						|
    '0': 0xA0,
 | 
						|
    '1': 0xA1,
 | 
						|
    '2': 0xA2,
 | 
						|
    '3': 0xA3,
 | 
						|
    '4': 0xA4,
 | 
						|
    '5': 0xA5,
 | 
						|
    '6': 0xA6,
 | 
						|
    '7': 0xA7,
 | 
						|
    '8': 0xA8,
 | 
						|
    '9': 0xA9,
 | 
						|
})
 | 
						|
 | 
						|
 | 
						|
class MM2TextEntry:
 | 
						|
    def __init__(self, text: str = "", coords: int = 0x0B):
 | 
						|
        self.target_area: int = 0x25  # don't change
 | 
						|
        self.coords: int = coords  # 0xYX, Y can only be increments of 0x20
 | 
						|
        self.text: str = text
 | 
						|
 | 
						|
    def resolve(self) -> bytes:
 | 
						|
        data = bytearray()
 | 
						|
        data.append(self.target_area)
 | 
						|
        data.append(self.coords)
 | 
						|
        data.extend([MM2_WEAPON_ENCODING[x] for x in self.text.upper()])
 | 
						|
        data.extend([0x40] * (14 - len(self.text)))
 | 
						|
        return bytes(data)
 |