5 Columns have a info dictionary with these keys:
6 - description: The description of the column
7 - official: True if the values appear in games or official material; False if
8 they are fan-created or fan-written. This flag is currently only set for
10 - markup: The format of a text column. Can be one of:
11 - plaintext: Normal Unicode text (widely used in names)
12 - markdown: Veekun's Markdown flavor (generally used in effect descriptions)
13 - gametext: Transcription of in-game text that strives to be both
14 human-readable and represent the original text exactly.
15 - identifier: A fan-made identifier in the [-_a-z0-9]* format. Not intended
17 - latex: A formula in LaTeX syntax.
18 - ripped: True for text that has been ripped from the games, and can be ripped
19 again for new versions or languages
21 See `pokedex.db.multilang` for how localizable text columns work. The session
22 classes in that module can be used to change the default language.
24 # XXX: Check if "gametext" is set correctly everywhere
27 from functools
import partial
29 from sqlalchemy
import Column
, ForeignKey
, MetaData
, PrimaryKeyConstraint
, Table
, UniqueConstraint
30 from sqlalchemy
.ext
.declarative
import declarative_base
, DeclarativeMeta
31 from sqlalchemy
.ext
.associationproxy
import association_proxy
32 from sqlalchemy
.orm
import backref
, relation
33 from sqlalchemy
.orm
.session
import Session
34 from sqlalchemy
.orm
.interfaces
import AttributeExtension
35 from sqlalchemy
.sql
import and_
36 from sqlalchemy
.schema
import ColumnDefault
37 from sqlalchemy
.types
import *
39 from pokedex
.db
import markdown
, multilang
41 class TableSuperclass(object):
42 """Superclass for declarative tables, to give them some generic niceties
45 def __unicode__(self
):
46 """Be as useful as possible. Show the primary key, and an identifier
49 typename
= u
'.'.join((__name__
, type(self
).__name__
))
51 pk_constraint
= self
.__table__
.primary_key
53 return u
"<%s object at %x>" %
(typename
, id(self
))
55 pk
= u
', '.join(unicode(getattr(self
, column
.name
))
56 for column
in pk_constraint
.columns
)
58 return u
"<%s object (%s): %s>" %
(typename
, pk
, self
.identifier
)
59 except AttributeError:
60 return u
"<%s object (%s)>" %
(typename
, pk
)
63 return unicode(self
).encode('utf8')
66 return unicode(self
).encode('utf8')
69 class TableMetaclass(DeclarativeMeta
):
70 def __init__(cls
, name
, bases
, attrs
):
71 super(TableMetaclass
, cls
).__init__(name
, bases
, attrs
)
72 if hasattr(cls
, '__tablename__'):
73 mapped_classes
.append(cls
)
74 cls
.translation_classes
= []
77 TableBase
= declarative_base(metadata
=metadata
, cls
=TableSuperclass
, metaclass
=TableMetaclass
)
80 ### Need Language first, to create the partial() below
82 class Language(TableBase
):
83 u
"""A language the Pokémon games have been translated into
85 __tablename__
= 'languages'
86 __singlename__
= 'language'
87 id = Column(Integer
, primary_key
=True, nullable
=False,
88 info
=dict(description
="A numeric ID"))
89 iso639
= Column(Unicode(2), nullable
=False,
90 info
=dict(description
="The two-letter code of the country where this language is spoken. Note that it is not unique.", format
='identifier'))
91 iso3166
= Column(Unicode(2), nullable
=False,
92 info
=dict(description
="The two-letter code of the language. Note that it is not unique.", format
='identifier'))
93 identifier
= Column(Unicode(16), nullable
=False,
94 info
=dict(description
="An identifier", format
='identifier'))
95 official
= Column(Boolean
, nullable
=False, index
=True,
96 info
=dict(description
=u
"True iff games are produced in the language."))
97 order
= Column(Integer
, nullable
=True,
98 info
=dict(description
=u
"Order for sorting in foreign name lists."))
100 create_translation_table
= partial(multilang
.create_translation_table
, language_class
=Language
)
102 create_translation_table('language_names', Language
, 'names',
103 name
= Column(Unicode(16), nullable
=False, index
=True,
104 info
=dict(description
="The name", format
='plaintext', official
=True)),
107 ### The actual tables
109 class Ability(TableBase
):
110 u
"""An ability a Pokémon can have, such as Static or Pressure.
112 __tablename__
= 'abilities'
113 __singlename__
= 'ability'
114 id = Column(Integer
, primary_key
=True, nullable
=False,
115 info
=dict(description
="This ability's unique ID; matches the games' internal ID"))
116 identifier
= Column(Unicode(24), nullable
=False,
117 info
=dict(description
="An identifier", format
='identifier'))
118 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False,
119 info
=dict(description
="The ID of the generation this ability was introduced in", detail
=True))
121 create_translation_table('ability_names', Ability
, 'names',
122 relation_lazy
='joined',
123 name
= Column(Unicode(24), nullable
=False, index
=True,
124 info
=dict(description
="The name", format
='plaintext', official
=True, ripped
=True)),
126 create_translation_table('ability_prose', Ability
, 'prose',
127 effect
= Column(markdown
.MarkdownColumn(5120), nullable
=True,
128 info
=dict(description
="A detailed description of this ability's effect", format
='markdown')),
129 short_effect
= Column(markdown
.MarkdownColumn(255), nullable
=True,
130 info
=dict(description
="A short summary of this ability's effect", format
='markdown')),
133 class AbilityChangelog(TableBase
):
134 """History of changes to abilities across main game versions."""
135 __tablename__
= 'ability_changelog'
136 __singlename__
= 'ability_changelog'
137 id = Column(Integer
, primary_key
=True, nullable
=False,
138 info
=dict(description
="This change's unique ID"))
139 ability_id
= Column(Integer
, ForeignKey('abilities.id'), nullable
=False,
140 info
=dict(description
="The ID of the ability that changed"))
141 changed_in_version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False,
142 info
=dict(description
="The ID of the version group in which the ability changed"))
144 create_translation_table('ability_changelog_prose', AbilityChangelog
, 'prose',
145 effect
= Column(markdown
.MarkdownColumn(255), nullable
=False,
146 info
=dict(description
="A description of the old behavior", format
='markdown'))
149 class AbilityFlavorText(TableBase
):
150 u
"""In-game flavor text of an ability
152 __tablename__
= 'ability_flavor_text'
153 ability_id
= Column(Integer
, ForeignKey('abilities.id'), primary_key
=True, nullable
=False, autoincrement
=False,
154 info
=dict(description
="The ID of the ability"))
155 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False,
156 info
=dict(description
="The ID of the version group this flavor text is taken from"))
157 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False,
158 info
=dict(description
="The language"))
159 flavor_text
= Column(Unicode(64), nullable
=False,
160 info
=dict(description
="The actual flavor text", official
=True, format
='gametext'))
162 class Berry(TableBase
):
163 u
"""A Berry, consumable item that grows on trees
165 For data common to all items, such as the name, see the corresponding item entry.
167 __tablename__
= 'berries'
168 id = Column(Integer
, primary_key
=True, nullable
=False,
169 info
=dict(description
="This Berry's in-game number"))
170 item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=False,
171 info
=dict(description
="The ID of the item that represents this Berry"))
172 firmness_id
= Column(Integer
, ForeignKey('berry_firmness.id'), nullable
=False,
173 info
=dict(description
="The ID of this Berry's firmness category"))
174 natural_gift_power
= Column(Integer
, nullable
=True,
175 info
=dict(description
="Natural Gift's power when used with this Berry"))
176 natural_gift_type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=True,
177 info
=dict(description
="The ID of the Type that Natural Gift has when used with this Berry"))
178 size
= Column(Integer
, nullable
=False,
179 info
=dict(description
=u
"The size of this Berry, in millimeters"))
180 max_harvest
= Column(Integer
, nullable
=False,
181 info
=dict(description
="The maximum number of these berries that can grow on one tree in Generation IV"))
182 growth_time
= Column(Integer
, nullable
=False,
183 info
=dict(description
="Time it takes the tree to grow one stage, in hours. Berry trees go through four of these growth stages before they can be picked."))
184 soil_dryness
= Column(Integer
, nullable
=False,
185 info
=dict(description
="The speed at which this Berry dries out the soil as it grows. A higher rate means the soil dries more quickly."))
186 smoothness
= Column(Integer
, nullable
=False,
187 info
=dict(description
="The smoothness of this Berry, used in making Pokéblocks or Poffins"))
189 class BerryFirmness(TableBase
):
190 u
"""A Berry firmness, such as "hard" or "very soft".
192 __tablename__
= 'berry_firmness'
193 __singlename__
= 'berry_firmness'
194 id = Column(Integer
, primary_key
=True, nullable
=False,
195 info
=dict(description
="A unique ID for this firmness"))
196 identifier
= Column(Unicode(10), nullable
=False,
197 info
=dict(description
="An identifier", format
='identifier'))
199 create_translation_table('berry_firmness_names', BerryFirmness
, 'names',
200 relation_lazy
='joined',
201 name
= Column(Unicode(10), nullable
=False, index
=True,
202 info
=dict(description
="The name", format
='plaintext', official
=True)),
205 class BerryFlavor(TableBase
):
206 u
"""A Berry flavor level.
208 __tablename__
= 'berry_flavors'
209 berry_id
= Column(Integer
, ForeignKey('berries.id'), primary_key
=True, nullable
=False, autoincrement
=False,
210 info
=dict(description
="The ID of the berry"))
211 contest_type_id
= Column(Integer
, ForeignKey('contest_types.id'), primary_key
=True, nullable
=False, autoincrement
=False,
212 info
=dict(description
="The ID of the flavor"))
213 flavor
= Column(Integer
, nullable
=False,
214 info
=dict(description
="The level of the flavor in the berry"))
216 class ContestCombo(TableBase
):
217 u
"""Combo of two moves in a Contest.
219 __tablename__
= 'contest_combos'
220 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
221 info
=dict(description
="The ID of the first move in the combo"))
222 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
223 info
=dict(description
="The ID of the second and final move in the combo"))
225 class ContestEffect(TableBase
):
226 u
"""Effect of a move when used in a Contest.
228 __tablename__
= 'contest_effects'
229 __singlename__
= 'contest_effect'
230 id = Column(Integer
, primary_key
=True, nullable
=False,
231 info
=dict(description
="A unique ID for this effect"))
232 appeal
= Column(SmallInteger
, nullable
=False,
233 info
=dict(description
="The base number of hearts the user of this move gets"))
234 jam
= Column(SmallInteger
, nullable
=False,
235 info
=dict(description
="The base number of hearts the user's opponent loses"))
237 create_translation_table('contest_effect_prose', ContestEffect
, 'prose',
238 flavor_text
= Column(Unicode(64), nullable
=True,
239 info
=dict(description
="The in-game description of this effect", official
=True, format
='gametext')),
240 effect
= Column(Unicode(255), nullable
=True,
241 info
=dict(description
="A detailed description of the effect", format
='plaintext')),
244 class ContestType(TableBase
):
245 u
"""A Contest type, such as "cool" or "smart", and their associated Berry flavors and Pokéblock colors.
247 __tablename__
= 'contest_types'
248 __singlename__
= 'contest_type'
249 id = Column(Integer
, primary_key
=True, nullable
=False,
250 info
=dict(description
="A unique ID for this Contest type"))
251 identifier
= Column(Unicode(6), nullable
=False,
252 info
=dict(description
="An identifier", format
='identifier'))
254 create_translation_table('contest_type_names', ContestType
, 'names',
255 relation_lazy
='joined',
256 name
= Column(Unicode(6), nullable
=True, index
=True,
257 info
=dict(description
="The name", format
='plaintext', official
=True)),
258 flavor
= Column(Unicode(6), nullable
=True,
259 info
=dict(description
="The name of the corresponding Berry flavor", official
=True, format
='plaintext')),
260 color
= Column(Unicode(6), nullable
=True,
261 info
=dict(description
=u
"The name of the corresponding Pokéblock color", official
=True, format
='plaintext')),
264 class EggGroup(TableBase
):
265 u
"""An Egg group. Usually, two Pokémon can breed if they share an Egg Group.
267 (exceptions are the Ditto and No Eggs groups)
269 __tablename__
= 'egg_groups'
270 __singlename__
= 'egg_group'
271 id = Column(Integer
, primary_key
=True, nullable
=False,
272 info
=dict(description
="A unique ID for this group"))
273 identifier
= Column(Unicode(16), nullable
=False,
274 info
=dict(description
=u
"An identifier.", format
='identifier'))
276 create_translation_table('egg_group_prose', EggGroup
, 'names',
277 relation_lazy
='joined',
278 name
= Column(Unicode(16), nullable
=False, index
=True,
279 info
=dict(description
="The name", format
='plaintext', official
=True)),
282 class Encounter(TableBase
):
283 u
"""Encounters with wild Pokémon.
287 Within a given area in a given game, encounters are differentiated by the
288 "slot" they are in and the state of the game world.
290 What the player is doing to get an encounter, such as surfing or walking
291 through tall grass, is called a method. Each method has its own set of
294 Within a method, slots are defined primarily by rarity. Each slot can
295 also be affected by world conditions; for example, the 20% slot for walking
296 in tall grass is affected by whether a swarm is in effect in that area.
297 "Is there a swarm?" is a condition; "there is a swarm" and "there is not a
298 swarm" are the possible values of this condition.
300 A slot (20% walking in grass) and any appropriate world conditions (no
301 swarm) are thus enough to define a specific encounter.
303 Well, okay, almost: each slot actually appears twice.
306 __tablename__
= 'encounters'
307 id = Column(Integer
, primary_key
=True, nullable
=False,
308 info
=dict(description
="A unique ID for this encounter"))
309 version_id
= Column(Integer
, ForeignKey('versions.id'), nullable
=False, autoincrement
=False,
310 info
=dict(description
="The ID of the version this applies to"))
311 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), nullable
=False, autoincrement
=False,
312 info
=dict(description
="The ID of the location of this encounter"))
313 encounter_slot_id
= Column(Integer
, ForeignKey('encounter_slots.id'), nullable
=False, autoincrement
=False,
314 info
=dict(description
="The ID of the encounter slot, which determines method and rarity"))
315 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False, autoincrement
=False,
316 info
=dict(description
=u
"The ID of the encountered Pokémon"))
317 min_level
= Column(Integer
, nullable
=False, autoincrement
=False,
318 info
=dict(description
=u
"The minimum level of the encountered Pokémon"))
319 max_level
= Column(Integer
, nullable
=False, autoincrement
=False,
320 info
=dict(description
=u
"The maxmum level of the encountered Pokémon"))
322 class EncounterCondition(TableBase
):
323 u
"""A conditions in the game world that affects Pokémon encounters, such as time of day.
326 __tablename__
= 'encounter_conditions'
327 __singlename__
= 'encounter_condition'
328 id = Column(Integer
, primary_key
=True, nullable
=False,
329 info
=dict(description
="A unique ID for this condition"))
330 identifier
= Column(Unicode(64), nullable
=False,
331 info
=dict(description
="An identifier", format
='identifier'))
333 create_translation_table('encounter_condition_prose', EncounterCondition
, 'prose',
334 name
= Column(Unicode(64), nullable
=False, index
=True,
335 info
=dict(description
="The name", format
='plaintext', official
=False)),
338 class EncounterConditionValue(TableBase
):
339 u
"""A possible state for a condition; for example, the state of 'swarm' could be 'swarm' or 'no swarm'.
342 __tablename__
= 'encounter_condition_values'
343 __singlename__
= 'encounter_condition_value'
344 id = Column(Integer
, primary_key
=True, nullable
=False,
345 info
=dict(description
="A numeric ID"))
346 encounter_condition_id
= Column(Integer
, ForeignKey('encounter_conditions.id'), primary_key
=False, nullable
=False, autoincrement
=False,
347 info
=dict(description
="The ID of the encounter condition this is a value of"))
348 identifier
= Column(Unicode(64), nullable
=False,
349 info
=dict(description
="An identifier", format
='identifier'))
350 is_default
= Column(Boolean
, nullable
=False,
351 info
=dict(description
='Set if this value is the default state for the condition'))
353 create_translation_table('encounter_condition_value_prose', EncounterConditionValue
, 'prose',
354 name
= Column(Unicode(64), nullable
=False, index
=True,
355 info
=dict(description
="The name", format
='plaintext', official
=False)),
358 class EncounterConditionValueMap(TableBase
):
359 u
"""Maps encounters to the specific conditions under which they occur.
361 __tablename__
= 'encounter_condition_value_map'
362 encounter_id
= Column(Integer
, ForeignKey('encounters.id'), primary_key
=True, nullable
=False, autoincrement
=False,
363 info
=dict(description
="The ID of the encounter"))
364 encounter_condition_value_id
= Column(Integer
, ForeignKey('encounter_condition_values.id'), primary_key
=True, nullable
=False, autoincrement
=False,
365 info
=dict(description
="The ID of the encounter condition value"))
367 class EncounterMethod(TableBase
):
368 u
"""A way the player can enter a wild encounter, e.g., surfing, fishing, or walking through tall grass.
371 __tablename__
= 'encounter_methods'
372 __singlename__
= 'encounter_method'
373 id = Column(Integer
, primary_key
=True, nullable
=False,
374 info
=dict(description
="A unique ID for the method"))
375 identifier
= Column(Unicode(16), nullable
=False, unique
=True,
376 info
=dict(description
="An identifier", format
='identifier'))
378 create_translation_table('encounter_method_prose', EncounterMethod
, 'prose',
379 name
= Column(Unicode(64), nullable
=False, index
=True,
380 info
=dict(description
="The name", format
='plaintext', official
=False)),
383 class EncounterSlot(TableBase
):
384 u
"""An abstract "slot" within a method, associated with both some set of conditions and a rarity.
386 Note that there are two encounters per slot, so the rarities will only add
390 __tablename__
= 'encounter_slots'
391 id = Column(Integer
, primary_key
=True, nullable
=False,
392 info
=dict(description
="A unique ID for this slot"))
393 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False, autoincrement
=False,
394 info
=dict(description
="The ID of the version group this slot is in"))
395 encounter_method_id
= Column(Integer
, ForeignKey('encounter_methods.id'), primary_key
=False, nullable
=False, autoincrement
=False,
396 info
=dict(description
="The ID of the method"))
397 slot
= Column(Integer
, nullable
=True,
398 info
=dict(description
="This slot's order for the location and method"))
399 rarity
= Column(Integer
, nullable
=True,
400 info
=dict(description
="The chance of the encounter as a percentage"))
402 class EvolutionChain(TableBase
):
403 u
"""A family of Pokémon that are linked by evolution
405 __tablename__
= 'evolution_chains'
406 id = Column(Integer
, primary_key
=True, nullable
=False,
407 info
=dict(description
="A numeric ID"))
408 growth_rate_id
= Column(Integer
, ForeignKey('growth_rates.id'), nullable
=False,
409 info
=dict(description
="ID of the growth rate for this family"))
410 baby_trigger_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True,
411 info
=dict(description
="Item that a parent must hold while breeding to produce a baby"))
413 class EvolutionTrigger(TableBase
):
414 u
"""An evolution type, such as "level" or "trade".
416 __tablename__
= 'evolution_triggers'
417 __singlename__
= 'evolution_trigger'
418 id = Column(Integer
, primary_key
=True, nullable
=False,
419 info
=dict(description
="A numeric ID"))
420 identifier
= Column(Unicode(16), nullable
=False,
421 info
=dict(description
="An identifier", format
='identifier'))
423 create_translation_table('evolution_trigger_prose', EvolutionTrigger
, 'prose',
424 name
= Column(Unicode(16), nullable
=False, index
=True,
425 info
=dict(description
="The name", format
='plaintext', official
=False)),
428 class Experience(TableBase
):
429 u
"""EXP needed for a certain level with a certain growth rate
431 __tablename__
= 'experience'
432 growth_rate_id
= Column(Integer
, ForeignKey('growth_rates.id'), primary_key
=True, nullable
=False,
433 info
=dict(description
="ID of the growth rate"))
434 level
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
435 info
=dict(description
="The level"))
436 experience
= Column(Integer
, nullable
=False,
437 info
=dict(description
="The number of EXP points needed to get to that level"))
439 class Generation(TableBase
):
440 u
"""A Generation of the Pokémon franchise
442 __tablename__
= 'generations'
443 __singlename__
= 'generation'
444 id = Column(Integer
, primary_key
=True, nullable
=False,
445 info
=dict(description
="A numeric ID"))
446 main_region_id
= Column(Integer
, ForeignKey('regions.id'), nullable
=False,
447 info
=dict(description
="ID of the region this generation's main games take place in"))
448 canonical_pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'), nullable
=False,
449 info
=dict(description
=u
"ID of the Pokédex this generation's main games use by default"))
450 identifier
= Column(Unicode(16), nullable
=False,
451 info
=dict(description
=u
'An identifier', format
='identifier'))
453 create_translation_table('generation_names', Generation
, 'names',
454 relation_lazy
='joined',
455 name
= Column(Unicode(16), nullable
=False, index
=True,
456 info
=dict(description
="The name", format
='plaintext', official
=True)),
459 class GrowthRate(TableBase
):
460 u
"""Growth rate of a Pokémon, i.e. the EXP → level function.
462 __tablename__
= 'growth_rates'
463 __singlename__
= 'growth_rate'
464 id = Column(Integer
, primary_key
=True, nullable
=False,
465 info
=dict(description
="A numeric ID"))
466 identifier
= Column(Unicode(20), nullable
=False,
467 info
=dict(description
="An identifier", format
='identifier'))
468 formula
= Column(Unicode(500), nullable
=False,
469 info
=dict(description
="The formula", format
='latex'))
471 create_translation_table('growth_rate_prose', GrowthRate
, 'prose',
472 name
= Column(Unicode(20), nullable
=False, index
=True,
473 info
=dict(description
="The name", format
='plaintext', official
=False)),
476 class Item(TableBase
):
477 u
"""An Item from the games, like "Poké Ball" or "Bicycle".
479 __tablename__
= 'items'
480 __singlename__
= 'item'
481 id = Column(Integer
, primary_key
=True, nullable
=False,
482 info
=dict(description
="A numeric ID"))
483 identifier
= Column(Unicode(20), nullable
=False,
484 info
=dict(description
="An identifier", format
='identifier'))
485 category_id
= Column(Integer
, ForeignKey('item_categories.id'), nullable
=False,
486 info
=dict(description
="ID of a category this item belongs to"))
487 cost
= Column(Integer
, nullable
=False,
488 info
=dict(description
=u
"Cost of the item when bought. Items sell for half this price."))
489 fling_power
= Column(Integer
, nullable
=True,
490 info
=dict(description
=u
"Power of the move Fling when used with this item."))
491 fling_effect_id
= Column(Integer
, ForeignKey('item_fling_effects.id'), nullable
=True,
492 info
=dict(description
=u
"ID of the fling-effect of the move Fling when used with this item. Note that these are different from move effects."))
495 def appears_underground(self
):
496 u
"""True if the item appears underground, as specified by the appropriate flag
498 return any(flag
.identifier
== u
'underground' for flag
in self
.flags
)
500 create_translation_table('item_names', Item
, 'names',
501 relation_lazy
='joined',
502 name
= Column(Unicode(20), nullable
=False, index
=True,
503 info
=dict(description
="The name", format
='plaintext', official
=True, ripped
=True)),
505 create_translation_table('item_prose', Item
, 'prose',
506 short_effect
= Column(markdown
.MarkdownColumn(256), nullable
=True,
507 info
=dict(description
="A short summary of the effect", format
='markdown')),
508 effect
= Column(markdown
.MarkdownColumn(5120), nullable
=True,
509 info
=dict(description
=u
"Detailed description of the item's effect.", format
='markdown')),
511 create_translation_table('item_flavor_summaries', Item
, 'flavor_summaries',
512 flavor_summary
= Column(Unicode(512), nullable
=True,
513 info
=dict(description
=u
"Text containing facts from all flavor texts, for languages without official game translations", official
=False, format
='plaintext', ripped
=True)),
516 class ItemCategory(TableBase
):
519 # XXX: This is fanon, right?
520 __tablename__
= 'item_categories'
521 __singlename__
= 'item_category'
522 id = Column(Integer
, primary_key
=True, nullable
=False,
523 info
=dict(description
="A numeric ID"))
524 pocket_id
= Column(Integer
, ForeignKey('item_pockets.id'), nullable
=False,
525 info
=dict(description
="ID of the pocket these items go to"))
526 identifier
= Column(Unicode(16), nullable
=False,
527 info
=dict(description
="An identifier", format
='identifier'))
529 create_translation_table('item_category_prose', ItemCategory
, 'prose',
530 relation_lazy
='joined',
531 name
= Column(Unicode(16), nullable
=False, index
=True,
532 info
=dict(description
="The name", format
='plaintext', official
=False)),
535 class ItemFlag(TableBase
):
536 u
"""An item attribute such as "consumable" or "holdable".
538 __tablename__
= 'item_flags'
539 __singlename__
= 'item_flag'
540 id = Column(Integer
, primary_key
=True, nullable
=False,
541 info
=dict(description
="A numeric ID"))
542 identifier
= Column(Unicode(24), nullable
=False,
543 info
=dict(description
="Identifier of the flag", format
='identifier'))
545 create_translation_table('item_flag_prose', ItemFlag
, 'prose',
546 name
= Column(Unicode(24), nullable
=True, index
=True,
547 info
=dict(description
="The name", format
='plaintext', official
=False)),
548 description
= Column(Unicode(64), nullable
=True,
549 info
=dict(description
="Short description of the flag", format
='plaintext')),
552 class ItemFlagMap(TableBase
):
553 u
"""Maps an item flag to its item.
555 __tablename__
= 'item_flag_map'
556 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False,
557 info
=dict(description
="The ID of the item"))
558 item_flag_id
= Column(Integer
, ForeignKey('item_flags.id'), primary_key
=True, autoincrement
=False, nullable
=False,
559 info
=dict(description
="The ID of the item flag"))
561 class ItemFlavorText(TableBase
):
562 u
"""An in-game description of an item
564 __tablename__
= 'item_flavor_text'
565 __singlename__
= 'item_flavor_text'
566 summary_column
= Item
.flavor_summaries_table
, 'flavor_summary'
567 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False,
568 info
=dict(description
="The ID of the item"))
569 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, autoincrement
=False, nullable
=False,
570 info
=dict(description
="ID of the version group that sports this text"))
571 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False,
572 info
=dict(description
="The language"))
573 flavor_text
= Column(Unicode(255), nullable
=False,
574 info
=dict(description
="The flavor text itself", official
=True, format
='gametext'))
576 class ItemFlingEffect(TableBase
):
577 u
"""An effect of the move Fling when used with a specific item
579 __tablename__
= 'item_fling_effects'
580 __singlename__
= 'item_fling_effect'
581 id = Column(Integer
, primary_key
=True, nullable
=False,
582 info
=dict(description
="A numeric ID"))
584 create_translation_table('item_fling_effect_prose', ItemFlingEffect
, 'prose',
585 effect
= Column(Unicode(255), nullable
=False,
586 info
=dict(description
="Description of the effect", format
='plaintext')),
589 class ItemGameIndex(TableBase
):
590 u
"""The internal ID number a game uses for an item
592 __tablename__
= 'item_game_indices'
593 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, autoincrement
=False, nullable
=False,
594 info
=dict(description
="The database ID of the item"))
595 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, autoincrement
=False, nullable
=False,
596 info
=dict(description
="ID of the generation of games"))
597 game_index
= Column(Integer
, nullable
=False,
598 info
=dict(description
="Internal ID of the item in the generation"))
600 class ItemPocket(TableBase
):
601 u
"""A pocket that categorizes items
603 __tablename__
= 'item_pockets'
604 __singlename__
= 'item_pocket'
605 id = Column(Integer
, primary_key
=True, nullable
=False,
606 info
=dict(description
="A numeric ID"))
607 identifier
= Column(Unicode(16), nullable
=False,
608 info
=dict(description
="An identifier of this pocket", format
='identifier'))
610 create_translation_table('item_pocket_names', ItemPocket
, 'names',
611 relation_lazy
='joined',
612 name
= Column(Unicode(16), nullable
=False, index
=True,
613 info
=dict(description
="The name", format
='plaintext', official
=True)),
616 class Location(TableBase
):
617 u
"""A place in the Pokémon world
619 __tablename__
= 'locations'
620 __singlename__
= 'location'
621 id = Column(Integer
, primary_key
=True, nullable
=False,
622 info
=dict(description
="A numeric ID"))
623 region_id
= Column(Integer
, ForeignKey('regions.id'),
624 info
=dict(description
="ID of the region this location is in"))
625 identifier
= Column(Unicode(64), nullable
=False,
626 info
=dict(description
="An identifier", format
='identifier'))
628 create_translation_table('location_names', Location
, 'names',
629 relation_lazy
='joined',
630 name
= Column(Unicode(64), nullable
=False, index
=True,
631 info
=dict(description
="The name", format
='plaintext', official
=True)),
634 class LocationArea(TableBase
):
635 u
"""A sub-area of a location
637 __tablename__
= 'location_areas'
638 __singlename__
= 'location_area'
639 id = Column(Integer
, primary_key
=True, nullable
=False,
640 info
=dict(description
="A numeric ID"))
641 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=False,
642 info
=dict(description
="ID of the location this area is part of"))
643 game_index
= Column(Integer
, nullable
=False,
644 info
=dict(description
="ID the games ude for this area"))
645 identifier
= Column(Unicode(64), nullable
=True,
646 info
=dict(description
="An identifier", format
='identifier'))
648 create_translation_table('location_area_prose', LocationArea
, 'prose',
649 relation_lazy
='joined',
650 name
= Column(Unicode(64), nullable
=False, index
=True,
651 info
=dict(description
="The name", format
='plaintext', official
=False)),
654 class LocationAreaEncounterRate(TableBase
):
655 # XXX: What's this exactly? Someone add the docstring & revise the descriptions
656 __tablename__
= 'location_area_encounter_rates'
657 location_area_id
= Column(Integer
, ForeignKey('location_areas.id'), primary_key
=True, nullable
=False, autoincrement
=False,
658 info
=dict(description
="ID of the area"))
659 encounter_method_id
= Column(Integer
, ForeignKey('encounter_methods.id'), primary_key
=True, nullable
=False, autoincrement
=False,
660 info
=dict(description
="ID of the method"))
661 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, autoincrement
=False,
662 info
=dict(description
="ID of the version"))
663 rate
= Column(Integer
, nullable
=True,
664 info
=dict(description
="The encounter rate")) # units?
666 class LocationGameIndex(TableBase
):
667 u
"""IDs the games use internally for locations
669 __tablename__
= 'location_game_indices'
670 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=False, primary_key
=True,
671 info
=dict(description
="Database ID of the locaion"))
672 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False, primary_key
=True,
673 info
=dict(description
="ID of the generation this entry to"))
674 game_index
= Column(Integer
, nullable
=False, primary_key
=True, autoincrement
=False,
675 info
=dict(description
="Internal game ID of the location"))
677 class Machine(TableBase
):
678 u
"""A TM or HM; numbered item that can teach a move to a Pokémon
680 __tablename__
= 'machines'
681 machine_number
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
682 info
=dict(description
="Number of the machine for TMs, or 100 + the munber for HMs"))
683 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False,
684 info
=dict(description
="Versions this entry applies to"))
685 item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=False,
686 info
=dict(description
="ID of the corresponding Item"))
687 move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=False,
688 info
=dict(description
="ID of the taught move"))
692 u
"""True if this machine is a HM, False if it's a TM
694 return self
.machine_number
>= 100
696 class Move(TableBase
):
697 u
"""A Move: technique or attack a Pokémon can learn to use
699 __tablename__
= 'moves'
700 __singlename__
= 'move'
701 id = Column(Integer
, primary_key
=True, nullable
=False,
702 info
=dict(description
="A numeric ID"))
703 identifier
= Column(Unicode(24), nullable
=False,
704 info
=dict(description
="An identifier", format
='identifier'))
705 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False,
706 info
=dict(description
="ID of the generation this move first appeared in"))
707 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False,
708 info
=dict(description
="ID of the move's elemental type"))
709 power
= Column(SmallInteger
, nullable
=False,
710 info
=dict(description
="Base power of the move"))
711 pp
= Column(SmallInteger
, nullable
=True,
712 info
=dict(description
="Base PP (Power Points) of the move, nullable if not applicable (e.g. Struggle and Shadow moves)."))
713 accuracy
= Column(SmallInteger
, nullable
=True,
714 info
=dict(description
="Accuracy of the move; NULL means it never misses"))
715 priority
= Column(SmallInteger
, nullable
=False,
716 info
=dict(description
="The move's priority bracket"))
717 target_id
= Column(Integer
, ForeignKey('move_targets.id'), nullable
=False,
718 info
=dict(description
="ID of the target (range) of the move"))
719 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=False,
720 info
=dict(description
="ID of the damage class (physical/special) of the move"))
721 effect_id
= Column(Integer
, ForeignKey('move_effects.id'), nullable
=False,
722 info
=dict(description
="ID of the move's effect"))
723 effect_chance
= Column(Integer
, nullable
=True,
724 info
=dict(description
="The chance for a secondary effect. What this is a chance of is specified by the move's effect."))
725 contest_type_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=True,
726 info
=dict(description
="ID of the move's Contest type (e.g. cool or smart)"))
727 contest_effect_id
= Column(Integer
, ForeignKey('contest_effects.id'), nullable
=True,
728 info
=dict(description
="ID of the move's Contest effect"))
729 super_contest_effect_id
= Column(Integer
, ForeignKey('super_contest_effects.id'), nullable
=True,
730 info
=dict(description
="ID of the move's Super Contest effect"))
732 create_translation_table('move_names', Move
, 'names',
733 relation_lazy
='joined',
734 name
= Column(Unicode(24), nullable
=False, index
=True,
735 info
=dict(description
="The name", format
='plaintext', official
=True, ripped
=True))
737 create_translation_table('move_flavor_summaries', Move
, 'flavor_summaries',
738 flavor_summary
= Column(Unicode(512), nullable
=True,
739 info
=dict(description
=u
"Text containing facts from all flavor texts, for languages without official game translations", official
=False, format
='plaintext', ripped
=True)),
742 class MoveBattleStyle(TableBase
):
743 u
"""A battle style of a move""" # XXX: Explain better
744 __tablename__
= 'move_battle_styles'
745 __singlename__
= 'move_battle_style'
746 id = Column(Integer
, primary_key
=True, nullable
=False,
747 info
=dict(description
="A numeric ID"))
748 identifier
= Column(Unicode(8), nullable
=False,
749 info
=dict(description
="An identifier", format
='identifier'))
751 create_translation_table('move_battle_style_prose', MoveBattleStyle
, 'prose',
752 relation_lazy
='joined',
753 name
= Column(Unicode(8), nullable
=False, index
=True,
754 info
=dict(description
="The name", format
='plaintext', official
=False)),
757 class MoveChangelog(TableBase
):
758 """History of changes to moves across main game versions."""
759 __tablename__
= 'move_changelog'
760 __singlename__
= 'move_changelog'
761 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False,
762 info
=dict(description
="ID of the move that changed"))
763 changed_in_version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False,
764 info
=dict(description
="ID of the version group in which the move changed"))
765 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=True,
766 info
=dict(description
="Prior type of the move, or NULL if unchanged"))
767 power
= Column(SmallInteger
, nullable
=True,
768 info
=dict(description
="Prior base power of the move, or NULL if unchanged"))
769 pp
= Column(SmallInteger
, nullable
=True,
770 info
=dict(description
="Prior base PP of the move, or NULL if unchanged"))
771 accuracy
= Column(SmallInteger
, nullable
=True,
772 info
=dict(description
="Prior accuracy of the move, or NULL if unchanged"))
773 effect_id
= Column(Integer
, ForeignKey('move_effects.id'), nullable
=True,
774 info
=dict(description
="Prior ID of the effect, or NULL if unchanged"))
775 effect_chance
= Column(Integer
, nullable
=True,
776 info
=dict(description
="Prior effect chance, or NULL if unchanged"))
778 class MoveDamageClass(TableBase
):
779 u
"""Any of the damage classes moves can have, i.e. physical, special, or non-damaging.
781 __tablename__
= 'move_damage_classes'
782 __singlename__
= 'move_damage_class'
783 id = Column(Integer
, primary_key
=True, nullable
=False,
784 info
=dict(description
="A numeric ID"))
785 identifier
= Column(Unicode(16), nullable
=False,
786 info
=dict(description
="An identifier", format
='identifier'))
788 create_translation_table('move_damage_class_prose', MoveDamageClass
, 'prose',
789 relation_lazy
='joined',
790 name
= Column(Unicode(16), nullable
=True, index
=True,
791 info
=dict(description
="The name", format
='plaintext', official
=False)),
792 description
= Column(Unicode(64), nullable
=True,
793 info
=dict(description
="A description of the class", format
='plaintext')),
796 class MoveEffect(TableBase
):
797 u
"""An effect of a move
799 __tablename__
= 'move_effects'
800 __singlename__
= 'move_effect'
801 id = Column(Integer
, primary_key
=True, nullable
=False,
802 info
=dict(description
="A numeric ID"))
804 create_translation_table('move_effect_prose', MoveEffect
, 'prose',
805 short_effect
= Column(Unicode(256), nullable
=True,
806 info
=dict(description
="A short summary of the effect", format
='plaintext')),
807 effect
= Column(Unicode(5120), nullable
=True,
808 info
=dict(description
="A detailed description of the effect", format
='plaintext')),
811 class MoveEffectChangelog(TableBase
):
812 """History of changes to move effects across main game versions."""
813 __tablename__
= 'move_effect_changelog'
814 __singlename__
= 'move_effect_changelog'
815 id = Column(Integer
, primary_key
=True, nullable
=False,
816 info
=dict(description
="A numeric ID"))
817 effect_id
= Column(Integer
, ForeignKey('move_effects.id'), nullable
=False,
818 info
=dict(description
="The ID of the effect that changed"))
819 changed_in_version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False,
820 info
=dict(description
="The ID of the version group in which the effect changed"))
823 UniqueConstraint(effect_id
, changed_in_version_group_id
),
827 create_translation_table('move_effect_changelog_prose', MoveEffectChangelog
, 'prose',
828 effect
= Column(markdown
.MarkdownColumn(512), nullable
=False,
829 info
=dict(description
="A description of the old behavior", format
='markdown')),
832 class MoveFlag(TableBase
):
833 u
"""Maps a move flag to a move
835 # XXX: Other flags have a ___Flag class for the actual flag and ___FlagMap for the map,
836 # these, somewhat confusingly, have MoveFlagType and MoveFlag
837 __tablename__
= 'move_flags'
838 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
839 info
=dict(description
="ID of the move"))
840 move_flag_type_id
= Column(Integer
, ForeignKey('move_flag_types.id'), primary_key
=True, nullable
=False, autoincrement
=False,
841 info
=dict(description
="ID of the flag"))
843 class MoveFlagType(TableBase
):
844 u
"""A Move attribute such as "snatchable" or "contact".
846 __tablename__
= 'move_flag_types'
847 __singlename__
= 'move_flag_type'
848 id = Column(Integer
, primary_key
=True, nullable
=False,
849 info
=dict(description
="A numeric ID"))
850 identifier
= Column(Unicode(32), nullable
=False,
851 info
=dict(description
="A short identifier for the flag", format
='identifier'))
853 create_translation_table('move_flag_type_prose', MoveFlagType
, 'prose',
854 relation_lazy
='joined',
855 name
= Column(Unicode(32), nullable
=True, index
=True,
856 info
=dict(description
="The name", format
='plaintext', official
=False)),
857 description
= Column(markdown
.MarkdownColumn(128), nullable
=True,
858 info
=dict(description
="A short description of the flag", format
='markdown')),
861 class MoveFlavorText(TableBase
):
862 u
"""In-game description of a move
864 __tablename__
= 'move_flavor_text'
865 summary_column
= Move
.flavor_summaries_table
, 'flavor_summary'
866 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
867 info
=dict(description
="ID of the move"))
868 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False,
869 info
=dict(description
="ID of the version group this text appears in"))
870 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False,
871 info
=dict(description
="The language"))
872 flavor_text
= Column(Unicode(255), nullable
=False,
873 info
=dict(description
="The flavor text", official
=True, format
='gametext'))
875 class MoveMeta(TableBase
):
876 u
"""Metadata for move effects, sorta-kinda ripped straight from the game"""
877 __tablename__
= 'move_meta'
878 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
879 info
=dict(description
="A numeric ID"))
880 meta_category_id
= Column(Integer
, ForeignKey('move_meta_categories.id'), nullable
=False,
881 info
=dict(description
="ID of the move category"))
882 meta_ailment_id
= Column(Integer
, ForeignKey('move_meta_ailments.id'), nullable
=False,
883 info
=dict(description
="ID of the caused ailment"))
884 min_hits
= Column(Integer
, nullable
=True, index
=True,
885 info
=dict(description
="Minimum number of hits per use"))
886 max_hits
= Column(Integer
, nullable
=True, index
=True,
887 info
=dict(description
="Maximum number of hits per use"))
888 min_turns
= Column(Integer
, nullable
=True, index
=True,
889 info
=dict(description
="Minimum number of turns the user is forced to use the move"))
890 max_turns
= Column(Integer
, nullable
=True, index
=True,
891 info
=dict(description
="Maximum number of turns the user is forced to use the move"))
892 recoil
= Column(Integer
, nullable
=False, index
=True,
893 info
=dict(description
="Recoil damage, in percent of damage done"))
894 healing
= Column(Integer
, nullable
=False, index
=True,
895 info
=dict(description
="Healing, in percent of user's max HP"))
896 crit_rate
= Column(Integer
, nullable
=False, index
=True,
897 info
=dict(description
="Critical hit rate bonus"))
898 ailment_chance
= Column(Integer
, nullable
=False, index
=True,
899 info
=dict(description
="Chance to cause an ailment, in percent"))
900 flinch_chance
= Column(Integer
, nullable
=False, index
=True,
901 info
=dict(description
="Chance to cause flinching, in percent"))
902 stat_chance
= Column(Integer
, nullable
=False, index
=True,
903 info
=dict(description
="Chance to cause a stat change, in percent"))
905 class MoveMetaAilment(TableBase
):
906 u
"""Common status ailments moves can inflict on a single Pokémon, including
907 major ailments like paralysis and minor ailments like trapping.
909 __tablename__
= 'move_meta_ailments'
910 __singlename__
= 'move_meta_ailment'
911 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
912 info
=dict(description
="A numeric ID"))
913 identifier
= Column(Unicode(24), nullable
=False, index
=True, unique
=True,
914 info
=dict(description
="An identifier", format
='identifier'))
916 create_translation_table('move_meta_ailment_names', MoveMetaAilment
, 'names',
917 relation_lazy
='joined',
918 name
= Column(Unicode(24), nullable
=False, index
=True,
919 info
=dict(description
="The name", format
='plaintext', official
=True)),
922 class MoveMetaCategory(TableBase
):
923 u
"""Very general categories that loosely group move effects."""
924 __tablename__
= 'move_meta_categories'
925 __singlename__
= 'move_meta_category'
926 id = Column(Integer
, primary_key
=True, nullable
=False,
927 info
=dict(description
="A numeric ID"))
928 identifier
= Column(Unicode(32), nullable
=False, index
=True, unique
=True,
929 info
=dict(description
="An identifier", format
='identifier'))
931 create_translation_table('move_meta_category_prose', MoveMetaCategory
, 'prose',
932 relation_lazy
='joined',
933 description
= Column(Unicode(64), nullable
=False,
934 info
=dict(description
="A description of the category", format
="plaintext", official
=False)),
937 class MoveMetaStatChange(TableBase
):
938 u
"""Stat changes moves (may) make."""
939 __tablename__
= 'move_meta_stat_changes'
940 move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
941 info
=dict(description
="ID of the move"))
942 stat_id
= Column(Integer
, ForeignKey('stats.id'), primary_key
=True, nullable
=False, autoincrement
=False,
943 info
=dict(description
="ID of the stat"))
944 change
= Column(Integer
, nullable
=False, index
=True,
945 info
=dict(description
="Amount of increase/decrease, in stages"))
947 class MoveTarget(TableBase
):
948 u
"""Targetting or "range" of a move, e.g. "Affects all opponents" or "Affects user".
950 __tablename__
= 'move_targets'
951 __singlename__
= 'move_target'
952 id = Column(Integer
, primary_key
=True, nullable
=False,
953 info
=dict(description
="A numeric ID"))
954 identifier
= Column(Unicode(32), nullable
=False,
955 info
=dict(description
="An identifier", format
='identifier'))
957 create_translation_table('move_target_prose', MoveTarget
, 'prose',
958 relation_lazy
='joined',
959 name
= Column(Unicode(32), nullable
=True, index
=True,
960 info
=dict(description
="The name", format
='plaintext', official
=False)),
961 description
= Column(Unicode(128), nullable
=True,
962 info
=dict(description
="A description", format
='plaintext')),
965 class Nature(TableBase
):
966 u
"""A nature a Pokémon can have, such as Calm or Brave
968 __tablename__
= 'natures'
969 __singlename__
= 'nature'
970 id = Column(Integer
, primary_key
=True, nullable
=False,
971 info
=dict(description
="A numeric ID"))
972 identifier
= Column(Unicode(8), nullable
=False,
973 info
=dict(description
="An identifier", format
='identifier'))
974 decreased_stat_id
= Column(Integer
, ForeignKey('stats.id'), nullable
=False,
975 info
=dict(description
="ID of the stat that this nature decreases by 10% (if decreased_stat_id is the same, the effects cancel out)"))
976 increased_stat_id
= Column(Integer
, ForeignKey('stats.id'), nullable
=False,
977 info
=dict(description
="ID of the stat that this nature increases by 10% (if decreased_stat_id is the same, the effects cancel out)"))
978 hates_flavor_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=False,
979 info
=dict(description
=u
"ID of the Berry flavor the Pokémon hates (if likes_flavor_id is the same, the effects cancel out)"))
980 likes_flavor_id
= Column(Integer
, ForeignKey('contest_types.id'), nullable
=False,
981 info
=dict(description
=u
"ID of the Berry flavor the Pokémon likes (if hates_flavor_id is the same, the effects cancel out)"))
984 def is_neutral(self
):
985 u
"""Returns True iff this nature doesn't alter a Pokémon's stats,
986 bestow taste preferences, etc.
988 return self
.increased_stat_id
== self
.decreased_stat_id
990 create_translation_table('nature_names', Nature
, 'names',
991 relation_lazy
='joined',
992 name
= Column(Unicode(8), nullable
=False, index
=True,
993 info
=dict(description
="The name", format
='plaintext', official
=True, ripped
=True)),
996 class NatureBattleStylePreference(TableBase
):
997 u
"""Battle Palace move preference
999 Specifies how likely a Pokémon with a specific Nature is to use a move of
1000 a particular battl style in Battle Palace or Battle Tent
1002 __tablename__
= 'nature_battle_style_preferences'
1003 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False,
1004 info
=dict(description
=u
"ID of the Pokémon's nature"))
1005 move_battle_style_id
= Column(Integer
, ForeignKey('move_battle_styles.id'), primary_key
=True, nullable
=False,
1006 info
=dict(description
="ID of the battle style"))
1007 low_hp_preference
= Column(Integer
, nullable
=False,
1008 info
=dict(description
=u
"Chance of using the move, in percent, if HP is under ½"))
1009 high_hp_preference
= Column(Integer
, nullable
=False,
1010 info
=dict(description
=u
"Chance of using the move, in percent, if HP is over ½"))
1012 class NaturePokeathlonStat(TableBase
):
1013 u
"""Specifies how a Nature affects a Pokéathlon stat
1015 __tablename__
= 'nature_pokeathlon_stats'
1016 nature_id
= Column(Integer
, ForeignKey('natures.id'), primary_key
=True, nullable
=False,
1017 info
=dict(description
="ID of the nature"))
1018 pokeathlon_stat_id
= Column(Integer
, ForeignKey('pokeathlon_stats.id'), primary_key
=True, nullable
=False,
1019 info
=dict(description
="ID of the stat"))
1020 max_change
= Column(Integer
, nullable
=False,
1021 info
=dict(description
="Maximum change"))
1023 class PokeathlonStat(TableBase
):
1024 u
"""A Pokéathlon stat, such as "Stamina" or "Jump".
1026 __tablename__
= 'pokeathlon_stats'
1027 __singlename__
= 'pokeathlon_stat'
1028 id = Column(Integer
, primary_key
=True, nullable
=False,
1029 info
=dict(description
="A numeric ID"))
1030 identifier
= Column(Unicode(8), nullable
=False,
1031 info
=dict(description
="An identifier", format
='identifier'))
1033 create_translation_table('pokeathlon_stat_names', PokeathlonStat
, 'names',
1034 name
= Column(Unicode(8), nullable
=False, index
=True,
1035 info
=dict(description
="The name", format
='plaintext', official
=True)),
1038 class Pokedex(TableBase
):
1039 u
"""A collection of Pokémon species ordered in a particular way
1041 __tablename__
= 'pokedexes'
1042 __singlename__
= 'pokedex'
1043 id = Column(Integer
, primary_key
=True, nullable
=False,
1044 info
=dict(description
="A numeric ID"))
1045 region_id
= Column(Integer
, ForeignKey('regions.id'), nullable
=True,
1046 info
=dict(description
=u
"ID of the region this Pokédex is used in, or None if it's global"))
1047 identifier
= Column(Unicode(16), nullable
=False,
1048 info
=dict(description
=u
"An identifier", format
='identifier'))
1050 create_translation_table('pokedex_prose', Pokedex
, 'prose',
1051 relation_lazy
='joined',
1052 name
= Column(Unicode(16), nullable
=True, index
=True,
1053 info
=dict(description
="The name", format
='plaintext', official
=False)),
1054 description
= Column(Unicode(512), nullable
=True,
1055 info
=dict(description
=u
"A longer description of the Pokédex", format
='plaintext')),
1058 class Pokemon(TableBase
):
1059 u
"""A species of Pokémon. The core to this whole mess.
1061 __tablename__
= 'pokemon'
1062 __singlename__
= 'pokemon'
1063 id = Column(Integer
, primary_key
=True, nullable
=False,
1064 info
=dict(description
=u
"A numeric ID"))
1065 identifier
= Column(Unicode(20), nullable
=False,
1066 info
=dict(description
=u
"An identifier", format
='identifier'))
1067 generation_id
= Column(Integer
, ForeignKey('generations.id'),
1068 info
=dict(description
=u
"ID of the generation this species first appeared in"))
1069 evolution_chain_id
= Column(Integer
, ForeignKey('evolution_chains.id'),
1070 info
=dict(description
=u
"ID of the species' evolution chain (a.k.a. family)"))
1071 height
= Column(Integer
, nullable
=False,
1072 info
=dict(description
=u
"The height of the Pokémon, in decimeters (tenths of a meter)"))
1073 weight
= Column(Integer
, nullable
=False,
1074 info
=dict(description
=u
"The weight of the Pokémon, in tenths of a kilogram (decigrams)"))
1075 color_id
= Column(Integer
, ForeignKey('pokemon_colors.id'), nullable
=False,
1076 info
=dict(description
=u
"ID of this Pokémon's Pokédex color, as used for a gimmick search function in the games."))
1077 pokemon_shape_id
= Column(Integer
, ForeignKey('pokemon_shapes.id'), nullable
=False,
1078 info
=dict(description
=u
"ID of this Pokémon's body shape, as used for a gimmick search function in the games."))
1079 habitat_id
= Column(Integer
, ForeignKey('pokemon_habitats.id'), nullable
=True,
1080 info
=dict(description
=u
"ID of this Pokémon's habitat, as used for a gimmick search function in the games."))
1081 gender_rate
= Column(Integer
, nullable
=False,
1082 info
=dict(description
=u
"The chance of this Pokémon being female, in eighths; or -1 for genderless"))
1083 capture_rate
= Column(Integer
, nullable
=False,
1084 info
=dict(description
=u
"The base capture rate; up to 255"))
1085 base_experience
= Column(Integer
, nullable
=False,
1086 info
=dict(description
=u
"The base EXP gained when defeating this Pokémon")) # XXX: Is this correct?
1087 base_happiness
= Column(Integer
, nullable
=False,
1088 info
=dict(description
=u
"The tameness when caught by a normal ball"))
1089 is_baby
= Column(Boolean
, nullable
=False,
1090 info
=dict(description
=u
"True iff the Pokémon is a baby, i.e. a lowest-stage Pokémon that cannot breed but whose evolved form can."))
1091 hatch_counter
= Column(Integer
, nullable
=False,
1092 info
=dict(description
=u
"Initial hatch counter: one must walk 255 × (hatch_counter + 1) steps before this Pokémon's egg hatches, unless utilizing bonuses like Flame Body's"))
1093 has_gender_differences
= Column(Boolean
, nullable
=False,
1094 info
=dict(description
=u
"Set iff the species exhibits enough sexual dimorphism to have separate sets of sprites in Gen IV and beyond."))
1095 order
= Column(Integer
, nullable
=False, index
=True,
1096 info
=dict(description
=u
"Order for sorting. Almost national order, except families and forms are grouped together."))
1098 ### Stuff to handle alternate Pokémon forms
1102 u
"""Returns the Pokémon's form, using its default form as fallback."""
1104 return self
.unique_form
or self
.default_form
1107 def is_base_form(self
):
1108 u
"""Returns True iff the Pokémon is the base form for its species,
1112 return self
.unique_form
is None or self
.unique_form
.is_default
1115 def form_name(self
):
1116 u
"""Returns the Pokémon's form name if it represents a particular form
1117 and that form has a name, or None otherwise.
1120 # If self.unique_form is None, the short-circuit "and" will go ahead
1121 # and return that. Otherwise, it'll return the form's name, which may
1123 return self
.unique_form
and self
.unique_form
.name
1126 def full_name(self
):
1127 u
"""Returns the Pokémon's name, including its form if applicable."""
1130 return u
'%s %s' %
(self
.form_name
, self
.name
)
1135 def normal_form(self
):
1136 u
"""Returns the normal form for this Pokémon; i.e., this will return
1137 regular Deoxys when called on any Deoxys form.
1140 if self
.unique_form
:
1141 return self
.unique_form
.form_base_pokemon
1146 def stat(self
, stat_name
):
1147 u
"""Returns a PokemonStat record for the given stat name (or Stat row
1148 object). Uses the normal has-many machinery, so all the stats are
1151 if isinstance(stat_name
, Stat
):
1152 stat_name
= stat_name
.name
1154 for pokemon_stat
in self
.stats
:
1155 if pokemon_stat
.stat
.name
== stat_name
:
1158 raise KeyError(u
'No stat named %s' % stat_name
)
1161 def better_damage_class(self
):
1162 u
"""Returns the MoveDamageClass that this Pokémon is best suited for,
1163 based on its attack stats.
1165 If the attack stats are about equal (within 5), returns None. The
1166 value None, not the damage class called 'None'.
1168 phys
= self
.stat(u
'Attack')
1169 spec
= self
.stat(u
'Special Attack')
1171 diff
= phys
.base_stat
- spec
.base_stat
1174 return phys
.stat
.damage_class
1176 return spec
.stat
.damage_class
1180 create_translation_table('pokemon_names', Pokemon
, 'names',
1181 relation_lazy
='joined',
1182 name
= Column(Unicode(20), nullable
=True, index
=True,
1183 info
=dict(description
="The name", format
='plaintext', official
=True, ripped
=True)),
1184 species
= Column(Unicode(16), nullable
=True,
1185 info
=dict(description
=u
'The short flavor text, such as "Seed" or "Lizard"; usually affixed with the word "Pokémon"',
1186 official
=True, format
='plaintext')),
1188 create_translation_table('pokemon_flavor_summaries', Pokemon
, 'flavor_summaries',
1189 flavor_summary
= Column(Unicode(512), nullable
=True,
1190 info
=dict(description
=u
"Text containing facts from all flavor texts, for languages without official game translations", official
=False, format
='plaintext', ripped
=True)),
1193 class PokemonAbility(TableBase
):
1194 u
"""Maps an ability to a Pokémon that can have it
1196 __tablename__
= 'pokemon_abilities'
1197 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1198 info
=dict(description
=u
"ID of the Pokémon"))
1199 ability_id
= Column(Integer
, ForeignKey('abilities.id'), nullable
=False,
1200 info
=dict(description
=u
"ID of the ability"))
1201 # XXX having both a method and a slot is kind of gross. "slot" is a
1202 # misnomer, anyway: duplicate abilities don't appear in slot 2.
1203 # Probably should replace that with "order".
1204 is_dream
= Column(Boolean
, nullable
=False, index
=True,
1205 info
=dict(description
=u
"Whether this is a Dream World ability"))
1206 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
1207 info
=dict(description
=u
"The ability slot, i.e. 1 or 2 for gen. IV"))
1209 class PokemonColor(TableBase
):
1210 u
"""The "Pokédex color" of a Pokémon species. Usually based on the Pokémon's color.
1212 __tablename__
= 'pokemon_colors'
1213 __singlename__
= 'pokemon_color'
1214 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
1215 info
=dict(description
=u
"ID of the Pokémon"))
1216 identifier
= Column(Unicode(6), nullable
=False,
1217 info
=dict(description
=u
"An identifier", format
='identifier'))
1219 create_translation_table('pokemon_color_names', PokemonColor
, 'names',
1220 relation_lazy
='joined',
1221 name
= Column(Unicode(6), nullable
=False, index
=True,
1222 info
=dict(description
="The name", format
='plaintext', official
=True)),
1225 class PokemonDexNumber(TableBase
):
1226 u
"""The number of a Pokémon in a particular Pokédex (e.g. Jigglypuff is #138 in Hoenn's 'dex)
1228 __tablename__
= 'pokemon_dex_numbers'
1229 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1230 info
=dict(description
=u
"ID of the Pokémon"))
1231 pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1232 info
=dict(description
=u
"ID of the Pokédex"))
1233 pokedex_number
= Column(Integer
, nullable
=False,
1234 info
=dict(description
=u
"Number of the Pokémon in that the Pokédex"))
1236 class PokemonEggGroup(TableBase
):
1237 u
"""Maps an Egg group to a Pokémon; each Pokémon belongs to one or two egg groups
1239 __tablename__
= 'pokemon_egg_groups'
1240 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1241 info
=dict(description
=u
"ID of the Pokémon"))
1242 egg_group_id
= Column(Integer
, ForeignKey('egg_groups.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1243 info
=dict(description
=u
"ID of the egg group"))
1245 class PokemonEvolution(TableBase
):
1246 u
"""A required action ("trigger") and the conditions under which the trigger
1247 must occur to cause a Pokémon to evolve.
1249 Any condition may be null if it does not apply for a particular Pokémon.
1251 __tablename__
= 'pokemon_evolution'
1252 from_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False,
1253 info
=dict(description
=u
"The ID of the pre-evolution Pokémon."))
1254 to_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1255 info
=dict(description
=u
"The ID of the post-evolution Pokémon."))
1256 evolution_trigger_id
= Column(Integer
, ForeignKey('evolution_triggers.id'), nullable
=False,
1257 info
=dict(description
=u
"The ID of the evolution trigger."))
1258 trigger_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True,
1259 info
=dict(description
=u
"The ID of the item that must be used on the Pokémon."))
1260 minimum_level
= Column(Integer
, nullable
=True,
1261 info
=dict(description
=u
"The minimum level for the Pokémon."))
1262 gender
= Column(Enum('male', 'female', name
='pokemon_evolution_gender'), nullable
=True,
1263 info
=dict(description
=u
"The Pokémon's required gender, or None if gender doesn't matter"))
1264 location_id
= Column(Integer
, ForeignKey('locations.id'), nullable
=True,
1265 info
=dict(description
=u
"The ID of the location the evolution must be triggered at."))
1266 held_item_id
= Column(Integer
, ForeignKey('items.id'), nullable
=True,
1267 info
=dict(description
=u
"The ID of the item the Pokémon must hold."))
1268 time_of_day
= Column(Enum('day', 'night', name
='pokemon_evolution_time_of_day'), nullable
=True,
1269 info
=dict(description
=u
"The required time of day."))
1270 known_move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=True,
1271 info
=dict(description
=u
"The ID of the move the Pokémon must know."))
1272 minimum_happiness
= Column(Integer
, nullable
=True,
1273 info
=dict(description
=u
"The minimum happiness value the Pokémon must have."))
1274 minimum_beauty
= Column(Integer
, nullable
=True,
1275 info
=dict(description
=u
"The minimum Beauty value the Pokémon must have."))
1276 relative_physical_stats
= Column(Integer
, nullable
=True,
1277 info
=dict(description
=u
"The required relation between the Pokémon's Attack and Defense stats, as sgn(atk-def)."))
1278 party_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=True,
1279 info
=dict(description
=u
"The ID of the Pokémon that must be present in the party."))
1280 trade_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=True,
1281 info
=dict(description
=u
"The ID of the Pokémon for which this Pokémon must be traded."))
1283 class PokemonFlavorText(TableBase
):
1284 u
"""In-game Pokédex descrption of a Pokémon.
1286 __tablename__
= 'pokemon_flavor_text'
1287 summary_column
= Pokemon
.flavor_summaries_table
, 'flavor_summary'
1288 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1289 info
=dict(description
=u
"ID of the Pokémon"))
1290 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1291 info
=dict(description
=u
"ID of the version that has this flavor text"))
1292 language_id
= Column(Integer
, ForeignKey('languages.id'), primary_key
=True, nullable
=False,
1293 info
=dict(description
="The language"))
1294 flavor_text
= Column(Unicode(255), nullable
=False,
1295 info
=dict(description
=u
"The flavor text", official
=True, format
='gametext'))
1297 class PokemonForm(TableBase
):
1298 u
"""An individual form of a Pokémon.
1300 Pokémon that do not have separate forms are still given a single row to
1301 represent their single form.
1303 __tablename__
= 'pokemon_forms'
1304 __singlename__
= 'pokemon_form'
1305 id = Column(Integer
, primary_key
=True, nullable
=False,
1306 info
=dict(description
=u
'A unique ID for this form.'))
1307 identifier
= Column(Unicode(16), nullable
=True,
1308 info
=dict(description
=u
"An identifier", format
='identifier'))
1309 form_base_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False, autoincrement
=False,
1310 info
=dict(description
=u
'The ID of the base Pokémon for this form.'))
1311 unique_pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), autoincrement
=False,
1312 info
=dict(description
=u
'The ID of a Pokémon that represents specifically this form, for Pokémon with functionally-different forms like Wormadam.'))
1313 introduced_in_version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), autoincrement
=False,
1314 info
=dict(description
=u
'The ID of the version group in which this form first appeared.'))
1315 is_default
= Column(Boolean
, nullable
=False,
1316 info
=dict(description
=u
'Set for exactly one form used as the default for each species.'))
1317 order
= Column(Integer
, nullable
=False, autoincrement
=False,
1318 info
=dict(description
=u
'The order in which forms should be sorted. Multiple forms may have equal order, in which case they should fall back on sorting by name.'))
1322 u
"""Returns the Pokémon for this form, using the form base as fallback.
1325 return self
.unique_pokemon
or self
.form_base_pokemon
1328 def full_name(self
):
1329 u
"""Returns the full name of this form, e.g. "Plant Cloak"."""
1333 elif self
.form_group
and self
.form_group
.term
:
1334 return u
'%s %s' %
(self
.name
, self
.form_group
.term
)
1339 def pokemon_name(self
):
1340 u
"""Returns the name of this Pokémon with this form, e.g. "Plant
1345 return u
'%s %s' %
(self
.name
, self
.form_base_pokemon
.name
)
1347 return self
.form_base_pokemon
.name
1349 create_translation_table('pokemon_form_names', PokemonForm
, 'names',
1350 relation_lazy
='joined',
1351 name
= Column(Unicode(16), nullable
=False, index
=True,
1352 info
=dict(description
="The name", format
='plaintext', official
=True)),
1355 class PokemonFormGroup(TableBase
):
1356 u
"""Information about a Pokémon's forms as a group."""
1357 __tablename__
= 'pokemon_form_groups'
1358 __singlename__
= 'pokemon_form_group'
1359 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1360 info
=dict(description
=u
"ID of the base form Pokémon"))
1361 is_battle_only
= Column(Boolean
, nullable
=False,
1362 info
=dict(description
=u
"Set iff the forms only change in battle"))
1364 PokemonFormGroup
.id = PokemonFormGroup
.pokemon_id
1366 create_translation_table('pokemon_form_group_prose', PokemonFormGroup
, 'prose',
1367 term
= Column(Unicode(16), nullable
=True,
1368 info
=dict(description
=u
"The term for this Pokémon's forms, e.g. \"Cloak\" for Burmy or \"Forme\" for Deoxys.", official
=True, format
='plaintext')),
1369 description
= Column(markdown
.MarkdownColumn(1024), nullable
=True,
1370 info
=dict(description
=u
"Description of how the forms work", format
='markdown')),
1373 class PokemonFormPokeathlonStat(TableBase
):
1374 u
"""A Pokémon form's performance in one Pokéathlon stat."""
1375 __tablename__
= 'pokemon_form_pokeathlon_stats'
1376 pokemon_form_id
= Column(Integer
, ForeignKey('pokemon_forms.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1377 info
=dict(description
=u
'The ID of the Pokémon form.'))
1378 pokeathlon_stat_id
= Column(Integer
, ForeignKey('pokeathlon_stats.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1379 info
=dict(description
=u
'The ID of the Pokéathlon stat.'))
1380 minimum_stat
= Column(Integer
, nullable
=False, autoincrement
=False,
1381 info
=dict(description
=u
'The minimum value for this stat for this Pokémon form.'))
1382 base_stat
= Column(Integer
, nullable
=False, autoincrement
=False,
1383 info
=dict(description
=u
'The default value for this stat for this Pokémon form.'))
1384 maximum_stat
= Column(Integer
, nullable
=False, autoincrement
=False,
1385 info
=dict(description
=u
'The maximum value for this stat for this Pokémon form.'))
1387 class PokemonGameIndex(TableBase
):
1388 u
"""The number of a Pokémon a game uses internally
1390 __tablename__
= 'pokemon_game_indices'
1391 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, autoincrement
=False, nullable
=False,
1392 info
=dict(description
=u
"Database ID of the Pokémon"))
1393 generation_id
= Column(Integer
, ForeignKey('generations.id'), primary_key
=True, autoincrement
=False, nullable
=False,
1394 info
=dict(description
=u
"Database ID of the generation"))
1395 game_index
= Column(Integer
, nullable
=False,
1396 info
=dict(description
=u
"Internal ID the generation's games use for the Pokémon"))
1398 class PokemonHabitat(TableBase
):
1399 u
"""The habitat of a Pokémon, as given in the FireRed/LeafGreen version Pokédex
1401 __tablename__
= 'pokemon_habitats'
1402 __singlename__
= 'pokemon_habitat'
1403 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
1404 info
=dict(description
=u
"A numeric ID"))
1405 identifier
= Column(Unicode(16), nullable
=False,
1406 info
=dict(description
=u
"An identifier", format
='identifier'))
1408 create_translation_table('pokemon_habitat_names', PokemonHabitat
, 'names',
1409 relation_lazy
='joined',
1410 name
= Column(Unicode(16), nullable
=False, index
=True,
1411 info
=dict(description
="The name", format
='plaintext', official
=True)),
1414 class PokemonItem(TableBase
):
1415 u
"""Record of an item a Pokémon can hold in the wild
1417 __tablename__
= 'pokemon_items'
1418 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1419 info
=dict(description
=u
"ID of the Pokémon"))
1420 version_id
= Column(Integer
, ForeignKey('versions.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1421 info
=dict(description
=u
"ID of the version this applies to"))
1422 item_id
= Column(Integer
, ForeignKey('items.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1423 info
=dict(description
=u
"ID of the item"))
1424 rarity
= Column(Integer
, nullable
=False,
1425 info
=dict(description
=u
"Chance of the Pokémon holding the item, in percent"))
1427 class PokemonMove(TableBase
):
1428 u
"""Record of a move a Pokémon can learn
1430 __tablename__
= 'pokemon_moves'
1431 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), nullable
=False, index
=True,
1432 info
=dict(description
=u
"ID of the Pokémon"))
1433 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False, index
=True,
1434 info
=dict(description
=u
"ID of the version group this applies to"))
1435 move_id
= Column(Integer
, ForeignKey('moves.id'), nullable
=False, index
=True,
1436 info
=dict(description
=u
"ID of the move"))
1437 pokemon_move_method_id
= Column(Integer
, ForeignKey('pokemon_move_methods.id'), nullable
=False, index
=True,
1438 info
=dict(description
=u
"ID of the method this move is learned by"))
1439 level
= Column(Integer
, nullable
=True, index
=True,
1440 info
=dict(description
=u
"Level the move is learned at, if applicable"))
1441 order
= Column(Integer
, nullable
=True,
1442 info
=dict(description
=u
"A sort key to produce the correct ordering when all else is equal")) # XXX: This needs a better description
1445 PrimaryKeyConstraint('pokemon_id', 'version_group_id', 'move_id', 'pokemon_move_method_id', 'level'),
1449 class PokemonMoveMethod(TableBase
):
1450 u
"""A method a move can be learned by, such as "Level up" or "Tutor".
1452 __tablename__
= 'pokemon_move_methods'
1453 __singlename__
= 'pokemon_move_method'
1454 id = Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
1455 info
=dict(description
=u
"A numeric ID"))
1456 identifier
= Column(Unicode(64), nullable
=False,
1457 info
=dict(description
=u
"An identifier", format
='identifier'))
1459 create_translation_table('pokemon_move_method_prose', PokemonMoveMethod
, 'prose',
1460 relation_lazy
='joined',
1461 name
= Column(Unicode(64), nullable
=True, index
=True,
1462 info
=dict(description
="The name", format
='plaintext', official
=False)),
1463 description
= Column(Unicode(255), nullable
=True,
1464 info
=dict(description
=u
"A detailed description of how the method works", format
='plaintext')),
1467 class PokemonShape(TableBase
):
1468 u
"""The shape of a Pokémon's body, as used in generation IV Pokédexes.
1470 __tablename__
= 'pokemon_shapes'
1471 __singlename__
= 'pokemon_shape'
1472 id = Column(Integer
, primary_key
=True, nullable
=False,
1473 info
=dict(description
=u
"A numeric ID"))
1474 identifier
= Column(Unicode(24), nullable
=False,
1475 info
=dict(description
=u
"An identifier", format
='identifier'))
1477 create_translation_table('pokemon_shape_prose', PokemonShape
, 'prose',
1478 relation_lazy
='joined',
1479 name
= Column(Unicode(24), nullable
=True, index
=True,
1480 info
=dict(description
="The name", format
='plaintext', official
=False)),
1481 awesome_name
= Column(Unicode(16), nullable
=True,
1482 info
=dict(description
=u
"A splendiferous name of the body shape", format
='plaintext')),
1485 class PokemonStat(TableBase
):
1486 u
"""A stat value of a Pokémon
1488 __tablename__
= 'pokemon_stats'
1489 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1490 info
=dict(description
=u
"ID of the Pokémon"))
1491 stat_id
= Column(Integer
, ForeignKey('stats.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1492 info
=dict(description
=u
"ID of the stat"))
1493 base_stat
= Column(Integer
, nullable
=False,
1494 info
=dict(description
=u
"The base stat"))
1495 effort
= Column(Integer
, nullable
=False,
1496 info
=dict(description
=u
"The effort increase in this stat gained when this Pokémon is defeated"))
1498 class PokemonType(TableBase
):
1499 u
"""Maps a type to a Pokémon. Each Pokémon has 1 or 2 types.
1501 __tablename__
= 'pokemon_types'
1502 pokemon_id
= Column(Integer
, ForeignKey('pokemon.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1503 info
=dict(description
=u
"ID of the Pokémon"))
1504 type_id
= Column(Integer
, ForeignKey('types.id'), nullable
=False,
1505 info
=dict(description
=u
"ID of the type"))
1506 slot
= Column(Integer
, primary_key
=True, nullable
=False, autoincrement
=False,
1507 info
=dict(description
=u
"The type's slot, 1 or 2, used to sort types if there are two of them"))
1509 class Region(TableBase
):
1510 u
"""Major areas of the world: Kanto, Johto, etc.
1512 __tablename__
= 'regions'
1513 __singlename__
= 'region'
1514 id = Column(Integer
, primary_key
=True, nullable
=False,
1515 info
=dict(description
=u
"A numeric ID"))
1516 identifier
= Column(Unicode(16), nullable
=False,
1517 info
=dict(description
=u
"An identifier", format
='identifier'))
1519 create_translation_table('region_names', Region
, 'names',
1520 relation_lazy
='joined',
1521 name
= Column(Unicode(16), nullable
=False, index
=True,
1522 info
=dict(description
="The name", format
='plaintext', official
=True)),
1525 class Stat(TableBase
):
1526 u
"""A Stat, such as Attack or Speed
1528 __tablename__
= 'stats'
1529 __singlename__
= 'stat'
1530 id = Column(Integer
, primary_key
=True, nullable
=False,
1531 info
=dict(description
=u
"A numeric ID"))
1532 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=True,
1533 info
=dict(description
=u
"For offensive and defensive stats, the damage this stat relates to; otherwise None (the NULL value)"))
1534 identifier
= Column(Unicode(16), nullable
=False,
1535 info
=dict(description
=u
"An identifier", format
='identifier'))
1536 is_battle_only
= Column(Boolean
, nullable
=False,
1537 info
=dict(description
=u
"Whether this stat only exists within a battle"))
1539 create_translation_table('stat_names', Stat
, 'names',
1540 relation_lazy
='joined',
1541 name
= Column(Unicode(16), nullable
=False, index
=True,
1542 info
=dict(description
="The name", format
='plaintext', official
=True)),
1545 class StatHint(TableBase
):
1546 u
"""Flavor text for genes that appears in a Pokémon's summary. Sometimes
1547 called "characteristics".
1549 __tablename__
= 'stat_hints'
1550 __singlename__
= 'stat_hint'
1551 id = Column(Integer
, primary_key
=True, nullable
=False,
1552 info
=dict(description
=u
"A numeric ID"))
1553 stat_id
= Column(Integer
, ForeignKey('stats.id'), nullable
=False,
1554 info
=dict(description
=u
"ID of the highest stat"))
1555 gene_mod_5
= Column(Integer
, nullable
=False, index
=True,
1556 info
=dict(description
=u
"Value of the highest stat modulo 5"))
1558 create_translation_table('stat_hint_names', StatHint
, 'names',
1559 relation_lazy
='joined',
1560 message
= Column(Unicode(24), nullable
=False, index
=True,
1561 info
=dict(description
=u
"The text displayed", official
=True, format
='plaintext')),
1564 class SuperContestCombo(TableBase
):
1565 u
"""Combo of two moves in a Super Contest.
1567 __tablename__
= 'super_contest_combos'
1568 first_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1569 info
=dict(description
=u
"The ID of the first move in the combo."))
1570 second_move_id
= Column(Integer
, ForeignKey('moves.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1571 info
=dict(description
=u
"The ID of the second and last move."))
1573 class SuperContestEffect(TableBase
):
1574 u
"""An effect a move can have when used in the Super Contest
1576 __tablename__
= 'super_contest_effects'
1577 __singlename__
= 'super_contest_effect'
1578 id = Column(Integer
, primary_key
=True, nullable
=False,
1579 info
=dict(description
=u
"This effect's unique ID."))
1580 appeal
= Column(SmallInteger
, nullable
=False,
1581 info
=dict(description
=u
"The number of hearts the user gains."))
1583 create_translation_table('super_contest_effect_prose', SuperContestEffect
, 'prose',
1584 flavor_text
= Column(Unicode(64), nullable
=False,
1585 info
=dict(description
=u
"A description of the effect.", format
='plaintext', official
=True)),
1588 class Type(TableBase
):
1589 u
"""Any of the elemental types Pokémon and moves can have."""
1590 __tablename__
= 'types'
1591 __singlename__
= 'type'
1592 id = Column(Integer
, primary_key
=True, nullable
=False,
1593 info
=dict(description
=u
"A unique ID for this type."))
1594 identifier
= Column(Unicode(12), nullable
=False,
1595 info
=dict(description
=u
"An identifier", format
='identifier'))
1596 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False,
1597 info
=dict(description
=u
"The ID of the generation this type first appeared in."))
1598 damage_class_id
= Column(Integer
, ForeignKey('move_damage_classes.id'), nullable
=True,
1599 info
=dict(description
=u
"The ID of the damage class this type's moves had before Generation IV, null if not applicable (e.g. ???)."))
1601 create_translation_table('type_names', Type
, 'names',
1602 relation_lazy
='joined',
1603 name
= Column(Unicode(12), nullable
=False, index
=True,
1604 info
=dict(description
="The name", format
='plaintext', official
=True)),
1607 class TypeEfficacy(TableBase
):
1608 u
"""The damage multiplier used when a move of a particular type damages a
1609 Pokémon of a particular other type.
1611 __tablename__
= 'type_efficacy'
1612 damage_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1613 info
=dict(description
=u
"The ID of the damaging type."))
1614 target_type_id
= Column(Integer
, ForeignKey('types.id'), primary_key
=True, nullable
=False, autoincrement
=False,
1615 info
=dict(description
=u
"The ID of the defending Pokémon's type."))
1616 damage_factor
= Column(Integer
, nullable
=False,
1617 info
=dict(description
=u
"The multiplier, as a percentage of damage inflicted."))
1619 class Version(TableBase
):
1620 u
"""An individual main-series Pokémon game."""
1621 __tablename__
= 'versions'
1622 __singlename__
= 'version'
1623 id = Column(Integer
, primary_key
=True, nullable
=False,
1624 info
=dict(description
=u
"A unique ID for this version."))
1625 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), nullable
=False,
1626 info
=dict(description
=u
"The ID of the version group this game belongs to."))
1627 identifier
= Column(Unicode(32), nullable
=False,
1628 info
=dict(description
=u
'And identifier', format
='identifier'))
1630 create_translation_table('version_names', Version
, 'names',
1631 relation_lazy
='joined',
1632 name
= Column(Unicode(32), nullable
=False, index
=True,
1633 info
=dict(description
="The name", format
='plaintext', official
=True)),
1636 class VersionGroup(TableBase
):
1637 u
"""A group of versions, containing either two paired versions (such as Red
1638 and Blue) or a single game (such as Yellow.)
1640 __tablename__
= 'version_groups'
1641 id = Column(Integer
, primary_key
=True, nullable
=False,
1642 info
=dict(description
=u
"This version group's unique ID."))
1643 generation_id
= Column(Integer
, ForeignKey('generations.id'), nullable
=False,
1644 info
=dict(description
=u
"The ID of the generation the games in this group belong to."))
1645 pokedex_id
= Column(Integer
, ForeignKey('pokedexes.id'), nullable
=False,
1646 info
=dict(description
=u
"The ID of the regional Pokédex used in this version group."))
1648 class VersionGroupRegion(TableBase
):
1649 u
"""Maps a version group to a region that appears in it."""
1650 __tablename__
= 'version_group_regions'
1651 version_group_id
= Column(Integer
, ForeignKey('version_groups.id'), primary_key
=True, nullable
=False,
1652 info
=dict(description
=u
"The ID of the version group."))
1653 region_id
= Column(Integer
, ForeignKey('regions.id'), primary_key
=True, nullable
=False,
1654 info
=dict(description
=u
"The ID of the region."))
1657 ### Relations down here, to avoid dependency ordering problems
1659 Ability
.changelog
= relation(AbilityChangelog
,
1660 order_by
=AbilityChangelog
.changed_in_version_group_id
.desc(),
1661 backref
=backref('ability', innerjoin
=True, lazy
='joined'))
1662 Ability
.flavor_text
= relation(AbilityFlavorText
,
1663 order_by
=AbilityFlavorText
.version_group_id
,
1664 backref
=backref('ability', innerjoin
=True, lazy
='joined'))
1665 Ability
.generation
= relation(Generation
,
1667 backref
='abilities')
1669 AbilityChangelog
.changed_in
= relation(VersionGroup
,
1670 innerjoin
=True, lazy
='joined',
1671 backref
='ability_changelog')
1673 AbilityFlavorText
.version_group
= relation(VersionGroup
,
1675 AbilityFlavorText
.language
= relation(Language
,
1676 innerjoin
=True, lazy
='joined')
1679 Berry
.berry_firmness
= relation(BerryFirmness
,
1682 Berry
.firmness
= association_proxy('berry_firmness', 'name')
1683 Berry
.flavors
= relation(BerryFlavor
,
1684 order_by
=BerryFlavor
.contest_type_id
,
1685 backref
=backref('berry', innerjoin
=True))
1686 Berry
.natural_gift_type
= relation(Type
, innerjoin
=True)
1688 BerryFlavor
.contest_type
= relation(ContestType
, innerjoin
=True)
1691 ContestCombo
.first
= relation(Move
,
1692 primaryjoin
=ContestCombo
.first_move_id
==Move
.id,
1693 innerjoin
=True, lazy
='joined',
1694 backref
='contest_combo_first')
1695 ContestCombo
.second
= relation(Move
,
1696 primaryjoin
=ContestCombo
.second_move_id
==Move
.id,
1697 innerjoin
=True, lazy
='joined',
1698 backref
='contest_combo_second')
1701 Encounter
.condition_value_map
= relation(EncounterConditionValueMap
,
1702 backref
='encounter')
1703 Encounter
.condition_values
= association_proxy('condition_value_map', 'condition_value')
1704 Encounter
.location_area
= relation(LocationArea
,
1705 innerjoin
=True, lazy
='joined',
1706 backref
='encounters')
1707 Encounter
.pokemon
= relation(Pokemon
,
1708 innerjoin
=True, lazy
='joined',
1709 backref
='encounters')
1710 Encounter
.version
= relation(Version
,
1711 innerjoin
=True, lazy
='joined',
1712 backref
='encounters')
1713 Encounter
.slot
= relation(EncounterSlot
,
1714 innerjoin
=True, lazy
='joined',
1715 backref
='encounters')
1717 EncounterConditionValue
.condition
= relation(EncounterCondition
,
1718 innerjoin
=True, lazy
='joined',
1720 EncounterConditionValueMap
.condition_value
= relation(EncounterConditionValue
,
1721 innerjoin
=True, lazy
='joined',
1722 backref
='encounter_map')
1724 EncounterSlot
.method
= relation(EncounterMethod
,
1725 innerjoin
=True, lazy
='joined',
1727 EncounterSlot
.version_group
= relation(VersionGroup
, innerjoin
=True)
1730 EvolutionChain
.growth_rate
= relation(GrowthRate
,
1732 backref
='evolution_chains')
1733 EvolutionChain
.baby_trigger_item
= relation(Item
,
1734 backref
='evolution_chains')
1737 Experience
.growth_rate
= relation(GrowthRate
,
1738 innerjoin
=True, lazy
='joined',
1739 backref
='experience_table')
1742 Generation
.canonical_pokedex
= relation(Pokedex
,
1743 backref
='canonical_for_generation')
1744 Generation
.versions
= relation(Version
,
1745 secondary
=VersionGroup
.__table__
,
1747 Generation
.main_region
= relation(Region
, innerjoin
=True)
1750 GrowthRate
.max_experience_obj
= relation(Experience
,
1752 Experience
.growth_rate_id
== GrowthRate
.id,
1753 Experience
.level
== 100),
1754 uselist
=False, innerjoin
=True)
1755 GrowthRate
.max_experience
= association_proxy('max_experience_obj', 'experience')
1758 Item
.berry
= relation(Berry
,
1761 Item
.flags
= relation(ItemFlag
,
1762 secondary
=ItemFlagMap
.__table__
)
1763 Item
.flavor_text
= relation(ItemFlavorText
,
1764 order_by
=ItemFlavorText
.version_group_id
.asc(),
1765 backref
=backref('item', innerjoin
=True, lazy
='joined'))
1766 Item
.fling_effect
= relation(ItemFlingEffect
,
1768 Item
.machines
= relation(Machine
,
1769 order_by
=Machine
.version_group_id
.asc())
1770 Item
.category
= relation(ItemCategory
,
1772 backref
=backref('items', order_by
=Item
.identifier
.asc()))
1773 Item
.pocket
= association_proxy('category', 'pocket')
1775 ItemCategory
.pocket
= relation(ItemPocket
, innerjoin
=True)
1777 ItemFlavorText
.version_group
= relation(VersionGroup
,
1778 innerjoin
=True, lazy
='joined')
1779 ItemFlavorText
.language
= relation(Language
,
1780 innerjoin
=True, lazy
='joined')
1782 ItemGameIndex
.item
= relation(Item
,
1783 innerjoin
=True, lazy
='joined',
1784 backref
='game_indices')
1785 ItemGameIndex
.generation
= relation(Generation
,
1786 innerjoin
=True, lazy
='joined')
1788 ItemPocket
.categories
= relation(ItemCategory
,
1790 order_by
=ItemCategory
.identifier
.asc())
1793 Location
.region
= relation(Region
,
1795 backref
='locations')
1797 LocationArea
.location
= relation(Location
,
1798 innerjoin
=True, lazy
='joined',
1801 LocationAreaEncounterRate
.location_area
= relation(LocationArea
,
1803 backref
='encounter_rates')
1804 LocationAreaEncounterRate
.method
= relation(EncounterMethod
,
1807 LocationGameIndex
.location
= relation(Location
,
1808 innerjoin
=True, lazy
='joined',
1809 backref
='game_indices')
1810 LocationGameIndex
.generation
= relation(Generation
,
1811 innerjoin
=True, lazy
='joined')
1814 Machine
.item
= relation(Item
)
1815 Machine
.version_group
= relation(VersionGroup
,
1816 innerjoin
=True, lazy
='joined')
1819 Move
.changelog
= relation(MoveChangelog
,
1820 order_by
=MoveChangelog
.changed_in_version_group_id
.desc(),
1821 backref
=backref('move', innerjoin
=True, lazy
='joined'))
1822 Move
.contest_effect
= relation(ContestEffect
,
1824 Move
.contest_combo_next
= association_proxy('contest_combo_first', 'second')
1825 Move
.contest_combo_prev
= association_proxy('contest_combo_second', 'first')
1826 Move
.contest_type
= relation(ContestType
,
1828 Move
.damage_class
= relation(MoveDamageClass
,
1831 Move
.flags
= association_proxy('move_flags', 'flag')
1832 Move
.flavor_text
= relation(MoveFlavorText
,
1833 order_by
=MoveFlavorText
.version_group_id
, backref
='move')
1834 Move
.generation
= relation(Generation
,
1837 Move
.machines
= relation(Machine
,
1839 Move
.meta
= relation(MoveMeta
,
1840 uselist
=False, innerjoin
=True,
1842 Move
.meta_stat_changes
= relation(MoveMetaStatChange
)
1843 Move
.move_effect
= relation(MoveEffect
,
1846 Move
.move_flags
= relation(MoveFlag
,
1848 Move
.super_contest_effect
= relation(SuperContestEffect
,
1850 Move
.super_contest_combo_next
= association_proxy('super_contest_combo_first', 'second')
1851 Move
.super_contest_combo_prev
= association_proxy('super_contest_combo_second', 'first')
1852 Move
.target
= relation(MoveTarget
,
1855 Move
.type = relation(Type
,
1859 Move
.effect
= markdown
.MoveEffectProperty('effect')
1860 Move
.effect_map
= markdown
.MoveEffectPropertyMap('effect_map')
1861 Move
.short_effect
= markdown
.MoveEffectProperty('short_effect')
1862 Move
.short_effect_map
= markdown
.MoveEffectPropertyMap('short_effect_map')
1864 MoveChangelog
.changed_in
= relation(VersionGroup
,
1865 innerjoin
=True, lazy
='joined',
1866 backref
='move_changelog')
1867 MoveChangelog
.move_effect
= relation(MoveEffect
,
1868 backref
='move_changelog')
1869 MoveChangelog
.type = relation(Type
,
1870 backref
='move_changelog')
1872 MoveChangelog
.effect
= markdown
.MoveEffectProperty('effect')
1873 MoveChangelog
.effect_map
= markdown
.MoveEffectPropertyMap('effect_map')
1874 MoveChangelog
.short_effect
= markdown
.MoveEffectProperty('short_effect')
1875 MoveChangelog
.short_effect_map
= markdown
.MoveEffectPropertyMap('short_effect_map')
1877 MoveEffect
.changelog
= relation(MoveEffectChangelog
,
1878 order_by
=MoveEffectChangelog
.changed_in_version_group_id
.desc(),
1879 backref
='move_effect')
1881 MoveEffectChangelog
.changed_in
= relation(VersionGroup
,
1882 innerjoin
=True, lazy
='joined',
1883 backref
='move_effect_changelog')
1885 MoveFlag
.flag
= relation(MoveFlagType
, innerjoin
=True, lazy
='joined')
1887 MoveFlavorText
.version_group
= relation(VersionGroup
,
1888 innerjoin
=True, lazy
='joined')
1889 MoveFlavorText
.language
= relation(Language
,
1890 innerjoin
=True, lazy
='joined')
1892 MoveMeta
.category
= relation(MoveMetaCategory
,
1893 innerjoin
=True, lazy
='joined',
1894 backref
='move_meta')
1895 MoveMeta
.ailment
= relation(MoveMetaAilment
,
1896 innerjoin
=True, lazy
='joined',
1897 backref
='move_meta')
1899 MoveMetaStatChange
.stat
= relation(Stat
,
1900 innerjoin
=True, lazy
='joined',
1901 backref
='move_meta_stat_changes')
1904 Nature
.decreased_stat
= relation(Stat
,
1905 primaryjoin
=Nature
.decreased_stat_id
==Stat
.id,
1907 backref
='decreasing_natures')
1908 Nature
.increased_stat
= relation(Stat
,
1909 primaryjoin
=Nature
.increased_stat_id
==Stat
.id,
1911 backref
='increasing_natures')
1912 Nature
.hates_flavor
= relation(ContestType
,
1913 primaryjoin
=Nature
.hates_flavor_id
==ContestType
.id,
1915 backref
='hating_natures')
1916 Nature
.likes_flavor
= relation(ContestType
,
1917 primaryjoin
=Nature
.likes_flavor_id
==ContestType
.id,
1919 backref
='liking_natures')
1920 Nature
.battle_style_preferences
= relation(NatureBattleStylePreference
,
1921 order_by
=NatureBattleStylePreference
.move_battle_style_id
.asc(),
1923 Nature
.pokeathlon_effects
= relation(NaturePokeathlonStat
,
1924 order_by
=NaturePokeathlonStat
.pokeathlon_stat_id
.asc())
1926 NatureBattleStylePreference
.battle_style
= relation(MoveBattleStyle
,
1927 innerjoin
=True, lazy
='joined',
1928 backref
='nature_preferences')
1930 NaturePokeathlonStat
.pokeathlon_stat
= relation(PokeathlonStat
,
1931 innerjoin
=True, lazy
='joined',
1932 backref
='nature_effects')
1935 Pokedex
.region
= relation(Region
,
1937 backref
='pokedexes')
1938 Pokedex
.version_groups
= relation(VersionGroup
,
1940 order_by
=VersionGroup
.id.asc(),
1944 Pokemon
.all_abilities
= relation(Ability
,
1945 secondary
=PokemonAbility
.__table__
,
1946 order_by
=PokemonAbility
.slot
.asc(),
1948 backref
=backref('all_pokemon',
1949 order_by
=Pokemon
.order
.asc(),
1952 Pokemon
.abilities
= relation(Ability
,
1953 secondary
=PokemonAbility
.__table__
,
1955 Pokemon
.id == PokemonAbility
.pokemon_id
,
1956 PokemonAbility
.is_dream
== False,
1959 order_by
=PokemonAbility
.slot
.asc(),
1960 backref
=backref('pokemon',
1961 order_by
=Pokemon
.order
.asc(),
1964 Pokemon
.dream_ability
= relation(Ability
,
1965 secondary
=PokemonAbility
.__table__
,
1967 Pokemon
.id == PokemonAbility
.pokemon_id
,
1968 PokemonAbility
.is_dream
== True,
1971 backref
=backref('dream_pokemon',
1972 order_by
=Pokemon
.order
,
1975 Pokemon
.pokemon_color
= relation(PokemonColor
,
1978 Pokemon
.color
= association_proxy('pokemon_color', 'name')
1979 Pokemon
.dex_numbers
= relation(PokemonDexNumber
,
1981 order_by
=PokemonDexNumber
.pokedex_id
.asc(),
1983 Pokemon
.egg_groups
= relation(EggGroup
,
1984 secondary
=PokemonEggGroup
.__table__
,
1986 order_by
=PokemonEggGroup
.egg_group_id
.asc(),
1987 backref
=backref('pokemon', order_by
=Pokemon
.order
.asc()))
1988 Pokemon
.evolution_chain
= relation(EvolutionChain
,
1990 backref
=backref('pokemon', order_by
=Pokemon
.order
.asc()))
1991 Pokemon
.child_pokemon
= relation(Pokemon
,
1992 primaryjoin
=Pokemon
.id==PokemonEvolution
.from_pokemon_id
,
1993 secondary
=PokemonEvolution
.__table__
,
1994 secondaryjoin
=PokemonEvolution
.to_pokemon_id
==Pokemon
.id,
1995 backref
=backref('parent_pokemon', uselist
=False))
1996 Pokemon
.flavor_text
= relation(PokemonFlavorText
,
1997 order_by
=PokemonFlavorText
.version_id
.asc(),
1999 Pokemon
.forms
= relation(PokemonForm
,
2000 primaryjoin
=Pokemon
.id==PokemonForm
.form_base_pokemon_id
,
2001 order_by
=(PokemonForm
.order
.asc(), PokemonForm
.identifier
.asc()))
2002 Pokemon
.default_form
= relation(PokemonForm
,
2004 Pokemon
.id==PokemonForm
.form_base_pokemon_id
,
2005 PokemonForm
.is_default
==True),
2007 Pokemon
.pokemon_habitat
= relation(PokemonHabitat
,
2009 Pokemon
.habitat
= association_proxy('pokemon_habitat', 'name')
2010 Pokemon
.items
= relation(PokemonItem
,
2012 Pokemon
.generation
= relation(Generation
,
2015 Pokemon
.shape
= relation(PokemonShape
,
2018 Pokemon
.stats
= relation(PokemonStat
,
2020 order_by
=PokemonStat
.stat_id
.asc(),
2022 Pokemon
.types
= relation(Type
,
2023 secondary
=PokemonType
.__table__
,
2025 order_by
=PokemonType
.slot
.asc(),
2026 backref
=backref('pokemon', order_by
=Pokemon
.order
))
2028 PokemonDexNumber
.pokedex
= relation(Pokedex
,
2029 innerjoin
=True, lazy
='joined')
2031 PokemonEvolution
.from_pokemon
= relation(Pokemon
,
2032 primaryjoin
=PokemonEvolution
.from_pokemon_id
==Pokemon
.id,
2034 backref
='child_evolutions')
2035 PokemonEvolution
.to_pokemon
= relation(Pokemon
,
2036 primaryjoin
=PokemonEvolution
.to_pokemon_id
==Pokemon
.id,
2038 backref
=backref('parent_evolution', uselist
=False))
2039 PokemonEvolution
.child_evolutions
= relation(PokemonEvolution
,
2040 primaryjoin
=PokemonEvolution
.from_pokemon_id
==PokemonEvolution
.to_pokemon_id
,
2041 foreign_keys
=[PokemonEvolution
.to_pokemon_id
],
2042 backref
=backref('parent_evolution',
2043 remote_side
=[PokemonEvolution
.from_pokemon_id
],
2045 PokemonEvolution
.trigger
= relation(EvolutionTrigger
,
2046 innerjoin
=True, lazy
='joined',
2047 backref
='evolutions')
2048 PokemonEvolution
.trigger_item
= relation(Item
,
2049 primaryjoin
=PokemonEvolution
.trigger_item_id
==Item
.id,
2050 backref
='triggered_evolutions')
2051 PokemonEvolution
.held_item
= relation(Item
,
2052 primaryjoin
=PokemonEvolution
.held_item_id
==Item
.id,
2053 backref
='required_for_evolutions')
2054 PokemonEvolution
.location
= relation(Location
,
2055 backref
='triggered_evolutions')
2056 PokemonEvolution
.known_move
= relation(Move
,
2057 backref
='triggered_evolutions')
2058 PokemonEvolution
.party_pokemon
= relation(Pokemon
,
2059 primaryjoin
=PokemonEvolution
.party_pokemon_id
==Pokemon
.id,
2060 backref
='triggered_evolutions')
2061 PokemonEvolution
.trade_pokemon
= relation(Pokemon
,
2062 primaryjoin
=PokemonEvolution
.trade_pokemon_id
==Pokemon
.id)
2064 PokemonFlavorText
.version
= relation(Version
, innerjoin
=True, lazy
='joined')
2065 PokemonFlavorText
.language
= relation(Language
, innerjoin
=True, lazy
='joined')
2067 PokemonForm
.form_base_pokemon
= relation(Pokemon
,
2068 primaryjoin
=PokemonForm
.form_base_pokemon_id
==Pokemon
.id,
2070 PokemonForm
.unique_pokemon
= relation(Pokemon
,
2071 primaryjoin
=PokemonForm
.unique_pokemon_id
==Pokemon
.id,
2072 backref
=backref('unique_form', uselist
=False))
2073 PokemonForm
.version_group
= relation(VersionGroup
,
2075 PokemonForm
.form_group
= association_proxy('form_base_pokemon', 'form_group')
2076 PokemonForm
.pokeathlon_stats
= relation(PokemonFormPokeathlonStat
,
2077 order_by
=PokemonFormPokeathlonStat
.pokeathlon_stat_id
,
2078 backref
='pokemon_form')
2080 PokemonFormGroup
.pokemon
= relation(Pokemon
,
2082 backref
=backref('form_group', uselist
=False))
2084 PokemonFormPokeathlonStat
.pokeathlon_stat
= relation(PokeathlonStat
,
2085 innerjoin
=True, lazy
='joined')
2087 PokemonItem
.item
= relation(Item
,
2088 innerjoin
=True, lazy
='joined',
2090 PokemonItem
.version
= relation(Version
,
2091 innerjoin
=True, lazy
='joined')
2093 PokemonMove
.pokemon
= relation(Pokemon
,
2094 innerjoin
=True, lazy
='joined',
2095 backref
='pokemon_moves')
2096 PokemonMove
.version_group
= relation(VersionGroup
,
2097 innerjoin
=True, lazy
='joined')
2098 PokemonMove
.machine
= relation(Machine
,
2100 Machine
.version_group_id
==PokemonMove
.version_group_id
,
2101 Machine
.move_id
==PokemonMove
.move_id
),
2102 foreign_keys
=[Machine
.version_group_id
, Machine
.move_id
],
2104 backref
='pokemon_moves')
2105 PokemonMove
.move
= relation(Move
,
2106 innerjoin
=True, lazy
='joined',
2107 backref
='pokemon_moves')
2108 PokemonMove
.method
= relation(PokemonMoveMethod
,
2109 innerjoin
=True, lazy
='joined')
2111 PokemonStat
.stat
= relation(Stat
,
2112 innerjoin
=True, lazy
='joined')
2115 Region
.generation
= relation(Generation
, uselist
=False)
2116 Region
.version_group_regions
= relation(VersionGroupRegion
,
2117 order_by
=VersionGroupRegion
.version_group_id
.asc(),
2119 Region
.version_groups
= association_proxy('version_group_regions', 'version_group')
2122 Stat
.damage_class
= relation(MoveDamageClass
,
2125 StatHint
.stat
= relation(Stat
,
2130 SuperContestCombo
.first
= relation(Move
,
2131 primaryjoin
=SuperContestCombo
.first_move_id
==Move
.id,
2132 innerjoin
=True, lazy
='joined',
2133 backref
='super_contest_combo_first')
2134 SuperContestCombo
.second
= relation(Move
,
2135 primaryjoin
=SuperContestCombo
.second_move_id
==Move
.id,
2136 innerjoin
=True, lazy
='joined',
2137 backref
='super_contest_combo_second')
2140 Type
.damage_efficacies
= relation(TypeEfficacy
,
2141 primaryjoin
=Type
.id==TypeEfficacy
.damage_type_id
,
2142 backref
=backref('damage_type', innerjoin
=True, lazy
='joined'))
2143 Type
.target_efficacies
= relation(TypeEfficacy
,
2144 primaryjoin
=Type
.id==TypeEfficacy
.target_type_id
,
2145 backref
=backref('target_type', innerjoin
=True, lazy
='joined'))
2147 Type
.generation
= relation(Generation
,
2150 Type
.damage_class
= relation(MoveDamageClass
,
2154 Version
.generation
= association_proxy('version_group', 'generation')
2156 VersionGroup
.versions
= relation(Version
,
2158 order_by
=Version
.id,
2159 backref
=backref('version_group', lazy
='joined'))
2160 VersionGroup
.generation
= relation(Generation
,
2161 innerjoin
=True, lazy
='joined',
2162 backref
='version_groups')
2163 VersionGroup
.version_group_regions
= relation(VersionGroupRegion
,
2164 backref
='version_group')
2165 VersionGroup
.regions
= association_proxy('version_group_regions', 'region')