From 722b3c53690703295d08a5a6a99d8bc974d37f72 Mon Sep 17 00:00:00 2001 From: Fabian Dill Date: Fri, 14 Oct 2022 22:52:45 +0200 Subject: [PATCH] Core: make add_rule set if it finds an empty rule (#1093) Co-authored-by: black-sliver <59490463+black-sliver@users.noreply.github.com> --- worlds/generic/Rules.py | 29 ++++++++++++++++++++++------- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/worlds/generic/Rules.py b/worlds/generic/Rules.py index 9b338e4d..6f70e1b5 100644 --- a/worlds/generic/Rules.py +++ b/worlds/generic/Rules.py @@ -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,