X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/cc633b04c574b96b208cd2eb62bfa13e1a9c6667..c0f4718a6d1ef731d857090a57555e38dd1151a3:/pokedex/db/tables.py diff --git a/pokedex/db/tables.py b/pokedex/db/tables.py index 95961d3..bae2211 100644 --- a/pokedex/db/tables.py +++ b/pokedex/db/tables.py @@ -180,6 +180,14 @@ class Move(TableBase): super_contest_effect_id = Column(Integer, nullable=False) class Pokemon(TableBase): + """The core to this whole mess. + + Note that I use both 'forme' and 'form' in both code and the database. I + only use 'forme' when specifically referring to Pokémon that have multiple + distinct species as forms—i.e., different stats or movesets. 'Form' is a + more general term referring to any variation within a species, including + purely cosmetic forms like Unown. + """ __tablename__ = 'pokemon' id = Column(Integer, primary_key=True, nullable=False) name = Column(Unicode(20), nullable=False) @@ -205,6 +213,37 @@ class Pokemon(TableBase): has_gen4_fem_sprite = Column(Boolean, nullable=False) has_gen4_fem_back_sprite = Column(Boolean, nullable=False) + ### Stuff to handle alternate Pokémon forms + + @property + def national_id(self): + """Returns the National Pokédex number for this Pokémon. Use this + instead of the id directly; alternate formes may make the id incorrect. + """ + + if self.forme_base_pokemon_id: + return self.forme_base_pokemon_id + return self.id + + @property + def full_name(self): + """Returns the name of this Pokémon, including its Forme, if any.""" + + if self.forme_name: + return "%s %s" % (self.forme_name.capitalize(), self.name) + return self.name + + @property + def normal_form(self): + """Returns the normal form for this Pokémon; i.e., this will return + regular Deoxys when called on any Deoxys form. + """ + + if self.forme_base_pokemon: + return self.forme_base_pokemon + + return self + class PokemonAbility(TableBase): __tablename__ = 'pokemon_abilities' pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False) @@ -228,6 +267,17 @@ class PokemonFlavorText(TableBase): version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False) flavor_text = Column(Unicode(255), nullable=False) +class PokemonFormGroup(TableBase): + __tablename__ = 'pokemon_form_groups' + pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False) + description = Column(Unicode(255), nullable=False) + +class PokemonFormSprite(TableBase): + __tablename__ = 'pokemon_form_sprites' + id = Column(Integer, primary_key=True, nullable=False) + pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False) + name = Column(Unicode(16), nullable=True) + class PokemonName(TableBase): __tablename__ = 'pokemon_names' pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False) @@ -301,6 +351,9 @@ LocationArea.location = relation(Location, backref='areas') Pokemon.abilities = relation(Ability, secondary=PokemonAbility.__table__, order_by=PokemonAbility.slot, backref='pokemon') +Pokemon.formes = relation(Pokemon, primaryjoin=Pokemon.id==Pokemon.forme_base_pokemon_id, + backref=backref('forme_base_pokemon', + remote_side=[Pokemon.id])) Pokemon.dex_numbers = relation(PokemonDexNumber, backref='pokemon') Pokemon.egg_groups = relation(EggGroup, secondary=PokemonEggGroup.__table__, order_by=PokemonEggGroup.egg_group_id, @@ -321,6 +374,10 @@ PokemonDexNumber.generation = relation(Generation) PokemonFlavorText.version = relation(Version) +PokemonFormGroup.pokemon = relation(Pokemon, backref=backref('form_group', + uselist=False)) +PokemonFormSprite.pokemon = relation(Pokemon, backref='form_sprites') + PokemonName.language = relation(Language) PokemonStat.stat = relation(Stat)