 11eebbbd32
			
		
	
	11eebbbd32
	
	
	
		
			
			* oot: repair closed forest + dungeon ER * oot: finally skip triforce pieces in balancing * oot: fix mq_dungeons_mode set to mq or count * oot: force 0.3.7 client hopefully this makes people update * oot: temp fix for skip-child-zelda crash eventually I want to decide on a better fix for this though * oot: remove skip-child-zelda item inside if tree * oot: fix classification of some thieves hideout locations in tracker * oot: fix regional shuffle for hideout keys and ganon boss key * oot: properly attach hints to dungeon locations * Fix entrance shuffle flag not being set correctly due to new dungeon shuffle option format
		
			
				
	
	
		
			434 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			434 lines
		
	
	
		
			31 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import typing
 | |
| 
 | |
| from BaseClasses import Item, ItemClassification
 | |
| 
 | |
| 
 | |
| def oot_data_to_ap_id(data, event): 
 | |
|     if event or data[2] is None or data[0] == 'Shop': 
 | |
|         return None
 | |
|     offset = 66000
 | |
|     if data[0] in ['Item', 'BossKey', 'Compass', 'Map', 'SmallKey', 'Token', 'GanonBossKey', 'HideoutSmallKey', 'Song']:
 | |
|         return offset + data[2]
 | |
|     else: 
 | |
|         raise Exception(f'Unexpected OOT item type found: {data[0]}')
 | |
| 
 | |
| 
 | |
| def ap_id_to_oot_data(ap_id): 
 | |
|     offset = 66000
 | |
|     val = ap_id - offset
 | |
|     try: 
 | |
|         return list(filter(lambda d: d[1][0] == 'Item' and d[1][2] == val, item_table.items()))[0]
 | |
|     except IndexError: 
 | |
|         raise Exception(f'Could not find desired item ID: {ap_id}')
 | |
| 
 | |
| 
 | |
| def oot_is_item_of_type(item, item_type):
 | |
|     if isinstance(item, OOTItem):
 | |
|         return item.type == item_type
 | |
|     if isinstance(item, str):
 | |
|         return item in item_table and item_table[item][0] == item_type
 | |
|     return False
 | |
| 
 | |
| 
 | |
| class OOTItem(Item):
 | |
|     game: str = "Ocarina of Time"
 | |
|     type: str
 | |
| 
 | |
|     def __init__(self, name, player, data, event, force_not_advancement):
 | |
|         (type, advancement, index, special) = data
 | |
|         # "advancement" is True, False or None; some items are not advancement based on settings
 | |
|         if force_not_advancement:
 | |
|             classification = ItemClassification.useful
 | |
|         elif name == "Ice Trap":
 | |
|             classification = ItemClassification.trap
 | |
|         elif name in {'Gold Skulltula Token', 'Triforce Piece'}:
 | |
|             classification = ItemClassification.progression_skip_balancing
 | |
|         elif advancement:
 | |
|             classification = ItemClassification.progression
 | |
|         else:
 | |
|             classification = ItemClassification.filler
 | |
|         super(OOTItem, self).__init__(name, classification, oot_data_to_ap_id(data, event), player)
 | |
|         self.type = type
 | |
|         self.index = index
 | |
|         self.special = special or {}
 | |
|         self.price = special.get('price', None) if special else None
 | |
|         self.internal = False
 | |
| 
 | |
|     @property
 | |
|     def dungeonitem(self) -> bool:
 | |
|         return self.type in ['SmallKey', 'HideoutSmallKey', 'BossKey', 'GanonBossKey', 'Map', 'Compass']
 | |
| 
 | |
| 
 | |
| # Progressive: True  -> Advancement
 | |
| #              False -> Priority
 | |
| #              None  -> Normal
 | |
| #    Item:                                            (type, Progressive, GetItemID, special),
 | |
