Core: don't allow region, location, or entrance with duplicate names (#2453)

This commit is contained in:
Aaron Wagener
2024-02-25 14:56:27 -06:00
committed by GitHub
parent 86a7ac466e
commit 8f7b0ee489
11 changed files with 36 additions and 51 deletions

View File

@@ -140,11 +140,7 @@ def create_explore_region(multiworld: MultiWorld, player: int, name: str, data:
def create_connections_in_regions(multiworld: MultiWorld, player: int, name: str, data: RoRRegionData) -> None:
region = multiworld.get_region(name, player)
if data.region_exits:
for region_exit in data.region_exits:
r_exit_stage = Entrance(player, region_exit, region)
exit_region = multiworld.get_region(region_exit, player)
r_exit_stage.connect(exit_region)
region.exits.append(r_exit_stage)
region.add_exits(data.region_exits)
def create_classic_regions(ror2_world: "RiskOfRainWorld") -> None:

View File

@@ -9,14 +9,16 @@ if TYPE_CHECKING:
# Rule to see if it has access to the previous stage
def has_entrance_access_rule(multiworld: MultiWorld, stage: str, entrance: str, player: int) -> None:
multiworld.get_entrance(entrance, player).access_rule = \
lambda state: state.has(entrance, player) and state.has(stage, player)
def has_entrance_access_rule(multiworld: MultiWorld, stage: str, region: str, player: int) -> None:
rule = lambda state: state.has(region, player) and state.has(stage, player)
for entrance in multiworld.get_region(region, player).entrances:
entrance.access_rule = rule
def has_all_items(multiworld: MultiWorld, items: Set[str], entrance: str, player: int) -> None:
multiworld.get_entrance(entrance, player).access_rule = \
lambda state: state.has_all(items, player) and state.has(entrance, player)
def has_all_items(multiworld: MultiWorld, items: Set[str], region: str, player: int) -> None:
rule = lambda state: state.has_all(items, player) and state.has(region, player)
for entrance in multiworld.get_region(region, player).entrances:
entrance.access_rule = rule
# Checks to see if chest/shrine are accessible
@@ -45,8 +47,9 @@ def check_location(state, environment: str, player: int, item_number: int, item_
def get_stage_event(multiworld: MultiWorld, player: int, stage_number: int) -> None:
if stage_number == 4:
return
multiworld.get_entrance(f"OrderedStage_{stage_number + 1}", player).access_rule = \
lambda state: state.has(f"Stage {stage_number + 1}", player)
rule = lambda state: state.has(f"Stage {stage_number + 1}", player)
for entrance in multiworld.get_region(f"OrderedStage_{stage_number + 1}", player).entrances:
entrance.access_rule = rule
def set_rules(ror2_world: "RiskOfRainWorld") -> None:

View File

@@ -8,8 +8,8 @@ class LimboGoalTest(RoR2TestBase):
def test_limbo(self) -> None:
self.collect_all_but(["Hidden Realm: A Moment, Whole", "Victory"])
self.assertFalse(self.can_reach_entrance("Hidden Realm: A Moment, Whole"))
self.assertFalse(self.can_reach_region("Hidden Realm: A Moment, Whole"))
self.assertBeatable(False)
self.collect_by_name("Hidden Realm: A Moment, Whole")
self.assertTrue(self.can_reach_entrance("Hidden Realm: A Moment, Whole"))
self.assertTrue(self.can_reach_region("Hidden Realm: A Moment, Whole"))
self.assertBeatable(True)

View File

@@ -8,18 +8,18 @@ class MithrixGoalTest(RoR2TestBase):
def test_mithrix(self) -> None:
self.collect_all_but(["Commencement", "Victory"])
self.assertFalse(self.can_reach_entrance("Commencement"))
self.assertFalse(self.can_reach_region("Commencement"))
self.assertBeatable(False)
self.collect_by_name("Commencement")
self.assertTrue(self.can_reach_entrance("Commencement"))
self.assertTrue(self.can_reach_region("Commencement"))
self.assertBeatable(True)
def test_stage5(self) -> None:
self.collect_all_but(["Stage 4", "Sky Meadow", "Victory"])
self.assertFalse(self.can_reach_entrance("Sky Meadow"))
self.assertFalse(self.can_reach_region("Sky Meadow"))
self.assertBeatable(False)
self.collect_by_name("Sky Meadow")
self.assertFalse(self.can_reach_entrance("Sky Meadow"))
self.assertFalse(self.can_reach_region("Sky Meadow"))
self.collect_by_name("Stage 4")
self.assertTrue(self.can_reach_entrance("Sky Meadow"))
self.assertTrue(self.can_reach_region("Sky Meadow"))
self.assertBeatable(True)

View File

@@ -9,17 +9,17 @@ class VoidlingGoalTest(RoR2TestBase):
def test_planetarium(self) -> None:
self.collect_all_but(["The Planetarium", "Victory"])
self.assertFalse(self.can_reach_entrance("The Planetarium"))
self.assertFalse(self.can_reach_region("The Planetarium"))
self.assertBeatable(False)
self.collect_by_name("The Planetarium")
self.assertTrue(self.can_reach_entrance("The Planetarium"))
self.assertTrue(self.can_reach_region("The Planetarium"))
self.assertBeatable(True)
def test_void_locus_to_victory(self) -> None:
self.collect_all_but(["Void Locus", "Commencement"])
self.assertFalse(self.can_reach_location("Victory"))
self.collect_by_name("Void Locus")
self.assertTrue(self.can_reach_entrance("Victory"))
self.assertTrue(self.can_reach_location("Victory"))
def test_commencement_to_victory(self) -> None:
self.collect_all_but(["Void Locus", "Commencement"])