Restored Item.appears_underground and added location support to rst.
[zzz-pokedex.git] / pokedex / db / tables.py
index dc2b93c..e71fc97 100644 (file)
@@ -172,6 +172,12 @@ class EvolutionMethod(TableBase):
     name = Column(Unicode(64), nullable=False)
     description = Column(Unicode(255), nullable=False)
 
+class Experience(TableBase):
+    __tablename__ = 'experience'
+    growth_rate_id = Column(Integer, ForeignKey('growth_rates.id'), primary_key=True, nullable=False)
+    level = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
+    experience = Column(Integer, nullable=False)
+
 class Generation(TableBase):
     __tablename__ = 'generations'
     id = Column(Integer, primary_key=True, nullable=False)
@@ -195,13 +201,11 @@ class Item(TableBase):
     cost = Column(Integer, nullable=False)
     fling_power = Column(Integer, nullable=True)
     fling_effect_id = Column(Integer, ForeignKey('item_fling_effects.id'), nullable=True)
-    flavor_text = Column(Unicode(255), nullable=False)
-    effect = Column(Unicode(5120), nullable=False)
-    is_underground = Column(Boolean, nullable=False)
-    can_hold = Column(Boolean, nullable=False)
-    is_battle_item = Column(Boolean, nullable=False)
-    can_use_automatically = Column(Boolean, nullable=False)
-    can_reuse = Column(Boolean, nullable=False)
+    effect = Column(rst.RstTextColumn(5120), nullable=False)
+
+    @property
+    def appears_underground(self):
+        return any(flag.identifier == u'underground' for flag in self.flags)
 
 class ItemCategory(TableBase):
     __tablename__ = 'item_categories'
@@ -209,11 +213,34 @@ class ItemCategory(TableBase):
     pocket_id = Column(Integer, ForeignKey('item_pockets.id'), nullable=False)
     name = Column(Unicode(16), nullable=False)
 
+class ItemFlag(TableBase):
+    __tablename__ = 'item_flags'
+    id = Column(Integer, primary_key=True, nullable=False)
+    identifier = Column(Unicode(24), nullable=False)
+    name = Column(Unicode(64), nullable=False)
+
+class ItemFlagMap(TableBase):
+    __tablename__ = 'item_flag_map'
+    item_id = Column(Integer, ForeignKey('items.id'), primary_key=True, autoincrement=False, nullable=False)
+    item_flag_id = Column(Integer, ForeignKey('item_flags.id'), primary_key=True, autoincrement=False, nullable=False)
+
+class ItemFlavorText(TableBase):
+    __tablename__ = 'item_flavor_text'
+    item_id = Column(Integer, ForeignKey('items.id'), primary_key=True, autoincrement=False, nullable=False)
+    version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, autoincrement=False, nullable=False)
+    flavor_text = Column(Unicode(255), nullable=False)
+
 class ItemFlingEffect(TableBase):
     __tablename__ = 'item_fling_effects'
     id = Column(Integer, primary_key=True, nullable=False)
     effect = Column(Unicode(255), nullable=False)
 
+class ItemInternalID(TableBase):
+    __tablename__ = 'item_internal_ids'
+    item_id = Column(Integer, ForeignKey('items.id'), primary_key=True, autoincrement=False, nullable=False)
+    generation_id = Column(Integer, ForeignKey('generations.id'), primary_key=True, autoincrement=False, nullable=False)
+    internal_id = Column(Integer, nullable=False)
+
 class ItemPocket(TableBase):
     __tablename__ = 'item_pockets'
     id = Column(Integer, primary_key=True, nullable=False)
@@ -254,6 +281,11 @@ class Machine(TableBase):
     version_group_id = Column(Integer, ForeignKey('version_groups.id'), primary_key=True, nullable=False, autoincrement=False)
     move_id = Column(Integer, ForeignKey('moves.id'), nullable=False)
 
+class MoveBattleStyle(TableBase):
+    __tablename__ = 'move_battle_styles'
+    id = Column(Integer, primary_key=True, nullable=False)
+    name = Column(Unicode(8), nullable=False)
+
 class MoveEffectCategory(TableBase):
     __tablename__ = 'move_effect_categories'
     id = Column(Integer, primary_key=True, nullable=False)
@@ -333,6 +365,26 @@ class Nature(TableBase):
     name = Column(Unicode(8), nullable=False)
     decreased_stat_id = Column(Integer, ForeignKey('stats.id'), nullable=False)
     increased_stat_id = Column(Integer, ForeignKey('stats.id'), nullable=False)
