[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)
|
locations.append(location)
|
||||||
self.world.random.choice(locations).place_locked_item(item)
|
self.world.random.choice(locations).place_locked_item(item)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if not self.world.badgesanity[self.player].value:
|
if not self.world.badgesanity[self.player].value:
|
||||||
self.world.non_local_items[self.player].value -= self.item_name_groups["Badges"]
|
self.world.non_local_items[self.player].value -= self.item_name_groups["Badges"]
|
||||||
for i in range(5):
|
for i in range(5):
|
||||||
|
|
|
@ -219,8 +219,7 @@ class RandomizeStarterPokemon(Choice):
|
||||||
|
|
||||||
|
|
||||||
class RandomizeStaticPokemon(Choice):
|
class RandomizeStaticPokemon(Choice):
|
||||||
"""Randomize all one-time gift and encountered Pokemon, except legendaries.
|
"""Randomize one-time gift and encountered Pokemon. These will always be first evolution stage Pokemon."""
|
||||||
These will always be first evolution stage Pokemon."""
|
|
||||||
display_name = "Randomize Static Pokemon"
|
display_name = "Randomize Static Pokemon"
|
||||||
default = 0
|
default = 0
|
||||||
option_vanilla = 0
|
option_vanilla = 0
|
||||||
|
|
|
@ -112,6 +112,10 @@ def process_static_pokemon(self):
|
||||||
["Static Pokemon", "Missable Pokemon"]]
|
["Static Pokemon", "Missable Pokemon"]]
|
||||||
legendary_mons = [slot.original_item for slot in legendary_slots]
|
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
|
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]
|
or self.world.randomize_legendary_pokemon[self.player].value == 3]
|
||||||
if self.world.randomize_legendary_pokemon[self.player].value == 0:
|
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:
|
elif self.world.randomize_legendary_pokemon[self.player].value == 2:
|
||||||
static_slots = static_slots + legendary_slots
|
static_slots = static_slots + legendary_slots
|
||||||
self.world.random.shuffle(static_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:
|
while legendary_slots:
|
||||||
swap_slot = legendary_slots.pop()
|
swap_slot = legendary_slots.pop()
|
||||||
slot = static_slots.pop()
|
slot = static_slots.pop()
|
||||||
|
@ -147,8 +152,12 @@ def process_static_pokemon(self):
|
||||||
if not randomize_type:
|
if not randomize_type:
|
||||||
location.place_locked_item(self.create_item(slot_type + " " + slot.original_item))
|
location.place_locked_item(self.create_item(slot_type + " " + slot.original_item))
|
||||||
else:
|
else:
|
||||||
location.place_locked_item(self.create_item(slot_type + " " +
|
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))
|
||||||
|
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:
|
for slot in starter_slots:
|
||||||
location = self.world.get_location(slot.name, self.player)
|
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))
|
location.place_locked_item(self.create_item(slot_type + " " + slot.original_item))
|
||||||
else:
|
else:
|
||||||
location.place_locked_item(self.create_item(slot_type + " " +
|
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):
|
def process_wild_pokemon(self):
|
||||||
|
|
||||||
|
@ -172,6 +182,12 @@ def process_wild_pokemon(self):
|
||||||
locations = []
|
locations = []
|
||||||
for slot in encounter_slots:
|
for slot in encounter_slots:
|
||||||
mon = randomize_pokemon(self, slot.original_item, mons_list, self.world.randomize_wild_pokemon[self.player].value)
|
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
|
placed_mons[mon] += 1
|
||||||
location = self.world.get_location(slot.name, self.player)
|
location = self.world.get_location(slot.name, self.player)
|
||||||
location.item = self.create_item(mon)
|
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"]]
|
chances = [[50, mon_data["type1"]], [80, mon_data["type2"]], [85, "Normal"]]
|
||||||
else:
|
else:
|
||||||
chances = []
|
chances = []
|
||||||
moves = set(poke_data.moves.keys())
|
moves = list(poke_data.moves.keys())
|
||||||
moves -= set(["No Move"] + poke_data.hm_moves)
|
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)
|
mon_data["start move 1"] = get_move(moves, chances, self.world.random, True)
|
||||||
for i in range(2, 5):
|
for i in range(2, 5):
|
||||||
if mon_data[f"start move {i}"] != "No Move" or self.world.start_with_four_moves[
|
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))
|
matchup[2] = random.choice([0] + ([5, 20] * 5))
|
||||||
elif self.world.randomize_type_matchup_type_effectiveness[self.player].value == 3:
|
elif self.world.randomize_type_matchup_type_effectiveness[self.player].value == 3:
|
||||||
for matchup in chart:
|
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"]
|
type_loc = rom_addresses["Type_Chart"]
|
||||||
for matchup in chart:
|
for matchup in chart:
|
||||||
data[type_loc] = poke_data.type_ids[matchup[0]]
|
data[type_loc] = poke_data.type_ids[matchup[0]]
|
||||||
|
|
Loading…
Reference in New Issue