Core: add some types to generic.Rules

This commit is contained in:
Fabian Dill 2022-08-22 07:24:36 +02:00 committed by Fabian Dill
parent 9553627136
commit 6a6dfcbaff
1 changed files with 10 additions and 8 deletions

View File

@ -49,11 +49,11 @@ def exclusion_rules(world, player: int, exclude_locations: typing.Set[str]):
location.progress_type = LocationProgressType.EXCLUDED
def set_rule(spot, rule: CollectionRule):
def set_rule(spot: typing.Union["BaseClasses.Location", "BaseClasses.Entrance"], rule: CollectionRule):
spot.access_rule = rule
def add_rule(spot, rule: CollectionRule, combine='and'):
def add_rule(spot: typing.Union["BaseClasses.Location", "BaseClasses.Entrance"], rule: CollectionRule, combine='and'):
old_rule = spot.access_rule
if combine == 'or':
spot.access_rule = lambda state: rule(state) or old_rule(state)
@ -61,35 +61,37 @@ def add_rule(spot, rule: CollectionRule, combine='and'):
spot.access_rule = lambda state: rule(state) and old_rule(state)
def forbid_item(location, item: str, player: int):
def forbid_item(location: "BaseClasses.Location", item: str, player: int):
old_rule = location.item_rule
location.item_rule = lambda i: (i.name != item or i.player != player) and old_rule(i)
def forbid_items_for_player(location, items: typing.Set[str], player: int):
def forbid_items_for_player(location: "BaseClasses.Location", items: typing.Set[str], player: int):
old_rule = location.item_rule
location.item_rule = lambda i: (i.player != player or i.name not in items) and old_rule(i)
def forbid_items(location, items: typing.Set[str]):
def forbid_items(location: "BaseClasses.Location", items: typing.Set[str]):
"""unused, but kept as a debugging tool."""
old_rule = location.item_rule
location.item_rule = lambda i: i.name not in items and old_rule(i)
def add_item_rule(location, rule: ItemRule):
def add_item_rule(location: "BaseClasses.Location", rule: ItemRule):
old_rule = location.item_rule
location.item_rule = lambda item: rule(item) and old_rule(item)
def item_in_locations(state, item: str, player: int, locations: typing.Sequence):
def item_in_locations(state: "BaseClasses.CollectionState", item: str, player: int,
locations: typing.Sequence["BaseClasses.Location"]) -> bool:
for location in locations:
if item_name(state, location[0], location[1]) == (item, player):
return True
return False
def item_name(state, location: str, player: int) -> typing.Optional[typing.Tuple[str, int]]:
def item_name(state: "BaseClasses.CollectionState", location: str, player: int) -> \
typing.Optional[typing.Tuple[str, int]]:
location = state.world.get_location(location, player)
if location.item is None:
return None