54 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			54 lines
		
	
	
		
			1.9 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 
								 | 
							
								from .LocationList import location_table
							 | 
						||
| 
								 | 
							
								from BaseClasses import Location
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								location_id_offset = 67000
							 | 
						||
| 
								 | 
							
								location_name_to_id = {name: (location_id_offset + index) for (index, name) in enumerate(location_table) 
							 | 
						||
| 
								 | 
							
								    if location_table[name][0] not in ['Boss', 'Event', 'Drop', 'HintStone', 'Hint']}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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):
							 | 
						||
| 
								 | 
							
								        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
							 | 
						||
| 
								 | 
							
								        if filter_tags is None: 
							 | 
						||
| 
								 | 
							
								            self.filter_tags = None
							 | 
						||
| 
								 | 
							
								        else: 
							 | 
						||
| 
								 | 
							
								            self.filter_tags = list(filter_tags)
							 | 
						||
| 
								 | 
							
								        self.never = False # no idea what this does
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								        if type == 'Event': 
							 | 
						||
| 
								 | 
							
								            self.event = True
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								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))
							 | 
						||
| 
								 | 
							
								        else:
							 | 
						||
| 
								 | 
							
								            raise KeyError('Unknown Location: %s', location)
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								    if singleton:
							 | 
						||
| 
								 | 
							
								        return ret[0]
							 | 
						||
| 
								 | 
							
								    return ret
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								
							 |