Pokemon Emerald: Fix possible dexsanity/legendary hunt softlock (#3443)

* Pokemon Emerald: Remove mirage tower from allowed dexsanity maps

* Pokemon Emerald: Prevent placing wailord/relicanth in out of logic maps

* Pokemon Emerald: Clarify docstring

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>

* Pokemon Emerald: Update changelog

---------

Co-authored-by: Exempt-Medic <60412657+Exempt-Medic@users.noreply.github.com>
This commit is contained in:
Bryce Wilson 2024-06-04 12:21:58 -07:00 committed by GitHub
parent c4572964ec
commit ee1b13f219
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 15 additions and 7 deletions

View File

@ -12,6 +12,7 @@ and won't show up in the wild. Previously they would be forced to show up exactl
- The Lilycove Wailmer now logically block you from the east. Actual game behavior is still unchanged for now. - The Lilycove Wailmer now logically block you from the east. Actual game behavior is still unchanged for now.
- Water encounters in Slateport now correctly require Surf. - Water encounters in Slateport now correctly require Surf.
- Mirage Tower can no longer be your only logical access to a species in the wild, since it can permanently disappear.
- Updated the tracker link in the setup guide. - Updated the tracker link in the setup guide.
# 2.1.1 # 2.1.1

View File

@ -25,13 +25,20 @@ IGNORABLE_MAPS = {
} }
"""These maps exist but don't show up in the rando or are unused, and so should be discarded""" """These maps exist but don't show up in the rando or are unused, and so should be discarded"""
POSTGAME_MAPS = { OUT_OF_LOGIC_MAPS = {
"MAP_DESERT_UNDERPASS", "MAP_DESERT_UNDERPASS",
"MAP_SAFARI_ZONE_NORTHEAST", "MAP_SAFARI_ZONE_NORTHEAST",
"MAP_SAFARI_ZONE_SOUTHEAST", "MAP_SAFARI_ZONE_SOUTHEAST",
"MAP_METEOR_FALLS_STEVENS_CAVE", "MAP_METEOR_FALLS_STEVENS_CAVE",
"MAP_MIRAGE_TOWER_1F",
"MAP_MIRAGE_TOWER_2F",
"MAP_MIRAGE_TOWER_3F",
"MAP_MIRAGE_TOWER_4F",
} }
"""These maps have encounters and are locked behind beating the champion. Those encounter slots should be ignored for logical access to a species.""" """
These maps have encounters and are locked behind beating the champion or are missable.
Those encounter slots should be ignored for logical access to a species.
"""
NUM_REAL_SPECIES = 386 NUM_REAL_SPECIES = 386

View File

@ -4,9 +4,8 @@ Functions related to pokemon species and moves
import functools import functools
from typing import TYPE_CHECKING, Dict, List, Set, Optional, Tuple from typing import TYPE_CHECKING, Dict, List, Set, Optional, Tuple
from Options import Toggle from .data import (NUM_REAL_SPECIES, OUT_OF_LOGIC_MAPS, EncounterTableData, LearnsetMove, MiscPokemonData,
SpeciesData, data)
from .data import NUM_REAL_SPECIES, POSTGAME_MAPS, EncounterTableData, LearnsetMove, MiscPokemonData, SpeciesData, data
from .options import (Goal, HmCompatibility, LevelUpMoves, RandomizeAbilities, RandomizeLegendaryEncounters, from .options import (Goal, HmCompatibility, LevelUpMoves, RandomizeAbilities, RandomizeLegendaryEncounters,
RandomizeMiscPokemon, RandomizeStarters, RandomizeTypes, RandomizeWildPokemon, RandomizeMiscPokemon, RandomizeStarters, RandomizeTypes, RandomizeWildPokemon,
TmTutorCompatibility) TmTutorCompatibility)
@ -266,7 +265,8 @@ def randomize_wild_encounters(world: "PokemonEmeraldWorld") -> None:
species_old_to_new_map: Dict[int, int] = {} species_old_to_new_map: Dict[int, int] = {}
for species_id in table.slots: for species_id in table.slots:
if species_id not in species_old_to_new_map: if species_id not in species_old_to_new_map:
if not placed_priority_species and len(priority_species) > 0: if not placed_priority_species and len(priority_species) > 0 \
and map_name not in OUT_OF_LOGIC_MAPS:
new_species_id = priority_species.pop() new_species_id = priority_species.pop()
placed_priority_species = True placed_priority_species = True
else: else:
@ -329,7 +329,7 @@ def randomize_wild_encounters(world: "PokemonEmeraldWorld") -> None:
new_species_id = world.random.choice(candidates).species_id new_species_id = world.random.choice(candidates).species_id
species_old_to_new_map[species_id] = new_species_id species_old_to_new_map[species_id] = new_species_id
if world.options.dexsanity and map_data.name not in POSTGAME_MAPS: if world.options.dexsanity and map_name not in OUT_OF_LOGIC_MAPS:
already_placed.add(new_species_id) already_placed.add(new_species_id)
# Actually create the new list of slots and encounter table # Actually create the new list of slots and encounter table