mirror of
https://github.com/MarioSpore/Grinch-AP.git
synced 2025-10-21 20:21:32 -06:00
Pokemon Emerald: v2 Update (#2918)
This commit is contained in:
@@ -5,35 +5,41 @@ duplicate claims and give warnings for unused and unignored locations or warps.
|
||||
import logging
|
||||
from typing import List
|
||||
|
||||
from .data import data
|
||||
from .data import load_json_data, data
|
||||
|
||||
|
||||
_ignorable_locations = {
|
||||
# Trick House
|
||||
"HIDDEN_ITEM_TRICK_HOUSE_NUGGET",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_1_ORANGE_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_2_HARBOR_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_2_WAVE_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_3_SHADOW_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_3_WOOD_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_4_MECH_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_6_GLITTER_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_7_TROPIC_MAIL",
|
||||
"ITEM_TRICK_HOUSE_PUZZLE_8_BEAD_MAIL",
|
||||
_IGNORABLE_LOCATIONS = frozenset({
|
||||
"HIDDEN_ITEM_TRICK_HOUSE_NUGGET", # Is permanently mssiable and has special behavior that sets the flag early
|
||||
|
||||
# Battle Frontier
|
||||
"ITEM_ARTISAN_CAVE_1F_CARBOS",
|
||||
"ITEM_ARTISAN_CAVE_B1F_HP_UP",
|
||||
"HIDDEN_ITEM_ARTISAN_CAVE_B1F_CALCIUM",
|
||||
"HIDDEN_ITEM_ARTISAN_CAVE_B1F_IRON",
|
||||
"HIDDEN_ITEM_ARTISAN_CAVE_B1F_PROTEIN",
|
||||
"HIDDEN_ITEM_ARTISAN_CAVE_B1F_ZINC",
|
||||
# Duplicate rival fights. All variations are represented by the Brandon + Mudkip version
|
||||
"TRAINER_BRENDAN_ROUTE_103_TREECKO_REWARD",
|
||||
"TRAINER_BRENDAN_ROUTE_103_TORCHIC_REWARD",
|
||||
"TRAINER_MAY_ROUTE_103_MUDKIP_REWARD",
|
||||
"TRAINER_MAY_ROUTE_103_TREECKO_REWARD",
|
||||
"TRAINER_MAY_ROUTE_103_TORCHIC_REWARD",
|
||||
"TRAINER_BRENDAN_ROUTE_110_TREECKO_REWARD",
|
||||
"TRAINER_BRENDAN_ROUTE_110_TORCHIC_REWARD",
|
||||
"TRAINER_MAY_ROUTE_110_MUDKIP_REWARD",
|
||||
"TRAINER_MAY_ROUTE_110_TREECKO_REWARD",
|
||||
"TRAINER_MAY_ROUTE_110_TORCHIC_REWARD",
|
||||
"TRAINER_BRENDAN_ROUTE_119_TREECKO_REWARD",
|
||||
"TRAINER_BRENDAN_ROUTE_119_TORCHIC_REWARD",
|
||||
"TRAINER_MAY_ROUTE_119_MUDKIP_REWARD",
|
||||
"TRAINER_MAY_ROUTE_119_TREECKO_REWARD",
|
||||
"TRAINER_MAY_ROUTE_119_TORCHIC_REWARD",
|
||||
"TRAINER_BRENDAN_RUSTBORO_TREECKO_REWARD",
|
||||
"TRAINER_BRENDAN_RUSTBORO_TORCHIC_REWARD",
|
||||
"TRAINER_MAY_RUSTBORO_MUDKIP_REWARD",
|
||||
"TRAINER_MAY_RUSTBORO_TREECKO_REWARD",
|
||||
"TRAINER_MAY_RUSTBORO_TORCHIC_REWARD",
|
||||
"TRAINER_BRENDAN_LILYCOVE_TREECKO_REWARD",
|
||||
"TRAINER_BRENDAN_LILYCOVE_TORCHIC_REWARD",
|
||||
"TRAINER_MAY_LILYCOVE_MUDKIP_REWARD",
|
||||
"TRAINER_MAY_LILYCOVE_TREECKO_REWARD",
|
||||
"TRAINER_MAY_LILYCOVE_TORCHIC_REWARD",
|
||||
})
|
||||
|
||||
# Event islands
|
||||
"HIDDEN_ITEM_NAVEL_ROCK_TOP_SACRED_ASH"
|
||||
}
|
||||
|
||||
_ignorable_warps = {
|
||||
_IGNORABLE_WARPS = frozenset({
|
||||
# Trick House
|
||||
"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:0,1/MAP_ROUTE110_TRICK_HOUSE_ENTRANCE:2!",
|
||||
"MAP_ROUTE110_TRICK_HOUSE_PUZZLE2:2/MAP_ROUTE110_TRICK_HOUSE_END:0!",
|
||||
@@ -72,75 +78,16 @@ _ignorable_warps = {
|
||||
"MAP_INSIDE_OF_TRUCK:0,1,2/MAP_DYNAMIC:-1!",
|
||||
|
||||
# Battle Frontier
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_DOME_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_DOME_PRE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1!",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0,1/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:3/MAP_BATTLE_FRONTIER_BATTLE_PALACE_BATTLE_ROOM:0!",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_CORRIDOR:0",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0,1/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0",
|
||||
"MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:2/MAP_BATTLE_FRONTIER_BATTLE_TOWER_BATTLE_ROOM:0",
|
||||
"MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0,1,2/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE1:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE2:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE3:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE4:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE5:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE6:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE7:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE8:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10",
|
||||
"MAP_BATTLE_FRONTIER_LOUNGE9:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11",
|
||||
"MAP_BATTLE_FRONTIER_MART:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:0/MAP_BATTLE_FRONTIER_BATTLE_TOWER_LOBBY:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:1/MAP_BATTLE_FRONTIER_BATTLE_ARENA_LOBBY:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:10/MAP_BATTLE_FRONTIER_LOUNGE8:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:11/MAP_BATTLE_FRONTIER_LOUNGE9:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13/MAP_ARTISAN_CAVE_1F:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:2/MAP_BATTLE_FRONTIER_BATTLE_PALACE_LOBBY:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:3/MAP_BATTLE_FRONTIER_BATTLE_PYRAMID_LOBBY:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4/MAP_BATTLE_FRONTIER_RANKING_HALL:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:5/MAP_BATTLE_FRONTIER_LOUNGE1:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:6/MAP_BATTLE_FRONTIER_EXCHANGE_SERVICE_CORNER:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:7/MAP_BATTLE_FRONTIER_LOUNGE5:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:8/MAP_BATTLE_FRONTIER_LOUNGE6:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_EAST:9/MAP_BATTLE_FRONTIER_LOUNGE3:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:0/MAP_BATTLE_FRONTIER_BATTLE_PIKE_LOBBY:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:1/MAP_BATTLE_FRONTIER_BATTLE_DOME_LOBBY:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10/MAP_ARTISAN_CAVE_B1F:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:2/MAP_BATTLE_FRONTIER_BATTLE_FACTORY_LOBBY:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:3/MAP_BATTLE_FRONTIER_LOUNGE2:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:4/MAP_BATTLE_FRONTIER_MART:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5/MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:6/MAP_BATTLE_FRONTIER_LOUNGE4:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:7/MAP_BATTLE_FRONTIER_LOUNGE7:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8/MAP_BATTLE_FRONTIER_RECEPTION_GATE:0",
|
||||
"MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9/MAP_BATTLE_FRONTIER_RECEPTION_GATE:1",
|
||||
"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:12",
|
||||
"MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2/MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0",
|
||||
"MAP_BATTLE_FRONTIER_POKEMON_CENTER_2F:0/MAP_BATTLE_FRONTIER_POKEMON_CENTER_1F:2",
|
||||
"MAP_BATTLE_FRONTIER_RANKING_HALL:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:4",
|
||||
"MAP_BATTLE_FRONTIER_RECEPTION_GATE:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:8",
|
||||
"MAP_BATTLE_FRONTIER_RECEPTION_GATE:1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:9",
|
||||
"MAP_BATTLE_FRONTIER_SCOTTS_HOUSE:0,1/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:5",
|
||||
|
||||
"MAP_ARTISAN_CAVE_1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_EAST:13",
|
||||
"MAP_ARTISAN_CAVE_1F:1/MAP_ARTISAN_CAVE_B1F:1",
|
||||
"MAP_ARTISAN_CAVE_B1F:0/MAP_BATTLE_FRONTIER_OUTSIDE_WEST:10",
|
||||
"MAP_ARTISAN_CAVE_B1F:1/MAP_ARTISAN_CAVE_1F:1",
|
||||
|
||||
# Terra Cave and Marine Cave
|
||||
"MAP_TERRA_CAVE_ENTRANCE:0/MAP_DYNAMIC:-1!",
|
||||
"MAP_TERRA_CAVE_END:0/MAP_TERRA_CAVE_ENTRANCE:1",
|
||||
"MAP_TERRA_CAVE_ENTRANCE:1/MAP_TERRA_CAVE_END:0",
|
||||
"MAP_ROUTE113:1/MAP_TERRA_CAVE_ENTRANCE:0!",
|
||||
"MAP_ROUTE113:2/MAP_TERRA_CAVE_ENTRANCE:0!",
|
||||
"MAP_ROUTE114:3/MAP_TERRA_CAVE_ENTRANCE:0!",
|
||||
@@ -153,8 +100,6 @@ _ignorable_warps = {
|
||||
"MAP_ROUTE118:1/MAP_TERRA_CAVE_ENTRANCE:0!",
|
||||
|
||||
"MAP_UNDERWATER_MARINE_CAVE:0/MAP_DYNAMIC:-1!",
|
||||
"MAP_MARINE_CAVE_END:0/MAP_MARINE_CAVE_ENTRANCE:0",
|
||||
"MAP_MARINE_CAVE_ENTRANCE:0/MAP_MARINE_CAVE_END:0",
|
||||
"MAP_UNDERWATER_ROUTE105:0/MAP_UNDERWATER_MARINE_CAVE:0!",
|
||||
"MAP_UNDERWATER_ROUTE105:1/MAP_UNDERWATER_MARINE_CAVE:0!",
|
||||
"MAP_UNDERWATER_ROUTE125:0/MAP_UNDERWATER_MARINE_CAVE:0!",
|
||||
@@ -164,6 +109,10 @@ _ignorable_warps = {
|
||||
"MAP_UNDERWATER_ROUTE129:0/MAP_UNDERWATER_MARINE_CAVE:0!",
|
||||
"MAP_UNDERWATER_ROUTE129:1/MAP_UNDERWATER_MARINE_CAVE:0!",
|
||||
|
||||
# Altering Cave
|
||||
"MAP_ALTERING_CAVE:0/MAP_ROUTE103:0",
|
||||
"MAP_ROUTE103:0/MAP_ALTERING_CAVE:0",
|
||||
|
||||
# Event islands
|
||||
"MAP_BIRTH_ISLAND_EXTERIOR:0/MAP_BIRTH_ISLAND_HARBOR:0",
|
||||
"MAP_BIRTH_ISLAND_HARBOR:0/MAP_BIRTH_ISLAND_EXTERIOR:0",
|
||||
@@ -294,11 +243,17 @@ _ignorable_warps = {
|
||||
"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0",
|
||||
"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:0/MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP2:1",
|
||||
"MAP_CAVE_OF_ORIGIN_UNUSED_RUBY_SAPPHIRE_MAP3:1/MAP_CAVE_OF_ORIGIN_B1F:0!",
|
||||
"MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!"
|
||||
}
|
||||
"MAP_LILYCOVE_CITY_UNUSED_MART:0,1/MAP_LILYCOVE_CITY:0!",
|
||||
})
|
||||
|
||||
|
||||
def validate_regions() -> bool:
|
||||
"""
|
||||
Verifies that Emerald's data doesn't have duplicate or missing
|
||||
regions/warps/locations. Meant to catch problems during development like
|
||||
forgetting to add a new location or incorrectly splitting a region.
|
||||
"""
|
||||
extracted_data_json = load_json_data("extracted_data.json")
|
||||
error_messages: List[str] = []
|
||||
warn_messages: List[str] = []
|
||||
failed = False
|
||||
@@ -319,7 +274,7 @@ def validate_regions() -> bool:
|
||||
|
||||
# Check warps
|
||||
for warp_source, warp_dest in data.warp_map.items():
|
||||
if warp_source in _ignorable_warps:
|
||||
if warp_source in _IGNORABLE_WARPS:
|
||||
continue
|
||||
|
||||
if warp_dest is None:
|
||||
@@ -335,8 +290,8 @@ def validate_regions() -> bool:
|
||||
error(f"Pokemon Emerald: Location [{location_name}] was claimed by multiple regions")
|
||||
claimed_locations_set.add(location_name)
|
||||
|
||||
for location_name in data.locations:
|
||||
if location_name not in claimed_locations and location_name not in _ignorable_locations:
|
||||
for location_name in extracted_data_json["locations"]:
|
||||
if location_name not in claimed_locations and location_name not in _IGNORABLE_LOCATIONS:
|
||||
warn(f"Pokemon Emerald: Location [{location_name}] was not claimed by any region")
|
||||
|
||||
warn_messages.sort()
|
||||
|
Reference in New Issue
Block a user