| item_table = {
 | |
|     'Bombs (5)':                                       ('Item',     None,  0x01, {'junk': 8}),
 | |
|     'Deku Nuts (5)':                                   ('Item',     None,  0x02, {'junk': 5}),
 | |
|     'Bombchus (10)':                                   ('Item',     True,  0x03, None),
 | |
|     'Boomerang':                                       ('Item',     True,  0x06, None),
 | |
|     'Deku Stick (1)':                                  ('Item',     None,  0x07, {'junk': 5}),
 | |
|     'Lens of Truth':                                   ('Item',     True,  0x0A, None),
 | |
|     'Megaton Hammer':                                  ('Item',     True,  0x0D, None),
 | |
|     'Cojiro':                                          ('Item',     True,  0x0E, {'trade': True}),
 | |
|     'Bottle':                                          ('Item',     True,  0x0F, {'bottle': float('Inf')}),
 | |
|     'Bottle with Milk':                                ('Item',     True,  0x14, {'bottle': float('Inf')}),
 | |
|     'Rutos Letter':                                    ('Item',     True,  0x15, None),
 | |
|     'Deliver Letter':                                  ('Item',     True,  None, {'bottle': float('Inf')}),
 | |
|     'Sell Big Poe':                                    ('Item',     True,  None, {'bottle': float('Inf')}),
 | |
|     'Magic Bean':                                      ('Item',     True,  0x16, {'progressive': 10}),
 | |
|     'Skull Mask':                                      ('Item',     True,  0x17, {'trade': True}),
 | |
|     'Spooky Mask':                                     ('Item',     None,  0x18, {'trade': True}),
 | |
|     'Keaton Mask':                                     ('Item',     None,  0x1A, {'trade': True}),
 | |
|     'Bunny Hood':                                      ('Item',     None,  0x1B, {'trade': True}),
 | |
|     'Mask of Truth':                                   ('Item',     True,  0x1C, {'trade': True}),
 | |
|     'Pocket Egg':                                      ('Item',     True,  0x1D, {'trade': True}),
 | |
|     'Pocket Cucco':                                    ('Item',     True,  0x1E, {'trade': True}),
 | |
|     'Odd Mushroom':                                    ('Item',     True,  0x1F, {'trade': True}),
 | |
|     'Odd Potion':                                      ('Item',     True,  0x20, {'trade': True}),
 | |
|     'Poachers Saw':                                    ('Item',     True,  0x21, {'trade': True}),
 | |
|     'Broken Sword':                                    ('Item',     True,  0x22, {'trade': True}),
 | |
|     'Prescription':                                    ('Item',     True,  0x23, {'trade': True}),
 | |
|     'Eyeball Frog':                                    ('Item',     True,  0x24, {'trade': True}),
 | |
|     'Eyedrops':                                        ('Item',     True,  0x25, {'trade': True}),
 | |
|     'Claim Check':                                     ('Item',     True,  0x26, {'trade': True}),
 | |
|     'Kokiri Sword':                                    ('Item',     True,  0x27, None),
 | |
|     'Giants Knife':                                    ('Item',     None,  0x28, None),
 | |
|     'Deku Shield':                                     ('Item',     None,  0x29, None),
 | |
|     'Hylian Shield':                                   ('Item',     None,  0x2A, None),
 | |
|     'Mirror Shield':                                   ('Item',     True,  0x2B, None),
 | |
|     'Goron Tunic':                                     ('Item',     True,  0x2C, None),
 | |
|     'Zora Tunic':                                      ('Item',     True,  0x2D, None),
 | |
|     'Iron Boots':                                      ('Item',     True,  0x2E, None),
 | |
|     'Hover Boots':                                     ('Item',     True,  0x2F, None),
 | |
|     'Stone of Agony':                                  ('Item',     True,  0x39, None),
 | |
|     'Gerudo Membership Card':                          ('Item',     True,  0x3A, None),
 | |
|     'Heart Container':                                 ('Item',     True,  0x3D, {'alias': ('Piece of Heart', 4), 'progressive': float('Inf')}),
 | |
|     'Piece of Heart':                                  ('Item',     True,  0x3E, {'progressive': float('Inf')}),
 | |
|     'Boss Key':                                        ('BossKey',  True,  0x3F, None),
 | |
|     'Compass':                                         ('Compass',  None,  0x40, None),
 | |
|     'Map':                                             ('Map',      None,  0x41, None),
 | |
|     'Small Key':                                       ('SmallKey', True,  0x42, {'progressive': float('Inf')}),
 | |
|     'Weird Egg':                                       ('Item',     True,  0x47, {'trade': True}),
 | |
|     'Recovery Heart':                                  ('Item',     None,  0x48, {'junk': 0}),
 | |
|     'Arrows (5)':                                      ('Item',     None,  0x49, {'junk': 8}),
 | |
|     'Arrows (10)':                                     ('Item',     None,  0x4A, {'junk': 2}),
 | |
|     'Arrows (30)':                                     ('Item',     None,  0x4B, {'junk': 0}),
 | |
|     'Rupee (1)':                                       ('Item',     None,  0x4C, {'junk': -1}),
 | |
|     'Rupees (5)':                                      ('Item',     None,  0x4D, {'junk': 10}),
 | |
|     'Rupees (20)':                                     ('Item',     None,  0x4E, {'junk': 4}),
 | |
|     'Milk':                                            ('Item',     None,  0x50, None),
 | |
|     'Goron Mask':                                      ('Item',     None,  0x51, None),
 | |
|     'Zora Mask':                                       ('Item',     None,  0x52, None),
 | |
|     'Gerudo Mask':                                     ('Item',     None,  0x53, None),
 | |
|     'Rupees (50)':                                     ('Item',     None,  0x55, {'junk': 1}),
 | |
|     'Rupees (200)':                                    ('Item',     None,  0x56, {'junk': 0}),
 | |
|     'Biggoron Sword':                                  ('Item',     None,  0x57, None),
 | |
|     'Fire Arrows':                                     ('Item',     True,  0x58, None),
 | |
|     'Ice Arrows':                                      ('Item',     True,  0x59, None),
 | |
|     'Light Arrows':                                    ('Item',     True,  0x5A, None),
 | |
|     'Gold Skulltula Token':                            ('Token',    True,  0x5B, {'progressive': float('Inf')}),
 | |
|     'Dins Fire':                                       ('Item',     True,  0x5C, None),
 | |
|     'Nayrus Love':                                     ('Item',     True,  0x5E, None),
 | |
|     'Farores Wind':                                    ('Item',     True,  0x5D, None),
 | |
|     'Deku Nuts (10)':                                  ('Item',     None,  0x64, {'junk': 0}),
 | |
|     'Bombs (10)':                                      ('Item',     None,  0x66, {'junk': 2}),
 | |
|     'Bombs (20)':                                      ('Item',     None,  0x67, {'junk': 0}),
 | |
|     'Deku Seeds (30)':                                 ('Item',     None,  0x69, {'junk': 5}),
 | |
|     'Bombchus (5)':                                    ('Item',     True,  0x6A, None),
 | |
|     'Bombchus (20)':                                   ('Item',     True,  0x6B, None),
 | |
|     'Rupee (Treasure Chest Game)':                     ('Item',     None,  0x72, None),
 | |
|     'Piece of Heart (Treasure Chest Game)':            ('Item',     True,  0x76, {'alias': ('Piece of Heart', 1), 'progressive': float('Inf')}),
 | |
|     'Ice Trap':                                        ('Item',     None,  0x7C, {'junk': 0}),
 | |
|     'Progressive Hookshot':                            ('Item',     True,  0x80, {'progressive': 2}),
 | |
|     'Progressive Strength Upgrade':                    ('Item',     True,  0x81, {'progressive': 3}),
 | |
|     'Bomb Bag':                                        ('Item',     True,  0x82, None),
 | |
|     'Bow':                                             ('Item',     True,  0x83, None),
 | |
|     'Slingshot':                                       ('Item',     True,  0x84, None),
 | |
|     'Progressive Wallet':                              ('Item',     True,  0x85, {'progressive': 3}),
 | |
|     'Progressive Scale':                               ('Item',     True,  0x86, {'progressive': 2}),
 | |
|     'Deku Nut Capacity':                               ('Item',     None,  0x87, None),
 | |
|     'Deku Stick Capacity':                             ('Item',     None,  0x88, None),
 | |
|     'Bombchus':                                        ('Item',     True,  0x89, None),
 | |
|     'Magic Meter':                                     ('Item',     True,  0x8A, None),
 | |
|     'Ocarina':                                         ('Item',     True,  0x8B, None),
 | |
|     'Bottle with Red Potion':                          ('Item',     True,  0x8C, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Bottle with Green Potion':                        ('Item',     True,  0x8D, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Bottle with Blue Potion':                         ('Item',     True,  0x8E, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Bottle with Fairy':                               ('Item',     True,  0x8F, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Bottle with Fish':                                ('Item',     True,  0x90, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Bottle with Blue Fire':                           ('Item',     True,  0x91, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Bottle with Bugs':                                ('Item',     True,  0x92, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Bottle with Big Poe':                             ('Item',     True,  0x93, {'shop_object': 0x0F}),
 | |
|     'Bottle with Poe':                                 ('Item',     True,  0x94, {'bottle': True, 'shop_object': 0x0F}),
 | |
|     'Boss Key (Forest Temple)':                        ('BossKey',  True,  0x95, None),
 | |
|     'Boss Key (Fire Temple)':                          ('BossKey',  True,  0x96, None),
 | |
|     'Boss Key (Water Temple)':                         ('BossKey',  True,  0x97, None),
 | |
|     'Boss Key (Spirit Temple)':                        ('BossKey',  True,  0x98, None),
 | |
|     'Boss Key (Shadow Temple)':                        ('BossKey',  True,  0x99, None),
 | |
|     'Boss Key (Ganons Castle)':                   ('GanonBossKey',  True,  0x9A, None),
 | |
|     'Compass (Deku Tree)':                             ('Compass', False,  0x9B, None),
 | |
|     'Compass (Dodongos Cavern)':                       ('Compass', False,  0x9C, None),
 | |
|     'Compass (Jabu Jabus Belly)':                      ('Compass', False,  0x9D, None),
 | |
|     'Compass (Forest Temple)':                         ('Compass', False,  0x9E, None),
 | |
|     'Compass (Fire Temple)':                           ('Compass', False,  0x9F, None),
 | |
|     'Compass (Water Temple)':                          ('Compass', False,  0xA0, None),
 | |
|     'Compass (Spirit Temple)':                         ('Compass', False,  0xA1, None),
 | |
|     'Compass (Shadow Temple)':                         ('Compass', False,  0xA2, None),
 | |
|     'Compass (Bottom of the Well)':                    ('Compass', False,  0xA3, None),
 | |
|     'Compass (Ice Cavern)':                            ('Compass', False,  0xA4, None),
 | |
|     'Map (Deku Tree)':                                 ('Map',     False,  0xA5, None),
 | |
|     'Map (Dodongos Cavern)':                           ('Map',     False,  0xA6, None),
 | |
|     'Map (Jabu Jabus Belly)':                          ('Map',     False,  0xA7, None),
 | |
|     'Map (Forest Temple)':                             ('Map',     False,  0xA8, None),
 | |
|     'Map (Fire Temple)':                               ('Map',     False,  0xA9, None),
 | |
|     'Map (Water Temple)':                              ('Map',     False,  0xAA, None),
 | |
|     'Map (Spirit Temple)':                             ('Map',     False,  0xAB, None),
 | |
|     'Map (Shadow Temple)':                             ('Map',     False,  0xAC, None),
 | |
|     'Map (Bottom of the Well)':                        ('Map',     False,  0xAD, None),
 | |
|     'Map (Ice Cavern)':                                ('Map',     False,  0xAE, None),
 | |
|     'Small Key (Forest Temple)':                       ('SmallKey', True,  0xAF, {'progressive': float('Inf')}),
 | |
|     'Small Key (Fire Temple)':                         ('SmallKey', True,  0xB0, {'progressive': float('Inf')}),
 | |
|     'Small Key (Water Temple)':                        ('SmallKey', True,  0xB1, {'progressive': float('Inf')}),
 | |
|     'Small Key (Spirit Temple)':                       ('SmallKey', True,  0xB2, {'progressive': float('Inf')}),
 | |
|     'Small Key (Shadow Temple)':                       ('SmallKey', True,  0xB3, {'progressive': float('Inf')}),
 | |
|     'Small Key (Bottom of the Well)':                  ('SmallKey', True,  0xB4, {'progressive': float('Inf')}),
 | |
|     'Small Key (Gerudo Training Ground)':              ('SmallKey', True,  0xB5, {'progressive': float('Inf')}),
 | |
|     'Small Key (Thieves Hideout)':              ('HideoutSmallKey', True,  0xB6, {'progressive': float('Inf')}),
 | |
|     'Small Key (Ganons Castle)':                       ('SmallKey', True,  0xB7, {'progressive': float('Inf')}),
 | |
|     'Double Defense':                                  ('Item',     None,  0xB8, None),
 | |
|     'Buy Magic Bean':                                  ('Item',     True,  0x16, {'alias': ('Magic Bean', 10), 'progressive': 10}),
 | |
|     'Magic Bean Pack':                                 ('Item',     True,  0xC9, {'alias': ('Magic Bean', 10), 'progressive': 10}),
 | |
|     'Triforce Piece':                                  ('Item',     True,  0xCA, {'progressive': float('Inf')}),
 | |
|     'Zeldas Letter':                                   ('Item',     True,  0x0B, {'trade': True}),
 | |
|     'Time Travel':                                     ('Event',    True,  None, None),
 | |
|     'Scarecrow Song':                                  ('Event',    True,  None, None),
 | |
|     'Triforce':                                        ('Event',    True,  None, None),
 | |
| 
 | |
|     # Event items otherwise generated by generic event logic
 | |
|     # can be defined here to enforce their appearance in playthroughs.
 | |
|     'Water Temple Clear':               ('Event',    True,  None, None),
 | |
|     'Forest Trial Clear':               ('Event',    True,  None, None),
 | |
|     'Fire Trial Clear':                 ('Event',    True,  None, None),
 | |
|     'Water Trial Clear':                ('Event',    True,  None, None),
 | |
|     'Shadow Trial Clear':               ('Event',    True,  None, None),
 | |
|     'Spirit Trial Clear':               ('Event',    True,  None, None),
 | |
|     'Light Trial Clear':                ('Event',    True,  None, None),
 | |
| 
 | |
|     'Deku Stick Drop':                  ('Drop',     True,  None, None),
 | |
|     'Deku Nut Drop':                    ('Drop',     True,  None, None),
 | |
|     'Blue Fire':                        ('Drop',     True,  None, None),
 | |
|     'Fairy':                            ('Drop',     True,  None, None),
 | |
|     'Fish':                             ('Drop',     True,  None, None),
 | |
|     'Bugs':                             ('Drop',     True,  None, None),
 | |
|     'Big Poe':                          ('Drop',     True,  None, None),
 | |
|     'Bombchu Drop':                     ('Drop',     True,  None, None),
 | |
|     'Deku Shield Drop':                 ('Drop',     True,  None, None),
 | |
| 
 | |
|     # Consumable refills defined mostly to placate 'starting with' options
 | |
|     'Arrows':                           ('Refill',   None,  None, None),
 | |
|     'Bombs':                            ('Refill',   None,  None, None),
 | |
|     'Deku Seeds':                       ('Refill',   None,  None, None),
 | |
|     'Deku Sticks':                      ('Refill',   None,  None, None),
 | |
|     'Deku Nuts':                        ('Refill',   None,  None, None),
 | |
|     'Rupees':                           ('Refill',   None,  None, None),
 | |
| 
 | |
|     'Minuet of Forest':                 ('Song',     True,  0xBB,
 | |
|                                             {
 | |
|                                                 'text_id': 0x73,
 | |
|                                                 'song_id': 0x02,
 | |
|                                                 'item_id': 0x5A,
 | |
|                                             }),
 | |
|     'Bolero of Fire':                   ('Song',     True,  0xBC,
 | |
|                                             {
 | |
|                                                 'text_id': 0x74,
 | |
|                                                 'song_id': 0x03,
 | |
|                                                 'item_id': 0x5B,
 | |
|                                             }),
 | |
|     'Serenade of Water':                ('Song',     True,  0xBD,
 | |
|                                             {
 | |
|                                                 'text_id': 0x75,
 | |
|                                                 'song_id': 0x04,
 | |
|                                                 'item_id': 0x5C,
 | |
|                                             }),
 | |
|     'Requiem of Spirit':                ('Song',     True,  0xBE,
 | |
|                                             {
 | |
|                                                 'text_id': 0x76,
 | |
|                                                 'song_id': 0x05,
 | |
|                                                 'item_id': 0x5D,
 | |
|                                             }),
 | |
|     'Nocturne of Shadow':               ('Song',     True,  0xBF,
 | |
|                                             {
 | |
|                                                 'text_id': 0x77,
 | |
|                                                 'song_id': 0x06,
 | |
|                                                 'item_id': 0x5E,
 | |
|                                             }),
 | |
|     'Prelude of Light':                 ('Song',     True,  0xC0,
 | |
|                                             {
 | |
|                                                 'text_id': 0x78,
 | |
|                                                 'song_id': 0x07,
 | |
|                                                 'item_id': 0x5F,
 | |
|                                             }),
 | |
|     'Zeldas Lullaby':                   ('Song',     True,  0xC1,
 | |
|                                             {
 | |
|                                                 'text_id': 0xD4,
 | |
|                                                 'song_id': 0x0A,
 | |
|                                                 'item_id': 0x60,
 | |
|                                             }),
 | |
|     'Eponas Song':                      ('Song',     True,  0xC2,
 | |
|                                             {
 | |
|                                                 'text_id': 0xD2,
 | |
|                                                 'song_id': 0x09,
 | |
|                                                 'item_id': 0x61,
 | |
|                                             }),
 | |
|     'Sarias Song':                      ('Song',     True,  0xC3,
 | |
|                                             {
 | |
|                                                 'text_id': 0xD1,
 | |
|                                                 'song_id': 0x08,
 | |
|                                                 'item_id': 0x62,
 | |
|                                             }),
 | |
|     'Suns Song':                        ('Song',     True,  0xC4,
 | |
|                                             {
 | |
|                                                 'text_id': 0xD3,
 | |
|                                                 'song_id': 0x0B,
 | |
|                                                 'item_id': 0x63,
 | |
|                                             }),
 | |
|     'Song of Time':                     ('Song',     True,  0xC5,
 | |
|                                             {
 | |
|                                                 'text_id': 0xD5,
 | |
|                                                 'song_id': 0x0C,
 | |
|                                                 'item_id': 0x64,
 | |
|                                             }),
 | |
|     'Song of Storms':                   ('Song',     True,  0xC6,
 | |
|                                             {
 | |
|                                                 'text_id': 0xD6,
 | |
|                                                 'song_id': 0x0D,
 | |
|                                                 'item_id': 0x65,
 | |
|                                             }),
 | |
| 
 | |
|     'Small Key Ring (Forest Temple)':                  ('SmallKey', True,  0xCB, {'alias': ('Small Key (Forest Temple)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Fire Temple)':                    ('SmallKey', True,  0xCC, {'alias': ('Small Key (Fire Temple)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Water Temple)':                   ('SmallKey', True,  0xCD, {'alias': ('Small Key (Water Temple)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Spirit Temple)':                  ('SmallKey', True,  0xCE, {'alias': ('Small Key (Spirit Temple)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Shadow Temple)':                  ('SmallKey', True,  0xCF, {'alias': ('Small Key (Shadow Temple)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Bottom of the Well)':             ('SmallKey', True,  0xD0, {'alias': ('Small Key (Bottom of the Well)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Gerudo Training Ground)':         ('SmallKey', True,  0xD1, {'alias': ('Small Key (Gerudo Training Ground)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Thieves Hideout)':         ('HideoutSmallKey', True,  0xD2, {'alias': ('Small Key (Thieves Hideout)', 10), 'progressive': float('Inf')}),
 | |
|     'Small Key Ring (Ganons Castle)':                  ('SmallKey', True,  0xD3, {'alias': ('Small Key (Ganons Castle)', 10), 'progressive': float('Inf')}),
 | |
| 
 | |
|     'Buy Deku Nut (5)':                 ('Shop',     True,  0x00, {'object': 0x00BB, 'price': 15}),
 | |
|     'Buy Arrows (30)':                  ('Shop',     False, 0x01, {'object': 0x00D8, 'price': 60}),
 | |
|     'Buy Arrows (50)':                  ('Shop',     False, 0x02, {'object': 0x00D8, 'price': 90}),
 | |
|     'Buy Bombs (5) for 25 Rupees':      ('Shop',     False, 0x03, {'object': 0x00CE, 'price': 25}),
 | |
|     'Buy Deku Nut (10)':                ('Shop',     True,  0x04, {'object': 0x00BB, 'price': 30}),
 | |
|     'Buy Deku Stick (1)':               ('Shop',     True,  0x05, {'object': 0x00C7, 'price': 10}),
 | |
|     'Buy Bombs (10)':                   ('Shop',     False, 0x06, {'object': 0x00CE, 'price': 50}),
 | |
|     'Buy Fish':                         ('Shop',     True,  0x07, {'object': 0x00F4, 'price': 200}),
 | |
|     'Buy Red Potion for 30 Rupees':     ('Shop',     False, 0x08, {'object': 0x00EB, 'price': 30}),
 | |
|     'Buy Green Potion':                 ('Shop',     False, 0x09, {'object': 0x00EB, 'price': 30}),
 | |
|     'Buy Blue Potion':                  ('Shop',     False, 0x0A, {'object': 0x00EB, 'price': 100}),
 | |
|     'Buy Hylian Shield':                ('Shop',     True,  0x0C, {'object': 0x00DC, 'price': 80}),
 | |
|     'Buy Deku Shield':                  ('Shop',     True,  0x0D, {'object': 0x00CB, 'price': 40}),
 | |
|     'Buy Goron Tunic':                  ('Shop',     True,  0x0E, {'object': 0x00F2, 'price': 200}),
 | |
|     'Buy Zora Tunic':                   ('Shop',     True,  0x0F, {'object': 0x00F2, 'price': 300}),
 | |
|     'Buy Heart':                        ('Shop',     False, 0x10, {'object': 0x00B7, 'price': 10}),
 | |
|     'Buy Bombchu (10)':                 ('Shop',     True,  0x15, {'object': 0x00D9, 'price': 99}),
 | |
|     'Buy Bombchu (20)':                 ('Shop',     True,  0x16, {'object': 0x00D9, 'price': 180}),
 | |
|     'Buy Bombchu (5)':                  ('Shop',     True,  0x18, {'object': 0x00D9, 'price': 60}),
 | |
|     'Buy Deku Seeds (30)':              ('Shop',     False, 0x1D, {'object': 0x0119, 'price': 30}),
 | |
|     'Sold Out':                         ('Shop',     False, 0x26, {'object': 0x0148}),
 | |
|     'Buy Blue Fire':                    ('Shop',     True,  0x27, {'object': 0x0173, 'price': 300}),
 | |
|     'Buy Bottle Bug':                   ('Shop',     True,  0x28, {'object': 0x0174, 'price': 50}),
 | |
|     'Buy Poe':                          ('Shop',     False, 0x2A, {'object': 0x0176, 'price': 30}),
 | |
|     'Buy Fairy\'s Spirit':              ('Shop',     True,  0x2B, {'object': 0x0177, 'price': 50}),
 | |
|     'Buy Arrows (10)':                  ('Shop',     False, 0x2C, {'object': 0x00D8, 'price': 20}),
 | |
|     'Buy Bombs (20)':                   ('Shop',     False, 0x2D, {'object': 0x00CE, 'price': 80}),
 | |
|     'Buy Bombs (30)':                   ('Shop',     False, 0x2E, {'object': 0x00CE, 'price': 120}),
 | |
|     'Buy Bombs (5) for 35 Rupees':      ('Shop',     False, 0x2F, {'object': 0x00CE, 'price': 35}),
 | |
|     'Buy Red Potion for 40 Rupees':     ('Shop',     False, 0x30, {'object': 0x00EB, 'price': 40}),
 | |
|     'Buy Red Potion for 50 Rupees':     ('Shop',     False, 0x31, {'object': 0x00EB, 'price': 50}),
 | |
| 
 | |
|     'Kokiri Emerald':                   ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'stone':      True,
 | |
|                                                 'addr2_data': 0x80,
 | |
|                                                 'bit_mask':   0x00040000,
 | |
|                                                 'item_id':    0x6C,
 | |
|                                                 'actor_type': 0x13,
 | |
|                                                 'object_id':  0x00AD,
 | |
|                                             }),
 | |
|     'Goron Ruby':                       ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'stone':      True,
 | |
|                                                 'addr2_data': 0x81,
 | |
|                                                 'bit_mask':   0x00080000,
 | |
|                                                 'item_id':    0x6D,
 | |
|                                                 'actor_type': 0x14,
 | |
|                                                 'object_id':  0x00AD,
 | |
|                                             }),
 | |
|     'Zora Sapphire':                    ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'stone':      True,
 | |
|                                                 'addr2_data': 0x82,
 | |
|                                                 'bit_mask':   0x00100000,
 | |
|                                                 'item_id':    0x6E,
 | |
|                                                 'actor_type': 0x15,
 | |
|                                                 'object_id':  0x00AD,
 | |
|                                             }),
 | |
|     'Forest Medallion':                 ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'medallion':  True,
 | |
|                                                 'addr2_data': 0x3E,
 | |
|                                                 'bit_mask':   0x00000001,
 | |
|                                                 'item_id':    0x66,
 | |
|                                                 'actor_type': 0x0B,
 | |
|                                                 'object_id':  0x00BA,
 | |
|                                             }),
 | |
|     'Fire Medallion':                   ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'medallion':  True,
 | |
|                                                 'addr2_data': 0x3C,
 | |
|                                                 'bit_mask':   0x00000002,
 | |
|                                                 'item_id':    0x67,
 | |
|                                                 'actor_type': 0x09,
 | |
|                                                 'object_id':  0x00BA,
 | |
|                                             }),
 | |
|     'Water Medallion':                  ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'medallion':  True,
 | |
|                                                 'addr2_data': 0x3D,
 | |
|                                                 'bit_mask':   0x00000004,
 | |
|                                                 'item_id':    0x68,
 | |
|                                                 'actor_type': 0x0A,
 | |
|                                                 'object_id':  0x00BA,
 | |
|                                             }),
 | |
|     'Spirit Medallion':                 ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'medallion':  True,
 | |
|                                                 'addr2_data': 0x3F,
 | |
|                                                 'bit_mask':   0x00000008,
 | |
|                                                 'item_id':    0x69,
 | |
|                                                 'actor_type': 0x0C,
 | |
|                                                 'object_id':  0x00BA,
 | |
|                                             }),
 | |
|     'Shadow Medallion':                 ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'medallion':  True,
 | |
|                                                 'addr2_data': 0x41,
 | |
|                                                 'bit_mask':   0x00000010,
 | |
|                                                 'item_id':    0x6A,
 | |
|                                                 'actor_type': 0x0D,
 | |
|                                                 'object_id':  0x00BA,
 | |
|                                             }),
 | |
|     'Light Medallion':                  ('DungeonReward',    True,  None,
 | |
|                                             {
 | |
|                                                 'medallion':  True,
 | |
|                                                 'addr2_data': 0x40,
 | |
|                                                 'bit_mask':   0x00000020,
 | |
|                                                 'item_id':    0x6B,
 | |
|                                                 'actor_type': 0x0E,
 | |
|                                                 'object_id':  0x00BA,
 | |
|                                             }),
 | |
| }
 |