3 from sqlalchemy
import Column
, ForeignKey
, MetaData
, Table
4 from sqlalchemy
.ext
.declarative
import declarative_base
5 from sqlalchemy
.ext
.associationproxy
import association_proxy
6 from sqlalchemy
.orm
import backref
, relation
7 from sqlalchemy
.sql
import and_
8 from sqlalchemy
.types
import *
9 from sqlalchemy
.databases
.mysql
import *
11 from pokedex
.db
import rst
14 TableBase
= declarative_base(metadata
=metadata
)
16 class Ability(TableBase
):
17 __tablename__
= 'abilities'
18 __singlename__
= 'ability'
19 id = Column(Integer
, primary_key
=True, nullable
=False)
20 name
= Column(Unicode(24), nullable
=False)
21 flavor_text
= Column(Unicode(64), nullable
=False)
22 effect
= Column(Unicode(255), nullable
=False)
24 class ContestCombo(TableBase
):
25 __tablename__
= 'contest_combos'
26 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
27 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
29 class ContestEffect(TableBase
):
30 __tablename__
= 'contest_effects'
31 id = Column(Integer
, primary_key
=True, nullable
=False)
32 appeal
= Column(SmallInteger
, nullable
=False)
33 jam
= Column(SmallInteger
, nullable
=False)
34 flavor_text
= Column(Unicode(64), nullable
=False)
35 effect
= Column(Unicode(255), nullable
=False)
37 class EggGroup(TableBase
):
38 __tablename__
= 'egg_groups'
39 id = Column(Integer
, primary_key
=True, nullable
=False)
40 name
= Column(Unicode(16), nullable
=False)
42 class Encounter(TableBase
):
43 """Rows in this table represent encounters with wild Pokémon. Bear with
46 Within a given area in a given game, encounters are differentiated by the
47 "slot" they are in and the state of the game world.
49 What the player is doing to get an encounter, such as surfing or walking
50 through tall grass, is called terrain. Each terrain has its own set of
53 Within a terrain, slots are defined primarily by rarity. Each slot can
54 also be affected by world conditions; for example, the 20% slot for walking
55 in tall grass is affected by whether a swarm is in effect in that area.
56 "Is there a swarm?" is a condition; "there is a swarm" and "there is not a
57 swarm" are the possible values of this condition.
59 A slot (20% walking in grass) and any appropriate world conditions (no
60 swarm) are thus enough to define a specific encounter.
62 Well, okay, almost: each slot actually appears twice.
65 __tablename__
= 'encounters'
66 id = Column(Integer
, primary_key
=True, nullable
=False)
67 version_id
= Column(Integer
, ForeignKey('versions.id'), nullable
=False, autoincrement
=False)
68 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), nullable
=False, autoincrement
=False)
69 encounter_slot_id
= Column(Integer
, ForeignKey('encounter_slots.id'), nullable
=False, autoincrement
=False)
70 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False, autoincrement
=False)
71 min_level
= Column(Integer
, nullable
=False, autoincrement
=False)
72 max_level
= Column(Integer
, nullable
=False, autoincrement
=False)
74 class EncounterCondition(TableBase
):
75 """Rows in this table represent varying conditions in the game world, such
79 __tablename__
= 'encounter_conditions'
80 id = Column(Integer
, primary_key
=True, nullable
=False)
81 name
= Column(Unicode(64), nullable
=False)
83 class EncounterConditionValue(TableBase
):
84 """Rows in this table represent possible states for a condition; for
85 example, the state of 'swarm' could be 'swarm' or 'no swarm'.
88 __tablename__
= 'encounter_condition_values'
89 id = Column(Integer
, primary_key
=True, nullable
=False)
90 encounter_condition_id
= Column(Integer
, ForeignKey('encounter_conditions.id'), primary_key
=False, nullable
=False, autoincrement
=False)
91 name
= Column(Unicode(64), nullable
=False)
92 is_default
= Column(Boolean
, nullable
=False)
94 class EncounterConditionValueMap(TableBase
):
95 """Maps encounters to the specific conditions under which they occur."""
97 __tablename__
= 'encounter_condition_value_map'
98 encounter_id
= Column(Integer
, ForeignKey('encounters.id'), primary_key
=True, nullable
=False, autoincrement
=False)
99 encounter_condition_value_id
= Column(Integer
, ForeignKey('encounter_condition_values.id'), primary_key
=True, nullable
=False, autoincrement
=False)
101 class EncounterTerrain(TableBase
):
102 """Rows in this table represent ways the player can enter a wild encounter,
103 e.g., surfing, fishing, or walking through tall grass.
106 __tablename__
= 'encounter_terrain'
107 id = Column(Integer
, primary_key
=True, nullable
=False)
108 name
= Column(Unicode(64), nullable
=False)
110 class EncounterSlot(TableBase
):
111 """Rows in this table represent an abstract "slot" within a terrain,
112 associated with both some set of conditions and a rarity.
114 Note that there are two encounters per slot, so the rarities will only add
118 __tablename__
= 'encounter_slots'
119 id = Column(Integer
, primary_key
=True, nullable
=False)
120 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False, autoincrement
=False)
121 encounter_terrain_id
= Column(Integer
, ForeignKey('encounter_terrain.id'), primary_key
=False, nullable
=False, autoincrement
=False)
122 rarity
= Column(Integer
, nullable
=False, autoincrement
=False)
124 class EncounterSlotCondition(TableBase
):
125 """Lists all conditions that affect each slot."""
127 __tablename__
= 'encounter_slot_conditions'
128 encounter_slot_id
= Column(Integer
, ForeignKey('encounter_slots.id'), primary_key
=True, nullable
=False, autoincrement
=False)
129 encounter_condition_id
= Column(Integer
, ForeignKey('encounter_conditions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
131 class EvolutionChain(TableBase
):
132 __tablename__
= 'evolution_chains'
133 id = Column(Integer
, primary_key
=True, nullable
=False)
134 growth_rate_id
= Column(Integer
, ForeignKey('growth_rates.id'), nullable
=False)
135 steps_to_hatch
= Column(Integer
, nullable
=False)
136 baby_trigger_item
= Column(Unicode(12))
138 class EvolutionMethod(TableBase
):
139 __tablename__
= 'evolution_methods'
140 id = Column(Integer
, primary_key
=True, nullable
=False)
141 name
= Column(Unicode(64), nullable
=False)
142 description
= Column(Unicode(255), nullable
=False)
144 class Generation(TableBase
):
145 __tablename__
= 'generations'
146 id = Column(Integer
, primary_key
=True, nullable
=False)
147 main_region_id
= Column(Integer
, ForeignKey('regions.id'))
148 name
= Column(Unicode(16), nullable
=False)
150 class GrowthRate(TableBase
):
151 """`formula` is written in LaTeX math notation."""
152 __tablename__
= 'growth_rates'
153 id = Column(Integer
, primary_key
=True, nullable
=False)
154 name
= Column(Unicode(20), nullable
=False)
155 formula
= Column(Unicode(500), nullable
=False)
157 class Item(TableBase
):
158 __tablename__
= 'items'
159 __singlename__
= 'item'
160 id = Column(Integer
, primary_key
=True, nullable
=False)
161 name
= Column(Unicode(16), nullable
=False)
163 class Language(TableBase
):
164 __tablename__
= 'languages'
165 id = Column(Integer
, primary_key
=True, nullable
=False)
166 iso3166
= Column(Unicode(2), nullable
=False)
167 name
= Column(Unicode(16), nullable
=False)
169 class Location(TableBase
):
170 __tablename__
= 'locations'
171 __singlename__
= 'location'
172 id = Column(Integer
, primary_key
=True, nullable
=False)
173 region_id
= Column(Integer
, ForeignKey('regions.id'))
174 name
= Column(Unicode(64), nullable
=False)
176 class LocationArea(TableBase
):
177 __tablename__
= 'location_areas'
178 id = Column(Integer
, primary_key
=True, nullable
=False)
179 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=False)
180 internal_id
= Column(Integer
, nullable
=False)
181 name
= Column(Unicode(64), nullable
=True)
183 class LocationAreaEncounterRate(TableBase
):
184 __tablename__
= 'location_area_encounter_rates'
185 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), primary_key
=True, nullable
=False, autoincrement
=False)
186 encounter_type_id
= Column(Integer
, ForeignKey('encounter_terrain.id'), primary_key
=True, nullable
=False, autoincrement
=False)
187 rate
= Column(Integer
, nullable
=True)
189 class Machine(TableBase
):
190 __tablename__
= 'machines'
191 machine_number
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
192 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
193 move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=False)
195 class MoveEffectCategory(TableBase
):
196 __tablename__
= 'move_effect_categories'
197 id = Column(Integer
, primary_key
=True, nullable
=False)
198 name
= Column(Unicode(64), nullable
=False)
199 can_affect_user
= Column(Boolean
, nullable
=False)
201 class MoveEffectCategoryMap(TableBase
):
202 __tablename__
= 'move_effect_category_map'
203 move_effect_id
= Column(Integer
, ForeignKey('move_effects.id'), primary_key
=True, nullable
=False)
204 move_effect_category_id
= Column(Integer
, ForeignKey('move_effect_categories.id'), primary_key
=True, nullable
=False)
205 affects_user
= Column(Boolean
, primary_key
=True, nullable
=False)
207 class MoveDamageClass(TableBase
):
208 __tablename__
= 'move_damage_classes'
209 id = Column(Integer
, primary_key
=True, nullable
=False)
210 name
= Column(Unicode(8), nullable
=False)
211 description
= Column(Unicode(64), nullable
=False)
213 class MoveEffect(TableBase
):
214 __tablename__
= 'move_effects'
215 id = Column(Integer
, primary_key
=True, nullable
=False)
216 priority
= Column(SmallInteger
, nullable
=False)
217 short_effect
= Column(Unicode(256), nullable
=False)
218 effect
= Column(Unicode(5120), nullable
=False)
220 class MoveFlag(TableBase
):
221 __tablename__
= 'move_flags'
222 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
223 move_flag_type_id
= Column(Integer
, ForeignKey('move_flag_types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
225 class MoveFlagType(TableBase
):
226 __tablename__
= 'move_flag_types'
227 id = Column(Integer
, primary_key
=True, nullable
=False)
228 name
= Column(Unicode(32), nullable
=False)
229 description
= Column(rst
.RstTextColumn(128), nullable
=False)
231 class MoveFlavorText(TableBase
):
232 __tablename__
= 'move_flavor_text'
233 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
234 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, nullable
=False, autoincrement
=False)
235 flavor_text
= Column(Unicode(255), nullable
=False)
237 class MoveName(TableBase
):
238 __tablename__
= 'move_names'
239 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
240 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
241 name
= Column(Unicode(16), nullable
=False)
243 class MoveTarget(TableBase
):
244 __tablename__
= 'move_targets'
245 id = Column(Integer
, primary_key
=True, nullable
=False)
246 name
= Column(Unicode(32), nullable
=False)
247 description
= Column(Unicode(128), nullable
=False)
249 class Move(TableBase
):
250 __tablename__
= 'moves'
251 __singlename__
= 'move'
252 id = Column(Integer
, primary_key
=True, nullable
=False)
253 name
= Column(Unicode(12), nullable
=False)
254 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
255 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False)
256 power
= Column(SmallInteger
)
257 pp
= Column(SmallInteger
, nullable
=False)
258 accuracy
= Column(SmallInteger
)
259 target_id
= Column(Integer
, ForeignKey('move_targets.id'), nullable
=False)
260 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=False)
261 effect_id
= Column(Integer
, ForeignKey('move_effects.id'), nullable
=False)
262 effect_chance
= Column(Integer
)
263 contest_type
= Column(Unicode(8), nullable
=False)
264 contest_effect_id
= Column(Integer
, ForeignKey('contest_effects.id'), nullable
=True)
265 super_contest_effect_id
= Column(Integer
, ForeignKey('super_contest_effects.id'), nullable
=False)
267 class Pokemon(TableBase
):
268 """The core to this whole mess.
270 Note that I use both 'forme' and 'form' in both code and the database. I
271 only use 'forme' when specifically referring to Pokémon that have multiple
272 distinct species as forms—i.e., different stats or movesets. 'Form' is a
273 more general term referring to any variation within a species, including
274 purely cosmetic forms like Unown.
276 __tablename__
= 'pokemon'
277 __singlename__
= 'pokemon'
278 id = Column(Integer
, primary_key
=True, nullable
=False)
279 name
= Column(Unicode(20), nullable
=False)
280 forme_name
= Column(Unicode(16))
281 forme_base_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'))
282 generation_id
= Column(Integer
, ForeignKey('generations.id'))
283 evolution_chain_id
= Column(Integer
, ForeignKey('evolution_chains.id'))
284 evolution_parent_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'))
285 evolution_method_id
= Column(Integer
, ForeignKey('evolution_methods.id'))
286 evolution_parameter
= Column(Unicode(32))
287 height
= Column(Integer
, nullable
=False)
288 weight
= Column(Integer
, nullable
=False)
289 species
= Column(Unicode(16), nullable
=False)
290 color
= Column(Unicode(6), nullable
=False)
291 pokemon_shape_id
= Column(Integer
, ForeignKey('pokemon_shapes.id'), nullable
=False)
292 habitat
= Column(Unicode(16), nullable
=False)
293 gender_rate
= Column(Integer
, nullable
=False)
294 capture_rate
= Column(Integer
, nullable
=False)
295 base_experience
= Column(Integer
, nullable
=False)
296 base_happiness
= Column(Integer
, nullable
=False)
297 gen1_internal_id
= Column(Integer
)
298 is_baby
= Column(Boolean
, nullable
=False)
299 has_gen4_fem_sprite
= Column(Boolean
, nullable
=False)
300 has_gen4_fem_back_sprite
= Column(Boolean
, nullable
=False)
302 ### Stuff to handle alternate Pokémon forms
305 def national_id(self
):
306 """Returns the National Pokédex number for this Pokémon. Use this
307 instead of the id directly; alternate formes may make the id incorrect.
310 if self
.forme_base_pokemon_id
:
311 return self
.forme_base_pokemon_id
316 """Returns the name of this Pokémon, including its Forme, if any."""
319 return "%s %s" %
(self
.forme_name
.capitalize(), self
.name
)
323 def normal_form(self
):
324 """Returns the normal form for this Pokémon; i.e., this will return
325 regular Deoxys when called on any Deoxys form.
328 if self
.forme_base_pokemon
:
329 return self
.forme_base_pokemon
333 class PokemonAbility(TableBase
):
334 __tablename__
= 'pokemon_abilities'
335 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
336 ability_id
= Column(Integer
, ForeignKey('abilities.id'), nullable
=False)
337 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
339 class PokemonDexNumber(TableBase
):
340 __tablename__
= 'pokemon_dex_numbers'
341 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
342 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, nullable
=False, autoincrement
=False)
343 pokedex_number
= Column(Integer
, nullable
=False)
345 class PokemonEggGroup(TableBase
):
346 __tablename__
= 'pokemon_egg_groups'
347 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
348 egg_group_id
= Column(Integer
, ForeignKey('egg_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
350 class PokemonFlavorText(TableBase
):
351 __tablename__
= 'pokemon_flavor_text'
352 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
353 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
354 flavor_text
= Column(Unicode(255), nullable
=False)
356 class PokemonFormGroup(TableBase
):
357 __tablename__
= 'pokemon_form_groups'
358 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
359 description
= Column(Unicode(512), nullable
=False)
361 class PokemonFormSprite(TableBase
):
362 __tablename__
= 'pokemon_form_sprites'
363 id = Column(Integer
, primary_key
=True, nullable
=False)
364 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
365 introduced_in_version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
366 name
= Column(Unicode(16), nullable
=True)
368 class PokemonItem(TableBase
):
369 __tablename__
= 'pokemon_items'
370 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
371 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False)
372 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, nullable
=False, autoincrement
=False)
373 rarity
= Column(Integer
, nullable
=False)
375 class PokemonMove(TableBase
):
376 __tablename__
= 'pokemon_moves'
377 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
378 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False)
379 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False, index
=True)
380 pokemon_move_method_id
= Column(Integer
, ForeignKey('pokemon_move_methods.id'), primary_key
=True, nullable
=False, autoincrement
=False)
381 level
= Column(Integer
, primary_key
=True, nullable
=True, autoincrement
=False)
382 order
= Column(Integer
, nullable
=True)
384 class PokemonMoveMethod(TableBase
):
385 __tablename__
= 'pokemon_move_methods'
386 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
387 name
= Column(Unicode(64), nullable
=False)
388 description
= Column(Unicode(255), nullable
=False)
390 class PokemonName(TableBase
):
391 __tablename__
= 'pokemon_names'
392 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
393 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False, autoincrement
=False)
394 name
= Column(Unicode(16), nullable
=False)
396 class PokemonShape(TableBase
):
397 __tablename__
= 'pokemon_shapes'
398 id = Column(Integer
, primary_key
=True, nullable
=False)
399 name
= Column(Unicode(24), nullable
=False)
400 awesome_name
= Column(Unicode(16), nullable
=False)
402 class PokemonStat(TableBase
):
403 __tablename__
= 'pokemon_stats'
404 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
405 stat_id
= Column(Integer
, ForeignKey('stats.id'), primary_key
=True, nullable
=False, autoincrement
=False)
406 base_stat
= Column(Integer
, nullable
=False)
407 effort
= Column(Integer
, nullable
=False)
409 class PokemonType(TableBase
):
410 __tablename__
= 'pokemon_types'
411 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False)
412 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False)
413 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False)
415 class Region(TableBase
):
416 """Major areas of the world: Kanto, Johto, etc."""
417 __tablename__
= 'regions'
418 id = Column(Integer
, primary_key
=True, nullable
=False)
419 name
= Column(Unicode(16), nullable
=False)
421 class Stat(TableBase
):
422 __tablename__
= 'stats'
423 id = Column(Integer
, primary_key
=True, nullable
=False)
424 name
= Column(Unicode(16), nullable
=False)
426 class SuperContestCombo(TableBase
):
427 __tablename__
= 'super_contest_combos'
428 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
429 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False)
431 class SuperContestEffect(TableBase
):
432 __tablename__
= 'super_contest_effects'
433 id = Column(Integer
, primary_key
=True, nullable
=False)
434 appeal
= Column(SmallInteger
, nullable
=False)
435 flavor_text
= Column(Unicode(64), nullable
=False)
437 class TypeEfficacy(TableBase
):
438 __tablename__
= 'type_efficacy'
439 damage_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
440 target_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False)
441 damage_factor
= Column(Integer
, nullable
=False)
443 class Type(TableBase
):
444 __tablename__
= 'types'
445 __singlename__
= 'type'
446 id = Column(Integer
, primary_key
=True, nullable
=False)
447 name
= Column(Unicode(8), nullable
=False)
448 abbreviation
= Column(Unicode(3), nullable
=False)
449 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
450 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=False) ## ??? is none; everything else is physical or special
452 class VersionGroup(TableBase
):
453 __tablename__
= 'version_groups'
454 id = Column(Integer
, primary_key
=True, nullable
=False)
455 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False)
457 class VersionGroupRegion(TableBase
):
458 __tablename__
= 'version_group_regions'
459 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False)
460 region_id
= Column(Integer
, ForeignKey('regions.id'), primary_key
=True, nullable
=False)
462 class Version(TableBase
):
463 __tablename__
= 'versions'
464 id = Column(Integer
, primary_key
=True, nullable
=False)
465 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False)
466 name
= Column(Unicode(32), nullable
=False)
469 ### Relations down here, to avoid ordering problems
470 ContestCombo
.first
= relation(Move
, primaryjoin
=ContestCombo
.first_move_id
==Move
.id,
471 backref
='contest_combo_first')
472 ContestCombo
.second
= relation(Move
, primaryjoin
=ContestCombo
.second_move_id
==Move
.id,
473 backref
='contest_combo_second')
475 Encounter
.location_area
= relation(LocationArea
, backref
='encounters')
476 Encounter
.pokemon
= relation(Pokemon
, backref
='encounters')
477 Encounter
.version
= relation(Version
, backref
='encounters')
478 Encounter
.slot
= relation(EncounterSlot
, backref
='encounters')
480 EncounterConditionValue
.condition
= relation(EncounterCondition
, backref
='values')
482 Encounter
.condition_value_map
= relation(EncounterConditionValueMap
, backref
='encounter')
483 Encounter
.condition_values
= association_proxy('condition_value_map', 'condition_value')
484 EncounterConditionValueMap
.condition_value
= relation(EncounterConditionValue
,
485 backref
='encounter_map')
487 EncounterSlot
.terrain
= relation(EncounterTerrain
, backref
='slots')
489 EncounterSlot
.condition_map
= relation(EncounterSlotCondition
, backref
='slot')
490 EncounterSlot
.conditions
= association_proxy('condition_map', 'condition')
491 EncounterSlotCondition
.condition
= relation(EncounterCondition
,
494 EvolutionChain
.growth_rate
= relation(GrowthRate
, backref
='evolution_chains')
496 Generation
.versions
= relation(Version
, secondary
=VersionGroup
.__table__
)
497 Generation
.main_region
= relation(Region
)
499 Location
.region
= relation(Region
, backref
='locations')
501 LocationArea
.location
= relation(Location
, backref
='areas')
503 Machine
.version_group
= relation(VersionGroup
)
505 Move
.contest_effect
= relation(ContestEffect
, backref
='moves')
506 Move
.contest_combo_next
= association_proxy('contest_combo_first', 'second')
507 Move
.contest_combo_prev
= association_proxy('contest_combo_second', 'first')
508 Move
.damage_class
= relation(MoveDamageClass
, backref
='moves')
509 Move
.flags
= association_proxy('move_flags', 'flag')
510 Move
.flavor_text
= relation(MoveFlavorText
, order_by
=MoveFlavorText
.generation_id
, backref
='move')
511 Move
.foreign_names
= relation(MoveName
, backref
='pokemon')
512 Move
.generation
= relation(Generation
, backref
='moves')
513 Move
.machines
= relation(Machine
, backref
='move')
514 Move
.move_effect
= relation(MoveEffect
, backref
='moves')
515 Move
.move_flags
= relation(MoveFlag
, backref
='move')
516 Move
.super_contest_effect
= relation(SuperContestEffect
, backref
='moves')
517 Move
.super_contest_combo_next
= association_proxy('super_contest_combo_first', 'second')
518 Move
.super_contest_combo_prev
= association_proxy('super_contest_combo_second', 'first')
519 Move
.target
= relation(MoveTarget
, backref
='moves')
520 Move
.type = relation(Type
, backref
='moves')
522 Move
.effect
= rst
.MoveEffectProperty('effect')
523 Move
.priority
= association_proxy('move_effect', 'priority')
524 Move
.short_effect
= rst
.MoveEffectProperty('short_effect')
526 MoveEffect
.category_map
= relation(MoveEffectCategoryMap
)
527 MoveEffect
.categories
= association_proxy('category_map', 'category')
528 MoveEffectCategoryMap
.category
= relation(MoveEffectCategory
)
530 MoveFlag
.flag
= relation(MoveFlagType
)
532 MoveFlavorText
.generation
= relation(Generation
)
534 MoveName
.language
= relation(Language
)
536 Pokemon
.abilities
= relation(Ability
, secondary
=PokemonAbility
.__table__
,
537 order_by
=PokemonAbility
.slot
,
539 Pokemon
.formes
= relation(Pokemon
, primaryjoin
=Pokemon
.id==Pokemon
.forme_base_pokemon_id
,
540 backref
=backref('forme_base_pokemon',
541 remote_side
=[Pokemon
.id]))
542 Pokemon
.dex_numbers
= relation(PokemonDexNumber
, backref
='pokemon')
543 Pokemon
.egg_groups
= relation(EggGroup
, secondary
=PokemonEggGroup
.__table__
,
544 order_by
=PokemonEggGroup
.egg_group_id
,
546 Pokemon
.evolution_chain
= relation(EvolutionChain
, backref
='pokemon')
547 Pokemon
.evolution_method
= relation(EvolutionMethod
)
548 Pokemon
.evolution_children
= relation(Pokemon
, primaryjoin
=Pokemon
.id==Pokemon
.evolution_parent_pokemon_id
,
549 backref
=backref('evolution_parent',
550 remote_side
=[Pokemon
.id]))
551 Pokemon
.flavor_text
= relation(PokemonFlavorText
, order_by
=PokemonFlavorText
.pokemon_id
, backref
='pokemon')
552 Pokemon
.foreign_names
= relation(PokemonName
, backref
='pokemon')
553 Pokemon
.items
= relation(PokemonItem
)
554 Pokemon
.generation
= relation(Generation
, backref
='pokemon')
555 Pokemon
.shape
= relation(PokemonShape
, backref
='pokemon')
556 Pokemon
.stats
= relation(PokemonStat
, backref
='pokemon')
557 Pokemon
.types
= relation(Type
, secondary
=PokemonType
.__table__
)
559 PokemonDexNumber
.generation
= relation(Generation
)
561 PokemonFlavorText
.version
= relation(Version
)
563 PokemonItem
.item
= relation(Item
, backref
='pokemon')
564 PokemonItem
.version
= relation(Version
)
566 PokemonFormGroup
.pokemon
= relation(Pokemon
, backref
=backref('form_group',
568 PokemonFormSprite
.pokemon
= relation(Pokemon
, backref
='form_sprites')
569 PokemonFormSprite
.introduced_in
= relation(VersionGroup
)
571 PokemonMove
.pokemon
= relation(Pokemon
, backref
='pokemon_moves')
572 PokemonMove
.version_group
= relation(VersionGroup
)
573 PokemonMove
.machine
= relation(Machine
, backref
='pokemon_moves',
574 primaryjoin
=and_(Machine
.version_group_id
==PokemonMove
.version_group_id
,
575 Machine
.move_id
==PokemonMove
.move_id
),
576 foreign_keys
=[Machine
.version_group_id
, Machine
.move_id
],
578 PokemonMove
.move
= relation(Move
, backref
='pokemon_moves')
579 PokemonMove
.method
= relation(PokemonMoveMethod
)
581 PokemonName
.language
= relation(Language
)
583 PokemonStat
.stat
= relation(Stat
)
585 # This is technically a has-many; Generation.main_region_id -> Region.id
586 Region
.generation
= relation(Generation
, uselist
=False)
587 Region
.version_group_regions
= relation(VersionGroupRegion
, backref
='region',
588 order_by
='VersionGroupRegion.version_group_id')
589 Region
.version_groups
= association_proxy('version_group_regions', 'version_group')
591 SuperContestCombo
.first
= relation(Move
, primaryjoin
=SuperContestCombo
.first_move_id
==Move
.id,
592 backref
='super_contest_combo_first')
593 SuperContestCombo
.second
= relation(Move
, primaryjoin
=SuperContestCombo
.second_move_id
==Move
.id,
594 backref
='super_contest_combo_second')
596 Type
.damage_efficacies
= relation(TypeEfficacy
,
598 ==TypeEfficacy
.damage_type_id
,
599 backref
='damage_type')
600 Type
.target_efficacies
= relation(TypeEfficacy
,
602 ==TypeEfficacy
.target_type_id
,
603 backref
='target_type')
605 Type
.generation
= relation(Generation
, backref
='types')
606 Type
.damage_class
= relation(MoveDamageClass
, backref
='types')
608 Version
.version_group
= relation(VersionGroup
, backref
='versions')
609 Version
.generation
= association_proxy('version_group', 'generation')
611 VersionGroup
.generation
= relation(Generation
, backref
='version_groups')
612 VersionGroup
.version_group_regions
= relation(VersionGroupRegion
, backref
='version_group')
613 VersionGroup
.regions
= association_proxy('version_group_regions', 'region')