From d185df39729875f2f40f25b77b00bddc320b3cce Mon Sep 17 00:00:00 2001 From: Alchav <59858495+Alchav@users.noreply.github.com> Date: Sat, 21 Jan 2023 12:59:00 -0500 Subject: [PATCH] =?UTF-8?q?Pok=C3=A9mon=20R/B:=20Use=20local=20random=20ob?= =?UTF-8?q?ject=20when=20randomizing=20trainer=20parties=20in=20generate?= =?UTF-8?q?=5Foutput?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- worlds/pokemon_rb/rom.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/worlds/pokemon_rb/rom.py b/worlds/pokemon_rb/rom.py index 169388c6..6f3b8908 100644 --- a/worlds/pokemon_rb/rom.py +++ b/worlds/pokemon_rb/rom.py @@ -54,7 +54,7 @@ def get_base_stat_total(mon): + poke_data.pokemon_data[mon]["spc"]) -def randomize_pokemon(self, mon, mons_list, randomize_type): +def randomize_pokemon(self, mon, mons_list, randomize_type, random): if randomize_type in [1, 3]: type_mons = [pokemon for pokemon in mons_list if any([poke_data.pokemon_data[mon][ "type1"] in [self.local_poke_data[pokemon]["type1"], self.local_poke_data[pokemon]["type2"]], @@ -65,17 +65,17 @@ def randomize_pokemon(self, mon, mons_list, randomize_type): if randomize_type == 3: stat_base = get_base_stat_total(mon) type_mons.sort(key=lambda mon: abs(get_base_stat_total(mon) - stat_base)) - mon = type_mons[round(self.multiworld.random.triangular(0, len(type_mons) - 1, 0))] + mon = type_mons[round(random.triangular(0, len(type_mons) - 1, 0))] if randomize_type == 2: stat_base = get_base_stat_total(mon) mons_list.sort(key=lambda mon: abs(get_base_stat_total(mon) - stat_base)) - mon = mons_list[round(self.multiworld.random.triangular(0, 50, 0))] + mon = mons_list[round(random.triangular(0, 50, 0))] elif randomize_type == 4: - mon = self.multiworld.random.choice(mons_list) + mon = random.choice(mons_list) return mon -def process_trainer_data(self, data): +def process_trainer_data(self, data, random): mons_list = [pokemon for pokemon in poke_data.pokemon_data.keys() if pokemon not in poke_data.legendary_pokemon or self.multiworld.trainer_legendaries[self.player].value] address = rom_addresses["Trainer_Data"] @@ -94,14 +94,16 @@ def process_trainer_data(self, data): for i in range(1, 4): for l in ["A", "B", "C", "D", "E", "F", "G", "H"]: if rom_addresses[f"Rival_Starter{i}_{l}"] == address: - mon = " ".join(self.multiworld.get_location(f"Pallet Town - Starter {i}", self.player).item.name.split()[1:]) + mon = " ".join(self.multiworld.get_location(f"Pallet Town - Starter {i}", + self.player).item.name.split()[1:]) if l in ["D", "E", "F", "G", "H"] and mon in poke_data.evolves_to: mon = poke_data.evolves_to[mon] if l in ["F", "G", "H"] and mon in poke_data.evolves_to: mon = poke_data.evolves_to[mon] if mon is None and self.multiworld.randomize_trainer_parties[self.player].value: mon = poke_data.id_to_mon[data[address]] - mon = randomize_pokemon(self, mon, mons_list, self.multiworld.randomize_trainer_parties[self.player].value) + mon = randomize_pokemon(self, mon, mons_list, + self.multiworld.randomize_trainer_parties[self.player].value, random) if mon is not None: data[address] = poke_data.pokemon_data[mon]["id"] @@ -154,10 +156,11 @@ def process_static_pokemon(self): location.place_locked_item(self.create_item(slot_type + " " + slot.original_item)) else: mon = self.create_item(slot_type + " " + - randomize_pokemon(self, slot.original_item, mons_list, randomize_type)) + randomize_pokemon(self, slot.original_item, mons_list, randomize_type, + self.multiworld.random)) while location.name == "Pokemon Tower 6F - Restless Soul" and mon in tower_6F_mons: mon = self.create_item(slot_type + " " + randomize_pokemon(self, slot.original_item, mons_list, - randomize_type)) + randomize_type, self.multiworld.random)) location.place_locked_item(mon) for slot in starter_slots: @@ -168,7 +171,8 @@ def process_static_pokemon(self): location.place_locked_item(self.create_item(slot_type + " " + slot.original_item)) else: location.place_locked_item(self.create_item(slot_type + " " + - randomize_pokemon(self, slot.original_item, mons_list, randomize_type))) + randomize_pokemon(self, slot.original_item, mons_list, randomize_type, + self.multiworld.random))) def process_wild_pokemon(self): @@ -182,13 +186,14 @@ def process_wild_pokemon(self): self.multiworld.random.shuffle(encounter_slots) locations = [] for slot in encounter_slots: - mon = randomize_pokemon(self, slot.original_item, mons_list, self.multiworld.randomize_wild_pokemon[self.player].value) + mon = randomize_pokemon(self, slot.original_item, mons_list, + self.multiworld.randomize_wild_pokemon[self.player].value, self.multiworld.random) # if static Pokemon are not randomized, we make sure nothing on Pokemon Tower 6F is a Marowak # if static Pokemon are randomized we deal with that during static encounter randomization while (self.multiworld.randomize_static_pokemon[self.player].value == 0 and mon == "Marowak" and "Pokemon Tower 6F" in slot.name): # to account for the possibility that only one ground type Pokemon exists, match only stats for this fix - mon = randomize_pokemon(self, slot.original_item, mons_list, 2) + mon = randomize_pokemon(self, slot.original_item, mons_list, 2, self.multiworld.random) placed_mons[mon] += 1 location = self.multiworld.get_location(slot.name, self.player) location.item = self.create_item(mon) @@ -527,7 +532,7 @@ def generate_output(self, output_directory: str): if data[rom_addresses["Start_Inventory"] + item.code - 172000000] < 255: data[rom_addresses["Start_Inventory"] + item.code - 172000000] += 1 - process_trainer_data(self, data) + process_trainer_data(self, data, random) mons = [mon["id"] for mon in poke_data.pokemon_data.values()] random.shuffle(mons)