Adjustment to chaos weights. Add progression logic.

This commit is contained in:
alwaysintreble 2021-09-26 20:56:04 -05:00 committed by Fabian Dill
parent df0335f739
commit c0b25e1f6e
2 changed files with 29 additions and 19 deletions

View File

@ -7,27 +7,37 @@ class RiskOfRainLogic(LogicMixin):
def _ror_has_items(self, player: int, amount: int) -> bool: def _ror_has_items(self, player: int, amount: int) -> bool:
count: int = self.item_count("Common Item", player) + self.item_count("Uncommon Item", player) + \ 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("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 return count >= amount
def set_rules(world: MultiWorld, player: int): def set_rules(world: MultiWorld, player: int):
total_checks = world.total_locations[player]
# divide by 5 since 5 levels (then commencement) # divide by 5 since 5 levels (then commencement)
items_per_level = total_checks / 5 items_per_level = max(int(world.total_locations[player] / 5 / (world.item_pickup_step[player]+1)), 1)
leftover = total_checks % 5
set_rule(world.get_location("Level One", player), # lock item pickup access based on level completion
lambda state: state._ror_has_items(player, items_per_level + leftover)) 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), 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), 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), 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), 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), 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) world.completion_condition[player] = lambda state: state.has("Victory", player)

View File

@ -37,16 +37,16 @@ class RiskOfRainWorld(World):
# generate chaos weights if the preset is chosen # generate chaos weights if the preset is chosen
if pool_option == 5: if pool_option == 5:
junk_pool = { junk_pool = {
"Item Scrap, Green": self.world.random.randint(0, 100), "Item Scrap, Green": self.world.random.randint(0, 80),
"Item Scrap, Red": self.world.random.randint(0, 100), "Item Scrap, Red": self.world.random.randint(0, 40),
"Item Scrap, Yellow": self.world.random.randint(0, 100), "Item Scrap, Yellow": self.world.random.randint(0, 50),
"Item Scrap, White": self.world.random.randint(0, 100), "Item Scrap, White": self.world.random.randint(0, 100),
"Common Item": self.world.random.randint(0, 100), "Common Item": self.world.random.randint(0, 100),
"Uncommon Item": self.world.random.randint(0, 70), "Uncommon Item": self.world.random.randint(0, 70),
"Legendary Item": self.world.random.randint(0, 45), "Legendary Item": self.world.random.randint(0, 45),
"Boss Item": self.world.random.randint(0, 30), "Boss Item": self.world.random.randint(0, 30),
"Lunar Item": self.world.random.randint(0, 60), "Lunar Item": self.world.random.randint(0, 60),
"Equipment": self.world.random.randint(0, 50) "Equipment": self.world.random.randint(0, 40)
} }
else: else:
junk_pool = item_pool_weights[pool_option].copy() junk_pool = item_pool_weights[pool_option].copy()
@ -64,15 +64,15 @@ class RiskOfRainWorld(World):
"Equipment": self.world.equipment[self.player].value "Equipment": self.world.equipment[self.player].value
} }
if not self.world.enable_lunar[self.player]:
junk_pool.pop("Lunar Item")
# Generate item pool # Generate item pool
itempool = [] itempool = []
# Add revive items for the player # Add revive items for the player
itempool += ["Dio's Best Friend"] * self.world.total_revivals[self.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 # Fill remaining items with randomly generated junk
itempool += self.world.random.choices(list(junk_pool.keys()), weights=list(junk_pool.values()), itempool += self.world.random.choices(list(junk_pool.keys()), weights=list(junk_pool.values()),
k=self.world.total_locations[self.player] - 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, 'Menu', None, ['Lobby']),
create_region(world, player, 'Petrichor V', create_region(world, player, 'Petrichor V',
[location for location in base_location_table] + [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)) world.get_entrance("Lobby", player).connect(world.get_region("Petrichor V", player))