RoR2: bug fixes (#1891)

* adding back parens that got deleted by accident.

* Void Locus and The Planetarium ids backwards

* change required client version

* beads of fealty was missing for A Moment, whole victory

* found another logic bug

* Update worlds/ror2/__init__.py

Co-authored-by: Zach Parks <zach@alliware.com>

* Remove unnecessary comment

---------

Co-authored-by: Zach Parks <zach@alliware.com>
This commit is contained in:
kindasneaki 2023-06-26 22:47:52 -06:00 committed by GitHub
parent 125ee8b198
commit a7bc8846cd
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
5 changed files with 28 additions and 25 deletions

View File

@ -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

View File

@ -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}

View File

@ -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")

View File

@ -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)

View File

@ -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