diff --git a/worlds/grinch/Items.py b/worlds/grinch/Items.py index 08dae2c8..b399b4c6 100644 --- a/worlds/grinch/Items.py +++ b/worlds/grinch/Items.py @@ -5,7 +5,7 @@ from BaseClasses import Item from BaseClasses import ItemClassification as IC #IC can be any name, saves having to type the whole word in code class GrinchItemData(NamedTuple): - item_group: str #list[str] #arbituary that can be whatever it can be, basically the field/property for item groups + item_group: list[str] #arbituary that can be whatever it can be, basically the field/property for item groups id: Optional[int] classification: IC update_ram_addr: list[GrinchRamData] @@ -31,7 +31,8 @@ def get_item_names_per_category() -> dict[str, set[str]]: categories: dict[str, set[str]] = {} for name, data in ALL_ITEMS_TABLE.items(): - categories.setdefault(data.item_group, set()).add(name) + for group in data.item_group: # iterate over each category + categories.setdefault(group, set()).add(name) return categories @@ -56,17 +57,17 @@ TT: str = "Tip Toe" #Gadgets #All gadgets require at least 4 different blueprints to be unlocked in the computer in Mount Crumpit. GADGETS_TABLE: dict[str, GrinchItemData] = { - "Binoculars": GrinchItemData("Gadgets", 100, IC.useful, + "Binoculars": GrinchItemData(["Gadgets"], 100, IC.useful, [GrinchRamData(0x0102B6, value=0x40), GrinchRamData(0x0102B7, value=0x41), GrinchRamData(0x0102B8, value=0x44), GrinchRamData(0x0102B9, value=0x45), # GrinchRamData(0x0100BC, binary_bit_pos=0) ]), - "Rotten Egg Launcher": GrinchItemData("Gadgets", 101, IC.progression, + "Rotten Egg Launcher": GrinchItemData(["Gadgets"], 101, IC.progression, [GrinchRamData(0x0102BA, value=0x40), GrinchRamData(0x0102BB, value=0x41), GrinchRamData(0x0102BC, value=0x44), GrinchRamData(0x0102BD, value=0x45), # GrinchRamData(0x0100BC, binary_bit_pos=1) ]), - "Rocket Spring": GrinchItemData("Gadgets", 102, IC.progression, + "Rocket Spring": GrinchItemData(["Gadgets"], 102, IC.progression, [GrinchRamData(0x0102BE, value=0x40), GrinchRamData(0x0102BF, value=0x41), GrinchRamData(0x0102C0, value=0x42), GrinchRamData(0x0102C1, value=0x44), GrinchRamData(0x0102C2, value=0x45), GrinchRamData(0x0102C3, value=0x46), @@ -74,7 +75,7 @@ GADGETS_TABLE: dict[str, GrinchItemData] = { GrinchRamData(0x0102C6, value=0x4A), # GrinchRamData(0x0100BC, binary_bit_pos=2) ]), - "Slime Shooter": GrinchItemData("Gadgets", 103, IC.progression, + "Slime Shooter": GrinchItemData(["Gadgets", "Slime Gun"], 103, IC.progression, [GrinchRamData(0x0102C7, value=0x40), GrinchRamData(0x0102C8, value=0x41), GrinchRamData(0x0102C9, value=0x42), GrinchRamData(0x0102CA, value=0x44), GrinchRamData(0x0102CB, value=0x45), GrinchRamData(0x0102CC, value=0x46), @@ -82,7 +83,7 @@ GADGETS_TABLE: dict[str, GrinchItemData] = { GrinchRamData(0x0102CF, value=0x4A), # GrinchRamData(0x0100BC, binary_bit_pos=3) ]), - "Octopus Climbing Device": GrinchItemData("Gadgets", 104, IC.progression, + "Octopus Climbing Device": GrinchItemData(["Gadgets"], 104, IC.progression, [GrinchRamData(0x0102D0, value=0x40), GrinchRamData(0x0102D1, value=0x41), GrinchRamData(0x0102D2, value=0x42), GrinchRamData(0x0102D3, value=0x44), GrinchRamData(0x0102D4, value=0x45), GrinchRamData(0x0102D5, value=0x46), @@ -90,7 +91,7 @@ GADGETS_TABLE: dict[str, GrinchItemData] = { GrinchRamData(0x0102D8, value=0x4A), # GrinchRamData(0x0100BC, binary_bit_pos=4) ]), - "Marine Mobile": GrinchItemData("Gadgets", 105, IC.progression, + "Marine Mobile": GrinchItemData(["Gadgets"], 105, IC.progression, [GrinchRamData(0x0102D9, value=0x40), GrinchRamData(0x0102DA, value=0x41), GrinchRamData(0x0102DB, value=0x42), GrinchRamData(0x0102DC, value=0x43), GrinchRamData(0x0102DD, value=0x44), GrinchRamData(0x0102DE, value=0x45), @@ -101,7 +102,7 @@ GADGETS_TABLE: dict[str, GrinchItemData] = { GrinchRamData(0x0102E7, value=0x4E), GrinchRamData(0x0102E8, value=0x4F), # GrinchRamData(0x0100BC, binary_bit_pos=5) ]), - "Grinch Copter": GrinchItemData("Gadgets", 106, IC.progression, + "Grinch Copter": GrinchItemData(["Gadgets"], 106, IC.progression, [GrinchRamData(0x0102E9, value=0x40), GrinchRamData(0x0102EA, value=0x41), GrinchRamData(0x0102EB, value=0x42), GrinchRamData(0x0102EC, value=0x43), GrinchRamData(0x0102ED, value=0x44), GrinchRamData(0x0102EE, value=0x45), @@ -116,120 +117,120 @@ GADGETS_TABLE: dict[str, GrinchItemData] = { #Mission Specific Items MISSION_ITEMS_TABLE: dict[str, GrinchItemData] = { - "Who Cloak": GrinchItemData("Mission Specific Items", 200, IC.progression, + "Who Cloak": GrinchItemData(["Mission Specific Items", "Useful Items"], 200, IC.progression, [GrinchRamData(0x0101F9, binary_bit_pos=0)]), - "Painting Bucket": GrinchItemData("Mission Specific Items", 201, IC.progression_deprioritized, + "Painting Bucket": GrinchItemData(["Mission Specific Items", "Useful Items"], 201, IC.progression_deprioritized, [GrinchRamData(0x0101F9, binary_bit_pos=1)]), - "Scissors": GrinchItemData("Mission Specific Items", 202, IC.progression_deprioritized, + "Scissors": GrinchItemData(["Mission Specific Items", "Useful Items"], 202, IC.progression_deprioritized, [GrinchRamData(0x0101F9, binary_bit_pos=6), GrinchRamData(0x0100C2, binary_bit_pos=1)]), - "Glue Bucket": GrinchItemData("Mission Specific Items", 203, IC.progression_deprioritized, + "Glue Bucket": GrinchItemData(["Mission Specific Items", "Useful Items"], 203, IC.progression_deprioritized, [GrinchRamData(0x0101F9, binary_bit_pos=4)]), - "Cable Car Access Card": GrinchItemData("Mission Specific Items", 204, IC.progression, + "Cable Car Access Card": GrinchItemData(["Mission Specific Items", "Useful Items"], 204, IC.progression, [GrinchRamData(0x0101F9, binary_bit_pos=5)]), - "Drill": GrinchItemData("Mission Specific Items", 205, IC.progression_deprioritized, + "Drill": GrinchItemData(["Mission Specific Items", "Useful Items"], 205, IC.progression_deprioritized, [GrinchRamData(0x0101FA, binary_bit_pos=2)]), - "Rope": GrinchItemData("Mission Specific Items", 206, IC.progression_deprioritized, + "Rope": GrinchItemData(["Mission Specific Items", "Useful Items"], 206, IC.progression_deprioritized, [GrinchRamData(0x0101FA, binary_bit_pos=1)]), - "Hook": GrinchItemData("Mission Specific Items", 207, IC.progression_deprioritized, + "Hook": GrinchItemData(["Mission Specific Items", "Useful Items"], 207, IC.progression_deprioritized, [GrinchRamData(0x0101FA, binary_bit_pos=0)]), - "Sculpting Tools": GrinchItemData("Mission Specific Items", 208, IC.progression_deprioritized, + "Sculpting Tools": GrinchItemData(["Mission Specific Items", "Useful Items"], 208, IC.progression_deprioritized, [GrinchRamData(0x0101F9, binary_bit_pos=2)]), - "Hammer": GrinchItemData("Mission Specific Items", 209, IC.progression_deprioritized, + "Hammer": GrinchItemData(["Mission Specific Items", "Useful Items"], 209, IC.progression_deprioritized, [GrinchRamData(0x0101F9, binary_bit_pos=3)]), - "Scout Clothes": GrinchItemData("Mission Specific Items", 210, IC.progression, + "Scout Clothes": GrinchItemData(["Mission Specific Items", "Useful Items"], 210, IC.progression, [GrinchRamData(0x0101F9, binary_bit_pos=7)]) } #Sleigh Parts # SLEIGH_PARTS_TABLE: dict[str, GrinchItemData] = { -# "Exhaust Pipes": GrinchItemData("Sleigh Parts", 300, IC.progression_skip_balancing, +# "Exhaust Pipes": GrinchItemData(["Sleigh Parts"], 300, IC.progression_skip_balancing, # [GrinchRamData(0x0101FB, binary_bit_pos=2)]), -# "GPS": GrinchItemData("Sleigh Parts", 301, IC.useful, +# "GPS": GrinchItemData(["Sleigh Parts"], 301, IC.useful, # [GrinchRamData(0x0101FB, binary_bit_pos=5)]), -# "Tires": GrinchItemData("Sleigh Parts", 302, IC.progression_skip_balancing, +# "Tires": GrinchItemData(["Sleigh Parts"], 302, IC.progression_skip_balancing, # [GrinchRamData(0x0101FB, binary_bit_pos=4)]), -# "Skis": GrinchItemData("Sleigh Parts", 303, IC.progression_skip_balancing, +# "Skis": GrinchItemData(["Sleigh Parts"], 303, IC.progression_skip_balancing, # [GrinchRamData(0x0101FB, binary_bit_pos=3)]), -# "Twin-End Tuba": GrinchItemData("Sleigh Parts", 304, IC.progression_skip_balancing, +# "Twin-End Tuba": GrinchItemData(["Sleigh Parts"], 304, IC.progression_skip_balancing, # [GrinchRamData(0x0101FB, binary_bit_pos=6)]) # } #Access Keys KEYS_TABLE: dict[str, GrinchItemData] = { - # "Whoville Vacuum Tube": GrinchItemData("Vacuum Tubes", 400, IC.progression, + # "Whoville Vacuum Tube": GrinchItemData(["Vacuum Tubes"], 400, IC.progression, # [GrinchRamData()]), - "Who Forest Vacuum Tube": GrinchItemData("Vacuum Tubes", 401, IC.progression, + "Who Forest Vacuum Tube": GrinchItemData(["Vacuum Tubes"], 401, IC.progression, [GrinchRamData(0x0100AA, binary_bit_pos=2)]), "Who Dump Vacuum Tube": GrinchItemData("Vacuum Tubes", 402, IC.progression, [GrinchRamData(0x0100AA, binary_bit_pos=3)]), - "Who Lake Vacuum Tube": GrinchItemData("Vacuum Tubes", 403, IC.progression, + "Who Lake Vacuum Tube": GrinchItemData(["Vacuum Tubes"], 403, IC.progression, [GrinchRamData(0x0100AA, binary_bit_pos=4)]), - # "Progressive Vacuum Tube": GrinchItemData("Vacuum Tubes", 404, IC.progression, + # "Progressive Vacuum Tube": GrinchItemData(["Vacuum Tubes"], 404, IC.progression, # [GrinchRamData()]), - # "Spin N' Win Door Unlock": GrinchItemData("Supadow Door Unlocks", 405, IC.progression, + # "Spin N' Win Door Unlock": GrinchItemData(["Supadow Door Unlocks"], 405, IC.progression, # [GrinchRamData()]), - # "Dankamania Door Unlock": GrinchItemData("Supadow Door Unlocks", 406, IC.progression, + # "Dankamania Door Unlock": GrinchItemData(["Supadow Door Unlocks"], 406, IC.progression, # [GrinchRamData()]), # "The Copter Race Contest Door Unlock": GrinchItemData("Supadow Door Unlocks", 407, IC.progression, # [GrinchRamData()]), # "Progressive Supadow Door Unlock": GrinchItemData("Supadow Door Unlocks", 408, IC.progression, # [GrinchRamData()]), - # "Bike Race Access": GrinchItemData("Supadow Door Unlocks", 409, IC.progression, + # "Bike Race Access": GrinchItemData(["Supadow Door Unlocks", 409, IC.progression, # [GrinchRamData()]) - "Sleigh Room Key": GrinchItemData("Sleigh Room", 410, IC.progression, + "Sleigh Room Key": GrinchItemData(["Sleigh Room"], 410, IC.progression, [GrinchRamData(0x010200, binary_bit_pos=6), GrinchRamData(0x0100AA, binary_bit_pos=5)]) } #Misc Items MISC_ITEMS_TABLE: dict[str, GrinchItemData] = { # This item may not function properly if you receive it during a loading screen or in Mount Crumpit - # "Fully Healed Grinch": GrinchItemData("Health Items", 500, IC.filler, + # "Fully Healed Grinch": GrinchItemData(["Health Items", "Filler"], 500, IC.filler, # [GrinchRamData(0x0E8FDC, value=120)]), - "5 Rotten Eggs": GrinchItemData("Rotten Egg Bundles", 502, IC.filler, + "5 Rotten Eggs": GrinchItemData(["Rotten Egg Bundles", "Filler"], 502, IC.filler, [GrinchRamData(0x010058, value=5, update_existing_value=True, max_count=200, bit_size=2)]), - "10 Rotten Eggs": GrinchItemData("Rotten Egg Bundles", 503, IC.filler, + "10 Rotten Eggs": GrinchItemData(["Rotten Egg Bundles", "Filler"], 503, IC.filler, [GrinchRamData(0x010058, value=10, update_existing_value=True, max_count=200, bit_size=2)]), - "20 Rotten Eggs": GrinchItemData("Rotten Egg Bundles", 504, IC.filler, + "20 Rotten Eggs": GrinchItemData(["Rotten Egg Bundles", "Filler"], 504, IC.filler, [GrinchRamData(0x010058, value=20, update_existing_value=True, max_count=200, bit_size=2)]) } USEFUL_IC_TABLE: dict[str, GrinchItemData] = { - "Heart of Stone": GrinchItemData("Health Items", 501, IC.useful, + "Heart of Stone": GrinchItemData(["Health Items"], 501, IC.useful, [GrinchRamData(0x0100ED, value=1, update_existing_value=True, max_count=4)]) } #Traps TRAPS_TABLE: dict[str, GrinchItemData] = { # alias to Ice Trap for traplink - # "Freeze Trap": GrinchItemData("Traps", 600, IC.trap, [GrinchRamData()]), - # "Bee Trap": GrinchItemData("Traps", 601, IC.trap, [GrinchRamData()]), - # "Electrocution Trap": GrinchItemData("Traps", 602, IC.trap, [GrinchRamData()]), + # "Freeze Trap": GrinchItemData(["Traps"], 600, IC.trap, [GrinchRamData()]), + # "Bee Trap": GrinchItemData(["Traps"], 601, IC.trap, [GrinchRamData()]), + # "Electrocution Trap": GrinchItemData(["Traps"], 602, IC.trap, [GrinchRamData()]), # alias to Slowness Trap for traplink - # "Tip Toe Trap": GrinchItemData("Traps", 603, IC.trap, [GrinchRamData()]), + # "Tip Toe Trap": GrinchItemData(["Traps"], 603, IC.trap, [GrinchRamData()]), # This item may not function properly if you receive it during a loading screen or in Mount Crumpit # alias to Exhaustion Trap -# "Damage Trap": GrinchItemData("Traps", 604, IC.trap, [GrinchRamData(0x0E8FDC, value=-20, update_existing_value=True)]), - "Depletion Trap": GrinchItemData("Traps", 605, IC.trap, [GrinchRamData(0x010058, value=0, bit_size=2)]), - "Dump it to Crumpit": GrinchItemData("Traps", 606, IC.trap, #Alias to Home Trap for traplink +# "Damage Trap": GrinchItemData(["Traps"], 604, IC.trap, [GrinchRamData(0x0E8FDC, value=-20, update_existing_value=True)]), + "Depletion Trap": GrinchItemData(["Traps"], 605, IC.trap, [GrinchRamData(0x010058, value=0, bit_size=2)]), + "Dump it to Crumpit": GrinchItemData(["Traps"], 606, IC.trap, #Alias to Home Trap for traplink [GrinchRamData(0x010000, value=0x05), GrinchRamData(0x08FB94, value=1), GrinchRamData(0x0100B4, value=0)]), #alias to Spring Trap for traplink - # "Rocket Spring Trap": GrinchItemData("Traps", 607, IC.trap, [GrinchRamData()]), + # "Rocket Spring Trap": GrinchItemData(["Traps"], 607, IC.trap, [GrinchRamData()]), #alias to Home Trap for traplink - "Who sent me back?": GrinchItemData("Traps", 608, IC.trap, [GrinchRamData(0x08FB94, value=1)]), - # "Cutscene Trap": GrinchItemData("Traps", 609, IC.trap, [GrinchRamData()]), - # "No Vac Trap": GrinchItemData("Traps", 610, IC.trap, [GrinchRamData(0x0102DA, value=0]), - # "Invisible Trap": GrinchItemData("Traps", 611, IC.trap, [GrinchRamData(0x0102DA, value=0, bit_size=4)]) - # "Child Trap": GrinchItemData("Traps", 612, IC.trap,[GrinchRamData()]) - # "Disable Jump Trap": GrinchItemData("Traps", 613, IC.trap,[GrinchRamData(0x010026, binary_bit_pos=6)]) + "Who sent me back?": GrinchItemData(["Traps"], 608, IC.trap, [GrinchRamData(0x08FB94, value=1)]), + # "Cutscene Trap": GrinchItemData(["Traps"], 609, IC.trap, [GrinchRamData()]), + # "No Vac Trap": GrinchItemData(["Traps"], 610, IC.trap, [GrinchRamData(0x0102DA, value=0]), + # "Invisible Trap": GrinchItemData(["Traps"], 611, IC.trap, [GrinchRamData(0x0102DA, value=0, bit_size=4)]) + # "Child Trap": GrinchItemData(["Traps"], 612, IC.trap,[GrinchRamData()]) + # "Disable Jump Trap": GrinchItemData(["Traps"], 613, IC.trap,[GrinchRamData(0x010026, binary_bit_pos=6)]) } #Movesets # MOVES_TABLE: dict[str, GrinchItemData] = { -# "Bad Breath": GrinchItemData("Movesets", 700, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=1)]), -# "Pancake": GrinchItemData("Movesets", 701, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=2)]), -# "Push & Pull": GrinchItemData("Movesets", 702, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=3)]), -# "Max": GrinchItemData("Movesets", 703, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=4)]), -# "Tip Toe": GrinchItemData("Movesets", 704, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=5)]) +# "Bad Breath": GrinchItemData(["Movesets"], 700, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=1)]), +# "Pancake": GrinchItemData(["Movesets"], 701, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=2)]), +# "Push & Pull": GrinchItemData(["Movesets"], 702, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=3)]), +# "Max": GrinchItemData(["Movesets"], 703, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=4)]), +# "Tip Toe": GrinchItemData(["Movesets"], 704, IC.progression, [GrinchRamData(0x0100BB, binary_bit_pos=5)]) # } #Double star combines all dictionaries from each individual list together ALL_ITEMS_TABLE: dict[str, GrinchItemData] = {