275 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			275 lines
		
	
	
		
			15 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from typing import NamedTuple, Optional
 | |
| 
 | |
| from .RamHandler import GrinchRamData
 | |
| 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: 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]
 | |
| 
 | |
| class GrinchItem(Item):
 | |
|     game: str = "The Grinch"
 | |
| 
 | |
|     #Tells server what item id it is
 | |
|     @staticmethod
 | |
|     def get_apid(id: int):
 | |
|         #If you give me an input id, I will return the Grinch equivalent server/ap id
 | |
|         base_id: int = 42069
 | |
|         return base_id + id if id is not None else None
 | |
| 
 | |
|     def __init__(self, name: str, player: int, data: GrinchItemData):
 | |
|         super(GrinchItem, self).__init__(name,data.classification, GrinchItem.get_apid(data.id), player)
 | |
| 
 | |
|         self.type = data.item_group
 | |
|         self.item_id = data.id
 | |
| 
 | |
| #allows hinting of items via category
 | |
| def get_item_names_per_category() -> dict[str, set[str]]:
 | |
|     categories: dict[str, set[str]] = {}
 | |
| 
 | |
|     for name, data in ALL_ITEMS_TABLE.items():
 | |
|         for group in data.item_group:  # iterate over each category
 | |
|             categories.setdefault(group, set()).add(name)
 | |
| 
 | |
|     return categories
 | |
| 
 | |
| REL: str = "Rotten Egg Launcher"
 | |
| RS: str = "Rocket Spring"
 | |
| SS: str = "Slime Shooter"
 | |
| OCD: str = "Octopus Climbing Device"
 | |
| MM: str = "Marine Mobile"
 | |
| GC: str = "Grinch Copter"
 | |
| WV: str = "Whoville Vacuum Tube"
 | |
| WF: str = "Who Forest Vacuum Tube"
 | |
| WD: str = "Who Dump Vacuum Tube"
 | |
| WL: str = "Who Lake Vacuum Tube"
 | |
| VT: str = "Progressive Vacuum Tube"
 | |
| PC: str = "Pancake"
 | |
| SR: str = "Sleigh Room Key"
 | |
| BB: str = "Bad Breath"
 | |
| SZ: str = "Seize"
 | |
| MX: str = "Max"
 | |
| SN: str = "Sneak"
 | |
| WC: str = "Who Cloak"
 | |
| PB: str = "Painting Bucket"
 | |
| SC: str = "Scissors"
 | |
| GB: str = "Glue Bucket"
 | |
| CCAC: str = "Cable Car Access Card"
 | |
| DRL: str = "Drill"
 | |
| RP: str = "Rope"
 | |
| HK: str = "Hook"
 | |
| ST: str = "Sculpting Tools"
 | |
| HMR: str = "Hammer"
 | |
| SCL: str = "Scout Clothes"
 | |
| 
 | |
| #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,
 | |
|         [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,
 | |
|         [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,
 | |
|         [GrinchRamData(0x0102BE, value=0x40), GrinchRamData(0x0102BF, value=0x41),
 | |
|         GrinchRamData(0x0102C0, value=0x42), GrinchRamData(0x0102C1, value=0x44),
 | |
|         GrinchRamData(0x0102C2, value=0x45), GrinchRamData(0x0102C3, value=0x46),
 | |
|         GrinchRamData(0x0102C4, value=0x48), GrinchRamData(0x0102C5, value=0x49),
 | |
|         GrinchRamData(0x0102C6, value=0x4A),
 | |
|          # GrinchRamData(0x0100BC, binary_bit_pos=2)
 | |
|          ]),
 | |
|     "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),
 | |
|         GrinchRamData(0x0102CD, value=0x48), GrinchRamData(0x0102CE, value=0x49),
 | |
|         GrinchRamData(0x0102CF, value=0x4A),
 | |
|          # GrinchRamData(0x0100BC, binary_bit_pos=3)
 | |
|          ]),
 | |
|     "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),
 | |
|         GrinchRamData(0x0102D6, value=0x48), GrinchRamData(0x0102D7, value=0x49),
 | |
|         GrinchRamData(0x0102D8, value=0x4A),
 | |
