veekun_pokedex/scripts/add-oras-locations.py

105 lines
3.8 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

#!/usr/bin/env python2
# encoding: utf-8
# Adds locations to the database from the text dump.
#
# Usage: python add-oras-locations.py | psql pokedex
import os
import re
import io
def make_identifier(name):
"""Make a string safe to use as an identifier.
Valid characters are lowercase alphanumerics and "-". This function may
raise ValueError if it can't come up with a suitable identifier.
This function is useful for scripts which add things with names.
"""
if isinstance(name, bytes):
identifier = name.decode('utf-8')
else:
identifier = name
identifier = identifier.lower()
identifier = identifier.replace(u'+', u' plus ')
identifier = re.sub(u'[ _]+', u'-', identifier)
identifier = re.sub(u"['./;(),:]", u'', identifier)
identifier = identifier.replace(u'é', u'e')
if identifier == '???':
identifier = 'inside-of-truck'
if not identifier.replace(u"-", u"").isalnum():
raise ValueError(identifier)
return identifier
ROOT = os.path.expanduser("~/xy/orips/text")
en = io.open(os.path.join(ROOT, 'en/90'), encoding='utf-8')
lang_idents = {
'ja-kana': 'ja-Hrkt',
'ja-kanji': 'ja',
}
foreign = []
for lang in 'ja-kana', 'ja-kanji', 'en', 'fr', 'it', 'de', 'es', 'ko':
f = io.open(os.path.join(ROOT, lang, '90'), encoding='utf-8')
foreign.append((lang_idents.get(lang, lang), f))
REGION_ID = 3
GENERATION_ID = 6
START_LINE = 170 # locations before this line were from X/Y
import pokedex.db
import pokedex.db.tables as t
session = pokedex.db.connect("postgresql:///pokedex")
existing_location_ids = set(x for x, in session.query(t.Location.identifier).all())
#print(existing_location_ids)
print("BEGIN;")
print("SELECT setval('locations_id_seq', max(id)) FROM locations;")
for i, name in enumerate(en):
foreign_names = [(lang, next(iter).strip()) for lang, iter in foreign]
if i == 0:
continue
if i < START_LINE:
continue
if name == '\n':
continue
try:
ident = make_identifier(name.strip())
except ValueError:
continue
if ident == 'safari-zone':
ident = 'hoenn-safari-zone'
elif ident == 'victory-road':
ident = 'hoenn-victory-road'
elif ident == 'pokemon-league':
ident = 'hoenn-pokemon-league'
elif ident.startswith("route-"):
ident = 'hoenn-' + ident
print("\echo '%s'" % ident)
if ident in ('mystery-zone', 'faraway-place'):
## standard locations
pass
elif ident in existing_location_ids:
## location already exists from R/S,
## so keep the existing location and just replace the names
print("""DELETE FROM location_names WHERE location_id = (SELECT id FROM locations where identifier = '%s');""" % ident)
else:
## new location
print("""INSERT INTO locations (identifier, region_id) VALUES ('%s', %s) RETURNING id;""" % (ident, REGION_ID))
for lang, name in foreign_names:
print("""INSERT INTO location_names (location_id, local_language_id, name) SELECT loc.id, lang.id, '%s' FROM locations loc, languages lang WHERE loc.identifier = '%s' AND (loc.region_id is NULL OR loc.region_id = %d) AND lang.identifier = '%s';""" % (name.encode("utf-8"), ident.encode("utf-8"), REGION_ID, lang))
print("""INSERT INTO location_game_indices (location_id, generation_id, game_index) SELECT id, %s, %s FROM locations WHERE identifier='%s' AND (region_id is NULL OR region_id = %d) ON CONFLICT DO NOTHING;""" % (GENERATION_ID, i, ident.encode("utf-8"), REGION_ID))
#for pokemon_id, location_identifier in (462, 'kalos-route-13'), (470, 'kalos-route-20'), (471, 'frost-cavern'), (476, 'kalos-route-13'):
# print("UPDATE pokemon_evolution SET location_id = (SELECT id FROM locations WHERE identifier = '%s') WHERE location_id is NULL AND evolved_species_id = %d;" % (location_identifier, pokemon_id))
print("COMMIT;")