diff --git a/worlds/ror2/Items.py b/worlds/ror2/Items.py index 874b2a7c..448e3272 100644 --- a/worlds/ror2/Items.py +++ b/worlds/ror2/Items.py @@ -20,7 +20,8 @@ item_table: Dict[str, int] = { "Item Scrap, Green": 37009, "Item Scrap, Red": 37010, "Item Scrap, Yellow": 37011, - "Void Item": 37012 + "Void Item": 37012, + "Beads of Fealty": 37013 } # 37700 - 37699 diff --git a/worlds/ror2/Regions.py b/worlds/ror2/Regions.py index 594558b5..58960346 100644 --- a/worlds/ror2/Regions.py +++ b/worlds/ror2/Regions.py @@ -50,8 +50,8 @@ def create_regions(multiworld: MultiWorld, player: int): "Hidden Realm: Gilded Coast": RoRRegionData(None, None) } dlc_other_regions: Dict[str, RoRRegionData] = { - "The Planetarium": RoRRegionData(None, ["Victory"]), - "Void Locus": RoRRegionData(None, ["The Planetarium"]) + "The Planetarium": RoRRegionData(None, ["Victory"]), + "Void Locus": RoRRegionData(None, ["The Planetarium"]) } # Totals of each item chests = int(multiworld.chests_per_stage[player]) @@ -92,7 +92,6 @@ def create_regions(multiworld: MultiWorld, player: int): non_dlc_regions["Menu"].region_exits.append("Siphoned Forest") other_regions["OrderedStage_2"].region_exits.append("Aphelian Sanctuary") other_regions["OrderedStage_3"].region_exits.append("Sulfur Pools") - other_regions["Commencement"].region_exits.append("The Planetarium") other_regions["Void Fields"].region_exits.append("Void Locus") regions_pool: Dict = {**all_location_regions, **other_regions, **dlc_other_regions} diff --git a/worlds/ror2/RoR2Environments.py b/worlds/ror2/RoR2Environments.py index 43d2fe52..2a9bf73e 100644 --- a/worlds/ror2/RoR2Environments.py +++ b/worlds/ror2/RoR2Environments.py @@ -62,8 +62,8 @@ environment_sotv_simulacrum_table: Dict[str, int] = { } environment_sotv_special_table: Dict[str, int] = { - "Void Locus": 45, # voidstage - "The Planetarium": 46, # voidraid + "Void Locus": 46, # voidstage + "The Planetarium": 45, # voidraid } X = TypeVar("X") diff --git a/worlds/ror2/Rules.py b/worlds/ror2/Rules.py index 90b72e81..7d941774 100644 --- a/worlds/ror2/Rules.py +++ b/worlds/ror2/Rules.py @@ -31,10 +31,11 @@ def check_location(state, environment: str, player: int, item_number: int, item_ # unlock event to next set of stages def get_stage_event(multiworld: MultiWorld, player: int, stage_number: int): if not multiworld.dlc_sotv[player]: - environment_name = multiworld.random.choices(list(environment_vanilla_orderedstages_table[stage_number].keys()), k=1) + environment_name = multiworld.random.choices(list(environment_vanilla_orderedstages_table[stage_number].keys()), + k=1) else: environment_name = multiworld.random.choices(list(environment_orderedstages_table[stage_number].keys()), k=1) - multiworld.get_location(f"Stage_{stage_number+1}", player).access_rule = \ + multiworld.get_location(f"Stage_{stage_number + 1}", player).access_rule = \ lambda state: get_one_of_the_stages(state, environment_name[0], player) @@ -43,7 +44,6 @@ def get_one_of_the_stages(state: CollectionState, stage: str, player: int): def set_rules(multiworld: MultiWorld, player: int) -> None: - if multiworld.goal[player] == "classic": # classic mode total_locations = multiworld.total_locations[player].value # total locations for current player @@ -72,21 +72,22 @@ def set_rules(multiworld: MultiWorld, player: int) -> None: event_loc = multiworld.get_location(f"Pickup{i * event_location_step}", player) set_rule(event_loc, lambda state, i=i: state.can_reach(f"ItemPickup{i * event_location_step - 1}", "Location", player)) - for n in range(i * event_location_step, (i + 1) * event_location_step + 1): # we want to create a rule for each of the 25 locations per division + # we want to create a rule for each of the 25 locations per division + for n in range(i * event_location_step, (i + 1) * event_location_step + 1): if n > total_locations: break if n == i * event_location_step: set_rule(multiworld.get_location(f"ItemPickup{n}", player), - lambda state, event_item=event_loc.item.name: state.has(event_item, player)) + lambda state, event_item=event_loc.item.name: state.has(event_item, player)) else: set_rule(multiworld.get_location(f"ItemPickup{n}", player), - lambda state, n=n: state.can_reach(f"ItemPickup{n - 1}", "Location", player)) + lambda state, n=n: state.can_reach(f"ItemPickup{n - 1}", "Location", player)) set_rule(multiworld.get_location("Victory", player), - lambda state: state.can_reach(f"ItemPickup{total_locations}", "Location", player)) + lambda state: state.can_reach(f"ItemPickup{total_locations}", "Location", player)) if total_revivals or multiworld.start_with_revive[player].value: add_rule(multiworld.get_location("Victory", player), - lambda state: state.has("Dio's Best Friend", player, - total_revivals + multiworld.start_with_revive[player])) + lambda state: state.has("Dio's Best Friend", player, + total_revivals + multiworld.start_with_revive[player])) elif multiworld.goal[player] == "explore": # When explore_mode is used, @@ -96,10 +97,10 @@ def set_rules(multiworld: MultiWorld, player: int) -> None: # help prevent being stuck in the same stages until that point.) for location in multiworld.get_locations(): - if location.player != player: continue # ignore all checks that don't belong to this player + if location.player != player: continue # ignore all checks that don't belong to this player if "Scavenger" in location.name: add_rule(location, lambda state: state.has("Stage_5", player)) - # Regions + # Regions chests = multiworld.chests_per_stage[player] shrines = multiworld.shrines_per_stage[player] newts = multiworld.altars_per_stage[player] @@ -140,11 +141,13 @@ def set_rules(multiworld: MultiWorld, player: int) -> None: has_location_access_rule(multiworld, environment_name, player, newt, "Newt Altar") if i > 0: has_entrance_access_rule(multiworld, f"Stage_{i}", environment_name, player) - has_entrance_access_rule(multiworld, f"Hidden Realm: A Moment, Fractured", "Hidden Realm: A Moment, Whole", player) + has_entrance_access_rule(multiworld, f"Hidden Realm: A Moment, Fractured", "Hidden Realm: A Moment, Whole", + player) has_entrance_access_rule(multiworld, f"Stage_1", "Hidden Realm: Bazaar Between Time", player) has_entrance_access_rule(multiworld, f"Hidden Realm: Bazaar Between Time", "Void Fields", player) has_entrance_access_rule(multiworld, f"Stage_5", "Commencement", player) has_entrance_access_rule(multiworld, f"Stage_5", "Hidden Realm: A Moment, Fractured", player) + has_entrance_access_rule(multiworld, "Beads of Fealty", "Hidden Realm: A Moment, Whole", player) if multiworld.dlc_sotv[player]: has_entrance_access_rule(multiworld, f"Stage_5", "Void Locus", player) has_entrance_access_rule(multiworld, f"Void Locus", "The Planetarium", player) diff --git a/worlds/ror2/__init__.py b/worlds/ror2/__init__.py index e7e1e48c..a7bce889 100644 --- a/worlds/ror2/__init__.py +++ b/worlds/ror2/__init__.py @@ -35,8 +35,8 @@ class RiskOfRainWorld(World): item_name_to_id = item_table location_name_to_id = item_pickups - data_version = 6 - required_client_version = (0, 3, 7) + data_version = 7 + required_client_version = (0, 4, 2) web = RiskOfWeb() total_revivals: int @@ -113,22 +113,22 @@ class RiskOfRainWorld(World): } # remove lunar items from the pool if they're disabled in the yaml unless lunartic is rolled - if not self.multiworld.enable_lunar[self.player] or pool_option == ItemWeights.option_lunartic: + if not (self.multiworld.enable_lunar[self.player] or pool_option == ItemWeights.option_lunartic): junk_pool.pop("Lunar Item") # remove void items from the pool - if not self.multiworld.dlc_sotv[self.player] or pool_option == ItemWeights.option_void: + if not (self.multiworld.dlc_sotv[self.player] or pool_option == ItemWeights.option_void): junk_pool.pop("Void Item") # Generate item pool itempool: List = [] # Add revive items for the player itempool += ["Dio's Best Friend"] * self.total_revivals + itempool += ["Beads of Fealty"] for env_name, _ in environments_pool.items(): itempool += [env_name] - # precollected environments are popped from the pool so counting like this is valid - nonjunk_item_count = self.total_revivals + len(environments_pool) + nonjunk_item_count = len(itempool) if self.multiworld.goal[self.player] == "classic": # classic mode total_locations = self.multiworld.total_locations[self.player].value @@ -205,7 +205,7 @@ class RiskOfRainWorld(World): def create_item(self, name: str) -> Item: item_id = item_table[name] classification = ItemClassification.filler - if name == "Dio's Best Friend": + if name in {"Dio's Best Friend", "Beads of Fealty"}: classification = ItemClassification.progression elif name in {"Legendary Item", "Boss Item"}: classification = ItemClassification.useful