|          # GrinchRamData(0x0100BC, binary_bit_pos=4)
 | |
|          ]),
 | |
|     "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),
 | |
|         GrinchRamData(0x0102DF, value=0x46), GrinchRamData(0x0102E0, value=0x47),
 | |
|         GrinchRamData(0x0102E1, value=0x48), GrinchRamData(0x0102E2, value=0x49),
 | |
|         GrinchRamData(0x0102E3, value=0x4A), GrinchRamData(0x0102E4, value=0x4B),
 | |
|         GrinchRamData(0x0102E5, value=0x4C), GrinchRamData(0x0102E6, value=0x4D),
 | |
|         GrinchRamData(0x0102E7, value=0x4E), GrinchRamData(0x0102E8, value=0x4F),
 | |
|         # GrinchRamData(0x0100BC, binary_bit_pos=5)
 | |
|          ]),
 | |
|     "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),
 | |
|         GrinchRamData(0x0102EF, value=0x46), GrinchRamData(0x0102F0, value=0x47),
 | |
|         GrinchRamData(0x0102F1, value=0x48), GrinchRamData(0x0102F2, value=0x49),
 | |
|         GrinchRamData(0x0102F3, value=0x4A), GrinchRamData(0x0102F4, value=0x4B),
 | |
|         GrinchRamData(0x0102F5, value=0x4C), GrinchRamData(0x0102F6, value=0x4D),
 | |
|         GrinchRamData(0x0102F7, value=0x4E), GrinchRamData(0x0102F8, value=0x4F),
 | |
|         # GrinchRamData(0x0100BC, binary_bit_pos=6)
 | |
|     ])
 | |
| }
 | |
| 
 | |
| #Mission Specific Items
 | |
| MISSION_ITEMS_TABLE: dict[str, GrinchItemData] = {
 | |
|     "Who Cloak": GrinchItemData(["Mission Specific Items", "Useful Items"], 200, IC.progression,
 | |
|         [GrinchRamData(0x0101F9, binary_bit_pos=0)]),
 | |
|     "Painting Bucket": GrinchItemData(["Mission Specific Items", "Useful Items"], 201, IC.progression_deprioritized,
 | |
|         [GrinchRamData(0x0101F9, binary_bit_pos=1)]),
 | |
|     "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", "Useful Items"], 203, IC.progression_deprioritized,
 | |
|         [GrinchRamData(0x0101F9, binary_bit_pos=4)]),
 | |
|     "Cable Car Access Card": GrinchItemData(["Mission Specific Items", "Useful Items"], 204, IC.progression,
 | |
|         [GrinchRamData(0x0101F9, binary_bit_pos=5)]),
 | |
|     "Drill": GrinchItemData(["Mission Specific Items", "Useful Items"], 205, IC.progression_deprioritized,
 | |
|         [GrinchRamData(0x0101FA, binary_bit_pos=2)]),
 | |
|     "Rope": GrinchItemData(["Mission Specific Items", "Useful Items"], 206, IC.progression_deprioritized,
 | |
|         [GrinchRamData(0x0101FA, binary_bit_pos=1)]),
 | |
|     "Hook": GrinchItemData(["Mission Specific Items", "Useful Items"], 207, IC.progression_deprioritized,
 | |
|         [GrinchRamData(0x0101FA, binary_bit_pos=0)]),
 | |
|     "Sculpting Tools": GrinchItemData(["Mission Specific Items", "Useful Items"], 208, IC.progression_deprioritized,
 | |
|         [GrinchRamData(0x0101F9, binary_bit_pos=2)]),
 | |
|     "Hammer": GrinchItemData(["Mission Specific Items", "Useful Items"], 209, IC.progression_deprioritized,
 | |
|         [GrinchRamData(0x0101F9, binary_bit_pos=3)]),
 | |
|     "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,
 | |
| #         [GrinchRamData(0x0101FB, binary_bit_pos=2)]),
 | |
| #     "GPS": GrinchItemData(["Sleigh Parts"], 301, IC.useful,
 | |
| #         [GrinchRamData(0x0101FB, binary_bit_pos=5)]),
 | |
