58 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
		
		
			
		
	
	
			58 lines
		
	
	
		
			2.1 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
|   | import typing | ||
|  | from .requirements import hasConsumableRequirement, OR | ||
|  | from ..locations.itemInfo import ItemInfo | ||
|  | 
 | ||
|  | 
 | ||
|  | class Location: | ||
|  |     def __init__(self, name=None, dungeon=None): | ||
|  |         self.name = name | ||
|  |         self.items = []  # type: typing.List[ItemInfo] | ||
|  |         self.dungeon = dungeon | ||
|  |         self.__connected_to = set() | ||
|  |         self.simple_connections = [] | ||
|  |         self.gated_connections = [] | ||
|  | 
 | ||
|  |     def add(self, *item_infos): | ||
|  |         for ii in item_infos: | ||
|  |             assert isinstance(ii, ItemInfo) | ||
|  |             ii.setLocation(self) | ||
|  |             self.items.append(ii) | ||
|  |         return self | ||
|  | 
 | ||
|  |     def connect(self, other, req, *, one_way=False): | ||
|  |         assert isinstance(other, Location), type(other) | ||
|  | 
 | ||
|  |         if isinstance(req, bool): | ||
|  |             if req: | ||
|  |                 self.connect(other, None, one_way=one_way) | ||
|  |             return | ||
|  | 
 | ||
|  |         if other in self.__connected_to: | ||
|  |             for idx, data in enumerate(self.gated_connections): | ||
|  |                 if data[0] == other: | ||
|  |                     if req is None or data[1] is None: | ||
|  |                         self.gated_connections[idx] = (other, None) | ||
|  |                     else: | ||
|  |                         self.gated_connections[idx] = (other, OR(req, data[1])) | ||
|  |                     break | ||
|  |             for idx, data in enumerate(self.simple_connections): | ||
|  |                 if data[0] == other: | ||
|  |                     if req is None or data[1] is None: | ||
|  |                         self.simple_connections[idx] = (other, None) | ||
|  |                     else: | ||
|  |                         self.simple_connections[idx] = (other, OR(req, data[1])) | ||
|  |                     break | ||
|  |         else: | ||
|  |             self.__connected_to.add(other) | ||
|  | 
 | ||
|  |             if hasConsumableRequirement(req): | ||
|  |                 self.gated_connections.append((other, req)) | ||
|  |             else: | ||
|  |                 self.simple_connections.append((other, req)) | ||
|  |         if not one_way: | ||
|  |             other.connect(self, req, one_way=True) | ||
|  |         return self | ||
|  | 
 | ||
|  |     def __repr__(self): | ||
|  |         return "<%s:%s:%d:%d:%d>" % (self.__class__.__name__, self.dungeon, len(self.items), len(self.simple_connections), len(self.gated_connections)) |