51 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from .itemInfo import ItemInfo
							 | 
						||
| 
								 | 
							
								from .constants import *
							 | 
						||
| 
								 | 
							
								from ..assembler import ASM
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class Chest(ItemInfo):
							 | 
						||
| 
								 | 
							
								    def __init__(self, room):
							 | 
						||
| 
								 | 
							
								        super().__init__(room)
							 | 
						||
| 
								 | 
							
								        self.addr = room + 0x560
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def patch(self, rom, option, *, multiworld=None):
							 | 
						||
| 
								 | 
							
								        rom.banks[0x14][self.addr] = CHEST_ITEMS[option]
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if self.room == 0x1B6:
							 | 
						||
| 
								 | 
							
								            # Patch the code that gives the nightmare key when you throw the pot at the chest in dungeon 6
							 | 
						||
| 
								 | 
							
								            # As this is hardcoded for a specific chest type
							 | 
						||
| 
								 | 
							
								            rom.patch(3, 0x145D, ASM("ld a, $19"), ASM("ld a, $%02x" % (CHEST_ITEMS[option])))
							 | 
						||
| 
								 | 
							
								        if multiworld is not None:
							 | 
						||
| 
								 | 
							
								            rom.banks[0x3E][0x3300 + self.room] = multiworld
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def read(self, rom):
							 | 
						||
| 
								 | 
							
								        value = rom.banks[0x14][self.addr]
							 | 
						||
| 
								 | 
							
								        for k, v in CHEST_ITEMS.items():
							 | 
						||
| 
								 | 
							
								            if v == value:
							 | 
						||
| 
								 | 
							
								                return k
							 | 
						||
| 
								 | 
							
								        raise ValueError("Could not find chest contents in ROM (0x%02x)" % (value))
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __repr__(self):
							 | 
						||
| 
								 | 
							
								        return "%s:%03x" % (self.__class__.__name__, self.room)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								class DungeonChest(Chest):
							 | 
						||
| 
								 | 
							
								    def patch(self, rom, option, *, multiworld=None):
							 | 
						||
| 
								 | 
							
								        if (option.startswith(MAP) and option != MAP) \
							 | 
						||
| 
								 | 
							
								                or (option.startswith(COMPASS)  and option != COMPASS) \
							 | 
						||
| 
								 | 
							
								                or (option.startswith(STONE_BEAK) and option != STONE_BEAK) \
							 | 
						||
| 
								 | 
							
								                    or (option.startswith(NIGHTMARE_KEY) and option != NIGHTMARE_KEY) \
							 | 
						||
| 
								 | 
							
								                    or (option.startswith(KEY) and option != KEY):
							 | 
						||
| 
								 | 
							
								            if self._location.dungeon == int(option[-1]) and multiworld is None:
							 | 
						||
| 
								 | 
							
								                option = option[:-1]
							 | 
						||
| 
								 | 
							
								        super().patch(rom, option, multiworld=multiworld)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def read(self, rom):
							 | 
						||
| 
								 | 
							
								        result = super().read(rom)
							 | 
						||
| 
								 | 
							
								        if result in [MAP, COMPASS, STONE_BEAK, NIGHTMARE_KEY, KEY]:
							 | 
						||
| 
								 | 
							
								            return "%s%d" % (result, self._location.dungeon)
							 | 
						||
| 
								 | 
							
								        return result
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    def __repr__(self):
							 | 
						||
| 
								 | 
							
								        return "%s:%03x:%d" % (self.__class__.__name__, self.room, self._location.dungeon)
							 |