diff --git a/worlds/ror2/Rules.py b/worlds/ror2/Rules.py index 3653f047..4f374832 100644 --- a/worlds/ror2/Rules.py +++ b/worlds/ror2/Rules.py @@ -7,27 +7,37 @@ class RiskOfRainLogic(LogicMixin): def _ror_has_items(self, player: int, amount: int) -> bool: count: int = self.item_count("Common Item", player) + self.item_count("Uncommon Item", player) + \ self.item_count("Legendary Item", player) + self.item_count("Boss Item", player) + \ - self.item_count("Lunar Item", player) + self.item_count("Equipment", player) + self.item_count("Lunar Item", player) + self.item_count("Equipment", player) + \ + self.item_count("Dio's Best Friend", player) return count >= amount def set_rules(world: MultiWorld, player: int): - total_checks = world.total_locations[player] # divide by 5 since 5 levels (then commencement) - items_per_level = total_checks / 5 - leftover = total_checks % 5 + items_per_level = max(int(world.total_locations[player] / 5 / (world.item_pickup_step[player]+1)), 1) - set_rule(world.get_location("Level One", player), - lambda state: state._ror_has_items(player, items_per_level + leftover)) + # lock item pickup access based on level completion + for i in range(1, items_per_level): + set_rule(world.get_location(f"Item Pickup {i}", player), lambda state: True) + for i in range(items_per_level, 2*items_per_level): + set_rule(world.get_location(f"Item Pickup {i}", player), lambda state: state.has("Beat Level One", player)) + for i in range(2*items_per_level, 3*items_per_level): + set_rule(world.get_location(f"Item Pickup {i}", player), lambda state: state.has("Beat Level Two", player)) + for i in range(3*items_per_level, 4*items_per_level): + set_rule(world.get_location(f"Item Pickup {i}", player), lambda state: state.has("Beat Level Three", player)) + for i in range(4*items_per_level, world.total_locations[player]+1): + set_rule(world.get_location(f"Item Pickup {i}", player), lambda state: state.has("Beat Level Four", player)) + + # require items to beat each stage set_rule(world.get_location("Level Two", player), - lambda state: state._ror_has_items(player, items_per_level) and state.has("Beat Level One", player)) + lambda state: state.has("Beat Level One", player) and state._ror_has_items(player, items_per_level)) set_rule(world.get_location("Level Three", player), - lambda state: state._ror_has_items(player, items_per_level) and state.has("Beat Level Two", player)) + lambda state: state._ror_has_items(player, 2 * items_per_level) and state.has("Beat Level Two", player)) set_rule(world.get_location("Level Four", player), - lambda state: state._ror_has_items(player, items_per_level) and state.has("Beat Level Three", player)) + lambda state: state._ror_has_items(player, 3 * items_per_level) and state.has("Beat Level Three", player)) set_rule(world.get_location("Level Five", player), - lambda state: state._ror_has_items(player, items_per_level) and state.has("Beat Level Four", player)) + lambda state: state._ror_has_items(player, 4 * items_per_level) and state.has("Beat Level Four", player)) set_rule(world.get_location("Victory", player), - lambda state: state._ror_has_items(player, items_per_level) and state.has("Beat Level Five", player)) + lambda state: state._ror_has_items(player, 5 * items_per_level) and state.has("Beat Level Five", player)) world.completion_condition[player] = lambda state: state.has("Victory", player) \ No newline at end of file diff --git a/worlds/ror2/__init__.py b/worlds/ror2/__init__.py index d3711760..483b4689 100644 --- a/worlds/ror2/__init__.py +++ b/worlds/ror2/__init__.py @@ -37,16 +37,16 @@ class RiskOfRainWorld(World): # generate chaos weights if the preset is chosen if pool_option == 5: junk_pool = { - "Item Scrap, Green": self.world.random.randint(0, 100), - "Item Scrap, Red": self.world.random.randint(0, 100), - "Item Scrap, Yellow": self.world.random.randint(0, 100), + "Item Scrap, Green": self.world.random.randint(0, 80), + "Item Scrap, Red": self.world.random.randint(0, 40), + "Item Scrap, Yellow": self.world.random.randint(0, 50), "Item Scrap, White": self.world.random.randint(0, 100), "Common Item": self.world.random.randint(0, 100), "Uncommon Item": self.world.random.randint(0, 70), "Legendary Item": self.world.random.randint(0, 45), "Boss Item": self.world.random.randint(0, 30), "Lunar Item": self.world.random.randint(0, 60), - "Equipment": self.world.random.randint(0, 50) + "Equipment": self.world.random.randint(0, 40) } else: junk_pool = item_pool_weights[pool_option].copy() @@ -64,15 +64,15 @@ class RiskOfRainWorld(World): "Equipment": self.world.equipment[self.player].value } + if not self.world.enable_lunar[self.player]: + junk_pool.pop("Lunar Item") + # Generate item pool itempool = [] # Add revive items for the player itempool += ["Dio's Best Friend"] * self.world.total_revivals[self.player] - if not self.world.enable_lunar[self.player]: - junk_pool.pop("Lunar Item") - # Fill remaining items with randomly generated junk itempool += self.world.random.choices(list(junk_pool.keys()), weights=list(junk_pool.values()), k=self.world.total_locations[self.player] - @@ -109,7 +109,7 @@ def create_regions(world, player: int): create_region(world, player, 'Menu', None, ['Lobby']), create_region(world, player, 'Petrichor V', [location for location in base_location_table] + - [f"ItemPickup{i}" for i in range(1, 1+world.total_locations[player])]) + [f"Item Pickup {i}" for i in range(1, world.start_with_revive[player].value+world.total_locations[player])]) ] world.get_entrance("Lobby", player).connect(world.get_region("Petrichor V", player))