gift-pokemon: fix Cosplay Pikachu and Sinnoh starter gift locations

Cosplay Pikachu was listed as being encountered in contest-hall, but
that's a Sinnoh location. In OR/AS, the contest halls are not a
first-class location but rather just treated as part of the town or city
they are in. Cosplay Pikachu is given to the player after they
participate in their first contest, so its location can be any of the
four cities with a contest hall.

The Sinnoh starter that the player obtains in OR/AS is on Hoenn Route
101, not Sinnoh Route 201 (probably a copy/paste error).

Add a test to make sure that encounter regions always match the
region(s) that their game takes place in.
This commit is contained in:
Andrew Ekstedt 2019-07-12 18:48:07 -07:00
parent 53e0fc0085
commit 8161bd84e4
5 changed files with 113 additions and 73 deletions

View file

@ -46757,72 +46757,78 @@ id,version_id,location_area_id,encounter_slot_id,pokemon_id,min_level,max_level
50467,26,393,503,255,5,5 50467,26,393,503,255,5,5
50468,25,393,503,258,5,5 50468,25,393,503,258,5,5
50469,26,393,503,258,5,5 50469,26,393,503,258,5,5
50470,25,784,503,25,20,20 50470,25,793,503,25,20,20
50471,26,784,503,25,20,20 50471,26,793,503,25,20,20
50472,25,785,503,381,30,30 50472,25,794,503,25,20,20
50473,26,785,503,380,30,30 50473,26,794,503,25,20,20
50474,25,769,503,351,30,30 50474,25,795,503,25,20,20
50475,26,769,503,351,30,30 50475,26,795,503,25,20,20
50476,25,393,503,152,5,5 50476,25,796,503,25,20,20
50477,26,393,503,152,5,5 50477,26,796,503,25,20,20
50478,25,393,503,155,5,5 50478,25,785,503,381,30,30
50479,26,393,503,155,5,5 50479,26,785,503,380,30,30
50480,25,393,503,158,5,5 50480,25,769,503,351,30,30
50481,26,393,503,158,5,5 50481,26,769,503,351,30,30
50482,25,393,503,495,5,5 50482,25,393,503,152,5,5
50483,26,393,503,495,5,5 50483,26,393,503,152,5,5
50484,25,393,503,498,5,5 50484,25,393,503,155,5,5
50485,26,393,503,498,5,5 50485,26,393,503,155,5,5
50486,25,393,503,501,5,5 50486,25,393,503,158,5,5
50487,26,393,503,501,5,5 50487,26,393,503,158,5,5
50488,25,770,503,374,1,1 50488,25,393,503,495,5,5
50489,26,770,503,374,1,1 50489,26,393,503,495,5,5
50490,25,141,503,387,5,5 50490,25,393,503,498,5,5
50491,26,141,503,387,5,5 50491,26,393,503,498,5,5
50492,25,141,503,390,5,5 50492,25,393,503,501,5,5
50493,26,141,503,390,5,5 50493,26,393,503,501,5,5
50494,25,141,503,393,5,5 50494,25,770,503,374,1,1
50495,26,141,503,393,5,5 50495,26,770,503,374,1,1
50496,25,786,503,323,40,40 50496,25,393,503,387,5,5
50497,26,786,503,323,40,40 50497,26,393,503,387,5,5
50498,25,786,503,319,40,40 50498,25,393,503,390,5,5
50499,26,786,503,319,40,40 50499,26,393,503,390,5,5
50500,4,189,504,175,5,5 50500,25,393,503,393,5,5
50501,5,189,504,175,5,5 50501,26,393,503,393,5,5
50502,6,189,505,175,5,5 50502,25,786,503,323,40,40
50503,6,205,505,172,5,5 50503,26,786,503,323,40,40
50504,6,205,505,173,5,5 50504,25,786,503,319,40,40
50505,6,205,505,174,5,5 50505,26,786,503,319,40,40
50506,6,205,505,236,5,5 50506,4,189,504,175,5,5
50507,6,205,505,238,5,5 50507,5,189,504,175,5,5
50508,6,205,505,239,5,5 50508,6,189,505,175,5,5
50509,6,205,505,240,5,5 50509,6,205,505,172,5,5
50510,7,787,506,360,5,5 50510,6,205,505,173,5,5
50511,8,787,506,360,5,5 50511,6,205,505,174,5,5
50512,9,787,507,360,5,5 50512,6,205,505,236,5,5
50513,10,518,508,175,5,5 50513,6,205,505,238,5,5
50514,11,518,508,175,5,5 50514,6,205,505,239,5,5
50515,12,788,509,175,1,1 50515,6,205,505,240,5,5
50516,13,788,509,175,1,1 50516,7,787,506,360,5,5
50517,14,788,510,175,1,1 50517,8,787,506,360,5,5
50518,12,789,509,440,1,1 50518,9,787,507,360,5,5
50519,13,789,509,440,1,1 50519,10,518,508,175,5,5
50520,12,124,509,447,1,1 50520,11,518,508,175,5,5
50521,13,124,509,447,1,1 50521,12,788,509,175,1,1
50522,14,124,510,447,1,1 50522,13,788,509,175,1,1
50523,15,790,511,175,1,1 50523,14,788,510,175,1,1
50524,16,790,511,175,1,1 50524,12,789,509,440,1,1
50525,15,791,511,179,1,1 50525,13,789,509,440,1,1
50526,16,791,511,179,1,1 50526,12,124,509,447,1,1
50527,15,791,511,194,1,1 50527,13,124,509,447,1,1
50528,16,791,511,194,1,1 50528,14,124,510,447,1,1
50529,15,791,511,218,1,1 50529,15,790,511,175,1,1
50530,16,791,511,218,1,1 50530,16,790,511,175,1,1
50531,17,653,512,636,1,1 50531,15,791,511,179,1,1
50532,18,653,512,636,1,1 50532,16,791,511,179,1,1
50533,21,792,513,440,1,1 50533,15,791,511,194,1,1
50534,22,792,513,440,1,1 50534,16,791,511,194,1,1
50535,25,787,514,360,1,1 50535,15,791,511,218,1,1
50536,26,787,514,360,1,1 50536,16,791,511,218,1,1
50537,25,787,514,175,1,1 50537,17,653,512,636,1,1
50538,26,787,514,175,1,1 50538,18,653,512,636,1,1
50539,21,792,513,440,1,1
50540,22,792,513,440,1,1
50541,25,787,514,360,1,1
50542,26,787,514,360,1,1
50543,25,787,514,175,1,1
50544,26,787,514,175,1,1

