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