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) |