Can't render this file because it is too large.

View file

@ -650,3 +650,7 @@ location_area_id,local_language_id,name
790,9,Poke Mart 790,9,Poke Mart
791,9,Pokemon Center 791,9,Pokemon Center
792,9,West Gate 792,9,West Gate
793,9,Contest Hall
794,9,Contest Hall
795,9,Contest Hall
796,9,Contest Hall

1 location_area_id local_language_id name
650 790 9 Poke Mart
651 791 9 Pokemon Center
652 792 9 West Gate
653 793 9 Contest Hall
654 794 9 Contest Hall
655 795 9 Contest Hall
656 796 9 Contest Hall

View file

@ -682,3 +682,7 @@ id,location_id,game_index,identifier
790,153,0,poke-mart 790,153,0,poke-mart
791,153,0,pokemon-center 791,153,0,pokemon-center
792,349,0,west-gate 792,349,0,west-gate
793,430,0,contest-hall
794,571,0,contest-hall
795,570,0,contest-hall
796,431,0,contest-hall

1 id location_id game_index identifier
682 790 153 0 poke-mart
683 791 153 0 pokemon-center
684 792 349 0 west-gate
685 793 430 0 contest-hall
686 794 571 0 contest-hall
687 795 570 0 contest-hall
688 796 431 0 contest-hall

View file

