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,17 +53,25 @@ def set_rule(spot: typing.Union["BaseClasses.Location", "BaseClasses.Entrance"],
|
|||
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
|
||||
if combine == 'or':
|
||||
spot.access_rule = lambda state: rule(state) or old_rule(state)
|
||||
# empty rule, replace instead of add
|
||||
if old_rule is spot.__class__.access_rule:
|
||||
spot.access_rule = rule if combine == "and" else old_rule
|
||||
else:
|
||||
spot.access_rule = lambda state: rule(state) and old_rule(state)
|
||||
if combine == "and":
|
||||
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):
|
||||
old_rule = location.item_rule
|
||||
location.item_rule = lambda i: (i.name != item or i.player != player) and old_rule(i)
|
||||
# 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)
|
||||
|
||||
|
||||
def forbid_items_for_player(location: "BaseClasses.Location", items: typing.Set[str], player: int):
|
||||
|
@ -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)
|
||||
|
||||
|
||||
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
|
||||
location.item_rule = lambda item: rule(item) and old_rule(item)
|
||||
# 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)
|
||||
else:
|
||||
location.item_rule = lambda item: rule(item) or old_rule(item)
|
||||
|
||||
|
||||
def item_in_locations(state: "BaseClasses.CollectionState", item: str, player: int,
|
||||
|
|
Loading…
Reference in New Issue