58 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			58 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
	
from .itemInfo import ItemInfo
 | 
						|
from .constants import *
 | 
						|
patched_already = {}
 | 
						|
 | 
						|
class DroppedKey(ItemInfo):
 | 
						|
    default_item = None
 | 
						|
 | 
						|
    def __init__(self, room=None):
 | 
						|
        extra = None
 | 
						|
        if room == 0x169:  # Room in D4 where the key drops down the hole into the sidescroller
 | 
						|
            extra = 0x017C
 | 
						|
        elif room == 0x166:  # D4 boss, also place the item in out real boss room.
 | 
						|
            extra = 0x01ff
 | 
						|
        elif room == 0x223:  # D7 boss, also place the item in our real boss room.
 | 
						|
            extra = 0x02E8
 | 
						|
        elif room == 0x092:  # Marins song
 | 
						|
            extra = 0x00DC
 | 
						|
        elif room == 0x0CE:
 | 
						|
            extra = 0x01F8
 | 
						|
        super().__init__(room, extra)
 | 
						|
    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 option[-1] == 'P':
 | 
						|
                print(option)
 | 
						|
            if self._location.dungeon == int(option[-1]) and multiworld is None and self.room not in {0x166, 0x223}:
 | 
						|
                option = option[:-1]
 | 
						|
        rom.banks[0x3E][self.room + 0x3800] = CHEST_ITEMS[option]
 | 
						|
        #assert room not in patched_already, f"{self} {patched_already[room]}"
 | 
						|
        #patched_already[room] = self
 | 
						|
 | 
						|
 | 
						|
        if self.extra:
 | 
						|
            assert(not self.default_item)
 | 
						|
            rom.banks[0x3E][self.extra + 0x3800] = CHEST_ITEMS[option]
 | 
						|
 | 
						|
        if multiworld is not None:
 | 
						|
            rom.banks[0x3E][0x3300 + self.room] = multiworld
 | 
						|
            
 | 
						|
            if self.extra:
 | 
						|
                rom.banks[0x3E][0x3300 + self.extra] = multiworld
 | 
						|
 | 
						|
    def read(self, rom):
 | 
						|
        assert self._location is not None, hex(self.room)
 | 
						|
        value = rom.banks[0x3E][self.room + 0x3800]
 | 
						|
        for k, v in CHEST_ITEMS.items():
 | 
						|
            if v == value:
 | 
						|
                if k in [MAP, COMPASS, STONE_BEAK, NIGHTMARE_KEY, KEY]:
 | 
						|
                    assert self._location.dungeon is not None, "Dungeon item outside of dungeon? %r" % (self)
 | 
						|
                    return "%s%d" % (k, self._location.dungeon)
 | 
						|
                return k
 | 
						|
        raise ValueError("Could not find chest contents in ROM (0x%02x)" % (value))
 | 
						|
 | 
						|
    def __repr__(self):
 | 
						|
        if self._location and self._location.dungeon:
 | 
						|
            return "%s:%03x:%d" % (self.__class__.__name__, self.room, self._location.dungeon)
 | 
						|
        else:
 | 
						|
            return "%s:%03x" % (self.__class__.__name__, self.room)
 |