Core: make add_rule set if it finds an empty rule (#1093)
Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com>
This commit is contained in:
parent
097ac189e4
commit
722b3c5369
|
@ -53,16 +53,24 @@ def set_rule(spot: typing.Union["BaseClasses.Location", "BaseClasses.Entrance"],
|
||||||
spot.access_rule = rule
|
spot.access_rule = rule
|
||||||
|
|
||||||
|
|
||||||
def add_rule(spot: typing.Union["BaseClasses.Location", "BaseClasses.Entrance"], rule: CollectionRule, combine='and'):
|
def add_rule(spot: typing.Union["BaseClasses.Location", "BaseClasses.Entrance"], rule: CollectionRule, combine="and"):
|
||||||
old_rule = spot.access_rule
|
old_rule = spot.access_rule
|
||||||
if combine == 'or':
|
# empty rule, replace instead of add
|
||||||
spot.access_rule = lambda state: rule(state) or old_rule(state)
|
if old_rule is spot.__class__.access_rule:
|
||||||
|
spot.access_rule = rule if combine == "and" else old_rule
|
||||||
else:
|
else:
|
||||||
|
if combine == "and":
|
||||||
spot.access_rule = lambda state: rule(state) and old_rule(state)
|
spot.access_rule = lambda state: rule(state) and old_rule(state)
|
||||||
|
else:
|
||||||
|
spot.access_rule = lambda state: rule(state) or old_rule(state)
|
||||||
|
|
||||||
|
|
||||||
def forbid_item(location: "BaseClasses.Location", item: str, player: int):
|
def forbid_item(location: "BaseClasses.Location", item: str, player: int):
|
||||||
old_rule = location.item_rule
|
old_rule = location.item_rule
|
||||||
|
# empty rule
|
||||||
|
if old_rule is location.__class__.item_rule:
|
||||||
|
location.item_rule = lambda i: i.name != item or i.player != player
|
||||||
|
else:
|
||||||
location.item_rule = lambda i: (i.name != item or i.player != player) and old_rule(i)
|
location.item_rule = lambda i: (i.name != item or i.player != player) and old_rule(i)
|
||||||
|
|
||||||
|
|
||||||
|
@ -77,9 +85,16 @@ def forbid_items(location: "BaseClasses.Location", items: typing.Set[str]):
|
||||||
location.item_rule = lambda i: i.name not in items and old_rule(i)
|
location.item_rule = lambda i: i.name not in items and old_rule(i)
|
||||||
|
|
||||||
|
|
||||||
def add_item_rule(location: "BaseClasses.Location", rule: ItemRule):
|
def add_item_rule(location: "BaseClasses.Location", rule: ItemRule, combine: str = "and"):
|
||||||
old_rule = location.item_rule
|
old_rule = location.item_rule
|
||||||
|
# empty rule, replace instead of add
|
||||||
|
if old_rule is location.__class__.item_rule:
|
||||||
|
location.item_rule = rule if combine == "and" else old_rule
|
||||||
|
else:
|
||||||
|
if combine == "and":
|
||||||
location.item_rule = lambda item: rule(item) and old_rule(item)
|
location.item_rule = lambda item: rule(item) and old_rule(item)
|
||||||
|
else:
|
||||||
|
location.item_rule = lambda item: rule(item) or old_rule(item)
|
||||||
|
|
||||||
|
|
||||||
def item_in_locations(state: "BaseClasses.CollectionState", item: str, player: int,
|
def item_in_locations(state: "BaseClasses.CollectionState", item: str, player: int,
|
||||||
|
|
Loading…
Reference in New Issue