diff --git a/scripts/form-differences.py b/scripts/form-differences.py new file mode 100644 index 0000000..f89e196 --- /dev/null +++ b/scripts/form-differences.py @@ -0,0 +1,87 @@ +#!/usr/bin/env python2 + +"""List the ways that pokemon forms differ from one another. + +This is not a one-shot script! It is probably unmaintained though. +""" + +from pokedex.db import connect +import pokedex.db.tables as t +from sqlalchemy.orm import lazyload, joinedload, subqueryload + +session = connect() +#session.bind.echo = True + +def getstats(stats): + return dict((stat.stat_id, stat.base_stat) for stat in stats) + +def geteffort(stats): + return dict((stat.stat_id, stat.effort) for stat in stats) + +def getpokeathlon(stats): + return dict((stat.pokeathlon_stat_id, (stat.minimum_stat, stat.base_stat, stat.maximum_stat)) for stat in stats) + +def getitems(items): + return list(sorted((item.version_id, item.item, item.rarity) for item in items)) + +def getmoves(moves): + return list(sorted((move.version_group_id, move.move_id, move.pokemon_move_method_id, move.level, move.order) for move in moves)) + +def getform(form): + return { + 'ability': form.pokemon.all_abilities, + 'items': getitems(form.pokemon.items), + 'moves': getmoves(form.pokemon.pokemon_moves), + 'pokeathlon': getpokeathlon(form.pokeathlon_stats), + 'stats': getstats(form.pokemon.stats), + 'effort': geteffort(form.pokemon.stats), + 'types': form.pokemon.types, + 'exp': form.pokemon.base_experience, + 'weight': form.pokemon.weight, + 'height': form.pokemon.height, + } + +def gcd(a, b): + keys = set(a.keys()) & set(b.keys()) + result = {} + for k in keys: + if a[k] == b[k]: + result[k] = a[k] + return result + +q = session.query(t.PokemonSpecies) +q = q.options( + lazyload('default_pokemon'), + + joinedload('forms'), + lazyload('forms.pokemon'), +) + +for species in q.all(): + forms = species.forms + + if len(forms) == 1: + continue + + forms = (session.query(t.PokemonForm) + .join(t.Pokemon) + .filter(t.Pokemon.species_id==species.id) + .options( + joinedload('pokemon'), + joinedload('pokemon.all_abilities'), + joinedload('pokemon.items'), + joinedload('pokemon.stats'), + joinedload('pokemon.types'), + joinedload('pokeathlon_stats'), + subqueryload('pokemon.pokemon_moves'), + lazyload('pokemon.pokemon_moves.pokemon'), + lazyload('pokemon.pokemon_moves.move'), + ) + .all() + ) + + keys = set(getform(forms[0]).keys()) + common_keys = set(reduce(gcd, map(getform, forms)).keys()) + unique_keys = keys - common_keys + + print "{}: {}".format(species.name, ", ".join(sorted(unique_keys)))