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))
							 |