veekun_pokedex/scripts/add-gift-encounters.py
Andrew Ekstedt 8161bd84e4 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.
2019-07-12 18:48:07 -07:00

308 lines
16 KiB
Python

#!/usr/bin/env python2
"""
This is an unmaintained one-shot script, only included in the repo for
reference.
"""
from pokedex.db import connect, identifier_from_name
from pokedex.db.tables import Encounter, EncounterMethod, EncounterSlot, Language, Location, LocationArea, Pokemon, Version
session = connect()
def get_version(name):
return session.query(Version).filter_by(identifier=identifier_from_name(name)).one()
R = get_version(u'red')
B = get_version(u'blue')
Ye = get_version(u'yellow')
G = get_version(u'gold')
S = get_version(u'silver')
C = get_version(u'crystal')
RU = get_version(u'ruby')
SA = get_version(u'sapphire')
EM = get_version(u'emerald')
FR = get_version(u'firered')
LG = get_version(u'leafgreen')
DI = get_version(u'diamond')
PE = get_version(u'pearl')
PT = get_version(u'platinum')
HG = get_version(u'heartgold')
SS = get_version(u'soulsilver')
BL = get_version(u'black')
WH = get_version(u'white')
B2 = get_version(u'black-2')
W2 = get_version(u'white-2')
X = get_version(u'x')
Y = get_version(u'y')
OR = get_version(u'omega-ruby')
AS = get_version(u'alpha-sapphire')
def normal_gift_data():
return [
# Gen I
[ u'bulbasaur', [ R, B ], 5, u'pallet-town' ],
[ u'charmander', [ R, B ], 5, u'pallet-town' ],
[ u'squirtle', [ R, B ], 5, u'pallet-town' ],
[ u'pikachu', [ Ye ], 5, u'pallet-town' ],
[ u'bulbasaur', [ Ye ], 10, u'cerulean-city' ],
[ u'charmander', [ Ye ], 10, u'kanto-route-24' ],
[ u'squirtle', [ Ye ], 10, u'vermilion-city' ],
#[ u'aerodactyl', [ R, B, Ye ], 30, u'pewter-city', u'museum-of-science', u'Pewter Museum of Science' ],
[ u'magikarp', [ R, B, Ye ], 5, u'kanto-route-4', u'pokemon-center', u'Pokemon Center' ],
#[ u'omanyte', [ R, B, Ye ], 30, u'mt-moon', u'b2f' ],
#[ u'kabuto', [ R, B, Ye ], 30, u'mt-moon', u'b2f' ],
[ u'hitmonlee', [ R, B, Ye ], 30, u'saffron-city', u'fighting-dojo', u'Fighting Dojo' ],
[ u'hitmonchan', [ R, B, Ye ], 30, u'saffron-city', u'fighting-dojo', u'Fighting Dojo' ],
[ u'eevee', [ R, B, Ye ], 25, u'celadon-city', u'celadon-mansion', u'Celadon Mansion rooftop' ],
[ u'lapras', [ R, B, Ye ], 15, u'saffron-city', u'silph-co-7f', u'Silph Co. 7F' ],
# Gen II
[ u'chikorita', [ G, S, C ], 5, u'new-bark-town' ],
[ u'cyndaquil', [ G, S, C ], 5, u'new-bark-town' ],
[ u'totodile', [ G, S, C ], 5, u'new-bark-town' ],
[ u'spearow', [ G, S, C ], 10, u'goldenrod-city', u'north-gate', u'North Gate' ],
[ u'eevee', [ G, S, C ], 20, u'goldenrod-city', u'bills-house', u"Bill's house" ],
[ u'shuckle', [ G, S, C ], 15, u'cianwood-city', u'manias-house', u"Mania's house" ],
[ u'dratini', [ C ], 15, u'dragons-den' ],
[ u'tyrogue', [ G, S, C ], 10, u'mt-mortar', u'b1f' ],
# Gen III
# Note Lileep + Anorith are not listed because they are not *gifts*
# They're note quite encounters either
# but that's outta scope of gift logic
[ u'treecko', [ RU, SA, EM ], 5, u'hoenn-route-101' ],
[ u'torchic', [ RU, SA, EM ], 5, u'hoenn-route-101' ],
[ u'mudkip' , [ RU, SA, EM ], 5, u'hoenn-route-101' ],
[ u'castform', [ RU, SA, EM ], 25, u'hoenn-route-119', u'weather-institute', u'Weather Institute' ],
[ u'beldum', [ RU, SA, EM ], 5, u'mossdeep-city', u'stevens-house', u"Steven's house" ],
[ u'chikorita', [ EM ], 5, u'littleroot-town' ],
[ u'cyndaquil', [ EM ], 5, u'littleroot-town' ],
[ u'totodile', [ EM ], 5, u'littleroot-town' ],
[ u'bulbasaur', [ FR, LG ], 5, u'pallet-town' ],
[ u'charmander', [ FR, LG ], 5, u'pallet-town' ],
[ u'squirtle', [ FR, LG ], 5, u'pallet-town' ],
#[ u'aerodactyl', [ FR, LG ], 5, u'pewter-city', u'museum-of-science' ],
[ u'magikarp', [ FR, LG ], 5, u'kanto-route-4', u'pokemon-center' ],
#[ u'omanyte', [ FR, LG ], 5, u'mt-moon', u'b2f' ],
#[ u'kabuto', [ FR, LG ], 5, u'mt-moon', u'b2f' ],
[ u'hitmonlee', [ FR, LG ], 25, u'saffron-city', u'fighting-dojo' ],
[ u'hitmonchan', [ FR, LG ], 25, u'saffron-city', u'fighting-dojo' ],
[ u'eevee', [ FR, LG ], 25, u'celadon-city', u'celadon-mansion' ],
[ u'lapras', [ FR, LG ], 25, u'saffron-city', u'silph-co-7f' ],
# Gen IV
[ u'turtwig', [ DI, PE ], 5, u'lake-verity', u'before-galactic-intervention' ],
[ u'chimchar', [ DI, PE ], 5, u'lake-verity', u'before-galactic-intervention' ],
[ u'piplup', [ DI, PE ], 5, u'lake-verity', u'before-galactic-intervention' ],
[ u'turtwig', [ PT ], 5, u'sinnoh-route-201' ],
[ u'chimchar', [ PT ], 5, u'sinnoh-route-201' ],
[ u'piplup', [ PT ], 5, u'sinnoh-route-201' ],
[ u'eevee', [ DI, PE, ], 5, u'hearthome-city' ],
[ u'eevee', [ PT ], 20, u'hearthome-city' ],
[ u'porygon', [ PT ], 25, u'veilstone-city' ],
[ u'chikorita', [ HG, SS ], 5, u'new-bark-town' ],
[ u'cyndaquil', [ HG, SS ], 5, u'new-bark-town' ],
[ u'totodile', [ HG, SS ], 5, u'new-bark-town' ],
[ u'spearow', [ HG, SS ], 20, u'goldenrod-city', u'north-gate' ],
[ u'eevee', [ HG, SS ], 5, u'goldenrod-city', u'bills-house' ],
[ u'shuckle', [ HG, SS ], 15, u'cianwood-city', u'kirks-house', u"Kirk's house" ],
[ u'dratini', [ HG, SS ], 15, u'dragons-den' ],
[ u'tyrogue', [ HG, SS ], 10, u'mt-mortar', u'b1f' ],
[ u'bulbasaur', [ HG, SS ], 5, u'pallet-town' ],
[ u'charmander', [ HG, SS ], 5, u'pallet-town' ],
[ u'squirtle', [ HG, SS ], 5, u'pallet-town' ],
[ u'treecko', [ HG, SS ], 5, u'saffron-city', u'silph-co-7f' ],
[ u'torchic', [ HG, SS ], 5, u'saffron-city', u'silph-co-7f' ],
[ u'mudkip' , [ HG, SS ], 5, u'saffron-city', u'silph-co-7f' ],
# Gen V
[ u'snivy', [ BL, WH ], 5, u'nuvema-town' ],
[ u'tepig', [ BL, WH ], 5, u'nuvema-town' ],
[ u'oshawott', [ BL, WH ], 5, u'nuvema-town' ],
[ u'pansage', [ BL, WH ], 10, u'dreamyard' ], # not the basement
[ u'pansear', [ BL, WH ], 10, u'dreamyard' ],
[ u'panpour', [ BL, WH ], 10, u'dreamyard' ],
[ u'zorua', [ BL, WH ], 10, u'castelia-city', u'game-freak-hq-1f', u'Game Freak HQ 1F' ],
#[ u'tirtouga', [ BL, WH ], 25, u'relic-castle', u'a' ],
#[ u'archen', [ BL, WH ], 25, u'relic-castle', u'a' ],
#[ u'omanyte', [ BL, WH ], 25, u'twist-mountain' ],
#[ u'kabuto', [ BL, WH ], 25, u'twist-mountain' ],
#[ u'aerodactyl', [ BL, WH ], 25, u'twist-mountain' ],
#[ u'lileep', [ BL, WH ], 25, u'twist-mountain' ],
#[ u'anorith', [ BL, WH ], 25, u'twist-mountain' ],
#[ u'cranidos', [ BL, WH ], 25, u'twist-mountain' ],
#[ u'shieldon', [ BL, WH ], 25, u'twist-mountain' ],
[ u'magikarp', [ BL, WH ], 5, u'marvelous-bridge' ],
[ u'snivy', [ B2, W2 ], 5, u'aspertia-city' ],
[ u'tepig', [ B2, W2 ], 5, u'aspertia-city' ],
[ u'oshawott', [ B2, W2 ], 5, u'aspertia-city' ],
[ u'zorua', [ B2, W2 ], 25, u'driftveil-city' ],
[ u'deerling', [ B2, W2 ], 30, u'unova-route-6', u'weather-institute', u'Weather Institute' ],
[ u'eevee', [ B2, W2 ], 10, u'castelia-city' ],
#[ u'omanyte', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'kabuto', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'aerodactyl', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'lileep', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'anorith', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'cranidos', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'shieldon', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'tirtouga', [ B2, W2 ], 25, u'join-avenue' ],
#[ u'archen', [ B2, W2 ], 25, u'join-avenue' ],
[ u'magikarp', [ B2, W2 ], 5, u'marvelous-bridge' ],
#[ u'tirtouga', [ B2, W2 ], 25, u'nacrene-city', u'museum', u'Nacrene City Museum' ],
#[ u'archen', [ B2, W2 ], 25, u'nacrene-city', u'museum'],
#[ u'omanyte', [ B2, W2 ], 25, u'twist-mountain' ],
#[ u'kabuto', [ B2, W2 ], 25, u'twist-mountain' ],
#[ u'aerodactyl', [ B2, W2 ], 25, u'twist-mountain' ],
#[ u'lileep', [ B2, W2 ], 25, u'twist-mountain' ],
#[ u'anorith', [ B2, W2 ], 25, u'twist-mountain' ],
#[ u'cranidos', [ B2, W2 ], 25, u'twist-mountain' ],
#[ u'shieldon', [ B2, W2 ], 25, u'twist-mountain' ],
# These are shiny...
[ u'dratini', [ W2 ], 1, u'floccesy-town' ],
[ u'gible', [ B2 ], 1, u'floccesy-town' ],
# Gen VI
[ u'chespin', [ X, Y ], 5, u'aquacorde-town' ],
[ u'fennekin', [ X, Y ], 5, u'aquacorde-town' ],
[ u'froakie', [ X, Y ], 5, u'aquacorde-town' ],
[ u'bulbasaur', [ X, Y ], 10, u'lumiose-city' ],
[ u'charmander', [ X, Y ], 10, u'lumiose-city' ],
[ u'squirtle', [ X, Y ], 10, u'lumiose-city' ],
[ u'tyrunt', [ X, Y ], 20, u'glittering-cave', u'unknown-area-303' ], # 304 means ceiling
[ u'amaura', [ X, Y ], 20, u'glittering-cave', u'unknown-area-303' ],
[ u'lucario', [ X, Y ], 32, u'tower-of-mastery' ],
[ u'lapras', [ X, Y ], 30, u'kalos-route-12' ],
[ u'treecko', [ 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' ],
# 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'latias', [ AS ], 30, u'southern-island' ],
[ u'castform', [ OR, AS ], 30, u'hoenn-route-119', u'weather-institute' ],
[ u'chikorita', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'cyndaquil', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'totodile', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'snivy', [ 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'beldum', [ OR, AS ], 1, u'mossdeep-city', u'stevens-house' ],
[ u'turtwig', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'chimchar', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'piplup', [ OR, AS ], 5, u'hoenn-route-101' ],
[ u'camerupt', [ OR, AS ], 40, u'battle-resort' ],
[ u'sharpedo', [ OR, AS ], 40, u'battle-resort' ],
]
def egg_gift_data():
return [
[ u'togepi', [ G, S, C ], 5, u'violet-city' ],
[ u'pichu', [ C ], 5, u'johto-route-34' ],
[ u'cleffa', [ C ], 5, u'johto-route-34' ],
[ u'igglybuff', [ C ], 5, u'johto-route-34' ],
[ u'tyrogue', [ C ], 5, u'johto-route-34' ],
[ u'smoochum', [ C ], 5, u'johto-route-34' ],
[ u'elekid', [ C ], 5, u'johto-route-34' ],
[ u'magby', [ C ], 5, u'johto-route-34' ],
[ u'wynaut', [ RU, SA, EM ], 5, u'lavaridge-town' ],
[ u'togepi', [ FR, LG ], 5, u'water-labyrinth' ],
[ u'togepi', [ DI, PE, PT ], 1, u'eterna-city', u'west-gate', u'West Gate' ],
[ u'happiny', [ DI, PE, ], 1, u'hearthome-city', u'west-gate', u'West Gate' ],
[ u'riolu', [ DI, PE, PT ], 1, u'iron-island', u'b2f-left' ],
[ u'togepi', [ HG, SS ], 1, u'violet-city', u'poke-mart', u'Poke Mart' ],
[ u'mareep', [ HG, SS ], 1, u'violet-city', u'pokemon-center', u'Pokemon Center' ],
[ u'wooper', [ HG, SS ], 1, u'violet-city', u'pokemon-center' ],
[ u'slugma', [ HG, SS ], 1, u'violet-city', u'pokemon-center' ],
[ u'larvesta', [ BL, WH ], 1, u'unova-route-18' ],
[ u'happiny', [ B2, W2 ], 1, u'nacrene-city', u'west-gate', u'West Gate' ],
[ u'wynaut', [ OR, AS ], 1, u'lavaridge-town' ],
[ u'togepi', [ OR, AS ], 1, u'lavaridge-town' ],
]
def record_method_and_gifts(gift_method, gift_data):
en = session.query(Language).filter_by(identifier=u'en').one()
for gift_datum in gift_data:
pokemon_name = identifier_from_name(gift_datum[0])
versions = gift_datum[1]
level = identifier_from_name(str(gift_datum[2]))
location_name = identifier_from_name(gift_datum[3])
area_name = None
if len(gift_datum) > 4:
area_name = identifier_from_name(gift_datum[4])
pokemon = session.query(Pokemon ).filter_by(identifier=pokemon_name ).one()
location = session.query(Location ).filter_by(identifier=location_name ).one()
location_area = session.query(LocationArea).filter_by(identifier=area_name, location_id=location.id).first()
# Some of these don't exist yet
if not location_area:
location_area = LocationArea(
location_id = location.id,
game_index = 0, # cause who knows what this means
identifier = area_name
)
area_prose = None
if area_name != None:
area_prose = gift_datum[5]
location_area.name_map[en] = area_prose
session.add(location_area)
session.commit()
for version in versions:
encounter_slot = session.query(EncounterSlot).filter_by(
version_group_id = version.version_group_id,
encounter_method_id = gift_method.id
).first()
if not encounter_slot:
encounter_slot = EncounterSlot(
version_group_id = version.version_group_id,
encounter_method_id = gift_method.id,
# No priority over or under other events/conditions
slot = None,
# Rarity is meaningless for gifts, but say that it's
# 100% to help out code that expects rarity to be defined.
rarity = 100,
)
session.add(encounter_slot)
session.commit()
encounter_info = {
'version_id': version.id,
'location_area_id': location_area.id,
'encounter_slot_id': encounter_slot.id,
'pokemon_id': pokemon.id,
'min_level': level,
'max_level': level
}
encounter = session.query(Encounter).filter_by(**encounter_info).first()
if not encounter:
encounter = Encounter(**encounter_info)
session.add(encounter)
session.commit()
normal_gift_method = session.query(EncounterMethod).filter_by(identifier=u'gift').one()
record_method_and_gifts(normal_gift_method, normal_gift_data())
egg_gift_method = session.query(EncounterMethod).filter_by(identifier=u'gift-egg').one()
record_method_and_gifts(egg_gift_method, egg_gift_data())