from sqlalchemy.sql import and_
from sqlalchemy.types import *
-from pokedex.db import rst
+from pokedex.db import markdown
metadata = MetaData()
TableBase = declarative_base(metadata=metadata)
id = Column(Integer, primary_key=True, nullable=False)
name = Column(Unicode(24), nullable=False)
generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
- effect = Column(rst.RstTextColumn(5120), nullable=False)
- short_effect = Column(rst.RstTextColumn(255), nullable=False)
+ effect = Column(markdown.MarkdownColumn(5120), nullable=False)
+ short_effect = Column(markdown.MarkdownColumn(255), nullable=False)
class AbilityFlavorText(TableBase):
__tablename__ = 'ability_flavor_text'
version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
flavor_text = Column(Unicode(64), nullable=False)
+class AbilityName(TableBase):
+ __tablename__ = 'ability_names'
+ ability_id = Column(Integer, ForeignKey('abilities.id'), primary_key=True, nullable=False, autoincrement=False)
+ language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False, autoincrement=False)
+ name = Column(Unicode(16), nullable=False)
+
class Berry(TableBase):
__tablename__ = 'berries'
id = Column(Integer, primary_key=True, nullable=False)
steps_to_hatch = Column(Integer, nullable=False)
baby_trigger_item = Column(Unicode(12))
-class EvolutionMethod(TableBase):
- __tablename__ = 'evolution_methods'
+class EvolutionTrigger(TableBase):
+ __tablename__ = 'evolution_triggers'
id = Column(Integer, primary_key=True, nullable=False)
- name = Column(Unicode(64), nullable=False)
- description = Column(Unicode(255), nullable=False)
+ identifier = Column(Unicode(16), nullable=False)
class Experience(TableBase):
__tablename__ = 'experience'
cost = Column(Integer, nullable=False)
fling_power = Column(Integer, nullable=True)
fling_effect_id = Column(Integer, ForeignKey('item_fling_effects.id'), nullable=True)
- effect = Column(rst.RstTextColumn(5120), nullable=False)
+ effect = Column(markdown.MarkdownColumn(5120), nullable=False)
@property
def appears_underground(self):
__tablename__ = 'move_flag_types'
id = Column(Integer, primary_key=True, nullable=False)
name = Column(Unicode(32), nullable=False)
- description = Column(rst.RstTextColumn(128), nullable=False)
+ description = Column(markdown.MarkdownColumn(128), nullable=False)
class MoveFlavorText(TableBase):
__tablename__ = 'move_flavor_text'
forme_base_pokemon_id = Column(Integer, ForeignKey('pokemon.id'))
generation_id = Column(Integer, ForeignKey('generations.id'))
evolution_chain_id = Column(Integer, ForeignKey('evolution_chains.id'))
- evolution_parent_pokemon_id = Column(Integer, ForeignKey('pokemon.id'))
- evolution_method_id = Column(Integer, ForeignKey('evolution_methods.id'))
- evolution_parameter = Column(Unicode(32))
height = Column(Integer, nullable=False)
weight = Column(Integer, nullable=False)
species = Column(Unicode(16), nullable=False)
if pokemon_stat.stat.name == stat_name:
return pokemon_stat
- return None
+ raise KeyError(u'No stat named %s' % stat_name)
+
+ @property
+ def better_damage_class(self):
+ u"""Returns the MoveDamageClass that this Pokémon is best suited for,
+ based on its attack stats.
+
+ If the attack stats are about equal (within 5), returns None. The
+ value None, not the damage class called 'None'.
+ """
+ phys = self.stat(u'Attack')
+ spec = self.stat(u'Special Attack')
+
+ diff = phys.base_stat - spec.base_stat
+
+ if diff > 5:
+ return phys.stat.damage_class
+ elif diff < -5:
+ return spec.stat.damage_class
+ else:
+ return None
class PokemonAbility(TableBase):
__tablename__ = 'pokemon_abilities'
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
egg_group_id = Column(Integer, ForeignKey('egg_groups.id'), primary_key=True, nullable=False, autoincrement=False)
+class PokemonEvolution(TableBase):
+ __tablename__ = 'pokemon_evolution'
+ from_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False)
+ to_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
+ evolution_trigger_id = Column(Integer, ForeignKey('evolution_triggers.id'), nullable=False)
+ trigger_item_id = Column(Integer, ForeignKey('items.id'), nullable=True)
+ minimum_level = Column(Integer, nullable=True)
+ gender = Column(Enum('male', 'female', name='pokemon_evolution_gender'), nullable=True)
+ location_id = Column(Integer, ForeignKey('locations.id'), nullable=True)
+ held_item_id = Column(Integer, ForeignKey('items.id'), nullable=True)
+ time_of_day = Column(Enum('morning', 'day', 'night', name='pokemon_evolution_time_of_day'), nullable=True)
+ known_move_id = Column(Integer, ForeignKey('moves.id'), nullable=True)
+ minimum_happiness = Column(Integer, nullable=True)
+ minimum_beauty = Column(Integer, nullable=True)
+ relative_physical_stats = Column(Integer, nullable=True)
+ party_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True)
+
class PokemonFlavorText(TableBase):
__tablename__ = 'pokemon_flavor_text'
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
__tablename__ = 'pokemon_form_groups'
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
is_battle_only = Column(Boolean, nullable=False)
- description = Column(Unicode(512), nullable=False)
+ description = Column(rst.RstTextColumn(1024), nullable=False)
class PokemonFormSprite(TableBase):
__tablename__ = 'pokemon_form_sprites'
version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False, index=True)
pokemon_move_method_id = Column(Integer, ForeignKey('pokemon_move_methods.id'), primary_key=True, nullable=False, autoincrement=False)
- level = Column(Integer, primary_key=True, nullable=True, autoincrement=False)
- order = Column(Integer, nullable=True)
+ level = Column(Integer, primary_key=True, nullable=True, autoincrement=False, index=True)
+ order = Column(Integer, nullable=True, index=True)
class PokemonMoveMethod(TableBase):
__tablename__ = 'pokemon_move_methods'
class Stat(TableBase):
__tablename__ = 'stats'
id = Column(Integer, primary_key=True, nullable=False)
+ damage_class_id = Column(Integer, ForeignKey('move_damage_classes.id'), nullable=True)
name = Column(Unicode(16), nullable=False)
class SuperContestCombo(TableBase):
### Relations down here, to avoid ordering problems
-Ability.flavor_text = relation(AbilityFlavorText, order_by=AbilityFlavorText.version_group_id, backref='abilities')
+Ability.flavor_text = relation(AbilityFlavorText, order_by=AbilityFlavorText.version_group_id, backref='ability')
+Ability.foreign_names = relation(AbilityName, backref='ability')
Ability.generation = relation(Generation, backref='abilities')
AbilityFlavorText.version_group = relation(VersionGroup)
+AbilityName.language = relation(Language)
+
Berry.berry_firmness = relation(BerryFirmness, backref='berries')
Berry.firmness = association_proxy('berry_firmness', 'name')
Berry.flavors = relation(BerryFlavor, order_by=BerryFlavor.contest_type_id, backref='berry')
Move.damage_class = relation(MoveDamageClass, backref='moves')
Move.flags = association_proxy('move_flags', 'flag')
Move.flavor_text = relation(MoveFlavorText, order_by=MoveFlavorText.version_group_id, backref='move')
-Move.foreign_names = relation(MoveName, backref='pokemon')
+Move.foreign_names = relation(MoveName, backref='move')
Move.generation = relation(Generation, backref='moves')
Move.machines = relation(Machine, backref='move')
Move.move_effect = relation(MoveEffect, backref='moves')
Move.target = relation(MoveTarget, backref='moves')
Move.type = relation(Type, backref='moves')
-Move.effect = rst.MoveEffectProperty('effect')
+Move.effect = markdown.MoveEffectProperty('effect')
Move.priority = association_proxy('move_effect', 'priority')
-Move.short_effect = rst.MoveEffectProperty('short_effect')
+Move.short_effect = markdown.MoveEffectProperty('short_effect')
MoveEffect.category_map = relation(MoveEffectCategoryMap)
MoveEffect.categories = association_proxy('category_map', 'category')
order_by=PokemonEggGroup.egg_group_id,
backref='pokemon')
Pokemon.evolution_chain = relation(EvolutionChain, backref='pokemon')
-Pokemon.evolution_method = relation(EvolutionMethod)
-Pokemon.evolution_children = relation(Pokemon, primaryjoin=Pokemon.id==Pokemon.evolution_parent_pokemon_id,
- backref=backref('evolution_parent',
- remote_side=[Pokemon.id]))
+Pokemon.child_pokemon = relation(Pokemon,
+ primaryjoin=Pokemon.id==PokemonEvolution.from_pokemon_id,
+ secondary=PokemonEvolution.__table__,
+ secondaryjoin=PokemonEvolution.to_pokemon_id==Pokemon.id,
+ backref=backref('parent_pokemon', uselist=False),
+)
Pokemon.flavor_text = relation(PokemonFlavorText, order_by=PokemonFlavorText.version_id.asc(), backref='pokemon')
Pokemon.foreign_names = relation(PokemonName, backref='pokemon')
Pokemon.pokemon_habitat = relation(PokemonHabitat, backref='pokemon')
PokemonDexNumber.pokedex = relation(Pokedex)
+PokemonEvolution.from_pokemon = relation(Pokemon,
+ primaryjoin=PokemonEvolution.from_pokemon_id==Pokemon.id,
+ backref='child_evolutions',
+)
+PokemonEvolution.to_pokemon = relation(Pokemon,
+ primaryjoin=PokemonEvolution.to_pokemon_id==Pokemon.id,
+ backref=backref('parent_evolution', uselist=False),
+)
+PokemonEvolution.child_evolutions = relation(PokemonEvolution,
+ primaryjoin=PokemonEvolution.from_pokemon_id==PokemonEvolution.to_pokemon_id,
+ foreign_keys=[PokemonEvolution.to_pokemon_id],
+ backref=backref('parent_evolution',
+ remote_side=[PokemonEvolution.from_pokemon_id],
+ uselist=False,
+ ),
+)
+PokemonEvolution.trigger = relation(EvolutionTrigger, backref='evolutions')
+PokemonEvolution.trigger_item = relation(Item,
+ primaryjoin=PokemonEvolution.trigger_item_id==Item.id,
+ backref='triggered_evolutions',
+)
+PokemonEvolution.held_item = relation(Item,
+ primaryjoin=PokemonEvolution.held_item_id==Item.id,
+ backref='required_for_evolutions',
+)
+PokemonEvolution.location = relation(Location, backref='triggered_evolutions')
+PokemonEvolution.known_move = relation(Move, backref='triggered_evolutions')
+PokemonEvolution.party_pokemon = relation(Pokemon,
+ primaryjoin=PokemonEvolution.party_pokemon_id==Pokemon.id,
+ backref='triggered_evolutions',
+)
+
PokemonFlavorText.version = relation(Version)
PokemonItem.item = relation(Item, backref='pokemon')
order_by='VersionGroupRegion.version_group_id')
Region.version_groups = association_proxy('version_group_regions', 'version_group')
+Stat.damage_class = relation(MoveDamageClass, backref='stats')
+
SuperContestCombo.first = relation(Move, primaryjoin=SuperContestCombo.first_move_id==Move.id,
backref='super_contest_combo_first')
SuperContestCombo.second = relation(Move, primaryjoin=SuperContestCombo.second_move_id==Move.id,