@ -26,6 +26,28 @@ def test_encounter_slots(session):
# Encounter slots all match the encounters they belong to # Encounter slots all match the encounters they belong to
assert sanity_q.count() == 0 assert sanity_q.count() == 0
def test_encounter_regions(session):
"""Check that encounter locations match the region of the game they're from.
"""
sanity_q = session.query(tables.Encounter) \
.join((tables.Version, tables.Encounter.version)) \
.join((tables.VersionGroup, tables.Version.version_group)) \
.join((tables.LocationArea, tables.Encounter.location_area)) \
.join((tables.Location, tables.LocationArea.location)) \
.join((tables.Region, tables.Location.region)) \
.filter(~tables.VersionGroup.version_group_regions.any(tables.VersionGroupRegion.region_id == tables.Region.id))
for e in sanity_q.limit(20):
acceptable_regions = " or ".join(r.identifier for r in e.version.version_group.regions)
if e.location_area.location.region is not None:
print("{e} ({e.pokemon.identifier}, {e.slot.method.identifier}, {e.version.identifier}) is in {e.location_area.location.region.identifier} ({e.location_area.location.identifier}) but should be in {acceptable_regions} ({e.version.identifier})".format(e=e, acceptable_regions=acceptable_regions))
else:
print("{e} ({e.pokemon.identifier}, {e.slot.method.identifier}, {e.version.identifier}) is in a pseudo-location ({e.location_area.location.identifier}) that is not part of any region, but should be in {acceptable_regions} ({e.version.identifier})".format(e=e, acceptable_regions=acceptable_regions))
# Encounter regions match the games they belong to
assert sanity_q.count() == 0
@parametrize('cls', tables.mapped_classes) @parametrize('cls', tables.mapped_classes)
def test_nonzero_autoincrement_ids(session, cls): def test_nonzero_autoincrement_ids(session, cls):
"""Check that autoincrementing ids don't contain zeroes """Check that autoincrementing ids don't contain zeroes

View file

@ -184,7 +184,11 @@ def normal_gift_data():
[ u'treecko', [ OR, AS ], 5, u'hoenn-route-101' ], [ u'treecko', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'torchic', [ OR, AS ], 5, u'hoenn-route-101' ], [ u'torchic', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'mudkip', [ OR, AS ], 5, u'hoenn-route-101' ], [ u'mudkip', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'pikachu', [ OR, AS ], 20, u'contest-hall' ], # suprisingly, this location exists already # cosplay pikachu is given to you the first time you participate in a contest
[ u'pikachu', [ OR, AS ], 20, u'slateport-city', u'contest-hall', u"Contest Hall" ],
[ u'pikachu', [ OR, AS ], 20, u'verdanturf-town', u'contest-hall', u"Contest Hall" ],
[ u'pikachu', [ OR, AS ], 20, u'fallarbor-town', u'contest-hall', u"Contest Hall" ],
[ u'pikachu', [ OR, AS ], 20, u'lilycove-city', u'contest-hall', u"Contest Hall" ],
[ u'latios', [ OR ], 30, u'southern-island' ], # eon tickets ignored here - they're not gifts? [ u'latios', [ OR ], 30, u'southern-island' ], # eon tickets ignored here - they're not gifts?
[ u'latias', [ AS ], 30, u'southern-island' ], [ u'latias', [ AS ], 30, u'southern-island' ],
[ u'castform', [ OR, AS ], 30, u'hoenn-route-119', u'weather-institute' ], [ u'castform', [ OR, AS ], 30, u'hoenn-route-119', u'weather-institute' ],
@ -195,9 +199,9 @@ def normal_gift_data():
[ u'tepig', [ OR, AS ], 5, u'hoenn-route-101' ], [ u'tepig', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'oshawott', [ OR, AS ], 5, u'hoenn-route-101' ], [ u'oshawott', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'beldum', [ OR, AS ], 1, u'mossdeep-city', u'stevens-house' ], [ u'beldum', [ OR, AS ], 1, u'mossdeep-city', u'stevens-house' ],
[ u'turtwig', [ OR, AS ], 5, u'sinnoh-route-201' ], [ u'turtwig', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'chimchar', [ OR, AS ], 5, u'sinnoh-route-201' ], [ u'chimchar', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'piplup', [ OR, AS ], 5, u'sinnoh-route-201' ], [ u'piplup', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'camerupt', [ OR, AS ], 40, u'battle-resort' ], [ u'camerupt', [ OR, AS ], 40, u'battle-resort' ],
[ u'sharpedo', [ OR, AS ], 40, u'battle-resort' ], [ u'sharpedo', [ OR, AS ], 40, u'battle-resort' ],
] ]