| #     "Tires": GrinchItemData(["Sleigh Parts"], 302, IC.progression_skip_balancing,
 | |
| #         [GrinchRamData(0x0101FB, binary_bit_pos=4)]),
 | |
| #     "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,
 | |
| #         [GrinchRamData(0x0101FB, binary_bit_pos=6)])
 | |
| # }
 | |
| 
 | |
| #Access Keys
 | |
| KEYS_TABLE: dict[str, GrinchItemData] = {
 | |
|     "Whoville Vacuum Tube": GrinchItemData(["Vacuum Tubes"], 400, IC.progression,
 | |
|         [GrinchRamData(0x010200, binary_bit_pos=1)]),
 | |
|     "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,
 | |
|         [GrinchRamData(0x0100AA, binary_bit_pos=4)]),
 | |
|     # "Progressive Vacuum Tube": GrinchItemData(["Vacuum Tubes"], 404, IC.progression,
 | |
|     #     [GrinchRamData()]),
 | |
|     # "Spin N' Win Door Unlock": GrinchItemData(["Supadow Door Unlocks"], 405, IC.progression,
 | |
|     #     [GrinchRamData()]),
 | |
|     # "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,
 | |
|     #     [GrinchRamData()])
 | |
|     "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", "Filler"], 500, IC.filler,
 | |
|     #     [GrinchRamData(0x0E8FDC, value=120)]),
 | |
|     "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", "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", "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,
 | |
|         [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()]),
 | |
| # alias to Slowness Trap for traplink
 | |
|     # "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
 | |
|         [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()]),
 | |
| #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)])
 | |
| }
 | |
| 
 | |
| #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)])
 | |
| # }
 | |
| #Double star combines all dictionaries from each individual list together
 | |
| ALL_ITEMS_TABLE: dict[str, GrinchItemData] = {
 | |
|     **GADGETS_TABLE,
 | |
|     **MISSION_ITEMS_TABLE,
 | |
|     **KEYS_TABLE,
 | |
|     **MISC_ITEMS_TABLE,
 | |
|     **TRAPS_TABLE,
 | |
|     **USEFUL_IC_TABLE,
 | |
|     # **SLEIGH_PARTS_TABLE,
 | |
|     # **MOVES_TABLE,
 | |
| }
 | |
| 
 | |
| # Psuedocoding traplink table
 | |
| # BEE_TRAP_EQUIV = ["Army Trap", "Buyon Trap", "Ghost", "Gooey Bag", "OmoTrap", "Police Trap"]
 | |
| # ICE_TRAP_EQUIV = ["Chaos Control Trap", "Freeze Trap", "Frozen Trap", "Honey Trap", "Paralyze Trap", "Stun Trap", "Bubble Trap"]
 | |
| # DAMAGE_TRAP_EQUIV = ["Banana Trap", "Bomb", "Bonk Trap", "Fire Trap", "Laughter Trap", "Nut Trap", "Push Trap",
 | |
| # "Squash Trap", "Thwimp Trap", "TNT Barrel Trap", "Meteor Trap", "Double Damage", "Spike Ball Trap"]
 | |
| 
 | |
| # SPRING_TRAP_EQUIV = ["Eject Ability", "Hiccup Trap", "Jump Trap", "Jumping Jacks Trap", "Whoops! Trap"]
 | |
| # HOME_TRAP_EQUIV = ["Blue Balls Curse", "Instant Death Trap", "Get Out Trap"]
 | |
| # SLOWNESS_TRAP_EQUIV = ["Iron Boots Trap", "Slow Trap", "Sticky Floor Trap"]
 | |
| # CUTSCENE_TRAP_EQUIV = ["Phone Trap"]
 | |
| # ELEC_TRAP_EQUIV = []
 | |
| # DEPL_TRAP_EQUIV = ["Dry Trap"]
 | |
| 
 | |
| def grinch_items_to_id() -> dict[str, int]:
 | |
|     item_mappings: dict[str, int] = {}
 | |
|     for ItemName, ItemData in ALL_ITEMS_TABLE.items():
 | |
|         item_mappings.update({ItemName: GrinchItem.get_apid(ItemData.id)})
 | |
|     return item_mappings | 
