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