From b81d1c3b0d3f8a0732e935d90d4a2ebfccba5137 Mon Sep 17 00:00:00 2001 From: Silvris <58583688+Silvris@users.noreply.github.com> Date: Mon, 21 Aug 2023 23:42:41 -0500 Subject: [PATCH] re-order pre_fill to properly handle animal fill --- worlds/kdl3/__init__.py | 51 +++++++++++++++++++++-------------------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/worlds/kdl3/__init__.py b/worlds/kdl3/__init__.py index e93dca581b83..a8725ee31448 100644 --- a/worlds/kdl3/__init__.py +++ b/worlds/kdl3/__init__.py @@ -110,6 +110,32 @@ def get_trap_item_name(self) -> str: self.multiworld.ability_trap_weight[self.player]])[0] def pre_fill(self) -> None: + if self.multiworld.copy_ability_randomization[self.player]: + # randomize copy abilities + valid_abilities = list(copy_ability_access_table.keys()) + enemies_to_set = list(self.copy_abilities.keys()) + # now for the edge cases + for abilities, enemies in enemy_restrictive: + available_enemies = list() + for enemy in enemies: + if enemy not in enemies_to_set: + if self.copy_abilities[enemy] in abilities: + break + else: + available_enemies.append(enemy) + else: + chosen_enemy = self.random.choice(available_enemies) + chosen_ability = self.random.choice(tuple(abilities)) + self.copy_abilities[chosen_enemy] = chosen_ability + enemies_to_set.remove(chosen_enemy) + # place remaining + for enemy in enemies_to_set: + self.copy_abilities[enemy] = self.random \ + .choice(valid_abilities) + + for enemy in enemy_mapping: + self.multiworld.get_location(enemy, self.player) \ + .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) # fill animals if self.multiworld.animal_randomization[self.player] != 0: spawns = [animal for animal in animal_friend_spawns.keys() if @@ -146,32 +172,7 @@ def pre_fill(self) -> None: self.multiworld.get_location(animal, self.player) \ .place_locked_item(self.create_item(animal_friends[animal])) - if self.multiworld.copy_ability_randomization[self.player]: - # randomize copy abilities - valid_abilities = list(copy_ability_access_table.keys()) - enemies_to_set = list(self.copy_abilities.keys()) - # now for the edge cases - for abilities, enemies in enemy_restrictive: - available_enemies = list() - for enemy in enemies: - if enemy not in enemies_to_set: - if self.copy_abilities[enemy] in abilities: - break - else: - available_enemies.append(enemy) - else: - chosen_enemy = self.random.choice(available_enemies) - chosen_ability = self.random.choice(tuple(abilities)) - self.copy_abilities[chosen_enemy] = chosen_ability - enemies_to_set.remove(chosen_enemy) - # place remaining - for enemy in enemies_to_set: - self.copy_abilities[enemy] = self.random \ - .choice(valid_abilities) - for enemy in enemy_mapping: - self.multiworld.get_location(enemy, self.player) \ - .place_locked_item(self.create_item(self.copy_abilities[enemy_mapping[enemy]])) def create_items(self) -> None: itempool = []