Core: cleanup Item classes (#849)
This commit is contained in:
parent
dd6e212519
commit
f6da81ac70
|
@ -1144,31 +1144,21 @@ class ItemClassification(IntFlag):
|
||||||
|
|
||||||
|
|
||||||
class Item:
|
class Item:
|
||||||
location: Optional[Location] = None
|
|
||||||
code: Optional[int] = None # an item with ID None is called an Event, and does not get written to multidata
|
|
||||||
name: str
|
|
||||||
game: str = "Generic"
|
game: str = "Generic"
|
||||||
type: str = None
|
__slots__ = ("name", "classification", "code", "player", "location")
|
||||||
|
name: str
|
||||||
classification: ItemClassification
|
classification: ItemClassification
|
||||||
|
code: Optional[int]
|
||||||
# need to find a decent place for these to live and to allow other games to register texts if they want.
|
"""an item with code None is called an Event, and does not get written to multidata"""
|
||||||
pedestal_credit_text: str = "and the Unknown Item"
|
player: int
|
||||||
sickkid_credit_text: Optional[str] = None
|
location: Optional[Location]
|
||||||
magicshop_credit_text: Optional[str] = None
|
|
||||||
zora_credit_text: Optional[str] = None
|
|
||||||
fluteboy_credit_text: Optional[str] = None
|
|
||||||
|
|
||||||
# hopefully temporary attributes to satisfy legacy LttP code, proper implementation in subclass ALttPItem
|
|
||||||
smallkey: bool = False
|
|
||||||
bigkey: bool = False
|
|
||||||
map: bool = False
|
|
||||||
compass: bool = False
|
|
||||||
|
|
||||||
def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int):
|
def __init__(self, name: str, classification: ItemClassification, code: Optional[int], player: int):
|
||||||
self.name = name
|
self.name = name
|
||||||
self.classification = classification
|
self.classification = classification
|
||||||
self.player = player
|
self.player = player
|
||||||
self.code = code
|
self.code = code
|
||||||
|
self.location = None
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def hint_text(self) -> str:
|
def hint_text(self) -> str:
|
||||||
|
|
|
@ -51,6 +51,11 @@ class ItemData(typing.NamedTuple):
|
||||||
flute_boy_credit: typing.Optional[str]
|
flute_boy_credit: typing.Optional[str]
|
||||||
hint_text: typing.Optional[str]
|
hint_text: typing.Optional[str]
|
||||||
|
|
||||||
|
def as_init_dict(self) -> typing.Dict[str, typing.Any]:
|
||||||
|
return {key: getattr(self, key) for key in
|
||||||
|
('classification', 'type', 'item_code', 'pedestal_hint', 'hint_text')}
|
||||||
|
|
||||||
|
|
||||||
# Format: Name: (Advancement, Type, ItemCode, Pedestal Hint Text, Pedestal Credit Text, Sick Kid Credit Text, Zora Credit Text, Witch Credit Text, Flute Boy Credit Text, Hint Text)
|
# Format: Name: (Advancement, Type, ItemCode, Pedestal Hint Text, Pedestal Credit Text, Sick Kid Credit Text, Zora Credit Text, Witch Credit Text, Flute Boy Credit Text, Hint Text)
|
||||||
item_table = {'Bow': ItemData(IC.progression, None, 0x0B, 'You have\nchosen the\narcher class.', 'the stick and twine', 'arrow-slinging kid', 'arrow sling for sale', 'witch and robin hood', 'archer boy shoots again', 'the Bow'),
|
item_table = {'Bow': ItemData(IC.progression, None, 0x0B, 'You have\nchosen the\narcher class.', 'the stick and twine', 'arrow-slinging kid', 'arrow sling for sale', 'witch and robin hood', 'archer boy shoots again', 'the Bow'),
|
||||||
'Progressive Bow': ItemData(IC.progression, None, 0x64, 'You have\nchosen the\narcher class.', 'the stick and twine', 'arrow-slinging kid', 'arrow sling for sale', 'witch and robin hood', 'archer boy shoots again', 'a Bow'),
|
'Progressive Bow': ItemData(IC.progression, None, 0x64, 'You have\nchosen the\narcher class.', 'the stick and twine', 'arrow-slinging kid', 'arrow sling for sale', 'witch and robin hood', 'archer boy shoots again', 'a Bow'),
|
||||||
|
@ -218,7 +223,7 @@ item_table = {'Bow': ItemData(IC.progression, None, 0x0B, 'You have\nchosen the\
|
||||||
'Open Floodgate': ItemData(IC.progression, 'Event', None, None, None, None, None, None, None, None),
|
'Open Floodgate': ItemData(IC.progression, 'Event', None, None, None, None, None, None, None, None),
|
||||||
}
|
}
|
||||||
|
|
||||||
as_dict_item_table = {name: data._asdict() for name, data in item_table.items()}
|
item_init_table = {name: data.as_init_dict() for name, data in item_table.items()}
|
||||||
|
|
||||||
progression_mapping = {
|
progression_mapping = {
|
||||||
"Golden Sword": ("Progressive Sword", 4),
|
"Golden Sword": ("Progressive Sword", 4),
|
||||||
|
|
|
@ -2091,7 +2091,9 @@ def write_string_to_rom(rom, target, string):
|
||||||
|
|
||||||
|
|
||||||
def write_strings(rom, world, player):
|
def write_strings(rom, world, player):
|
||||||
|
from . import ALTTPWorld
|
||||||
local_random = world.slot_seeds[player]
|
local_random = world.slot_seeds[player]
|
||||||
|
w: ALTTPWorld = world.worlds[player]
|
||||||
|
|
||||||
tt = TextTable()
|
tt = TextTable()
|
||||||
tt.removeUnwantedText()
|
tt.removeUnwantedText()
|
||||||
|
@ -2420,7 +2422,8 @@ def write_strings(rom, world, player):
|
||||||
pedestal_text = 'Some Hot Air' if pedestalitem is None else hint_text(pedestalitem,
|
pedestal_text = 'Some Hot Air' if pedestalitem is None else hint_text(pedestalitem,
|
||||||
True) if pedestalitem.pedestal_hint_text is not None else 'Unknown Item'
|
True) if pedestalitem.pedestal_hint_text is not None else 'Unknown Item'
|
||||||
tt['mastersword_pedestal_translated'] = pedestal_text
|
tt['mastersword_pedestal_translated'] = pedestal_text
|
||||||
pedestal_credit_text = 'and the Hot Air' if pedestalitem is None else pedestalitem.pedestal_credit_text if pedestalitem.pedestal_credit_text is not None else 'and the Unknown Item'
|
pedestal_credit_text = 'and the Hot Air' if pedestalitem is None else \
|
||||||
|
w.pedestal_credit_texts.get(pedestalitem.code, 'and the Unknown Item')
|
||||||
|
|
||||||
etheritem = world.get_location('Ether Tablet', player).item
|
etheritem = world.get_location('Ether Tablet', player).item
|
||||||
ether_text = 'Some Hot Air' if etheritem is None else hint_text(etheritem,
|
ether_text = 'Some Hot Air' if etheritem is None else hint_text(etheritem,
|
||||||
|
@ -2448,20 +2451,24 @@ def write_strings(rom, world, player):
|
||||||
credits = Credits()
|
credits = Credits()
|
||||||
|
|
||||||
sickkiditem = world.get_location('Sick Kid', player).item
|
sickkiditem = world.get_location('Sick Kid', player).item
|
||||||
sickkiditem_text = local_random.choice(
|
sickkiditem_text = local_random.choice(SickKid_texts) \
|
||||||
SickKid_texts) if sickkiditem is None or sickkiditem.sickkid_credit_text is None else sickkiditem.sickkid_credit_text
|
if sickkiditem is None or sickkiditem.code not in w.sickkid_credit_texts \
|
||||||
|
else w.sickkid_credit_texts[sickkiditem.code]
|
||||||
|
|
||||||
zoraitem = world.get_location('King Zora', player).item
|
zoraitem = world.get_location('King Zora', player).item
|
||||||
zoraitem_text = local_random.choice(
|
zoraitem_text = local_random.choice(Zora_texts) \
|
||||||
Zora_texts) if zoraitem is None or zoraitem.zora_credit_text is None else zoraitem.zora_credit_text
|
if zoraitem is None or zoraitem.code not in w.zora_credit_texts \
|
||||||
|
else w.zora_credit_texts[zoraitem.code]
|
||||||
|
|
||||||
magicshopitem = world.get_location('Potion Shop', player).item
|
magicshopitem = world.get_location('Potion Shop', player).item
|
||||||
magicshopitem_text = local_random.choice(
|
magicshopitem_text = local_random.choice(MagicShop_texts) \
|
||||||
MagicShop_texts) if magicshopitem is None or magicshopitem.magicshop_credit_text is None else magicshopitem.magicshop_credit_text
|
if magicshopitem is None or magicshopitem.code not in w.magicshop_credit_texts \
|
||||||
|
else w.magicshop_credit_texts[magicshopitem.code]
|
||||||
|
|
||||||
fluteboyitem = world.get_location('Flute Spot', player).item
|
fluteboyitem = world.get_location('Flute Spot', player).item
|
||||||
fluteboyitem_text = local_random.choice(
|
fluteboyitem_text = local_random.choice(FluteBoy_texts) \
|
||||||
FluteBoy_texts) if fluteboyitem is None or fluteboyitem.fluteboy_credit_text is None else fluteboyitem.fluteboy_credit_text
|
if fluteboyitem is None or fluteboyitem.code not in w.fluteboy_credit_texts \
|
||||||
|
else w.fluteboy_credit_texts[fluteboyitem.code]
|
||||||
|
|
||||||
credits.update_credits_line('castle', 0, local_random.choice(KingsReturn_texts))
|
credits.update_credits_line('castle', 0, local_random.choice(KingsReturn_texts))
|
||||||
credits.update_credits_line('sanctuary', 0, local_random.choice(Sanctuary_texts))
|
credits.update_credits_line('sanctuary', 0, local_random.choice(Sanctuary_texts))
|
||||||
|
|
|
@ -18,19 +18,16 @@ class ALttPLocation(Location):
|
||||||
|
|
||||||
class ALttPItem(Item):
|
class ALttPItem(Item):
|
||||||
game: str = "A Link to the Past"
|
game: str = "A Link to the Past"
|
||||||
|
type: Optional[str]
|
||||||
|
_pedestal_hint_text: Optional[str]
|
||||||
|
_hint_text: Optional[str]
|
||||||
dungeon = None
|
dungeon = None
|
||||||
|
|
||||||
def __init__(self, name, player, classification=ItemClassification.filler, type=None, item_code=None, pedestal_hint=None,
|
def __init__(self, name, player, classification=ItemClassification.filler, type=None, item_code=None,
|
||||||
pedestal_credit=None, sick_kid_credit=None, zora_credit=None, witch_credit=None,
|
pedestal_hint=None, hint_text=None):
|
||||||
flute_boy_credit=None, hint_text=None):
|
|
||||||
super(ALttPItem, self).__init__(name, classification, item_code, player)
|
super(ALttPItem, self).__init__(name, classification, item_code, player)
|
||||||
self.type = type
|
self.type = type
|
||||||
self._pedestal_hint_text = pedestal_hint
|
self._pedestal_hint_text = pedestal_hint
|
||||||
self.pedestal_credit_text = pedestal_credit
|
|
||||||
self.sickkid_credit_text = sick_kid_credit
|
|
||||||
self.zora_credit_text = zora_credit
|
|
||||||
self.magicshop_credit_text = witch_credit
|
|
||||||
self.fluteboy_credit_text = flute_boy_credit
|
|
||||||
self._hint_text = hint_text
|
self._hint_text = hint_text
|
||||||
|
|
||||||
@property
|
@property
|
||||||
|
|
|
@ -8,7 +8,7 @@ from BaseClasses import Item, CollectionState, Tutorial
|
||||||
from .SubClasses import ALttPItem
|
from .SubClasses import ALttPItem
|
||||||
from ..AutoWorld import World, WebWorld, LogicMixin
|
from ..AutoWorld import World, WebWorld, LogicMixin
|
||||||
from .Options import alttp_options, smallkey_shuffle
|
from .Options import alttp_options, smallkey_shuffle
|
||||||
from .Items import as_dict_item_table, item_name_groups, item_table, GetBeemizerItem
|
from .Items import item_init_table, item_name_groups, item_table, GetBeemizerItem
|
||||||
from .Regions import lookup_name_to_id, create_regions, mark_light_world_regions
|
from .Regions import lookup_name_to_id, create_regions, mark_light_world_regions
|
||||||
from .Rules import set_rules
|
from .Rules import set_rules
|
||||||
from .ItemPool import generate_itempool, difficulties
|
from .ItemPool import generate_itempool, difficulties
|
||||||
|
@ -124,6 +124,17 @@ class ALTTPWorld(World):
|
||||||
required_client_version = (0, 3, 2)
|
required_client_version = (0, 3, 2)
|
||||||
web = ALTTPWeb()
|
web = ALTTPWeb()
|
||||||
|
|
||||||
|
pedestal_credit_texts: typing.Dict[int, str] = \
|
||||||
|
{data.item_code: data.pedestal_credit for data in item_table.values() if data.pedestal_credit}
|
||||||
|
sickkid_credit_texts: typing.Dict[int, str] = \
|
||||||
|
{data.item_code: data.sick_kid_credit for data in item_table.values() if data.sick_kid_credit}
|
||||||
|
zora_credit_texts: typing.Dict[int, str] = \
|
||||||
|
{data.item_code: data.zora_credit for data in item_table.values() if data.zora_credit}
|
||||||
|
magicshop_credit_texts: typing.Dict[int, str] = \
|
||||||
|
{data.item_code: data.witch_credit for data in item_table.values() if data.witch_credit}
|
||||||
|
fluteboy_credit_texts: typing.Dict[int, str] = \
|
||||||
|
{data.item_code: data.flute_boy_credit for data in item_table.values() if data.flute_boy_credit}
|
||||||
|
|
||||||
set_rules = set_rules
|
set_rules = set_rules
|
||||||
|
|
||||||
create_items = generate_itempool
|
create_items = generate_itempool
|
||||||
|
@ -400,7 +411,7 @@ class ALTTPWorld(World):
|
||||||
multidata["connect_names"][new_name] = multidata["connect_names"][self.world.player_name[self.player]]
|
multidata["connect_names"][new_name] = multidata["connect_names"][self.world.player_name[self.player]]
|
||||||
|
|
||||||
def create_item(self, name: str) -> Item:
|
def create_item(self, name: str) -> Item:
|
||||||
return ALttPItem(name, self.player, **as_dict_item_table[name])
|
return ALttPItem(name, self.player, **item_init_table[name])
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def stage_fill_hook(cls, world, progitempool, nonexcludeditempool, localrestitempool, nonlocalrestitempool,
|
def stage_fill_hook(cls, world, progitempool, nonexcludeditempool, localrestitempool, nonlocalrestitempool,
|
||||||
|
|
|
@ -47,13 +47,12 @@ class ArchipIDLEWorld(World):
|
||||||
|
|
||||||
item_pool = []
|
item_pool = []
|
||||||
for i in range(100):
|
for i in range(100):
|
||||||
item = Item(
|
item = ArchipIDLEItem(
|
||||||
item_table_copy[i],
|
item_table_copy[i],
|
||||||
ItemClassification.progression if i < 20 else ItemClassification.filler,
|
ItemClassification.progression if i < 20 else ItemClassification.filler,
|
||||||
self.item_name_to_id[item_table_copy[i]],
|
self.item_name_to_id[item_table_copy[i]],
|
||||||
self.player
|
self.player
|
||||||
)
|
)
|
||||||
item.game = 'ArchipIDLE'
|
|
||||||
item_pool.append(item)
|
item_pool.append(item)
|
||||||
|
|
||||||
self.world.itempool += item_pool
|
self.world.itempool += item_pool
|
||||||
|
@ -93,6 +92,10 @@ def create_region(world: MultiWorld, player: int, name: str, locations=None, exi
|
||||||
return region
|
return region
|
||||||
|
|
||||||
|
|
||||||
|
class ArchipIDLEItem(Item):
|
||||||
|
game = "ArchipIDLE"
|
||||||
|
|
||||||
|
|
||||||
class ArchipIDLELocation(Location):
|
class ArchipIDLELocation(Location):
|
||||||
game: str = "ArchipIDLE"
|
game: str = "ArchipIDLE"
|
||||||
|
|
||||||
|
|
|
@ -632,8 +632,9 @@ class HKLocation(Location):
|
||||||
|
|
||||||
class HKItem(Item):
|
class HKItem(Item):
|
||||||
game = "Hollow Knight"
|
game = "Hollow Knight"
|
||||||
|
type: str
|
||||||
|
|
||||||
def __init__(self, name, advancement, code, type, player: int = None):
|
def __init__(self, name, advancement, code, type: str, player: int = None):
|
||||||
if name == "Mimic_Grub":
|
if name == "Mimic_Grub":
|
||||||
classification = ItemClassification.trap
|
classification = ItemClassification.trap
|
||||||
elif type in ("Grub", "DreamWarrior", "Root", "Egg"):
|
elif type in ("Grub", "DreamWarrior", "Root", "Egg"):
|
||||||
|
|
|
@ -6,14 +6,9 @@
|
||||||
import typing
|
import typing
|
||||||
|
|
||||||
from BaseClasses import Item, ItemClassification
|
from BaseClasses import Item, ItemClassification
|
||||||
|
from worlds.alttp import ALTTPWorld
|
||||||
|
|
||||||
|
|
||||||
# pedestal_credit_text: str = "and the Unknown Item"
|
|
||||||
# sickkid_credit_text: Optional[str] = None
|
|
||||||
# magicshop_credit_text: Optional[str] = None
|
|
||||||
# zora_credit_text: Optional[str] = None
|
|
||||||
# fluteboy_credit_text: Optional[str] = None
|
|
||||||
|
|
||||||
class MeritousLttPText(typing.NamedTuple):
|
class MeritousLttPText(typing.NamedTuple):
|
||||||
pedestal: typing.Optional[str]
|
pedestal: typing.Optional[str]
|
||||||
sickkid: typing.Optional[str]
|
sickkid: typing.Optional[str]
|
||||||
|
@ -143,6 +138,7 @@ LttPCreditsText = {
|
||||||
|
|
||||||
class MeritousItem(Item):
|
class MeritousItem(Item):
|
||||||
game: str = "Meritous"
|
game: str = "Meritous"
|
||||||
|
type: str
|
||||||
|
|
||||||
def __init__(self, name, advancement, code, player):
|
def __init__(self, name, advancement, code, player):
|
||||||
super(MeritousItem, self).__init__(name,
|
super(MeritousItem, self).__init__(name,
|
||||||
|
@ -171,14 +167,6 @@ class MeritousItem(Item):
|
||||||
self.type = "Artifact"
|
self.type = "Artifact"
|
||||||
self.classification = ItemClassification.useful
|
self.classification = ItemClassification.useful
|
||||||
|
|
||||||
if name in LttPCreditsText:
|
|
||||||
lttp = LttPCreditsText[name]
|
|
||||||
self.pedestal_credit_text = f"and the {lttp.pedestal}"
|
|
||||||
self.sickkid_credit_text = lttp.sickkid
|
|
||||||
self.magicshop_credit_text = lttp.magicshop
|
|
||||||
self.zora_credit_text = lttp.zora
|
|
||||||
self.fluteboy_credit_text = lttp.fluteboy
|
|
||||||
|
|
||||||
|
|
||||||
offset = 593_000
|
offset = 593_000
|
||||||
|
|
||||||
|
@ -217,3 +205,10 @@ item_groups = {
|
||||||
"Important Artifacts": ["Shield Boost", "Circuit Booster", "Metabolism", "Dodge Enhancer"],
|
"Important Artifacts": ["Shield Boost", "Circuit Booster", "Metabolism", "Dodge Enhancer"],
|
||||||
"Crystals": ["Crystals x500", "Crystals x1000", "Crystals x2000"]
|
"Crystals": ["Crystals x500", "Crystals x1000", "Crystals x2000"]
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ALTTPWorld.pedestal_credit_texts.update({item_table[name]: f"and the {texts.pedestal}"
|
||||||
|
for name, texts in LttPCreditsText.items()})
|
||||||
|
ALTTPWorld.sickkid_credit_texts.update({item_table[name]: texts.sickkid for name, texts in LttPCreditsText.items()})
|
||||||
|
ALTTPWorld.magicshop_credit_texts.update({item_table[name]: texts.magicshop for name, texts in LttPCreditsText.items()})
|
||||||
|
ALTTPWorld.zora_credit_texts.update({item_table[name]: texts.zora for name, texts in LttPCreditsText.items()})
|
||||||
|
ALTTPWorld.fluteboy_credit_texts.update({item_table[name]: texts.fluteboy for name, texts in LttPCreditsText.items()})
|
||||||
|
|
|
@ -24,6 +24,7 @@ def ap_id_to_oot_data(ap_id):
|
||||||
|
|
||||||
class OOTItem(Item):
|
class OOTItem(Item):
|
||||||
game: str = "Ocarina of Time"
|
game: str = "Ocarina of Time"
|
||||||
|
type: str
|
||||||
|
|
||||||
def __init__(self, name, player, data, event, force_not_advancement):
|
def __init__(self, name, player, data, event, force_not_advancement):
|
||||||
(type, advancement, index, special) = data
|
(type, advancement, index, special) = data
|
||||||
|
@ -38,7 +39,6 @@ class OOTItem(Item):
|
||||||
classification = ItemClassification.progression
|
classification = ItemClassification.progression
|
||||||
else:
|
else:
|
||||||
classification = ItemClassification.filler
|
classification = ItemClassification.filler
|
||||||
adv = bool(advancement) and not force_not_advancement
|
|
||||||
super(OOTItem, self).__init__(name, classification, oot_data_to_ap_id(data, event), player)
|
super(OOTItem, self).__init__(name, classification, oot_data_to_ap_id(data, event), player)
|
||||||
self.type = type
|
self.type = type
|
||||||
self.index = index
|
self.index = index
|
||||||
|
@ -47,24 +47,11 @@ class OOTItem(Item):
|
||||||
self.price = special.get('price', None) if special else None
|
self.price = special.get('price', None) if special else None
|
||||||
self.internal = False
|
self.internal = False
|
||||||
|
|
||||||
# The playthrough calculation calls a function that uses "sweep_for_events(key_only=True)"
|
|
||||||
# This checks if the item it's looking for is a small key, using the small key property.
|
|
||||||
# Because of overlapping item fields, this means that OoT small keys are technically counted, unless we do this.
|
|
||||||
# This causes them to be double-collected during playthrough and generation.
|
|
||||||
@property
|
|
||||||
def smallkey(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
|
||||||
def bigkey(self) -> bool:
|
|
||||||
return False
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def dungeonitem(self) -> bool:
|
def dungeonitem(self) -> bool:
|
||||||
return self.type in ['SmallKey', 'HideoutSmallKey', 'BossKey', 'GanonBossKey', 'Map', 'Compass']
|
return self.type in ['SmallKey', 'HideoutSmallKey', 'BossKey', 'GanonBossKey', 'Map', 'Compass']
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# Progressive: True -> Advancement
|
# Progressive: True -> Advancement
|
||||||
# False -> Priority
|
# False -> Priority
|
||||||
# None -> Normal
|
# None -> Normal
|
||||||
|
|
|
@ -2,6 +2,7 @@ import typing
|
||||||
|
|
||||||
from BaseClasses import Item, ItemClassification
|
from BaseClasses import Item, ItemClassification
|
||||||
from .Names import ItemName
|
from .Names import ItemName
|
||||||
|
from worlds.alttp import ALTTPWorld
|
||||||
|
|
||||||
|
|
||||||
class ItemData(typing.NamedTuple):
|
class ItemData(typing.NamedTuple):
|
||||||
|
@ -18,9 +19,6 @@ class SA2BItem(Item):
|
||||||
def __init__(self, name, classification: ItemClassification, code: int = None, player: int = None):
|
def __init__(self, name, classification: ItemClassification, code: int = None, player: int = None):
|
||||||
super(SA2BItem, self).__init__(name, classification, code, player)
|
super(SA2BItem, self).__init__(name, classification, code, player)
|
||||||
|
|
||||||
if self.name == ItemName.sonic_light_shoes or self.name == ItemName.shadow_air_shoes:
|
|
||||||
self.pedestal_credit_text = "and the Soap Shoes"
|
|
||||||
|
|
||||||
|
|
||||||
# Separate tables for each type of item.
|
# Separate tables for each type of item.
|
||||||
emblems_table = {
|
emblems_table = {
|
||||||
|
@ -94,3 +92,6 @@ item_table = {
|
||||||
}
|
}
|
||||||
|
|
||||||
lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_table.items() if data.code}
|
lookup_id_to_name: typing.Dict[int, str] = {data.code: item_name for item_name, data in item_table.items() if data.code}
|
||||||
|
|
||||||
|
ALTTPWorld.pedestal_credit_texts[item_table[ItemName.sonic_light_shoes].code] = "and the Soap Shoes"
|
||||||
|
ALTTPWorld.pedestal_credit_texts[item_table[ItemName.shadow_air_shoes].code] = "and the Soap Shoes"
|
||||||
|
|
|
@ -5,7 +5,7 @@ import copy
|
||||||
import os
|
import os
|
||||||
import threading
|
import threading
|
||||||
import base64
|
import base64
|
||||||
from typing import Set, List, TextIO
|
from typing import Set, TextIO
|
||||||
|
|
||||||
from worlds.sm.variaRandomizer.graph.graph_utils import GraphUtils
|
from worlds.sm.variaRandomizer.graph.graph_utils import GraphUtils
|
||||||
|
|
||||||
|
@ -735,7 +735,8 @@ class SMLocation(Location):
|
||||||
|
|
||||||
class SMItem(Item):
|
class SMItem(Item):
|
||||||
game = "Super Metroid"
|
game = "Super Metroid"
|
||||||
|
type: str
|
||||||
|
|
||||||
def __init__(self, name, classification, type, code, player: int = None):
|
def __init__(self, name, classification, type: str, code, player: int):
|
||||||
super(SMItem, self).__init__(name, classification, code, player)
|
super(SMItem, self).__init__(name, classification, code, player)
|
||||||
self.type = type
|
self.type = type
|
||||||
|
|
|
@ -573,8 +573,10 @@ class SMZ3Location(Location):
|
||||||
|
|
||||||
class SMZ3Item(Item):
|
class SMZ3Item(Item):
|
||||||
game = "SMZ3"
|
game = "SMZ3"
|
||||||
|
type: ItemType
|
||||||
|
item: Item
|
||||||
|
|
||||||
def __init__(self, name, classification, type, code, player: int = None, item=None):
|
def __init__(self, name, classification, type: ItemType, code, player: int, item: Item):
|
||||||
|
super(SMZ3Item, self).__init__(name, classification, code, player)
|
||||||
self.type = type
|
self.type = type
|
||||||
self.item = item
|
self.item = item
|
||||||
super(SMZ3Item, self).__init__(name, classification, code, player)
|
|
||||||
|
|
Loading…
Reference in New Issue