+    hates_flavor_id = Column(Integer, ForeignKey('contest_types.id'), nullable=False)
+    likes_flavor_id = Column(Integer, ForeignKey('contest_types.id'), nullable=False)
+
+class NatureBattleStylePreference(TableBase):
+    __tablename__ = 'nature_battle_style_preferences'
+    nature_id = Column(Integer, ForeignKey('natures.id'), primary_key=True, nullable=False)
+    move_battle_style_id = Column(Integer, ForeignKey('move_battle_styles.id'), primary_key=True, nullable=False)
+    low_hp_preference = Column(Integer, nullable=False)
+    high_hp_preference = Column(Integer, nullable=False)
+
+class NaturePokeathlonStat(TableBase):
+    __tablename__ = 'nature_pokeathlon_stats'
+    nature_id = Column(Integer, ForeignKey('natures.id'), primary_key=True, nullable=False)
+    pokeathlon_stat_id = Column(Integer, ForeignKey('pokeathlon_stats.id'), primary_key=True, nullable=False)
+    max_change = Column(Integer, nullable=False)
+
+class PokeathlonStat(TableBase):
+    __tablename__ = 'pokeathlon_stats'
+    id = Column(Integer, primary_key=True, nullable=False)
+    name = Column(Unicode(8), nullable=False)
 
 class Pokedex(TableBase):
     __tablename__ = 'pokedexes'
@@ -609,11 +661,15 @@ EncounterSlotCondition.condition = relation(EncounterCondition,
 
 EvolutionChain.growth_rate = relation(GrowthRate, backref='evolution_chains')
 
+Experience.growth_rate = relation(GrowthRate, backref='experience_table')
+
 Generation.canonical_pokedex = relation(Pokedex, backref='canonical_for_generation')
 Generation.versions = relation(Version, secondary=VersionGroup.__table__)
 Generation.main_region = relation(Region)
 
 Item.berry = relation(Berry, uselist=False, backref='item')
+Item.flags = relation(ItemFlag, secondary=ItemFlagMap.__table__)
+Item.flavor_text = relation(ItemFlavorText, order_by=ItemFlavorText.version_group_id.asc(), backref='item')
 Item.fling_effect = relation(ItemFlingEffect, backref='items')
 Item.category = relation(ItemCategory)
 Item.pocket = association_proxy('category', 'pocket')
@@ -621,6 +677,8 @@ Item.pocket = association_proxy('category', 'pocket')
 ItemCategory.items = relation(Item, order_by=Item.name)
 ItemCategory.pocket = relation(ItemPocket)
 
+ItemFlavorText.version_group = relation(VersionGroup)
+
 ItemPocket.categories = relation(ItemCategory, order_by=ItemCategory.name)
 
 Location.region = relation(Region, backref='locations')
@@ -665,6 +723,18 @@ Nature.decreased_stat = relation(Stat, primaryjoin=Nature.decreased_stat_id==Sta
                                        backref='decreasing_natures')
 Nature.increased_stat = relation(Stat, primaryjoin=Nature.increased_stat_id==Stat.id,
                                        backref='increasing_natures')
+Nature.hates_flavor = relation(ContestType, primaryjoin=Nature.hates_flavor_id==ContestType.id,
+                                       backref='hating_natures')
+Nature.likes_flavor = relation(ContestType, primaryjoin=Nature.likes_flavor_id==ContestType.id,
+                                       backref='liking_natures')
+Nature.battle_style_preferences = relation(NatureBattleStylePreference,
+                                           order_by=NatureBattleStylePreference.move_battle_style_id,
+                                           backref='nature')
+Nature.pokeathlon_effects = relation(NaturePokeathlonStat, order_by=NaturePokeathlonStat.pokeathlon_stat_id)
+
+NatureBattleStylePreference.battle_style = relation(MoveBattleStyle, backref='nature_preferences')
+
+NaturePokeathlonStat.pokeathlon_stat = relation(PokeathlonStat, backref='nature_effects')
 
 Pokedex.region = relation(Region, backref='pokedexes')
 Pokedex.version_groups = relation(VersionGroup, secondary=PokedexVersionGroup.__table__, backref='pokedexes')
@@ -692,7 +762,7 @@ 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.flavor_text = relation(PokemonFlavorText, order_by=PokemonFlavorText.pokemon_id, backref='pokemon')
+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')
 Pokemon.habitat = association_proxy('pokemon_habitat', 'name')