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