 aee0df5359
			
		
	
	aee0df5359
	
	
	
		
			
			## What is this fixing or adding? - Adds the majority of OoTR 7.0 features: - Pot shuffle, Freestanding item shuffle, Crate shuffle, Beehive shuffle - Key rings mode - Dungeon shortcuts to speed up dungeons - "Regional" shuffle for dungeon items - New options for shop pricing in shopsanity - Expanded Ganon's Boss Key shuffle options - Pre-planted beans - Improved Chest Appearance Matches Contents mode - Blue Fire Arrows - Bonk self-damage - Finer control over MQ dungeons and spawn position randomization - Several bugfixes as a result of the update: - Items recognized by the server and valid starting items are now in a 1-to-1 correspondence. In particular, starting with keys is now supported. - Entrance randomization success rate improved. Hopefully it is now at 100%. Co-authored-by: Zach Parks <zach@alliware.com>
		
			
				
	
	
		
			86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			86 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from enum import Enum
 | |
| from .LocationList import location_table
 | |
| from BaseClasses import Location
 | |
| 
 | |
| location_id_offset = 67000
 | |
| locnames_pre_70 = {
 | |
|     "Gift from Sages",
 | |
|     "ZR Frogs Zeldas Lullaby",
 | |
|     "ZR Frogs Eponas Song",
 | |
|     "ZR Frogs Sarias Song",
 | |
|     "ZR Frogs Suns Song",
 | |
|     "ZR Frogs Song of Time",
 | |
| }
 | |
| loctypes_70 = {'Beehive', 'Pot', 'FlyingPot', 'Crate', 'SmallCrate', 'RupeeTower', 'Freestanding', 'ActorOverride'}
 | |
| new_name_order = sorted(location_table.keys(),
 | |
|     key=lambda name: 2 if location_table[name][0] in loctypes_70
 | |
|                 else 1 if name in locnames_pre_70
 | |
|                 else 0)
 | |
| 
 | |
| location_name_to_id = {name: (location_id_offset + index) for (index, name) in enumerate(new_name_order) 
 | |
|     if location_table[name][0] not in {'Boss', 'Event', 'Drop', 'HintStone', 'Hint'}}
 | |
| 
 | |
| class DisableType(Enum):
 | |
|     ENABLED  = 0
 | |
|     PENDING = 1
 | |
|     DISABLED = 2
 | |
| 
 | |
| class OOTLocation(Location): 
 | |
|     game: str = 'Ocarina of Time'
 | |
| 
 | |
|     def __init__(self, player, name='', code=None, address1=None, address2=None,
 | |
|         default=None, type='Chest', scene=None, parent=None, filter_tags=None,
 | |
|         internal=False, vanilla_item=None
 | |
|     ):
 | |
|         super(OOTLocation, self).__init__(player, name, code, parent)
 | |
|         self.address1 = address1
 | |
|         self.address2 = address2
 | |
|         self.default = default
 | |
|         self.type = type
 | |
|         self.scene = scene
 | |
|         self.internal = internal
 | |
|         self.vanilla_item = vanilla_item
 | |
|         if filter_tags is None: 
 | |
|             self.filter_tags = None
 | |
|         else: 
 | |
|             self.filter_tags = list(filter_tags)
 | |
|         self.never = False # no idea what this does
 | |
|         self.disabled = DisableType.ENABLED
 | |
| 
 | |
|         if type == 'Event': 
 | |
|             self.event = True
 | |
| 
 | |
|     @property
 | |
|     def dungeon(self):
 | |
|         return self.parent_region.dungeon
 | |
| 
 | |
| 
 | |
| def LocationFactory(locations, player: int):
 | |
|     ret = []
 | |
|     singleton = False
 | |
|     if isinstance(locations, str):
 | |
|         locations = [locations]
 | |
|         singleton = True
 | |
|     for location in locations:
 | |
|         if location in location_table:
 | |
|             match_location = location
 | |
|         else:
 | |
|             match_location = next(filter(lambda k: k.lower() == location.lower(), location_table), None)
 | |
|         if match_location:
 | |
|             type, scene, default, addresses, vanilla_item, filter_tags = location_table[match_location]
 | |
|             if addresses is None:
 | |
|                 addresses = (None, None)
 | |
|             address1, address2 = addresses
 | |
|             ret.append(OOTLocation(player, match_location,
 | |
|                 location_name_to_id.get(match_location, None),
 | |
|                 address1, address2, default, type, scene,
 | |
|                 filter_tags=filter_tags, vanilla_item=vanilla_item))
 | |
|         else:
 | |
|             raise KeyError('Unknown Location: %s', location)
 | |
| 
 | |
|     if singleton:
 | |
|         return ret[0]
 | |
|     return ret
 | |
| 
 | |
| 
 |