# encoding: utf8
-from sqlalchemy import Column, ForeignKey, MetaData, Table
+from sqlalchemy import Column, ForeignKey, MetaData, PrimaryKeyConstraint, Table
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.associationproxy import association_proxy
from sqlalchemy.orm import backref, eagerload_all, relation
__tablename__ = 'evolution_chains'
id = Column(Integer, primary_key=True, nullable=False)
growth_rate_id = Column(Integer, ForeignKey('growth_rates.id'), nullable=False)
- steps_to_hatch = Column(Integer, nullable=False)
- baby_trigger_item = Column(Unicode(12))
+ baby_trigger_item_id = Column(Integer, ForeignKey('items.id'), nullable=True)
class EvolutionTrigger(TableBase):
__tablename__ = 'evolution_triggers'
__tablename__ = 'items'
__singlename__ = 'item'
id = Column(Integer, primary_key=True, nullable=False)
- name = Column(Unicode(16), nullable=False)
+ name = Column(Unicode(20), nullable=False)
category_id = Column(Integer, ForeignKey('item_categories.id'), nullable=False)
cost = Column(Integer, nullable=False)
fling_power = Column(Integer, nullable=True)
version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, autoincrement=False)
rate = Column(Integer, nullable=True)
+class LocationInternalID(TableBase):
+ __tablename__ = 'location_internal_ids'
+ location_id = Column(Integer, ForeignKey('locations.id'), nullable=False, primary_key=True)
+ generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False, primary_key=True)
+ internal_id = Column(Integer, nullable=False)
+
class Machine(TableBase):
__tablename__ = 'machines'
machine_number = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
class MoveEffect(TableBase):
__tablename__ = 'move_effects'
id = Column(Integer, primary_key=True, nullable=False)
- priority = Column(SmallInteger, nullable=False)
short_effect = Column(Unicode(256), nullable=False)
effect = Column(Unicode(5120), nullable=False)
class MoveFlagType(TableBase):
__tablename__ = 'move_flag_types'
id = Column(Integer, primary_key=True, nullable=False)
+ identifier = Column(Unicode(16), nullable=False)
name = Column(Unicode(32), nullable=False)
description = Column(markdown.MarkdownColumn(128), nullable=False)
__tablename__ = 'moves'
__singlename__ = 'move'
id = Column(Integer, primary_key=True, nullable=False)
- name = Column(Unicode(12), nullable=False)
+ name = Column(Unicode(24), nullable=False)
generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
type_id = Column(Integer, ForeignKey('types.id'), nullable=False)
- power = Column(SmallInteger)
+ power = Column(SmallInteger, nullable=False)
pp = Column(SmallInteger, nullable=False)
- accuracy = Column(SmallInteger)
+ accuracy = Column(SmallInteger, nullable=True)
+ priority = Column(SmallInteger, nullable=False)
target_id = Column(Integer, ForeignKey('move_targets.id'), nullable=False)
damage_class_id = Column(Integer, ForeignKey('move_damage_classes.id'), nullable=False)
effect_id = Column(Integer, ForeignKey('move_effects.id'), nullable=False)
effect_chance = Column(Integer)
contest_type_id = Column(Integer, ForeignKey('contest_types.id'), nullable=True)
contest_effect_id = Column(Integer, ForeignKey('contest_effects.id'), nullable=True)
- super_contest_effect_id = Column(Integer, ForeignKey('super_contest_effects.id'), nullable=False)
+ super_contest_effect_id = Column(Integer, ForeignKey('super_contest_effects.id'), nullable=True)
class Nature(TableBase):
__tablename__ = 'natures'
hates_flavor_id = Column(Integer, ForeignKey('contest_types.id'), nullable=False)
likes_flavor_id = Column(Integer, ForeignKey('contest_types.id'), nullable=False)
+ @property
+ def is_neutral(self):
+ u"""Returns True iff this nature doesn't alter a Pokémon's stats,
+ bestow taste preferences, etc.
+ """
+ return self.increased_stat_id == self.decreased_stat_id
+
class NatureBattleStylePreference(TableBase):
__tablename__ = 'nature_battle_style_preferences'
nature_id = Column(Integer, ForeignKey('natures.id'), primary_key=True, nullable=False)
weight = Column(Integer, nullable=False)
species = Column(Unicode(16), nullable=False)
color_id = Column(Integer, ForeignKey('pokemon_colors.id'), nullable=False)
- pokemon_shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=False)
+ pokemon_shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=True)
habitat_id = Column(Integer, ForeignKey('pokemon_habitats.id'), nullable=True)
gender_rate = Column(Integer, nullable=False)
capture_rate = Column(Integer, nullable=False)
base_experience = Column(Integer, nullable=False)
base_happiness = Column(Integer, nullable=False)
is_baby = Column(Boolean, nullable=False)
+ hatch_counter = Column(Integer, nullable=False)
has_gen4_fem_sprite = Column(Boolean, nullable=False)
has_gen4_fem_back_sprite = Column(Boolean, nullable=False)
class PokemonMove(TableBase):
__tablename__ = 'pokemon_moves'
- pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
- 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, index=True)
- order = Column(Integer, nullable=True, index=True)
+ pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, index=True)
+ version_group_id = Column(Integer, ForeignKey('version_groups.id'), nullable=False, index=True)
+ move_id = Column(Integer, ForeignKey('moves.id'), nullable=False, index=True)
+ pokemon_move_method_id = Column(Integer, ForeignKey('pokemon_move_methods.id'), nullable=False, index=True)
+ level = Column(Integer, nullable=True, index=True)
+ order = Column(Integer, nullable=True)
+
+ __table_args__ = (
+ PrimaryKeyConstraint('pokemon_id', 'version_group_id', 'move_id', 'pokemon_move_method_id', 'level'),
+ {},
+ )
class PokemonMoveMethod(TableBase):
__tablename__ = 'pokemon_move_methods'
generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
damage_class_id = Column(Integer, ForeignKey('move_damage_classes.id'), nullable=False) ## ??? is none; everything else is physical or special
+class TypeName(TableBase):
+ __tablename__ = 'type_names'
+ type_id = Column(Integer, ForeignKey('types.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 VersionGroup(TableBase):
__tablename__ = 'version_groups'
id = Column(Integer, primary_key=True, nullable=False)
backref='slot_map')
EvolutionChain.growth_rate = relation(GrowthRate, backref='evolution_chains')
+EvolutionChain.baby_trigger_item = relation(Item, backref='evolution_chains')
Experience.growth_rate = relation(GrowthRate, backref='experience_table')
ItemFlavorText.version_group = relation(VersionGroup)
+ItemInternalID.item = relation(Item, backref='internal_ids')
+ItemInternalID.generation = relation(Generation)
+
ItemName.language = relation(Language)
ItemPocket.categories = relation(ItemCategory, order_by=ItemCategory.name)
LocationArea.location = relation(Location, backref='areas')
+LocationInternalID.location = relation(Location, backref='internal_ids')
+LocationInternalID.generation = relation(Generation)
+
Machine.item = relation(Item)
Machine.version_group = relation(VersionGroup)
Move.type = relation(Type, backref='moves')
Move.effect = markdown.MoveEffectProperty('effect')
-Move.priority = association_proxy('move_effect', 'priority')
Move.short_effect = markdown.MoveEffectProperty('short_effect')
MoveEffect.category_map = relation(MoveEffectCategoryMap)
Pokemon.items = relation(PokemonItem, backref='pokemon')
Pokemon.generation = relation(Generation, backref='pokemon')
Pokemon.shape = relation(PokemonShape, backref='pokemon')
-Pokemon.stats = relation(PokemonStat, backref='pokemon')
+Pokemon.stats = relation(PokemonStat, backref='pokemon', order_by=PokemonStat.stat_id.asc())
Pokemon.types = relation(Type, secondary=PokemonType.__table__, order_by=PokemonType.slot.asc())
PokemonDexNumber.pokedex = relation(Pokedex)
Type.generation = relation(Generation, backref='types')
Type.damage_class = relation(MoveDamageClass, backref='types')
+Type.foreign_names = relation(TypeName, backref='type')
+
+TypeName.language = relation(Language)
Version.version_group = relation(VersionGroup, backref='versions')
Version.generation = association_proxy('version_group', 'generation')