X-Git-Url: http://git.veekun.com/zzz-pokedex.git/blobdiff_plain/b3796a22bbafb2aa5eee5fdf0b2a9463c2520962..4fe178430584034cd4592d3e27ad9cd617830910:/pokedex/db/tables.py diff --git a/pokedex/db/tables.py b/pokedex/db/tables.py index a5d8a84..dc2b93c 100644 --- a/pokedex/db/tables.py +++ b/pokedex/db/tables.py @@ -20,6 +20,30 @@ class Ability(TableBase): flavor_text = Column(Unicode(64), nullable=False) effect = Column(Unicode(255), nullable=False) +class Berry(TableBase): + __tablename__ = 'berries' + id = Column(Integer, primary_key=True, nullable=False) + item_id = Column(Integer, ForeignKey('items.id'), nullable=False) + firmness_id = Column(Integer, ForeignKey('berry_firmness.id'), nullable=False) + natural_gift_power = Column(Integer, nullable=True) + natural_gift_type_id = Column(Integer, ForeignKey('types.id'), nullable=True) + size = Column(Integer, nullable=False) + max_harvest = Column(Integer, nullable=False) + growth_time = Column(Integer, nullable=False) + soil_dryness = Column(Integer, nullable=False) + smoothness = Column(Integer, nullable=False) + +class BerryFirmness(TableBase): + __tablename__ = 'berry_firmness' + id = Column(Integer, primary_key=True, nullable=False) + name = Column(Unicode(10), nullable=False) + +class BerryFlavor(TableBase): + __tablename__ = 'berry_flavors' + berry_id = Column(Integer, ForeignKey('berries.id'), primary_key=True, nullable=False, autoincrement=False) + contest_type_id = Column(Integer, ForeignKey('contest_types.id'), primary_key=True, nullable=False, autoincrement=False) + flavor = Column(Integer, nullable=False) + class ContestCombo(TableBase): __tablename__ = 'contest_combos' first_move_id = Column(Integer, ForeignKey('moves.id'), primary_key=True, nullable=False, autoincrement=False) @@ -33,6 +57,13 @@ class ContestEffect(TableBase): flavor_text = Column(Unicode(64), nullable=False) effect = Column(Unicode(255), nullable=False) +class ContestType(TableBase): + __tablename__ = 'contest_types' + id = Column(Integer, primary_key=True, nullable=False) + name = Column(Unicode(6), nullable=False) + flavor = Column(Unicode(6), nullable=False) + color = Column(Unicode(6), nullable=False) + class EggGroup(TableBase): __tablename__ = 'egg_groups' id = Column(Integer, primary_key=True, nullable=False) @@ -118,7 +149,8 @@ class EncounterSlot(TableBase): id = Column(Integer, primary_key=True, nullable=False) version_group_id = Column(Integer, ForeignKey('version_groups.id'), nullable=False, autoincrement=False) encounter_terrain_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=False, nullable=False, autoincrement=False) - rarity = Column(Integer, nullable=False, autoincrement=False) + slot = Column(Integer, nullable=True) + rarity = Column(Integer, nullable=False) class EncounterSlotCondition(TableBase): """Lists all conditions that affect each slot.""" @@ -144,6 +176,7 @@ class Generation(TableBase): __tablename__ = 'generations' id = Column(Integer, primary_key=True, nullable=False) main_region_id = Column(Integer, ForeignKey('regions.id')) + canonical_pokedex_id = Column(Integer, ForeignKey('pokedexes.id')) name = Column(Unicode(16), nullable=False) class GrowthRate(TableBase): @@ -158,6 +191,34 @@ class Item(TableBase): __singlename__ = 'item' id = Column(Integer, primary_key=True, nullable=False) name = Column(Unicode(16), nullable=False) + category_id = Column(Integer, ForeignKey('item_categories.id'), nullable=False) + 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) + +class ItemCategory(TableBase): + __tablename__ = 'item_categories' + id = Column(Integer, primary_key=True, nullable=False) + pocket_id = Column(Integer, ForeignKey('item_pockets.id'), nullable=False) + name = Column(Unicode(16), nullable=False) + +class ItemFlingEffect(TableBase): + __tablename__ = 'item_fling_effects' + id = Column(Integer, primary_key=True, nullable=False) + effect = Column(Unicode(255), nullable=False) + +class ItemPocket(TableBase): + __tablename__ = 'item_pockets' + id = Column(Integer, primary_key=True, nullable=False) + identifier = Column(Unicode(16), nullable=False) + name = Column(Unicode(16), nullable=False) class Language(TableBase): __tablename__ = 'languages' @@ -183,7 +244,8 @@ class LocationArea(TableBase): class LocationAreaEncounterRate(TableBase): __tablename__ = 'location_area_encounter_rates' location_area_id = Column(Integer, ForeignKey('location_areas.id'), primary_key=True, nullable=False, autoincrement=False) - encounter_type_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=True, nullable=False, autoincrement=False) + encounter_terrain_id = Column(Integer, ForeignKey('encounter_terrain.id'), primary_key=True, nullable=False, autoincrement=False) + version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, autoincrement=False) rate = Column(Integer, nullable=True) class Machine(TableBase): @@ -260,12 +322,13 @@ class Move(TableBase): 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 = Column(Unicode(8), nullable=False) + 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) class Nature(TableBase): __tablename__ = 'natures' + __singlename__ = 'nature' id = Column(Integer, primary_key=True, nullable=False) name = Column(Unicode(8), nullable=False) decreased_stat_id = Column(Integer, ForeignKey('stats.id'), nullable=False) @@ -274,6 +337,7 @@ class Nature(TableBase): class Pokedex(TableBase): __tablename__ = 'pokedexes' id = Column(Integer, primary_key=True, nullable=False) + region_id = Column(Integer, ForeignKey('regions.id'), nullable=True) name = Column(Unicode(16), nullable=False) description = Column(Unicode(512)) @@ -347,6 +411,22 @@ class Pokemon(TableBase): return self + ### Not forms! + + def stat(self, stat_name): + """Returns a PokemonStat record for the given stat name (or Stat row + object). Uses the normal has-many machinery, so all the stats are + effectively cached. + """ + if isinstance(stat_name, Stat): + stat_name = stat_name.name + + for pokemon_stat in self.stats: + if pokemon_stat.stat.name == stat_name: + return pokemon_stat + + return None + class PokemonAbility(TableBase): __tablename__ = 'pokemon_abilities' pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False) @@ -496,6 +576,13 @@ class Version(TableBase): ### Relations down here, to avoid ordering problems +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') +Berry.natural_gift_type = relation(Type) + +BerryFlavor.contest_type = relation(ContestType) + ContestCombo.first = relation(Move, primaryjoin=ContestCombo.first_move_id==Move.id, backref='contest_combo_first') ContestCombo.second = relation(Move, primaryjoin=ContestCombo.second_move_id==Move.id, @@ -522,9 +609,20 @@ EncounterSlotCondition.condition = relation(EncounterCondition, EvolutionChain.growth_rate = relation(GrowthRate, backref='evolution_chains') +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.fling_effect = relation(ItemFlingEffect, backref='items') +Item.category = relation(ItemCategory) +Item.pocket = association_proxy('category', 'pocket') + +ItemCategory.items = relation(Item, order_by=Item.name) +ItemCategory.pocket = relation(ItemPocket) + +ItemPocket.categories = relation(ItemCategory, order_by=ItemCategory.name) + Location.region = relation(Region, backref='locations') LocationArea.location = relation(Location, backref='areas') @@ -534,6 +632,7 @@ Machine.version_group = relation(VersionGroup) Move.contest_effect = relation(ContestEffect, backref='moves') Move.contest_combo_next = association_proxy('contest_combo_first', 'second') Move.contest_combo_prev = association_proxy('contest_combo_second', 'first') +Move.contest_type = relation(ContestType, backref='moves') Move.damage_class = relation(MoveDamageClass, backref='moves') Move.flags = association_proxy('move_flags', 'flag') Move.flavor_text = relation(MoveFlavorText, order_by=MoveFlavorText.generation_id, backref='move') @@ -567,7 +666,8 @@ Nature.decreased_stat = relation(Stat, primaryjoin=Nature.decreased_stat_id==Sta Nature.increased_stat = relation(Stat, primaryjoin=Nature.increased_stat_id==Stat.id, backref='increasing_natures') -Pokedex.version_groups = relation(VersionGroup, secondary=PokedexVersionGroup.__table__) +Pokedex.region = relation(Region, backref='pokedexes') +Pokedex.version_groups = relation(VersionGroup, secondary=PokedexVersionGroup.__table__, backref='pokedexes') Pokemon.abilities = relation(Ability, secondary=PokemonAbility.__table__, order_by=PokemonAbility.slot, @@ -596,7 +696,7 @@ Pokemon.flavor_text = relation(PokemonFlavorText, order_by=PokemonFlavorText.pok Pokemon.foreign_names = relation(PokemonName, backref='pokemon') Pokemon.pokemon_habitat = relation(PokemonHabitat, backref='pokemon') Pokemon.habitat = association_proxy('pokemon_habitat', 'name') -Pokemon.items = relation(PokemonItem) +Pokemon.items = relation(PokemonItem, backref='pokemon') Pokemon.generation = relation(Generation, backref='pokemon') Pokemon.shape = relation(PokemonShape, backref='pokemon') Pokemon.stats = relation(PokemonStat, backref='pokemon')