mirror of
https://github.com/veekun/pokedex.git
synced 2024-08-20 18:16:34 +00:00
4397dfbb0c
Types, abilities, egg groups, and stats for Shaymin, Giratina, and Rotom forms. Updated height and weight for Shaymin and Giratina forms. Added Giratina's form descriptions and updated Shaymin's to mention link battles and freezing.
395 lines
18 KiB
Python
395 lines
18 KiB
Python
# encoding: utf8
|
|
|
|
from sqlalchemy import Column, ForeignKey, MetaData, Table
|
|
from sqlalchemy.ext.declarative import declarative_base
|
|
from sqlalchemy.orm import backref, relation
|
|
from sqlalchemy.types import *
|
|
from sqlalchemy.databases.mysql import *
|
|
|
|
metadata = MetaData()
|
|
TableBase = declarative_base(metadata=metadata)
|
|
|
|
class Ability(TableBase):
|
|
__tablename__ = 'abilities'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(24), nullable=False)
|
|
flavor_text = Column(Unicode(64), nullable=False)
|
|
effect = Column(Unicode(255), nullable=False)
|
|
|
|
class ContestEffect(TableBase):
|
|
__tablename__ = 'contest_effects'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
appeal = Column(SmallInteger, nullable=False)
|
|
jam = Column(SmallInteger, nullable=False)
|
|
flavor = Column(Unicode(255), nullable=False)
|
|
effect = Column(Unicode(255), nullable=False)
|
|
|
|
class EggGroup(TableBase):
|
|
__tablename__ = 'egg_groups'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(16), nullable=False)
|
|
|
|
class Encounter(TableBase):
|
|
"""Rows in this table represent encounters with wild Pokémon.
|
|
|
|
Within a given area in a given game, encounters are differentiated by the
|
|
slot they are in and a world condition.
|
|
|
|
Groups of slots belong to encounter types; these are what the player is
|
|
doing to get an encounter, such as surfing or walking through tall grass.
|
|
|
|
Within an encounter type, slots are defined primarily by rarity. Each slot
|
|
can also be affected by a world condition; for example, the 20% slot for
|
|
walking in tall grass is affected by whether a swarm is in effect in the
|
|
areas. "There is a swarm" and "there is not a swarm" are conditions, and
|
|
together they make a condition group. However, since "not a swarm" is a
|
|
base state rather than any sort of new state, it is omitted and instead
|
|
referred to by a NULL.
|
|
|
|
A slot (20% walking in grass) and single world condition (NULL, i.e. no
|
|
swarm) are thus enough to define a specific encounter.
|
|
|
|
Well, okay, almost: each slot actually appears twice.
|
|
"""
|
|
|
|
__tablename__ = 'encounters'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
version_id = Column(Integer, ForeignKey('versions.id'), nullable=False, autoincrement=False)
|
|
location_area_id = Column(Integer, ForeignKey('location_areas.id'), nullable=False, autoincrement=False)
|
|
encounter_type_slot_id = Column(Integer, ForeignKey('encounter_type_slots.id'), nullable=False, autoincrement=False)
|
|
encounter_condition_id = Column(Integer, ForeignKey('encounter_conditions.id'), nullable=True, autoincrement=False)
|
|
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, autoincrement=False)
|
|
min_level = Column(Integer, nullable=False, autoincrement=False)
|
|
max_level = Column(Integer, nullable=False, autoincrement=False)
|
|
|
|
class EncounterCondition(TableBase):
|
|
"""Rows in this table represent something different about the world that
|
|
can affect what Pokémon are encountered.
|
|
"""
|
|
|
|
__tablename__ = 'encounter_conditions'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
encounter_condition_group_id = Column(Integer, ForeignKey('encounter_condition_groups.id'), primary_key=False, nullable=False, autoincrement=False)
|
|
name = Column(Unicode(64), nullable=False)
|
|
|
|
class EncounterConditionGroup(TableBase):
|
|
"""Rows in this table represent a group of mutually exclusive conditions,
|
|
such as morning/day/night. "Conditions" that are part of the default state
|
|
of the world, such as "not during a swarm" or "not using the PokéRadar",
|
|
are not included in this table and are referred to by NULLs in other
|
|
tables.
|
|
"""
|
|
|
|
__tablename__ = 'encounter_condition_groups'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(64), nullable=False)
|
|
|
|
class EncounterType(TableBase):
|
|
"""Rows in this table represent ways the player can enter a wild encounter;
|
|
i.e. surfing, fishing, or walking through tall grass.
|
|
"""
|
|
|
|
__tablename__ = 'encounter_types'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(64), nullable=False)
|
|
|
|
class EncounterTypeSlot(TableBase):
|
|
"""Rows in this table represent an abstract "slot" within an encounter
|
|
type, associated with both a condition group and a rarity.
|
|
|
|
Note that there are two encounters per slot, so the rarities will only add
|
|
up to 50.
|
|
"""
|
|
|
|
__tablename__ = 'encounter_type_slots'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
encounter_type_id = Column(Integer, ForeignKey('encounter_types.id'), primary_key=False, nullable=False, autoincrement=False)
|
|
encounter_condition_group_id = Column(Integer, ForeignKey('encounter_condition_groups.id'), primary_key=False, nullable=True, autoincrement=False)
|
|
rarity = Column(Integer, nullable=False, autoincrement=False)
|
|
|
|
class EvolutionChain(TableBase):
|
|
__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))
|
|
|
|
class EvolutionMethod(TableBase):
|
|
__tablename__ = 'evolution_methods'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(64), nullable=False)
|
|
description = Column(Unicode(255), nullable=False)
|
|
|
|
class Generation(TableBase):
|
|
__tablename__ = 'generations'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(16), nullable=False)
|
|
main_region = Column(Unicode(16), nullable=False)
|
|
|
|
class GrowthRate(TableBase):
|
|
__tablename__ = 'growth_rates'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(16), nullable=False)
|
|
formula = Column(Unicode(255), nullable=False)
|
|
|
|
class Language(TableBase):
|
|
__tablename__ = 'languages'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(16), nullable=False)
|
|
|
|
class Location(TableBase):
|
|
__tablename__ = 'locations'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
|
|
name = Column(Unicode(64), nullable=False)
|
|
|
|
class LocationArea(TableBase):
|
|
__tablename__ = 'location_areas'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
location_id = Column(Integer, ForeignKey('locations.id'), nullable=False)
|
|
internal_id = Column(Integer, nullable=False)
|
|
name = Column(Unicode(64), nullable=True)
|
|
|
|
class MoveEffect(TableBase):
|
|
__tablename__ = 'move_effects'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
priority = Column(SmallInteger, nullable=False)
|
|
short_effect = Column(Unicode(128), nullable=False)
|
|
effect = Column(Unicode(255), nullable=False)
|
|
|
|
class MoveTarget(TableBase):
|
|
__tablename__ = 'move_targets'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(32), nullable=False)
|
|
description = Column(Unicode(128), nullable=False)
|
|
|
|
class Move(TableBase):
|
|
__tablename__ = 'moves'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(12), nullable=False)
|
|
type_id = Column(Integer, ForeignKey('types.id'), nullable=False)
|
|
power = Column(SmallInteger)
|
|
pp = Column(SmallInteger, nullable=False)
|
|
accuracy = Column(SmallInteger)
|
|
target_id = Column(Integer, ForeignKey('move_targets.id'), nullable=False)
|
|
category = Column(Unicode(8), nullable=False)
|
|
effect_id = Column(Integer, ForeignKey('move_effects.id'), nullable=False)
|
|
effect_chance = Column(Integer)
|
|
contest_type = Column(Unicode(8), nullable=False)
|
|
contest_effect_id = Column(Integer, ForeignKey('contest_effects.id'), nullable=False)
|
|
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)
|
|
forme_name = Column(Unicode(16))
|
|
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)
|
|
color = Column(Unicode(6), nullable=False)
|
|
pokemon_shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=False)
|
|
habitat = Column(Unicode(16), nullable=False)
|
|
gender_rate = Column(Integer, nullable=False)
|
|
capture_rate = Column(Integer, nullable=False)
|
|
base_experience = Column(Integer, nullable=False)
|
|
base_happiness = Column(Integer, nullable=False)
|
|
gen1_internal_id = Column(Integer)
|
|
is_baby = Column(Boolean, nullable=False)
|
|
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)
|
|
ability_id = Column(Integer, ForeignKey('abilities.id'), nullable=False)
|
|
slot = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
|
|
|
|
class PokemonDexNumber(TableBase):
|
|
__tablename__ = 'pokemon_dex_numbers'
|
|
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
generation_id = Column(Integer, ForeignKey('generations.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
pokedex_number = Column(Integer, nullable=False)
|
|
|
|
class PokemonEggGroup(TableBase):
|
|
__tablename__ = 'pokemon_egg_groups'
|
|
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 PokemonFlavorText(TableBase):
|
|
__tablename__ = 'pokemon_flavor_text'
|
|
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
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)
|
|
language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
name = Column(Unicode(16), nullable=False)
|
|
|
|
class PokemonShape(TableBase):
|
|
__tablename__ = 'pokemon_shapes'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(24), nullable=False)
|
|
awesome_name = Column(Unicode(16), nullable=False)
|
|
|
|
class PokemonStat(TableBase):
|
|
__tablename__ = 'pokemon_stats'
|
|
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
stat_id = Column(Integer, ForeignKey('stats.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
base_stat = Column(Integer, nullable=False)
|
|
effort = Column(Integer, nullable=False)
|
|
|
|
class PokemonType(TableBase):
|
|
__tablename__ = 'pokemon_types'
|
|
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
type_id = Column(Integer, ForeignKey('types.id'), nullable=False)
|
|
slot = Column(Integer, primary_key=True, nullable=False, autoincrement=False)
|
|
|
|
class Stat(TableBase):
|
|
__tablename__ = 'stats'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(16), nullable=False)
|
|
|
|
class TypeEfficacy(TableBase):
|
|
__tablename__ = 'type_efficacy'
|
|
damage_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
target_type_id = Column(Integer, ForeignKey('types.id'), primary_key=True, nullable=False, autoincrement=False)
|
|
damage_factor = Column(Integer, nullable=False)
|
|
|
|
class Type(TableBase):
|
|
__tablename__ = 'types'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
name = Column(Unicode(8), nullable=False)
|
|
abbreviation = Column(Unicode(3), nullable=False)
|
|
|
|
class VersionGroup(TableBase):
|
|
__tablename__ = 'version_groups'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
generation_id = Column(Integer, ForeignKey('generations.id'), nullable=False)
|
|
|
|
class Version(TableBase):
|
|
__tablename__ = 'versions'
|
|
id = Column(Integer, primary_key=True, nullable=False)
|
|
version_group_id = Column(Integer, ForeignKey('version_groups.id'), nullable=False)
|
|
name = Column(Unicode(32), nullable=False)
|
|
|
|
|
|
### Relations down here, to avoid ordering problems
|
|
Encounter.pokemon = relation(Pokemon, backref='encounters')
|
|
Encounter.version = relation(Version, backref='encounters')
|
|
Encounter.location_area = relation(LocationArea, backref='encounters')
|
|
Encounter.slot = relation(EncounterTypeSlot, backref='encounters')
|
|
Encounter.condition = relation(EncounterCondition, backref='encounters')
|
|
|
|
EncounterCondition.group = relation(EncounterConditionGroup,
|
|
backref='conditions')
|
|
|
|
EncounterTypeSlot.type = relation(EncounterType, backref='slots')
|
|
|
|
EvolutionChain.growth_rate = relation(GrowthRate, backref='evolution_chains')
|
|
|
|
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,
|
|
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.flavor_text = relation(PokemonFlavorText, backref='pokemon')
|
|
Pokemon.foreign_names = relation(PokemonName, backref='pokemon')
|
|
Pokemon.generation = relation(Generation, backref='pokemon')
|
|
Pokemon.shape = relation(PokemonShape, backref='pokemon')
|
|
Pokemon.stats = relation(PokemonStat, backref='pokemon')
|
|
Pokemon.types = relation(Type, secondary=PokemonType.__table__)
|
|
|
|
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)
|
|
|
|
Type.damage_efficacies = relation(TypeEfficacy,
|
|
primaryjoin=Type.id
|
|
==TypeEfficacy.damage_type_id,
|
|
backref='damage_type')
|
|
Type.target_efficacies = relation(TypeEfficacy,
|
|
primaryjoin=Type.id
|
|
==TypeEfficacy.target_type_id,
|
|
backref='target_type')
|
|
|
|
Version.generation = relation(Generation, secondary=VersionGroup.__table__,
|
|
backref='versions')
|