[Pokémon R/B] Fixes (#1096)
* Prevent legendaries from being shuffled into restless soul encounter * Prevent Poke Tower 6F wild mons from being same as restless soul * fix non-deterministic generation
This commit is contained in:
parent
6b9073acd7
commit
3bd4ef3f3d
|
@ -130,8 +130,6 @@ class PokemonRedBlueWorld(World):
|
|||
locations.append(location)
|
||||
self.world.random.choice(locations).place_locked_item(item)
|
||||
|
||||
|
||||
|
||||
if not self.world.badgesanity[self.player].value:
|
||||
self.world.non_local_items[self.player].value -= self.item_name_groups["Badges"]
|
||||
for i in range(5):
|
||||
|
|
|
@ -219,8 +219,7 @@ class RandomizeStarterPokemon(Choice):
|
|||
|
||||
|
||||
class RandomizeStaticPokemon(Choice):
|
||||
"""Randomize all one-time gift and encountered Pokemon, except legendaries.
|
||||
These will always be first evolution stage Pokemon."""
|
||||
"""Randomize one-time gift and encountered Pokemon. These will always be first evolution stage Pokemon."""
|
||||
display_name = "Randomize Static Pokemon"
|
||||
default = 0
|
||||
option_vanilla = 0
|
||||
|
|
|
@ -112,6 +112,10 @@ def process_static_pokemon(self):
|
|||
["Static Pokemon", "Missable Pokemon"]]
|
||||
legendary_mons = [slot.original_item for slot in legendary_slots]
|
||||
|
||||
tower_6F_mons = set()
|
||||
for i in range(1, 11):
|
||||
tower_6F_mons.add(self.world.get_location(f"Pokemon Tower 6F - Wild Pokemon - {i}", self.player).item.name)
|
||||
|
||||
mons_list = [pokemon for pokemon in poke_data.first_stage_pokemon if pokemon not in poke_data.legendary_pokemon
|
||||
or self.world.randomize_legendary_pokemon[self.player].value == 3]
|
||||
if self.world.randomize_legendary_pokemon[self.player].value == 0:
|
||||
|
@ -126,6 +130,7 @@ def process_static_pokemon(self):
|
|||
elif self.world.randomize_legendary_pokemon[self.player].value == 2:
|
||||
static_slots = static_slots + legendary_slots
|
||||
self.world.random.shuffle(static_slots)
|
||||
static_slots.sort(key=lambda s: 0 if s.name == "Pokemon Tower 6F - Restless Soul" else 1)
|
||||
while legendary_slots:
|
||||
swap_slot = legendary_slots.pop()
|
||||
slot = static_slots.pop()
|
||||
|
@ -147,8 +152,12 @@ def process_static_pokemon(self):
|
|||
if not randomize_type:
|
||||
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)))
|
||||
mon = self.create_item(slot_type + " " +
|
||||
randomize_pokemon(self, slot.original_item, mons_list, randomize_type))
|
||||
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))
|
||||
location.place_locked_item(mon)
|
||||
|
||||
for slot in starter_slots:
|
||||
location = self.world.get_location(slot.name, self.player)
|
||||
|
@ -158,7 +167,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)))
|
||||
|
||||
|
||||
def process_wild_pokemon(self):
|
||||
|
||||
|
@ -172,6 +182,12 @@ def process_wild_pokemon(self):
|
|||
locations = []
|
||||
for slot in encounter_slots:
|
||||
mon = randomize_pokemon(self, slot.original_item, mons_list, self.world.randomize_wild_pokemon[self.player].value)
|
||||
# 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.world.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)
|
||||
placed_mons[mon] += 1
|
||||
location = self.world.get_location(slot.name, self.player)
|
||||
location.item = self.create_item(mon)
|
||||
|
@ -293,8 +309,9 @@ def process_pokemon_data(self):
|
|||
chances = [[50, mon_data["type1"]], [80, mon_data["type2"]], [85, "Normal"]]
|
||||
else:
|
||||
chances = []
|
||||
moves = set(poke_data.moves.keys())
|
||||
moves -= set(["No Move"] + poke_data.hm_moves)
|
||||
moves = list(poke_data.moves.keys())
|
||||
for move in ["No Move"] + poke_data.hm_moves:
|
||||
moves.remove(move)
|
||||
mon_data["start move 1"] = get_move(moves, chances, self.world.random, True)
|
||||
for i in range(2, 5):
|
||||
if mon_data[f"start move {i}"] != "No Move" or self.world.start_with_four_moves[
|
||||
|
@ -462,7 +479,7 @@ def generate_output(self, output_directory: str):
|
|||
matchup[2] = random.choice([0] + ([5, 20] * 5))
|
||||
elif self.world.randomize_type_matchup_type_effectiveness[self.player].value == 3:
|
||||
for matchup in chart:
|
||||
matchup[2] = self.world.random.choice([i for i in range(0, 21) if i != 10])
|
||||
matchup[2] = random.choice([i for i in range(0, 21) if i != 10])
|
||||
type_loc = rom_addresses["Type_Chart"]
|
||||
for matchup in chart:
|
||||
data[type_loc] = poke_data.type_ids[matchup[0]]
|
||||
|
|
Loading…
Reference in New Issue