Merge branch 'encukou-species-split'

This commit is contained in:
Eevee 2011-08-29 20:00:58 -07:00
commit 339d5d7da6
40 changed files with 7455 additions and 6784 deletions

21
conftest.py Normal file
View file

@ -0,0 +1,21 @@
# Configuration for the tests.
# Use `py.test` to run the tests.
# (This file needs to be in or above the directory where py.test is called)
import pytest
import os
def pytest_addoption(parser):
parser.addoption("--media-root", action="store",
default=None,
help="Root for the media files (if not specified and pokedex/data/media doesn't exist, tests are skipped)")
parser.addoption("--all", action="store_true", default=False,
help="Run all tests, even those that take a lot of time")
def pytest_generate_tests(metafunc):
for funcargs in getattr(metafunc.function, 'funcarglist', ()):
metafunc.addcall(funcargs=funcargs)
for posargs in getattr(metafunc.function, 'posarglist', ()):
metafunc.addcall(funcargs=dict(zip(metafunc.funcargnames, posargs)))

View file

@ -1,330 +1,329 @@
id,growth_rate_id,baby_trigger_item_id
1,4,
2,4,
3,4,
4,2,
5,2,
6,4,
7,2,
8,2,
9,2,
10,2,
11,2,
12,4,
13,4,
14,3,
15,2,
16,3,
17,2,
18,4,
19,2,
20,2,
21,2,
22,2,
23,2,
24,2,
25,1,
26,4,
27,4,
28,4,
29,4,
30,1,
31,4,
32,2,
33,2,
34,2,
35,2,
36,2,
37,2,
38,2,
39,1,
40,4,
41,2,
42,2,
43,2,
44,2,
45,1,
46,2,
47,2,
48,2,
49,2,
50,1,
51,3,296
52,2,
53,2,
54,2,
55,2,
56,1,
57,2,291
58,2,
59,2,
60,2,
61,2,
62,1,
63,1,
64,1,
65,1,
66,2,
67,2,
68,2,
69,2,
70,2,
71,1,
72,1,293
73,1,
74,1,
75,1,
76,1,
77,1,
78,4,
79,4,
80,4,
81,4,
82,2,
83,2,
84,3,
85,3,
86,1,
87,3,
88,2,
89,4,
90,3,231
91,2,292
92,4,
93,3,
94,4,
95,2,
96,2,
97,4,
98,3,
99,2,
100,2,232
101,2,
102,2,
103,2,
104,4,
105,3,
106,2,
107,4,
108,1,
109,4,
110,2,
111,2,
112,1,
113,3,
114,2,
115,3,
116,1,294
117,1,
118,1,
119,2,
120,1,
121,3,
122,1,
123,1,
124,1,
125,1,
126,1,
127,1,
128,1,
129,4,
130,4,
131,4,
132,4,
133,2,
134,2,
135,2,
136,4,
137,4,
138,4,
139,2,
140,1,
141,2,
142,6,
143,1,
144,5,
145,4,
146,6,
147,2,
148,3,
149,4,
150,3,
151,1,
152,2,
153,1,
154,2,
155,2,
156,5,
157,6,
158,4,295
159,6,
160,1,
161,6,
162,2,
163,2,
164,3,
165,3,
166,4,
167,4,
168,5,
169,5,
170,6,
171,3,
172,3,
173,2,
174,6,
175,2,
176,5,
177,5,
178,5,
179,2,
180,4,
181,3,
182,3,
183,1,
184,3,297
185,4,
186,2,
187,4,
188,5,
189,1,
190,3,
191,1,
192,1,
193,1,
194,1,
195,1,
196,1,
197,1,
198,1,
199,1,
200,1,
201,1,
202,1,
203,4,
204,4,
205,4,
206,4,
207,2,
208,4,
209,4,
211,5,
212,5,
213,2,
214,4,
215,2,
216,2,
217,2,
218,2,
219,6,
220,2,
221,3,
223,2,
224,2,
228,4,
229,2,
230,1,
232,4,
233,1,
234,1,
235,2,
236,1,
237,5,
239,1,
240,2,
241,1,
242,1,
243,1,
244,1,
245,1,
246,1,
247,1,
248,1,
249,1,
250,1,
251,1,
252,1,
253,4,
254,1,
255,1,
256,4,
257,4,
258,4,
259,2,
260,4,
261,2,
262,2,
263,2,
264,2,
265,3,
266,4,
267,2,
268,4,
269,2,
270,2,
271,3,
272,4,
273,4,
274,2,
275,2,
276,4,
277,4,
278,2,
279,2,
280,2,
281,4,
282,4,
283,2,
284,2,
285,2,
286,2,
287,2,
288,2,
289,2,
290,2,
291,4,
292,3,
293,4,
294,4,
295,2,
296,1,
297,2,
298,2,
299,2,
300,2,
301,2,
302,3,
303,2,
304,2,
305,4,
306,1,
307,2,
308,4,
309,1,
310,2,
311,2,
312,2,
313,2,
314,4,
315,2,
316,2,
317,2,
318,2,
319,1,
320,1,
321,2,
322,2,
323,1,
324,1,
325,1,
326,1,
327,1,
328,1,
329,1,
330,1,
331,1,
332,1,
333,1,
334,1,
335,1,
336,1,
id,baby_trigger_item_id
1,
2,
3,
4,
5,
6,
7,
8,
9,
10,
11,
12,
13,
14,
15,
16,
17,
18,
19,
20,
21,
22,
23,
24,
25,
26,
27,
28,
29,
30,
31,
32,
33,
34,
35,
36,
37,
38,
39,
40,
41,
42,
43,
44,
45,
46,
47,
48,
49,
50,
51,296
52,
53,
54,
55,
56,
57,291
58,
59,
60,
61,
62,
63,
64,
65,
66,
67,
68,
69,
70,
71,
72,293
73,
74,
75,
76,
77,
78,
79,
80,
81,
82,
83,
84,
85,
86,
87,
88,
89,
90,231
91,292
92,
93,
94,
95,
96,
97,
98,
99,
100,232
101,
102,
103,
104,
105,
106,
107,
108,
109,
110,
111,
112,
113,
114,
115,
116,294
117,
118,
119,
120,
121,
122,
123,
124,
125,
126,
127,
128,
129,
130,
131,
132,
133,
134,
135,
136,
137,
138,
139,
140,
141,
142,
143,
144,
145,
146,
147,
148,
149,
150,
151,
152,
153,
154,
155,
156,
157,
158,295
159,
160,
161,
162,
163,
164,
165,
166,
167,
168,
169,
170,
171,
172,
173,
174,
175,
176,
177,
178,
179,
180,
181,
182,
183,
184,297
185,
186,
187,
188,
189,
190,
191,
192,
193,
194,
195,
196,
197,
198,
199,
200,
201,
202,
203,
204,
205,
206,
207,
208,
209,
211,
212,
213,
214,
215,
216,
217,
218,
219,
220,
221,
223,
224,
228,
229,
230,
232,
233,
234,
235,
236,
237,
239,
240,
241,
242,
243,
244,
245,
246,
247,
248,
249,
250,
252,
253,
254,
255,
256,
257,
258,
259,
260,
261,
262,
263,
264,
265,
266,
267,
268,
269,
270,
271,
272,
273,
274,
275,
276,
277,
278,
279,
280,
281,
282,
283,
284,
285,
286,
287,
288,
289,
290,
291,
292,
293,
294,
295,
296,
297,
298,
299,
300,
301,
302,
303,
304,
305,
306,
307,
308,
309,
310,
311,
312,
313,
314,
315,
316,
317,
318,
319,
320,
321,
322,
323,
324,
325,
326,
327,
328,
329,
330,
331,
332,
333,
334,
335,
336,

1 id growth_rate_id baby_trigger_item_id
2 1 4
3 2 4
4 3 4
5 4 2
6 5 2
7 6 4
8 7 2
9 8 2
10 9 2
11 10 2
12 11 2
13 12 4
14 13 4
15 14 3
16 15 2
17 16 3
18 17 2
19 18 4
20 19 2
21 20 2
22 21 2
23 22 2
24 23 2
25 24 2
26 25 1
27 26 4
28 27 4
29 28 4
30 29 4
31 30 1
32 31 4
33 32 2
34 33 2
35 34 2
36 35 2
37 36 2
38 37 2
39 38 2
40 39 1
41 40 4
42 41 2
43 42 2
44 43 2
45 44 2
46 45 1
47 46 2
48 47 2
49 48 2
50 49 2
51 50 1
52 51 3 296
53 52 2
54 53 2
55 54 2
56 55 2
57 56 1
58 57 2 291
59 58 2
60 59 2
61 60 2
62 61 2
63 62 1
64 63 1
65 64 1
66 65 1
67 66 2
68 67 2
69 68 2
70 69 2
71 70 2
72 71 1
73 72 1 293
74 73 1
75 74 1
76 75 1
77 76 1
78 77 1
79 78 4
80 79 4
81 80 4
82 81 4
83 82 2
84 83 2
85 84 3
86 85 3
87 86 1
88 87 3
89 88 2
90 89 4
91 90 3 231
92 91 2 292
93 92 4
94 93 3
95 94 4
96 95 2
97 96 2
98 97 4
99 98 3
100 99 2
101 100 2 232
102 101 2
103 102 2
104 103 2
105 104 4
106 105 3
107 106 2
108 107 4
109 108 1
110 109 4
111 110 2
112 111 2
113 112 1
114 113 3
115 114 2
116 115 3
117 116 1 294
118 117 1
119 118 1
120 119 2
121 120 1
122 121 3
123 122 1
124 123 1
125 124 1
126 125 1
127 126 1
128 127 1
129 128 1
130 129 4
131 130 4
132 131 4
133 132 4
134 133 2
135 134 2
136 135 2
137 136 4
138 137 4
139 138 4
140 139 2
141 140 1
142 141 2
143 142 6
144 143 1
145 144 5
146 145 4
147 146 6
148 147 2
149 148 3
150 149 4
151 150 3
152 151 1
153 152 2
154 153 1
155 154 2
156 155 2
157 156 5
158 157 6
159 158 4 295
160 159 6
161 160 1
162 161 6
163 162 2
164 163 2
165 164 3
166 165 3
167 166 4
168 167 4
169 168 5
170 169 5
171 170 6
172 171 3
173 172 3
174 173 2
175 174 6
176 175 2
177 176 5
178 177 5
179 178 5
180 179 2
181 180 4
182 181 3
183 182 3
184 183 1
185 184 3 297
186 185 4
187 186 2
188 187 4
189 188 5
190 189 1
191 190 3
192 191 1
193 192 1
194 193 1
195 194 1
196 195 1
197 196 1
198 197 1
199 198 1
200 199 1
201 200 1
202 201 1
203 202 1
204 203 4
205 204 4
206 205 4
207 206 4
208 207 2
209 208 4
210 209 4
211 211 5
212 212 5
213 213 2
214 214 4
215 215 2
216 216 2
217 217 2
218 218 2
219 219 6
220 220 2
221 221 3
222 223 2
223 224 2
224 228 4
225 229 2
226 230 1
227 232 4
228 233 1
229 234 1
230 235 2
231 236 1
232 237 5
233 239 1
234 240 2
235 241 1
236 242 1
237 243 1
238 244 1
239 245 1
240 246 1
241 247 1
242 248 1
243 249 1
244 250 1
245 251 252 1
246 252 253 1
247 253 254 4
248 254 255 1
249 255 256 1
250 256 257 4
251 257 258 4
252 258 259 4
253 259 260 2
254 260 261 4
255 261 262 2
256 262 263 2
257 263 264 2
258 264 265 2
259 265 266 3
260 266 267 4
261 267 268 2
262 268 269 4
263 269 270 2
264 270 271 2
265 271 272 3
266 272 273 4
267 273 274 4
268 274 275 2
269 275 276 2
270 276 277 4
271 277 278 4
272 278 279 2
273 279 280 2
274 280 281 2
275 281 282 4
276 282 283 4
277 283 284 2
278 284 285 2
279 285 286 2
280 286 287 2
281 287 288 2
282 288 289 2
283 289 290 2
284 290 291 2
285 291 292 4
286 292 293 3
287 293 294 4
288 294 295 4
289 295 296 2
290 296 297 1
291 297 298 2
292 298 299 2
293 299 300 2
294 300 301 2
295 301 302 2
296 302 303 3
297 303 304 2
298 304 305 2
299 305 306 4
300 306 307 1
301 307 308 2
302 308 309 4
303 309 310 1
304 310 311 2
305 311 312 2
306 312 313 2
307 313 314 2
308 314 315 4
309 315 316 2
310 316 317 2
311 317 318 2
312 318 319 2
313 319 320 1
314 320 321 1
315 321 322 2
316 322 323 2
317 323 324 1
318 324 325 1
319 325 326 1
320 326 327 1
321 327 328 1
322 328 329 1
323 329 330 1
324 330 331 1
325 331 332 1
326 332 333 1
327 333 334 1
328 334 335 1
329 335 336 1
336 1

File diff suppressed because it is too large Load diff

View file

@ -1601,27 +1601,27 @@ pokemon_id,ability_id,is_dream,slot
647,154,0,1
648,32,0,1
649,88,0,1
10001,46,0,1
10002,46,0,1
10003,46,0,1
10004,107,0,1
10004,142,1,3
10005,107,0,1
10005,142,1,3
10006,32,0,1
10007,26,0,1
10007,26,1,3
10008,26,0,1
10009,26,0,1
10010,26,0,1
10011,26,0,1
10012,26,0,1
10013,59,0,1
10014,59,0,1
10015,59,0,1
10016,69,0,1
10016,91,0,2
10016,104,1,3
10017,125,0,1
10017,161,1,3
10018,32,0,1
650,46,0,1
651,46,0,1
652,46,0,1
653,107,0,1
653,142,1,3
654,107,0,1
654,142,1,3
655,32,0,1
656,26,0,1
656,26,1,3
657,26,0,1
658,26,0,1
659,26,0,1
660,26,0,1
661,26,0,1
662,59,0,1
663,59,0,1
664,59,0,1
665,69,0,1
665,91,0,2
665,104,1,3
666,125,0,1
666,161,1,3
667,32,0,1

1 pokemon_id ability_id is_dream slot
1601 647 154 0 1
1602 648 32 0 1
1603 649 88 0 1
1604 10001 650 46 0 1
1605 10002 651 46 0 1
1606 10003 652 46 0 1
1607 10004 653 107 0 1
1608 10004 653 142 1 3
1609 10005 654 107 0 1
1610 10005 654 142 1 3
1611 10006 655 32 0 1
1612 10007 656 26 0 1
1613 10007 656 26 1 3
1614 10008 657 26 0 1
1615 10009 658 26 0 1
1616 10010 659 26 0 1
1617 10011 660 26 0 1
1618 10012 661 26 0 1
1619 10013 662 59 0 1
1620 10014 663 59 0 1
1621 10015 664 59 0 1
1622 10016 665 69 0 1
1623 10016 665 91 0 2
1624 10016 665 104 1 3
1625 10017 666 125 0 1
1626 10017 666 161 1 3
1627 10018 667 32 0 1

View file

@ -1,4 +1,4 @@
pokemon_id,pokedex_id,pokedex_number
species_id,pokedex_id,pokedex_number
1,1,1
1,2,1
1,3,226

1 pokemon_id species_id pokedex_id pokedex_number
2 1 1 1
3 1 2 1
4 1 3 226

View file

@ -1,4 +1,4 @@
pokemon_id,egg_group_id
species_id,egg_group_id
1,1
1,7
2,1
@ -823,24 +823,3 @@ pokemon_id,egg_group_id
647,15
648,15
649,15
10001,15
10002,15
10003,15
10004,3
10005,3
10006,15
10007,15
10008,11
10009,11
10010,11
10011,11
10012,11
10013,6
10013,11
10014,6
10014,11
10015,6
10015,11
10016,12
10017,5
10018,15

1 pokemon_id species_id egg_group_id
2 1 1
3 1 7
4 2 1
823 647 15
824 648 15
825 649 15
10001 15
10002 15
10003 15
10004 3
10005 3
10006 15
10007 15
10008 11
10009 11
10010 11
10011 11
10012 11
10013 6
10013 11
10014 6
10014 11
10015 6
10015 11
10016 12
10017 5
10018 15

View file

@ -1,4 +1,4 @@
id,evolved_pokemon_id,evolution_trigger_id,trigger_item_id,minimum_level,gender,location_id,held_item_id,time_of_day,known_move_id,minimum_happiness,minimum_beauty,relative_physical_stats,party_pokemon_id,trade_pokemon_id
id,evolved_species_id,evolution_trigger_id,trigger_item_id,minimum_level,gender,location_id,held_item_id,time_of_day,known_move_id,minimum_happiness,minimum_beauty,relative_physical_stats,party_species_id,trade_species_id
1,2,1,,16,,,,,,,,,,
2,3,1,,32,,,,,,,,,,
3,5,1,,16,,,,,,,,,,

1 id evolved_pokemon_id evolved_species_id evolution_trigger_id trigger_item_id minimum_level gender location_id held_item_id time_of_day known_move_id minimum_happiness minimum_beauty relative_physical_stats party_pokemon_id party_species_id trade_pokemon_id trade_species_id
2 1 2 1 16
3 2 3 1 32
4 3 5 1 16

View file

@ -1 +0,0 @@
pokemon_id,local_language_id,flavor_summary
1 pokemon_id local_language_id flavor_summary

View file

@ -1,20 +0,0 @@
pokemon_form_group_id,local_language_id,term,description
172,9,,"Spiky-eared Pichu can only be received by taking the shiny Pichu from an official promotion to []{pokemon:celebi}'s shrine in []{location:ilex-forest}. Spiky-eared Pichu is always female, cannot evolve, and cannot be taken into the Wi-Fi Club or the Union Room, but is otherwise a normal Pichu."
201,9,,Forms only affect appearance. A form is determined at random before a wild encounter and cannot be changed.
351,9,Form,"Form changes along with type to match the [weather]{mechanic:weather} in battle, due to []{ability:forecast}. Castform is always in its normal form outside of battle, regardless of weather."
386,9,Forme,"Forms have different stats and movepools. In Generation III, Deoxys's form depends on the game: Normal Forme in Ruby and Sapphire, Attack Forme in FireRed, Defense Forme in LeafGreen, and Speed Forme in Emerald. In Generation IV, every form exists: form is preserved when transferring via []{location:pal-park}, and meteorites in the southeast corner of []{location:veilstone-city} or at the west end of []{location:unova-route-3} can be used to switch between forms."
412,9,Cloak,"Forms only affect appearance, although they become permanent upon evolution. Wild and newly-hatched Burmy are always in a Plant Cloak. Burmy's cloak changes to match the terrain after a battle it participated in: Plant Cloak by default; Sandy Cloak in sandy or rocky areas, such as beaches, caves, and trails; and Trash Cloak in buildings."
413,9,Cloak,"Forms have different stats and movepools. During evolution, Burmy's current cloak becomes Wormadam's form, and can no longer be changed."
421,9,Form,"Sunshine form is active during [strong sunlight]{mechanic:strong-sunlight}. Otherwise, Cherrim defaults to its Overcast form."
422,9,Sea,"Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh, or inherited from the mother when breeding, and cannot be changed."
423,9,Sea,Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh and cannot be changed.
479,9,Form,"Forms have different signature moves, and the appliance forms' stats are different from the normal form's. When switching forms, the old signature move (if any) is removed and the new one must be learned, overwriting another move if need be, or the switch will be cancelled; however, it can be forgotten while in the new form. There are appliances for switching forms in a secret room in the Team Galactic Eterna Building or the Silph Co. Office Building; the room in the Galactic Building requires a []{item:secret-key}, but the room in Silph Co. is freely accessible when walking with Rotom. Rotom can be returned to its normal form by checking the space its appliance occupied. It also reverts to its normal form upon entering the Wi-Fi Club or the Union Room."
487,9,Forme,"Forms have different stats. Giratina transforms into Origin Forme in the []{location:distortion-world} or while holding a []{item:griseous-orb}. Otherwise, it assumes its Altered Forme. The Griseous Orb returns to the bag upon entering the Wi-Fi Club or the Union Room."
492,9,Forme,"Forms have different stats and movepools. Shaymin transforms into Sky Forme with the use of a []{item:gracidea}. It is limited to Land Forme at night, when [frozen]{mechanic:frozen}, in the storage system boxes, in the Wi-Fi Club, and in the Union Room; under these conditions, Sky Shaymin reverts to Land Forme, and the Gracidea has no effect. The Gracidea must be used again to return to Sky Forme. A Gracidea may be received by showing a woman in southwest []{location:floaroma-town} or the []{location:goldenrod-city} flower shop a Shaymin met in a fateful encounter."
493,9,Type,"Form changes along with type to match a held Plate, due to []{ability:multitype}."
550,9,Form,"Forms have one different ability and different wild held items. Blue-Striped Basculin are rarer in Black Version, and Red-Striped Basculin in White Version."
555,9,Mode,"Forms have different stats and types. Darmanitan changes to Zen Mode below 50% HP if it has []{ability:zen-mode} as its ability, and back to Standard Mode above 50% HP."
585,9,Form,"Form changes to match the season. To switch forms, Deerling must be in the party when loading the game."
586,9,Form,"Form changes to match the season. To switch forms, Sawsbuck must be in the party when loading the game."
648,9,Forme,"Forms have different stats and types. Meloetta changes form upon using []{move:relic-song} in battle, and reverts to Aria Forme outside of battle."
649,9,Drive,Form changes to match Genesect's held Drive. The only differences are the color of its weapon and []{move:techno-blast}'s type.
1 pokemon_form_group_id local_language_id term description
2 172 9 Spiky-eared Pichu can only be received by taking the shiny Pichu from an official promotion to []{pokemon:celebi}'s shrine in []{location:ilex-forest}. Spiky-eared Pichu is always female, cannot evolve, and cannot be taken into the Wi-Fi Club or the Union Room, but is otherwise a normal Pichu.
3 201 9 Forms only affect appearance. A form is determined at random before a wild encounter and cannot be changed.
4 351 9 Form Form changes along with type to match the [weather]{mechanic:weather} in battle, due to []{ability:forecast}. Castform is always in its normal form outside of battle, regardless of weather.
5 386 9 Forme Forms have different stats and movepools. In Generation III, Deoxys's form depends on the game: Normal Forme in Ruby and Sapphire, Attack Forme in FireRed, Defense Forme in LeafGreen, and Speed Forme in Emerald. In Generation IV, every form exists: form is preserved when transferring via []{location:pal-park}, and meteorites in the southeast corner of []{location:veilstone-city} or at the west end of []{location:unova-route-3} can be used to switch between forms.
6 412 9 Cloak Forms only affect appearance, although they become permanent upon evolution. Wild and newly-hatched Burmy are always in a Plant Cloak. Burmy's cloak changes to match the terrain after a battle it participated in: Plant Cloak by default; Sandy Cloak in sandy or rocky areas, such as beaches, caves, and trails; and Trash Cloak in buildings.
7 413 9 Cloak Forms have different stats and movepools. During evolution, Burmy's current cloak becomes Wormadam's form, and can no longer be changed.
8 421 9 Form Sunshine form is active during [strong sunlight]{mechanic:strong-sunlight}. Otherwise, Cherrim defaults to its Overcast form.
9 422 9 Sea Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh, or inherited from the mother when breeding, and cannot be changed.
10 423 9 Sea Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh and cannot be changed.
11 479 9 Form Forms have different signature moves, and the appliance forms' stats are different from the normal form's. When switching forms, the old signature move (if any) is removed and the new one must be learned, overwriting another move if need be, or the switch will be cancelled; however, it can be forgotten while in the new form. There are appliances for switching forms in a secret room in the Team Galactic Eterna Building or the Silph Co. Office Building; the room in the Galactic Building requires a []{item:secret-key}, but the room in Silph Co. is freely accessible when walking with Rotom. Rotom can be returned to its normal form by checking the space its appliance occupied. It also reverts to its normal form upon entering the Wi-Fi Club or the Union Room.
12 487 9 Forme Forms have different stats. Giratina transforms into Origin Forme in the []{location:distortion-world} or while holding a []{item:griseous-orb}. Otherwise, it assumes its Altered Forme. The Griseous Orb returns to the bag upon entering the Wi-Fi Club or the Union Room.
13 492 9 Forme Forms have different stats and movepools. Shaymin transforms into Sky Forme with the use of a []{item:gracidea}. It is limited to Land Forme at night, when [frozen]{mechanic:frozen}, in the storage system boxes, in the Wi-Fi Club, and in the Union Room; under these conditions, Sky Shaymin reverts to Land Forme, and the Gracidea has no effect. The Gracidea must be used again to return to Sky Forme. A Gracidea may be received by showing a woman in southwest []{location:floaroma-town} or the []{location:goldenrod-city} flower shop a Shaymin met in a fateful encounter.
14 493 9 Type Form changes along with type to match a held Plate, due to []{ability:multitype}.
15 550 9 Form Forms have one different ability and different wild held items. Blue-Striped Basculin are rarer in Black Version, and Red-Striped Basculin in White Version.
16 555 9 Mode Forms have different stats and types. Darmanitan changes to Zen Mode below 50% HP if it has []{ability:zen-mode} as its ability, and back to Standard Mode above 50% HP.
17 585 9 Form Form changes to match the season. To switch forms, Deerling must be in the party when loading the game.
18 586 9 Form Form changes to match the season. To switch forms, Sawsbuck must be in the party when loading the game.
19 648 9 Forme Forms have different stats and types. Meloetta changes form upon using []{move:relic-song} in battle, and reverts to Aria Forme outside of battle.
20 649 9 Drive Form changes to match Genesect's held Drive. The only differences are the color of its weapon and []{move:techno-blast}'s type.

File diff suppressed because it is too large Load diff

View file

@ -2464,308 +2464,308 @@ pokemon_form_id,pokeathlon_stat_id,minimum_stat,base_stat,maximum_stat
493,3,1,4,5
493,4,1,5,5
493,5,2,4,5
10001,1,1,2,4
10001,2,1,2,3
10001,3,1,2,4
10001,4,1,2,4
10001,5,2,2,5
10002,1,1,2,4
10002,2,1,2,3
10002,3,1,2,4
10002,4,1,2,4
10002,5,2,2,5
10003,1,1,2,4
10003,2,1,2,3
10003,3,1,2,4
10003,4,1,2,4
10003,5,2,2,5
10004,1,1,2,4
10004,2,1,2,3
10004,3,1,2,4
10004,4,1,2,4
10004,5,2,2,5
10005,1,1,2,4
10005,2,1,2,3
10005,3,1,2,4
10005,4,1,2,4
10005,5,2,2,5
10006,1,1,2,4
10006,2,1,2,3
10006,3,1,2,4
10006,4,1,2,4
10006,5,2,2,5
10007,1,1,2,4
10007,2,1,2,3
10007,3,1,2,4
10007,4,1,2,4
10007,5,2,2,5
10008,1,1,2,4
10008,2,1,2,3
10008,3,1,2,4
10008,4,1,2,4
10008,5,2,2,5
10009,1,1,2,4
10009,2,1,2,3
10009,3,1,2,4
10009,4,1,2,4
10009,5,2,2,5
10010,1,1,2,4
10010,2,1,2,3
10010,3,1,2,4
10010,4,1,2,4
10010,5,2,2,5
10011,1,1,2,4
10011,2,1,2,3
10011,3,1,2,4
10011,4,1,2,4
10011,5,2,2,5
10012,1,1,2,4
10012,2,1,2,3
10012,3,1,2,4
10012,4,1,2,4
10012,5,2,2,5
10013,1,1,2,4
10013,2,1,2,3
10013,3,1,2,4
10013,4,1,2,4
10013,5,2,2,5
10014,1,1,2,4
10014,2,1,2,3
10014,3,1,2,4
10014,4,1,2,4
10014,5,2,2,5
10015,1,1,2,4
10015,2,1,2,3
10015,3,1,2,4
10015,4,1,2,4
10015,5,2,2,5
10016,1,1,2,4
10016,2,1,2,3
10016,3,1,2,4
10016,4,1,2,4
10016,5,2,2,5
10017,1,1,2,4
10017,2,1,2,3
10017,3,1,2,4
10017,4,1,2,4
10017,5,2,2,5
10018,1,1,2,4
10018,2,1,2,3
10018,3,1,2,4
10018,4,1,2,4
10018,5,2,2,5
10019,1,1,2,4
10019,2,1,2,3
10019,3,1,2,4
10019,4,1,2,4
10019,5,2,2,5
10020,1,1,2,4
10020,2,1,2,3
10020,3,1,2,4
10020,4,1,2,4
10020,5,2,2,5
10021,1,1,2,4
10021,2,1,2,3
10021,3,1,2,4
10021,4,1,2,4
10021,5,2,2,5
10022,1,1,2,4
10022,2,1,2,3
10022,3,1,2,4
10022,4,1,2,4
10022,5,2,2,5
10023,1,1,2,4
10023,2,1,2,3
10023,3,1,2,4
10023,4,1,2,4
10023,5,2,2,5
10024,1,1,2,4
10024,2,1,2,3
10024,3,1,2,4
10024,4,1,2,4
10024,5,2,2,5
10025,1,1,2,4
10025,2,1,2,3
10025,3,1,2,4
10025,4,1,2,4
10025,5,2,2,5
10026,1,1,2,4
10026,2,1,2,3
10026,3,1,2,5
10026,4,1,2,4
10026,5,2,2,5
10027,1,1,2,4
10027,2,1,2,3
10027,3,1,2,5
10027,4,1,2,4
10027,5,2,2,5
10031,1,2,4,5
10031,2,4,5,5
10031,3,1,4,5
10031,4,1,2,3
10031,5,2,3,4
10032,1,1,3,3
10032,2,1,3,4
10032,3,2,4,5
10032,4,4,5,5
10032,5,2,2,3
10033,1,4,5,5
10033,2,1,2,3
10033,3,2,4,5
10033,4,1,3,4
10033,5,2,4,4
10034,1,1,1,4
10034,2,1,1,4
10034,3,1,1,4
10034,4,1,1,5
10034,5,2,2,3
10035,1,1,1,4
10035,2,1,1,5
10035,3,1,1,3
10035,4,1,1,5
10035,5,2,2,3
10036,1,1,2,3
10036,2,3,4,5
10036,3,1,2,2
10036,4,1,4,5
10036,5,2,2,3
10037,1,1,1,3
10037,2,1,3,5
10037,3,1,2,3
10037,4,5,5,5
10037,5,2,2,2
10039,1,1,1,3
10039,2,1,1,4
10039,3,1,1,3
10039,4,1,3,5
10039,5,2,2,2
10040,1,1,1,2
10040,2,3,4,5
10040,3,1,3,3
10040,4,4,5,5
10040,5,2,2,2
10041,1,5,5,5
10041,2,1,4,5
10041,3,1,4,5
10041,4,1,4,5
10041,5,2,5,5
10042,1,1,4,5
10042,2,5,5,5
10042,3,1,5,5
10042,4,1,4,5
10042,5,2,4,5
10043,1,1,3,5
10043,2,1,5,5
10043,3,1,5,5
10043,4,1,5,5
10043,5,2,5,5
10044,1,5,5,5
10044,2,1,4,5
10044,3,1,5,5
10044,4,1,4,5
10044,5,2,4,5
10045,1,1,4,5
10045,2,1,5,5
10045,3,5,5,5
10045,4,1,4,5
10045,5,2,4,5
10046,1,1,4,5
10046,2,5,5,5
10046,3,1,4,5
10046,4,1,5,5
10046,5,2,4,5
10047,1,1,5,5
10047,2,1,4,5
10047,3,1,4,5
10047,4,1,4,5
10047,5,5,5,5
10048,1,1,4,5
10048,2,1,4,5
10048,3,1,5,5
10048,4,1,4,5
10048,5,5,5,5
10049,1,1,4,5
10049,2,1,4,5
10049,3,1,4,5
10049,4,5,5,5
10049,5,2,5,5
10050,1,1,4,5
10050,2,1,5,5
10050,3,1,4,5
10050,4,5,5,5
10050,5,2,4,5
10051,1,5,5,5
10051,2,1,5,5
10051,3,1,4,5
10051,4,1,4,5
10051,5,2,4,5
10052,1,1,4,5
10052,2,1,4,5
10052,3,5,5,5
10052,4,1,5,5
10052,5,2,4,5
10053,1,1,5,5
10053,2,1,4,5
10053,3,5,5,5
10053,4,1,4,5
10053,5,2,4,5
10054,1,1,4,5
10054,2,5,5,5
10054,3,1,4,5
10054,4,1,5,5
10054,5,2,4,5
10055,1,1,4,5
10055,2,1,4,5
10055,3,1,5,5
10055,4,5,5,5
10055,5,2,4,5
10056,1,1,5,5
10056,2,1,4,5
10056,3,5,5,5
10056,4,1,4,5
10056,5,2,4,5
10057,1,1,5,5
10057,2,1,5,5
10057,3,1,5,5
10057,4,1,5,5
10057,5,2,5,5
10058,1,2,3,4
10058,2,2,4,4
10058,3,1,3,4
10058,4,1,3,4
10058,5,2,4,4
10059,1,1,3,3
10059,2,1,3,3
10059,3,1,3,4
10059,4,1,4,4
10059,5,2,2,4
10060,1,1,3,4
10060,2,1,2,3
10060,3,3,4,5
10060,4,1,3,3
10060,5,3,3,4
10061,1,3,3,5
10061,2,1,3,5
10061,3,1,3,3
10061,4,1,2,3
10061,5,4,5,5
10062,1,1,3,3
10062,2,1,3,3
10062,3,3,5,5
10062,4,3,3,4
10062,5,2,2,4
10063,1,1,3,5
10063,2,1,3,5
10063,3,1,3,5
10063,4,1,3,5
10063,5,2,3,5
10064,1,3,3,5
10064,2,1,4,4
10064,3,1,3,4
10064,4,1,3,3
10064,5,3,5,5
10065,1,3,5,5
10065,2,1,1,1
10065,3,1,3,5
10065,4,1,1,3
10065,5,2,3,4
650,1,1,2,4
650,2,1,2,3
650,3,1,2,4
650,4,1,2,4
650,5,2,2,5
651,1,1,2,4
651,2,1,2,3
651,3,1,2,4
651,4,1,2,4
651,5,2,2,5
652,1,1,2,4
652,2,1,2,3
652,3,1,2,4
652,4,1,2,4
652,5,2,2,5
653,1,1,2,4
653,2,1,2,3
653,3,1,2,4
653,4,1,2,4
653,5,2,2,5
654,1,1,2,4
654,2,1,2,3
654,3,1,2,4
654,4,1,2,4
654,5,2,2,5
655,1,1,2,4
655,2,1,2,3
655,3,1,2,4
655,4,1,2,4
655,5,2,2,5
656,1,1,2,4
656,2,1,2,3
656,3,1,2,4
656,4,1,2,4
656,5,2,2,5
657,1,1,2,4
657,2,1,2,3
657,3,1,2,4
657,4,1,2,4
657,5,2,2,5
658,1,1,2,4
658,2,1,2,3
658,3,1,2,4
658,4,1,2,4
658,5,2,2,5
659,1,1,2,4
659,2,1,2,3
659,3,1,2,4
659,4,1,2,4
659,5,2,2,5
660,1,1,2,4
660,2,1,2,3
660,3,1,2,4
660,4,1,2,4
660,5,2,2,5
661,1,1,2,4
661,2,1,2,3
661,3,1,2,4
661,4,1,2,4
661,5,2,2,5
662,1,1,2,4
662,2,1,2,3
662,3,1,2,4
662,4,1,2,4
662,5,2,2,5
663,1,1,2,4
663,2,1,2,3
663,3,1,2,4
663,4,1,2,4
663,5,2,2,5
664,1,1,2,4
664,2,1,2,3
664,3,1,2,4
664,4,1,2,4
664,5,2,2,5
665,1,1,2,4
665,2,1,2,3
665,3,1,2,4
665,4,1,2,4
665,5,2,2,5
666,1,1,2,4
666,2,1,2,3
666,3,1,2,4
666,4,1,2,4
666,5,2,2,5
667,1,1,2,4
667,2,1,2,3
667,3,1,2,4
667,4,1,2,4
667,5,2,2,5
668,1,1,2,4
668,2,1,2,3
668,3,1,2,4
668,4,1,2,4
668,5,2,2,5
669,1,1,2,4
669,2,1,2,3
669,3,1,2,4
669,4,1,2,4
669,5,2,2,5
670,1,1,2,4
670,2,1,2,3
670,3,1,2,4
670,4,1,2,4
670,5,2,2,5
671,1,1,2,4
671,2,1,2,3
671,3,1,2,4
671,4,1,2,4
671,5,2,2,5
672,1,1,2,4
672,2,1,2,3
672,3,1,2,4
672,4,1,2,4
672,5,2,2,5
673,1,1,2,4
673,2,1,2,3
673,3,1,2,4
673,4,1,2,4
673,5,2,2,5
674,1,1,2,4
674,2,1,2,3
674,3,1,2,4
674,4,1,2,4
674,5,2,2,5
675,1,1,2,4
675,2,1,2,3
675,3,1,2,5
675,4,1,2,4
675,5,2,2,5
676,1,1,2,4
676,2,1,2,3
676,3,1,2,5
676,4,1,2,4
676,5,2,2,5
680,1,2,4,5
680,2,4,5,5
680,3,1,4,5
680,4,1,2,3
680,5,2,3,4
681,1,1,3,3
681,2,1,3,4
681,3,2,4,5
681,4,4,5,5
681,5,2,2,3
682,1,4,5,5
682,2,1,2,3
682,3,2,4,5
682,4,1,3,4
682,5,2,4,4
683,1,1,1,4
683,2,1,1,4
683,3,1,1,4
683,4,1,1,5
683,5,2,2,3
684,1,1,1,4
684,2,1,1,5
684,3,1,1,3
684,4,1,1,5
684,5,2,2,3
685,1,1,2,3
685,2,3,4,5
685,3,1,2,2
685,4,1,4,5
685,5,2,2,3
686,1,1,1,3
686,2,1,3,5
686,3,1,2,3
686,4,5,5,5
686,5,2,2,2
688,1,1,1,3
688,2,1,1,4
688,3,1,1,3
688,4,1,3,5
688,5,2,2,2
689,1,1,1,2
689,2,3,4,5
689,3,1,3,3
689,4,4,5,5
689,5,2,2,2
690,1,5,5,5
690,2,1,4,5
690,3,1,4,5
690,4,1,4,5
690,5,2,5,5
691,1,1,4,5
691,2,5,5,5
691,3,1,5,5
691,4,1,4,5
691,5,2,4,5
692,1,1,3,5
692,2,1,5,5
692,3,1,5,5
692,4,1,5,5
692,5,2,5,5
693,1,5,5,5
693,2,1,4,5
693,3,1,5,5
693,4,1,4,5
693,5,2,4,5
694,1,1,4,5
694,2,1,5,5
694,3,5,5,5
694,4,1,4,5
694,5,2,4,5
695,1,1,4,5
695,2,5,5,5
695,3,1,4,5
695,4,1,5,5
695,5,2,4,5
696,1,1,5,5
696,2,1,4,5
696,3,1,4,5
696,4,1,4,5
696,5,5,5,5
697,1,1,4,5
697,2,1,4,5
697,3,1,5,5
697,4,1,4,5
697,5,5,5,5
698,1,1,4,5
698,2,1,4,5
698,3,1,4,5
698,4,5,5,5
698,5,2,5,5
699,1,1,4,5
699,2,1,5,5
699,3,1,4,5
699,4,5,5,5
699,5,2,4,5
700,1,5,5,5
700,2,1,5,5
700,3,1,4,5
700,4,1,4,5
700,5,2,4,5
701,1,1,4,5
701,2,1,4,5
701,3,5,5,5
701,4,1,5,5
701,5,2,4,5
702,1,1,5,5
702,2,1,4,5
702,3,5,5,5
702,4,1,4,5
702,5,2,4,5
703,1,1,4,5
703,2,5,5,5
703,3,1,4,5
703,4,1,5,5
703,5,2,4,5
704,1,1,4,5
704,2,1,4,5
704,3,1,5,5
704,4,5,5,5
704,5,2,4,5
705,1,1,5,5
705,2,1,4,5
705,3,5,5,5
705,4,1,4,5
705,5,2,4,5
706,1,1,5,5
706,2,1,5,5
706,3,1,5,5
706,4,1,5,5
706,5,2,5,5
707,1,2,3,4
707,2,2,4,4
707,3,1,3,4
707,4,1,3,4
707,5,2,4,4
708,1,1,3,3
708,2,1,3,3
708,3,1,3,4
708,4,1,4,4
708,5,2,2,4
709,1,1,3,4
709,2,1,2,3
709,3,3,4,5
709,4,1,3,3
709,5,3,3,4
710,1,3,3,5
710,2,1,3,5
710,3,1,3,3
710,4,1,2,3
710,5,4,5,5
711,1,1,3,3
711,2,1,3,3
711,3,3,5,5
711,4,3,3,4
711,5,2,2,4
712,1,1,3,5
712,2,1,3,5
712,3,1,3,5
712,4,1,3,5
712,5,2,3,5
713,1,3,3,5
713,2,1,4,4
713,3,1,3,4
713,4,1,3,3
713,5,3,5,5
714,1,3,5,5
714,2,1,1,1
714,3,1,3,5
714,4,1,1,3
714,5,2,3,4

1 pokemon_form_id pokeathlon_stat_id minimum_stat base_stat maximum_stat
2464 493 3 1 4 5
2465 493 4 1 5 5
2466 493 5 2 4 5
2467 10001 650 1 1 2 4
2468 10001 650 2 1 2 3
2469 10001 650 3 1 2 4
2470 10001 650 4 1 2 4
2471 10001 650 5 2 2 5
2472 10002 651 1 1 2 4
2473 10002 651 2 1 2 3
2474 10002 651 3 1 2 4
2475 10002 651 4 1 2 4
2476 10002 651 5 2 2 5
2477 10003 652 1 1 2 4
2478 10003 652 2 1 2 3
2479 10003 652 3 1 2 4
2480 10003 652 4 1 2 4
2481 10003 652 5 2 2 5
2482 10004 653 1 1 2 4
2483 10004 653 2 1 2 3
2484 10004 653 3 1 2 4
2485 10004 653 4 1 2 4
2486 10004 653 5 2 2 5
2487 10005 654 1 1 2 4
2488 10005 654 2 1 2 3
2489 10005 654 3 1 2 4
2490 10005 654 4 1 2 4
2491 10005 654 5 2 2 5
2492 10006 655 1 1 2 4
2493 10006 655 2 1 2 3
2494 10006 655 3 1 2 4
2495 10006 655 4 1 2 4
2496 10006 655 5 2 2 5
2497 10007 656 1 1 2 4
2498 10007 656 2 1 2 3
2499 10007 656 3 1 2 4
2500 10007 656 4 1 2 4
2501 10007 656 5 2 2 5
2502 10008 657 1 1 2 4
2503 10008 657 2 1 2 3
2504 10008 657 3 1 2 4
2505 10008 657 4 1 2 4
2506 10008 657 5 2 2 5
2507 10009 658 1 1 2 4
2508 10009 658 2 1 2 3
2509 10009 658 3 1 2 4
2510 10009 658 4 1 2 4
2511 10009 658 5 2 2 5
2512 10010 659 1 1 2 4
2513 10010 659 2 1 2 3
2514 10010 659 3 1 2 4
2515 10010 659 4 1 2 4
2516 10010 659 5 2 2 5
2517 10011 660 1 1 2 4
2518 10011 660 2 1 2 3
2519 10011 660 3 1 2 4
2520 10011 660 4 1 2 4
2521 10011 660 5 2 2 5
2522 10012 661 1 1 2 4
2523 10012 661 2 1 2 3
2524 10012 661 3 1 2 4
2525 10012 661 4 1 2 4
2526 10012 661 5 2 2 5
2527 10013 662 1 1 2 4
2528 10013 662 2 1 2 3
2529 10013 662 3 1 2 4
2530 10013 662 4 1 2 4
2531 10013 662 5 2 2 5
2532 10014 663 1 1 2 4
2533 10014 663 2 1 2 3
2534 10014 663 3 1 2 4
2535 10014 663 4 1 2 4
2536 10014 663 5 2 2 5
2537 10015 664 1 1 2 4
2538 10015 664 2 1 2 3
2539 10015 664 3 1 2 4
2540 10015 664 4 1 2 4
2541 10015 664 5 2 2 5
2542 10016 665 1 1 2 4
2543 10016 665 2 1 2 3
2544 10016 665 3 1 2 4
2545 10016 665 4 1 2 4
2546 10016 665 5 2 2 5
2547 10017 666 1 1 2 4
2548 10017 666 2 1 2 3
2549 10017 666 3 1 2 4
2550 10017 666 4 1 2 4
2551 10017 666 5 2 2 5
2552 10018 667 1 1 2 4
2553 10018 667 2 1 2 3
2554 10018 667 3 1 2 4
2555 10018 667 4 1 2 4
2556 10018 667 5 2 2 5
2557 10019 668 1 1 2 4
2558 10019 668 2 1 2 3
2559 10019 668 3 1 2 4
2560 10019 668 4 1 2 4
2561 10019 668 5 2 2 5
2562 10020 669 1 1 2 4
2563 10020 669 2 1 2 3
2564 10020 669 3 1 2 4
2565 10020 669 4 1 2 4
2566 10020 669 5 2 2 5
2567 10021 670 1 1 2 4
2568 10021 670 2 1 2 3
2569 10021 670 3 1 2 4
2570 10021 670 4 1 2 4
2571 10021 670 5 2 2 5
2572 10022 671 1 1 2 4
2573 10022 671 2 1 2 3
2574 10022 671 3 1 2 4
2575 10022 671 4 1 2 4
2576 10022 671 5 2 2 5
2577 10023 672 1 1 2 4
2578 10023 672 2 1 2 3
2579 10023 672 3 1 2 4
2580 10023 672 4 1 2 4
2581 10023 672 5 2 2 5
2582 10024 673 1 1 2 4
2583 10024 673 2 1 2 3
2584 10024 673 3 1 2 4
2585 10024 673 4 1 2 4
2586 10024 673 5 2 2 5
2587 10025 674 1 1 2 4
2588 10025 674 2 1 2 3
2589 10025 674 3 1 2 4
2590 10025 674 4 1 2 4
2591 10025 674 5 2 2 5
2592 10026 675 1 1 2 4
2593 10026 675 2 1 2 3
2594 10026 675 3 1 2 5
2595 10026 675 4 1 2 4
2596 10026 675 5 2 2 5
2597 10027 676 1 1 2 4
2598 10027 676 2 1 2 3
2599 10027 676 3 1 2 5
2600 10027 676 4 1 2 4
2601 10027 676 5 2 2 5
2602 10031 680 1 2 4 5
2603 10031 680 2 4 5 5
2604 10031 680 3 1 4 5
2605 10031 680 4 1 2 3
2606 10031 680 5 2 3 4
2607 10032 681 1 1 3 3
2608 10032 681 2 1 3 4
2609 10032 681 3 2 4 5
2610 10032 681 4 4 5 5
2611 10032 681 5 2 2 3
2612 10033 682 1 4 5 5
2613 10033 682 2 1 2 3
2614 10033 682 3 2 4 5
2615 10033 682 4 1 3 4
2616 10033 682 5 2 4 4
2617 10034 683 1 1 1 4
2618 10034 683 2 1 1 4
2619 10034 683 3 1 1 4
2620 10034 683 4 1 1 5
2621 10034 683 5 2 2 3
2622 10035 684 1 1 1 4
2623 10035 684 2 1 1 5
2624 10035 684 3 1 1 3
2625 10035 684 4 1 1 5
2626 10035 684 5 2 2 3
2627 10036 685 1 1 2 3
2628 10036 685 2 3 4 5
2629 10036 685 3 1 2 2
2630 10036 685 4 1 4 5
2631 10036 685 5 2 2 3
2632 10037 686 1 1 1 3
2633 10037 686 2 1 3 5
2634 10037 686 3 1 2 3
2635 10037 686 4 5 5 5
2636 10037 686 5 2 2 2
2637 10039 688 1 1 1 3
2638 10039 688 2 1 1 4
2639 10039 688 3 1 1 3
2640 10039 688 4 1 3 5
2641 10039 688 5 2 2 2
2642 10040 689 1 1 1 2
2643 10040 689 2 3 4 5
2644 10040 689 3 1 3 3
2645 10040 689 4 4 5 5
2646 10040 689 5 2 2 2
2647 10041 690 1 5 5 5
2648 10041 690 2 1 4 5
2649 10041 690 3 1 4 5
2650 10041 690 4 1 4 5
2651 10041 690 5 2 5 5
2652 10042 691 1 1 4 5
2653 10042 691 2 5 5 5
2654 10042 691 3 1 5 5
2655 10042 691 4 1 4 5
2656 10042 691 5 2 4 5
2657 10043 692 1 1 3 5
2658 10043 692 2 1 5 5
2659 10043 692 3 1 5 5
2660 10043 692 4 1 5 5
2661 10043 692 5 2 5 5
2662 10044 693 1 5 5 5
2663 10044 693 2 1 4 5
2664 10044 693 3 1 5 5
2665 10044 693 4 1 4 5
2666 10044 693 5 2 4 5
2667 10045 694 1 1 4 5
2668 10045 694 2 1 5 5
2669 10045 694 3 5 5 5
2670 10045 694 4 1 4 5
2671 10045 694 5 2 4 5
2672 10046 695 1 1 4 5
2673 10046 695 2 5 5 5
2674 10046 695 3 1 4 5
2675 10046 695 4 1 5 5
2676 10046 695 5 2 4 5
2677 10047 696 1 1 5 5
2678 10047 696 2 1 4 5
2679 10047 696 3 1 4 5
2680 10047 696 4 1 4 5
2681 10047 696 5 5 5 5
2682 10048 697 1 1 4 5
2683 10048 697 2 1 4 5
2684 10048 697 3 1 5 5
2685 10048 697 4 1 4 5
2686 10048 697 5 5 5 5
2687 10049 698 1 1 4 5
2688 10049 698 2 1 4 5
2689 10049 698 3 1 4 5
2690 10049 698 4 5 5 5
2691 10049 698 5 2 5 5
2692 10050 699 1 1 4 5
2693 10050 699 2 1 5 5
2694 10050 699 3 1 4 5
2695 10050 699 4 5 5 5
2696 10050 699 5 2 4 5
2697 10051 700 1 5 5 5
2698 10051 700 2 1 5 5
2699 10051 700 3 1 4 5
2700 10051 700 4 1 4 5
2701 10051 700 5 2 4 5
2702 10052 701 1 1 4 5
2703 10052 701 2 1 4 5
2704 10052 701 3 5 5 5
2705 10052 701 4 1 5 5
2706 10052 701 5 2 4 5
2707 10053 702 1 1 5 5
2708 10053 702 2 1 4 5
2709 10053 702 3 5 5 5
2710 10053 702 4 1 4 5
2711 10053 702 5 2 4 5
2712 10054 703 1 1 4 5
2713 10054 703 2 5 5 5
2714 10054 703 3 1 4 5
2715 10054 703 4 1 5 5
2716 10054 703 5 2 4 5
2717 10055 704 1 1 4 5
2718 10055 704 2 1 4 5
2719 10055 704 3 1 5 5
2720 10055 704 4 5 5 5
2721 10055 704 5 2 4 5
2722 10056 705 1 1 5 5
2723 10056 705 2 1 4 5
2724 10056 705 3 5 5 5
2725 10056 705 4 1 4 5
2726 10056 705 5 2 4 5
2727 10057 706 1 1 5 5
2728 10057 706 2 1 5 5
2729 10057 706 3 1 5 5
2730 10057 706 4 1 5 5
2731 10057 706 5 2 5 5
2732 10058 707 1 2 3 4
2733 10058 707 2 2 4 4
2734 10058 707 3 1 3 4
2735 10058 707 4 1 3 4
2736 10058 707 5 2 4 4
2737 10059 708 1 1 3 3
2738 10059 708 2 1 3 3
2739 10059 708 3 1 3 4
2740 10059 708 4 1 4 4
2741 10059 708 5 2 2 4
2742 10060 709 1 1 3 4
2743 10060 709 2 1 2 3
2744 10060 709 3 3 4 5
2745 10060 709 4 1 3 3
2746 10060 709 5 3 3 4
2747 10061 710 1 3 3 5
2748 10061 710 2 1 3 5
2749 10061 710 3 1 3 3
2750 10061 710 4 1 2 3
2751 10061 710 5 4 5 5
2752 10062 711 1 1 3 3
2753 10062 711 2 1 3 3
2754 10062 711 3 3 5 5
2755 10062 711 4 3 3 4
2756 10062 711 5 2 2 4
2757 10063 712 1 1 3 5
2758 10063 712 2 1 3 5
2759 10063 712 3 1 3 5
2760 10063 712 4 1 3 5
2761 10063 712 5 2 3 5
2762 10064 713 1 3 3 5
2763 10064 713 2 1 4 4
2764 10064 713 3 1 3 4
2765 10064 713 4 1 3 3
2766 10064 713 5 3 5 5
2767 10065 714 1 3 5 5
2768 10065 714 2 1 1 1
2769 10065 714 3 1 3 5
2770 10065 714 4 1 1 3
2771 10065 714 5 2 3 4

File diff suppressed because it is too large Load diff

View file

@ -1929,33 +1929,33 @@ pokemon_id,generation_id,game_index
647,5,647
648,5,648
649,5,649
10001,4,496
10001,5,650
10002,4,497
10002,5,651
10003,4,498
10003,5,652
10004,4,499
10004,5,653
10005,4,500
10005,5,654
10006,4,502
10006,5,655
10007,4,501
10007,5,656
10008,4,503
10008,5,657
10009,4,504
10009,5,658
10010,4,505
10010,5,659
10011,4,506
10011,5,660
10012,4,507
10012,5,661
10013,5,662
10014,5,663
10015,5,664
10016,5,665
10017,5,666
10018,5,667
650,4,496
650,5,650
651,4,497
651,5,651
652,4,498
652,5,652
653,4,499
653,5,653
654,4,500
654,5,654
655,4,502
655,5,655
656,4,501
656,5,656
657,4,503
657,5,657
658,4,504
658,5,658
659,4,505
659,5,659
660,4,506
660,5,660
661,4,507
661,5,661
662,5,662
663,5,663
664,5,664
665,5,665
666,5,666
667,5,667

1 pokemon_id generation_id game_index
1929 647 5 647
1930 648 5 648
1931 649 5 649
1932 10001 650 4 496
1933 10001 650 5 650
1934 10002 651 4 497
1935 10002 651 5 651
1936 10003 652 4 498
1937 10003 652 5 652
1938 10004 653 4 499
1939 10004 653 5 653
1940 10005 654 4 500
1941 10005 654 5 654
1942 10006 655 4 502
1943 10006 655 5 655
1944 10007 656 4 501
1945 10007 656 5 656
1946 10008 657 4 503
1947 10008 657 5 657
1948 10009 658 4 504
1949 10009 658 5 658
1950 10010 659 4 505
1951 10010 659 5 659
1952 10011 660 4 506
1953 10011 660 5 660
1954 10012 661 4 507
1955 10012 661 5 661
1956 10013 662 5 662
1957 10014 663 5 663
1958 10015 664 5 664
1959 10016 665 5 665
1960 10017 666 5 666
1961 10018 667 5 667

View file

@ -2343,34 +2343,34 @@ pokemon_id,version_id,item_id,rarity
637,18,199,100
648,17,91,100
648,18,91,100
10004,12,199,5
10004,13,199,5
10004,14,199,5
10004,15,199,5
10004,16,199,5
10004,17,199,5
10004,18,199,5
10005,12,199,5
10005,13,199,5
10005,14,199,5
10005,15,199,5
10005,16,199,5
10005,17,199,5
10005,18,199,5
10006,14,134,100
10006,15,134,100
10006,16,134,100
10006,17,134,100
10006,18,134,100
10013,17,220,100
10013,18,220,100
10014,17,220,100
10014,18,220,100
10015,17,220,100
10015,18,220,100
10016,17,204,5
10016,18,204,5
10017,17,129,50
10017,18,129,50
10018,17,91,100
10018,18,91,100
653,12,199,5
653,13,199,5
653,14,199,5
653,15,199,5
653,16,199,5
653,17,199,5
653,18,199,5
654,12,199,5
654,13,199,5
654,14,199,5
654,15,199,5
654,16,199,5
654,17,199,5
654,18,199,5
655,14,134,100
655,15,134,100
655,16,134,100
655,17,134,100
655,18,134,100
662,17,220,100
662,18,220,100
663,17,220,100
663,18,220,100
664,17,220,100
664,18,220,100
665,17,204,5
665,18,204,5
666,17,129,50
666,18,129,50
667,17,91,100
667,18,91,100

1 pokemon_id version_id item_id rarity
2343 637 18 199 100
2344 648 17 91 100
2345 648 18 91 100
2346 10004 653 12 199 5
2347 10004 653 13 199 5
2348 10004 653 14 199 5
2349 10004 653 15 199 5
2350 10004 653 16 199 5
2351 10004 653 17 199 5
2352 10004 653 18 199 5
2353 10005 654 12 199 5
2354 10005 654 13 199 5
2355 10005 654 14 199 5
2356 10005 654 15 199 5
2357 10005 654 16 199 5
2358 10005 654 17 199 5
2359 10005 654 18 199 5
2360 10006 655 14 134 100
2361 10006 655 15 134 100
2362 10006 655 16 134 100
2363 10006 655 17 134 100
2364 10006 655 18 134 100
2365 10013 662 17 220 100
2366 10013 662 18 220 100
2367 10014 663 17 220 100
2368 10014 663 18 220 100
2369 10015 664 17 220 100
2370 10015 664 18 220 100
2371 10016 665 17 204 5
2372 10016 665 18 204 5
2373 10017 666 17 129 50
2374 10017 666 18 129 50
2375 10018 667 17 91 100
2376 10018 667 18 91 100

File diff suppressed because it is too large Load diff

View file

@ -0,0 +1,650 @@
id,identifier,generation_id,evolves_from_species_id,evolution_chain_id,color_id,shape_id,habitat_id,gender_rate,capture_rate,base_happiness,is_baby,hatch_counter,has_gender_differences,growth_rate_id,forms_switchable
1,bulbasaur,1,,1,5,8,3,1,45,70,0,20,0,4,0
2,ivysaur,1,1,1,5,8,3,1,45,70,0,20,0,4,0
3,venusaur,1,2,1,5,8,3,1,45,70,0,20,1,4,0
4,charmander,1,,2,8,6,4,1,45,70,0,20,0,4,0
5,charmeleon,1,4,2,8,6,4,1,45,70,0,20,0,4,0
6,charizard,1,5,2,8,6,4,1,45,70,0,20,0,4,0
7,squirtle,1,,3,2,6,9,1,45,70,0,20,0,4,0
8,wartortle,1,7,3,2,6,9,1,45,70,0,20,0,4,0
9,blastoise,1,8,3,2,6,9,1,45,70,0,20,0,4,0
10,caterpie,1,,4,5,2,2,4,255,70,0,15,0,2,0
11,metapod,1,10,4,5,2,2,4,120,70,0,15,0,2,0
12,butterfree,1,11,4,9,13,2,4,45,70,0,15,1,2,0
13,weedle,1,,5,3,2,2,4,255,70,0,15,0,2,0
14,kakuna,1,13,5,10,2,2,4,120,70,0,15,0,2,0
15,beedrill,1,14,5,10,13,2,4,45,70,0,15,0,2,0
16,pidgey,1,,6,3,9,2,4,255,70,0,15,0,4,0
17,pidgeotto,1,16,6,3,9,2,4,120,70,0,15,0,4,0
18,pidgeot,1,17,6,3,9,2,4,45,70,0,15,0,4,0
19,rattata,1,,7,7,8,3,4,255,70,0,15,1,2,0
20,raticate,1,19,7,3,8,3,4,127,70,0,15,1,2,0
21,spearow,1,,8,3,9,6,4,255,70,0,15,0,2,0
22,fearow,1,21,8,3,9,6,4,90,70,0,15,0,2,0
23,ekans,1,,9,7,2,3,4,255,70,0,20,0,2,0
24,arbok,1,23,9,7,2,3,4,90,70,0,20,0,2,0
25,pikachu,1,172,10,10,8,2,4,190,70,0,10,1,2,0
26,raichu,1,25,10,10,6,2,4,75,70,0,10,1,2,0
27,sandshrew,1,,11,10,6,6,4,255,70,0,20,0,2,0
28,sandslash,1,27,11,10,6,6,4,90,70,0,20,0,2,0
29,nidoran-f,1,,12,2,8,3,8,235,70,0,20,0,4,0
30,nidorina,1,29,12,2,8,3,8,120,70,0,20,0,4,0
31,nidoqueen,1,30,12,2,6,3,8,45,70,0,20,0,4,0
32,nidoran-m,1,,13,7,8,3,0,235,70,0,20,0,4,0
33,nidorino,1,32,13,7,8,3,0,120,70,0,20,0,4,0
34,nidoking,1,33,13,7,6,3,0,45,70,0,20,0,4,0
35,clefairy,1,173,14,6,6,4,6,150,140,0,10,0,3,0
36,clefable,1,35,14,6,6,4,6,25,140,0,10,0,3,0
37,vulpix,1,,15,3,8,3,6,190,70,0,20,0,2,0
38,ninetales,1,37,15,10,8,3,6,75,70,0,20,0,2,0
39,jigglypuff,1,174,16,6,12,3,6,170,70,0,10,0,3,0
40,wigglytuff,1,39,16,6,12,3,6,50,70,0,10,0,3,0
41,zubat,1,,17,7,9,1,4,255,70,0,15,1,2,0
42,golbat,1,41,17,7,9,1,4,90,70,0,15,1,2,0
43,oddish,1,,18,2,7,3,4,255,70,0,20,0,4,0
44,gloom,1,43,18,2,12,3,4,120,70,0,20,1,4,0
45,vileplume,1,44,18,8,12,3,4,45,70,0,20,1,4,0
46,paras,1,,19,8,14,2,4,190,70,0,20,0,2,0
47,parasect,1,46,19,8,14,2,4,75,70,0,20,0,2,0
48,venonat,1,,20,7,12,2,4,190,70,0,20,0,2,0
49,venomoth,1,48,20,7,13,2,4,75,70,0,20,0,2,0
50,diglett,1,,21,3,5,1,4,255,70,0,20,0,2,0
51,dugtrio,1,50,21,3,11,1,4,50,70,0,20,0,2,0
52,meowth,1,,22,10,8,8,4,255,70,0,20,0,2,0
53,persian,1,52,22,10,8,8,4,90,70,0,20,0,2,0
54,psyduck,1,,23,10,6,9,4,190,70,0,20,0,2,0
55,golduck,1,54,23,2,6,9,4,75,70,0,20,0,2,0
56,mankey,1,,24,3,6,4,4,190,70,0,20,0,2,0
57,primeape,1,56,24,3,6,4,4,75,70,0,20,0,2,0
58,growlithe,1,,25,3,8,3,2,190,70,0,20,0,1,0
59,arcanine,1,58,25,3,8,3,2,75,70,0,20,0,1,0
60,poliwag,1,,26,2,7,9,4,255,70,0,20,0,4,0
61,poliwhirl,1,60,26,2,12,9,4,120,70,0,20,0,4,0
62,poliwrath,1,61,26,2,12,9,4,45,70,0,20,0,4,0
63,abra,1,,27,3,6,8,2,200,70,0,20,0,4,0
64,kadabra,1,63,27,3,6,8,2,100,70,0,20,1,4,0
65,alakazam,1,64,27,3,12,8,2,50,70,0,20,1,4,0
66,machop,1,,28,4,6,4,2,180,70,0,20,0,4,0
67,machoke,1,66,28,4,12,4,2,90,70,0,20,0,4,0
68,machamp,1,67,28,4,12,4,2,45,70,0,20,0,4,0
69,bellsprout,1,,29,5,12,2,4,255,70,0,20,0,4,0
70,weepinbell,1,69,29,5,5,2,4,120,70,0,20,0,4,0
71,victreebel,1,70,29,5,5,2,4,45,70,0,20,0,4,0
72,tentacool,1,,30,2,10,7,4,190,70,0,20,0,1,0
73,tentacruel,1,72,30,2,10,7,4,60,70,0,20,0,1,0
74,geodude,1,,31,3,4,4,4,255,70,0,15,0,4,0
75,graveler,1,74,31,3,12,4,4,120,70,0,15,0,4,0
76,golem,1,75,31,3,12,4,4,45,70,0,15,0,4,0
77,ponyta,1,,32,10,8,3,4,190,70,0,20,0,2,0
78,rapidash,1,77,32,10,8,3,4,60,70,0,20,0,2,0
79,slowpoke,1,,33,6,8,9,4,190,70,0,20,0,2,0
80,slowbro,1,79,33,6,6,9,4,75,70,0,20,0,2,0
81,magnemite,1,,34,4,4,6,-1,190,70,0,20,0,2,0
82,magneton,1,81,34,4,11,6,-1,60,70,0,20,0,2,0
83,farfetchd,1,,35,3,9,3,4,45,70,0,20,0,2,0
84,doduo,1,,36,3,7,3,4,190,70,0,20,1,2,0
85,dodrio,1,84,36,3,7,3,4,45,70,0,20,1,2,0
86,seel,1,,37,9,3,7,4,190,70,0,20,0,2,0
87,dewgong,1,86,37,9,3,7,4,75,70,0,20,0,2,0
88,grimer,1,,38,7,4,8,4,190,70,0,20,0,2,0
89,muk,1,88,38,7,4,8,4,75,70,0,20,0,2,0
90,shellder,1,,39,7,1,7,4,190,70,0,20,0,1,0
91,cloyster,1,90,39,7,1,7,4,60,70,0,20,0,1,0
92,gastly,1,,40,7,1,1,4,190,70,0,20,0,4,0
93,haunter,1,92,40,7,4,1,4,90,70,0,20,0,4,0
94,gengar,1,93,40,7,6,1,4,45,70,0,20,0,4,0
95,onix,1,,41,4,2,1,4,45,70,0,25,0,2,0
96,drowzee,1,,42,10,12,3,4,190,70,0,20,0,2,0
97,hypno,1,96,42,10,12,3,4,75,70,0,20,1,2,0
98,krabby,1,,43,8,14,9,4,225,70,0,20,0,2,0
99,kingler,1,98,43,8,14,9,4,60,70,0,20,0,2,0
100,voltorb,1,,44,8,1,8,-1,190,70,0,20,0,2,0
101,electrode,1,100,44,8,1,8,-1,60,70,0,20,0,2,0
102,exeggcute,1,,45,6,11,2,4,90,70,0,20,0,1,0
103,exeggutor,1,102,45,10,7,2,4,45,70,0,20,0,1,0
104,cubone,1,,46,3,6,4,4,190,70,0,20,0,2,0
105,marowak,1,104,46,3,6,4,4,75,70,0,20,0,2,0
106,hitmonlee,1,236,47,3,12,8,0,45,70,0,25,0,2,0
107,hitmonchan,1,236,47,3,12,8,0,45,70,0,25,0,2,0
108,lickitung,1,,48,6,6,3,4,45,70,0,20,0,2,0
109,koffing,1,,49,7,1,8,4,190,70,0,20,0,2,0
110,weezing,1,109,49,7,11,8,4,60,70,0,20,0,2,0
111,rhyhorn,1,,50,4,8,6,4,120,70,0,20,1,1,0
112,rhydon,1,111,50,4,6,6,4,60,70,0,20,1,1,0
113,chansey,1,440,51,6,6,8,8,30,140,0,40,0,3,0
114,tangela,1,,52,2,7,3,4,45,70,0,20,0,2,0
115,kangaskhan,1,,53,3,6,3,8,45,70,0,20,0,2,0
116,horsea,1,,54,2,5,7,4,225,70,0,20,0,2,0
117,seadra,1,116,54,2,5,7,4,75,70,0,20,0,2,0
118,goldeen,1,,55,8,3,9,4,225,70,0,20,1,2,0
119,seaking,1,118,55,8,3,9,4,60,70,0,20,1,2,0
120,staryu,1,,56,3,5,7,-1,225,70,0,20,0,1,0
121,starmie,1,120,56,7,5,7,-1,60,70,0,20,0,1,0
122,mr-mime,1,439,57,6,12,8,4,45,70,0,25,0,2,0
123,scyther,1,,58,5,13,3,4,45,70,0,25,1,2,0
124,jynx,1,238,59,8,12,8,8,45,70,0,25,0,2,0
125,electabuzz,1,239,60,10,6,3,2,45,70,0,25,0,2,0
126,magmar,1,240,61,8,6,4,2,45,70,0,25,0,2,0
127,pinsir,1,,62,3,12,2,4,45,70,0,25,0,1,0
128,tauros,1,,63,3,8,3,0,45,70,0,20,0,1,0
129,magikarp,1,,64,8,3,9,4,255,70,0,5,1,1,0
130,gyarados,1,129,64,2,2,9,4,45,70,0,5,1,1,0
131,lapras,1,,65,2,3,7,4,45,70,0,40,0,1,0
132,ditto,1,,66,7,1,8,-1,35,70,0,20,0,2,0
133,eevee,1,,67,3,8,8,1,45,70,0,35,0,2,0
134,vaporeon,1,133,67,2,8,8,1,45,70,0,35,0,2,0
135,jolteon,1,133,67,10,8,8,1,45,70,0,35,0,2,0
136,flareon,1,133,67,8,8,8,1,45,70,0,35,0,2,0
137,porygon,1,,68,6,7,8,-1,45,70,0,20,0,2,0
138,omanyte,1,,69,2,10,7,1,45,70,0,30,0,2,0
139,omastar,1,138,69,2,10,7,1,45,70,0,30,0,2,0
140,kabuto,1,,70,3,14,7,1,45,70,0,30,0,2,0
141,kabutops,1,140,70,3,6,7,1,45,70,0,30,0,2,0
142,aerodactyl,1,,71,7,9,4,1,45,70,0,35,0,1,0
143,snorlax,1,446,72,1,12,4,1,25,70,0,40,0,1,0
144,articuno,1,,73,2,9,5,-1,3,35,0,80,0,1,0
145,zapdos,1,,74,10,9,5,-1,3,35,0,80,0,1,0
146,moltres,1,,75,10,9,5,-1,3,35,0,80,0,1,0
147,dratini,1,,76,2,2,9,4,45,35,0,40,0,1,0
148,dragonair,1,147,76,2,2,9,4,45,35,0,40,0,1,0
149,dragonite,1,148,76,3,6,9,4,45,35,0,40,0,1,0
150,mewtwo,1,,77,7,6,5,-1,3,0,0,120,0,1,0
151,mew,1,,78,6,6,5,-1,45,100,0,120,0,4,0
152,chikorita,2,,79,5,8,3,1,45,70,0,20,0,4,0
153,bayleef,2,152,79,5,8,3,1,45,70,0,20,0,4,0
154,meganium,2,153,79,5,8,3,1,45,70,0,20,1,4,0
155,cyndaquil,2,,80,10,12,3,1,45,70,0,20,0,4,0
156,quilava,2,155,80,10,8,3,1,45,70,0,20,0,4,0
157,typhlosion,2,156,80,10,8,3,1,45,70,0,20,0,4,0
158,totodile,2,,81,2,6,9,1,45,70,0,20,0,4,0
159,croconaw,2,158,81,2,6,9,1,45,70,0,20,0,4,0
160,feraligatr,2,159,81,2,6,9,1,45,70,0,20,0,4,0
161,sentret,2,,82,3,8,3,4,255,70,0,15,0,2,0
162,furret,2,161,82,3,8,3,4,90,70,0,15,0,2,0
163,hoothoot,2,,83,3,9,2,4,255,70,0,15,0,2,0
164,noctowl,2,163,83,3,9,2,4,90,70,0,15,0,2,0
165,ledyba,2,,84,8,9,2,4,255,70,0,15,1,3,0
166,ledian,2,165,84,8,9,2,4,90,70,0,15,1,3,0
167,spinarak,2,,85,5,14,2,4,255,70,0,15,0,3,0
168,ariados,2,167,85,8,14,2,4,90,70,0,15,0,3,0
169,crobat,2,42,17,7,13,1,4,90,70,0,15,0,2,0
170,chinchou,2,,86,2,3,7,4,190,70,0,20,0,1,0
171,lanturn,2,170,86,2,3,7,4,75,70,0,20,0,1,0
172,pichu,2,,10,10,8,2,4,190,70,1,10,0,2,0
173,cleffa,2,,14,6,6,4,6,150,140,1,10,0,3,0
174,igglybuff,2,,16,6,12,3,6,170,70,1,10,0,3,0
175,togepi,2,,87,9,12,2,1,190,70,1,10,0,3,0
176,togetic,2,175,87,9,12,2,1,75,70,0,10,0,3,0
177,natu,2,,88,5,9,2,4,190,70,0,20,0,2,0
178,xatu,2,177,88,5,9,2,4,75,70,0,20,1,2,0
179,mareep,2,,89,9,8,3,4,235,70,0,20,0,4,0
180,flaaffy,2,179,89,6,6,3,4,120,70,0,20,0,4,0
181,ampharos,2,180,89,10,6,3,4,45,70,0,20,0,4,0
182,bellossom,2,44,18,5,12,3,4,45,70,0,20,0,4,0
183,marill,2,298,90,2,6,9,4,190,70,0,10,0,3,0
184,azumarill,2,183,90,2,6,9,4,75,70,0,10,0,3,0
185,sudowoodo,2,438,91,3,12,2,4,65,70,0,20,1,2,0
186,politoed,2,61,26,5,12,9,4,45,70,0,20,1,4,0
187,hoppip,2,,92,6,6,3,4,255,70,0,20,0,4,0
188,skiploom,2,187,92,5,6,3,4,120,70,0,20,0,4,0
189,jumpluff,2,188,92,2,6,3,4,45,70,0,20,0,4,0
190,aipom,2,,93,7,6,2,4,45,70,0,20,1,3,0
191,sunkern,2,,94,10,1,3,4,235,70,0,20,0,4,0
192,sunflora,2,191,94,10,12,3,4,120,70,0,20,0,4,0
193,yanma,2,,95,8,13,2,4,75,70,0,20,0,2,0
194,wooper,2,,96,2,7,9,4,255,70,0,20,1,2,0
195,quagsire,2,194,96,2,6,9,4,90,70,0,20,1,2,0
196,espeon,2,133,67,7,8,8,1,45,70,0,35,0,2,0
197,umbreon,2,133,67,1,8,8,1,45,35,0,35,0,2,0
198,murkrow,2,,97,1,9,2,4,30,35,0,20,1,4,0
199,slowking,2,79,33,6,6,9,4,70,70,0,20,0,2,0
200,misdreavus,2,,98,4,1,1,4,45,35,0,25,0,3,0
201,unown,2,,99,1,1,5,-1,225,70,0,40,0,2,0
202,wobbuffet,2,360,100,2,5,1,4,45,70,0,20,1,2,0
203,girafarig,2,,101,10,8,3,4,60,70,0,20,1,2,0
204,pineco,2,,102,4,1,2,4,190,70,0,20,0,2,0
205,forretress,2,204,102,7,1,2,4,75,70,0,20,0,2,0
206,dunsparce,2,,103,10,2,1,4,190,70,0,20,0,2,0
207,gligar,2,,104,7,9,4,4,60,70,0,20,1,4,0
208,steelix,2,95,41,4,2,1,4,25,70,0,25,1,2,0
209,snubbull,2,,105,6,12,8,6,190,70,0,20,0,3,0
210,granbull,2,209,105,7,6,8,6,75,70,0,20,0,3,0
211,qwilfish,2,,106,4,3,7,4,45,70,0,20,0,2,0
212,scizor,2,123,58,8,13,3,4,25,70,0,25,1,2,0
213,shuckle,2,,107,10,14,4,4,190,70,0,20,0,4,0
214,heracross,2,,108,2,12,2,4,45,70,0,25,1,1,0
215,sneasel,2,,109,1,6,2,4,60,35,0,20,1,4,0
216,teddiursa,2,,110,3,6,4,4,120,70,0,20,0,2,0
217,ursaring,2,216,110,3,6,4,4,60,70,0,20,1,2,0
218,slugma,2,,111,8,2,4,4,190,70,0,20,0,2,0
219,magcargo,2,218,111,8,2,4,4,75,70,0,20,0,2,0
220,swinub,2,,112,3,8,1,4,225,70,0,20,0,1,0
221,piloswine,2,220,112,3,8,1,4,75,70,0,20,1,1,0
222,corsola,2,,113,6,14,7,6,60,70,0,20,0,3,0
223,remoraid,2,,114,4,3,7,4,190,70,0,20,0,2,0
224,octillery,2,223,114,8,10,7,4,75,70,0,20,1,2,0
225,delibird,2,,115,8,9,4,4,45,70,0,20,0,3,0
226,mantine,2,458,116,7,9,7,4,25,70,0,25,0,1,0
227,skarmory,2,,117,4,9,6,4,25,70,0,25,0,1,0
228,houndour,2,,118,1,8,6,4,120,35,0,20,0,1,0
229,houndoom,2,228,118,1,8,6,4,45,35,0,20,1,1,0
230,kingdra,2,117,54,2,5,7,4,45,70,0,20,0,2,0
231,phanpy,2,,119,2,8,6,4,120,70,0,20,0,2,0
232,donphan,2,231,119,4,8,6,4,60,70,0,20,1,2,0
233,porygon2,2,137,68,8,7,8,-1,45,70,0,20,0,2,0
234,stantler,2,,120,3,8,2,4,45,70,0,20,0,1,0
235,smeargle,2,,121,9,6,8,4,45,70,0,20,0,3,0
236,tyrogue,2,,47,7,12,8,0,75,70,1,25,0,2,0
237,hitmontop,2,236,47,3,6,8,0,45,70,0,25,0,2,0
238,smoochum,2,,59,6,12,8,8,45,70,1,25,0,2,0
239,elekid,2,,60,10,12,3,2,45,70,1,25,0,2,0
240,magby,2,,61,8,6,4,2,45,70,1,25,0,2,0
241,miltank,2,,122,6,6,3,8,45,70,0,20,0,1,0
242,blissey,2,113,51,6,12,8,8,30,140,0,40,0,3,0
243,raikou,2,,123,10,8,3,-1,3,35,0,80,0,1,0
244,entei,2,,124,3,8,3,-1,3,35,0,80,0,1,0
245,suicune,2,,125,2,8,3,-1,3,35,0,80,0,1,0
246,larvitar,2,,126,5,6,4,4,45,35,0,40,0,1,0
247,pupitar,2,246,126,4,2,4,4,45,35,0,40,0,1,0
248,tyranitar,2,247,126,5,6,4,4,45,35,0,40,0,1,0
249,lugia,2,,127,9,9,5,-1,3,0,0,120,0,1,0
250,ho-oh,2,,128,8,9,5,-1,3,0,0,120,0,1,0
251,celebi,2,,129,5,12,2,-1,45,100,0,120,0,4,0
252,treecko,3,,130,5,6,2,1,45,70,0,20,0,4,0
253,grovyle,3,252,130,5,6,2,1,45,70,0,20,0,4,0
254,sceptile,3,253,130,5,6,2,1,45,70,0,20,0,4,0
255,torchic,3,,131,8,7,3,1,45,70,0,20,1,4,0
256,combusken,3,255,131,8,6,3,1,45,70,0,20,1,4,0
257,blaziken,3,256,131,8,6,3,1,45,70,0,20,1,4,0
258,mudkip,3,,132,2,8,9,1,45,70,0,20,0,4,0
259,marshtomp,3,258,132,2,6,9,1,45,70,0,20,0,4,0
260,swampert,3,259,132,2,6,9,1,45,70,0,20,0,4,0
261,poochyena,3,,133,4,8,3,4,255,70,0,15,0,2,0
262,mightyena,3,261,133,4,8,3,4,127,70,0,15,0,2,0
263,zigzagoon,3,,134,3,8,3,4,255,70,0,15,0,2,0
264,linoone,3,263,134,9,8,3,4,90,70,0,15,0,2,0
265,wurmple,3,,135,8,2,2,4,255,70,0,15,0,2,0
266,silcoon,3,265,135,9,1,2,4,120,70,0,15,0,2,0
267,beautifly,3,266,135,10,13,2,4,45,70,0,15,1,2,0
268,cascoon,3,265,135,7,1,2,4,120,70,0,15,0,2,0
269,dustox,3,268,135,5,13,2,4,45,70,0,15,1,2,0
270,lotad,3,,136,5,14,9,4,255,70,0,15,0,4,0
271,lombre,3,270,136,5,12,9,4,120,70,0,15,0,4,0
272,ludicolo,3,271,136,5,12,9,4,45,70,0,15,1,4,0
273,seedot,3,,137,3,7,2,4,255,70,0,15,0,4,0
274,nuzleaf,3,273,137,3,12,2,4,120,70,0,15,1,4,0
275,shiftry,3,274,137,3,12,2,4,45,70,0,15,1,4,0
276,taillow,3,,138,2,9,3,4,200,70,0,15,0,4,0
277,swellow,3,276,138,2,9,3,4,45,70,0,15,0,4,0
278,wingull,3,,139,9,9,7,4,190,70,0,20,0,2,0
279,pelipper,3,278,139,10,9,7,4,45,70,0,20,0,2,0
280,ralts,3,,140,9,12,8,4,235,35,0,20,0,1,0
281,kirlia,3,280,140,9,12,8,4,120,35,0,20,0,1,0
282,gardevoir,3,281,140,9,12,8,4,45,35,0,20,0,1,0
283,surskit,3,,141,2,14,9,4,200,70,0,15,0,2,0
284,masquerain,3,283,141,2,13,9,4,75,70,0,15,0,2,0
285,shroomish,3,,142,3,7,2,4,255,70,0,15,0,6,0
286,breloom,3,285,142,5,6,2,4,90,70,0,15,0,6,0
287,slakoth,3,,143,3,8,2,4,255,70,0,15,0,1,0
288,vigoroth,3,287,143,9,6,2,4,120,70,0,15,0,1,0
289,slaking,3,288,143,3,12,2,4,45,70,0,15,0,1,0
290,nincada,3,,144,4,14,2,4,255,70,0,15,0,5,0
291,ninjask,3,290,144,10,13,2,4,120,70,0,15,0,5,0
292,shedinja,3,290,144,3,5,2,-1,45,70,0,15,0,5,0
293,whismur,3,,145,6,6,1,4,190,70,0,20,0,4,0
294,loudred,3,293,145,2,6,1,4,120,70,0,20,0,4,0
295,exploud,3,294,145,2,6,1,4,45,70,0,20,0,4,0
296,makuhita,3,,146,10,12,4,2,180,70,0,20,0,6,0
297,hariyama,3,296,146,3,12,4,2,200,70,0,20,0,6,0
298,azurill,3,,90,2,7,9,6,150,70,1,10,0,3,0
299,nosepass,3,,147,4,12,1,4,255,70,0,20,0,2,0
300,skitty,3,,148,6,8,2,6,255,70,0,15,0,3,0
301,delcatty,3,300,148,7,8,2,6,60,70,0,15,0,3,0
302,sableye,3,,149,7,12,1,4,45,35,0,25,0,4,0
303,mawile,3,,150,1,12,1,4,45,70,0,20,0,3,0
304,aron,3,,151,4,8,4,4,180,35,0,35,0,1,0
305,lairon,3,304,151,4,8,4,4,90,35,0,35,0,1,0
306,aggron,3,305,151,4,6,4,4,45,35,0,35,0,1,0
307,meditite,3,,152,2,12,4,4,180,70,0,20,1,2,0
308,medicham,3,307,152,8,12,4,4,90,70,0,20,1,2,0
309,electrike,3,,153,5,8,3,4,120,70,0,20,0,1,0
310,manectric,3,309,153,10,8,3,4,45,70,0,20,0,1,0
311,plusle,3,,154,10,6,3,4,200,70,0,20,0,2,0
312,minun,3,,155,10,6,3,4,200,70,0,20,0,2,0
313,volbeat,3,,156,4,6,2,0,150,70,0,15,0,5,0
314,illumise,3,,157,7,12,2,8,150,70,0,15,0,6,0
315,roselia,3,406,158,5,12,3,4,150,70,0,20,1,4,0
316,gulpin,3,,159,5,4,3,4,225,70,0,20,1,6,0
317,swalot,3,316,159,7,4,3,4,75,70,0,20,1,6,0
318,carvanha,3,,160,8,3,7,4,225,35,0,20,0,1,0
319,sharpedo,3,318,160,2,3,7,4,60,35,0,20,0,1,0
320,wailmer,3,,161,2,3,7,4,125,70,0,40,0,6,0
321,wailord,3,320,161,2,3,7,4,60,70,0,40,0,6,0
322,numel,3,,162,10,8,4,4,255,70,0,20,1,2,0
323,camerupt,3,322,162,8,8,4,4,150,70,0,20,1,2,0
324,torkoal,3,,163,3,8,4,4,90,70,0,20,0,2,0
325,spoink,3,,164,1,4,4,4,255,70,0,20,0,3,0
326,grumpig,3,325,164,7,6,4,4,60,70,0,20,0,3,0
327,spinda,3,,165,3,6,4,4,255,70,0,15,0,3,0
328,trapinch,3,,166,3,14,6,4,255,70,0,20,0,4,0
329,vibrava,3,328,166,5,13,6,4,120,70,0,20,0,4,0
330,flygon,3,329,166,5,9,6,4,45,70,0,20,0,4,0
331,cacnea,3,,167,5,12,6,4,190,35,0,20,0,4,0
332,cacturne,3,331,167,5,12,6,4,60,35,0,20,1,4,0
333,swablu,3,,168,2,9,2,4,255,70,0,20,0,5,0
334,altaria,3,333,168,2,9,2,4,45,70,0,20,0,5,0
335,zangoose,3,,169,9,6,3,4,90,70,0,20,0,5,0
336,seviper,3,,170,1,2,3,4,90,70,0,20,0,6,0
337,lunatone,3,,171,10,1,1,-1,45,70,0,25,0,3,0
338,solrock,3,,172,8,1,1,-1,45,70,0,25,0,3,0
339,barboach,3,,173,4,3,9,4,190,70,0,20,0,2,0
340,whiscash,3,339,173,2,3,9,4,75,70,0,20,0,2,0
341,corphish,3,,174,8,14,9,4,205,70,0,15,0,6,0
342,crawdaunt,3,341,174,8,14,9,4,155,70,0,15,0,6,0
343,baltoy,3,,175,3,4,6,-1,255,70,0,20,0,2,0
344,claydol,3,343,175,1,4,6,-1,90,70,0,20,0,2,0
345,lileep,3,,176,7,5,7,1,45,70,0,30,0,5,0
346,cradily,3,345,176,5,5,7,1,45,70,0,30,0,5,0
347,anorith,3,,177,4,14,9,1,45,70,0,30,0,5,0
348,armaldo,3,347,177,4,6,9,1,45,70,0,30,0,5,0
349,feebas,3,,178,3,3,9,4,255,70,0,20,0,5,0
350,milotic,3,349,178,6,2,9,4,60,70,0,20,1,5,0
351,castform,3,,179,9,1,3,4,45,70,0,25,0,2,1
352,kecleon,3,,180,5,6,2,4,200,70,0,20,0,4,0
353,shuppet,3,,181,1,1,8,4,225,35,0,25,0,3,0
354,banette,3,353,181,1,6,8,4,45,35,0,25,0,3,0
355,duskull,3,,182,1,4,2,4,190,35,0,25,0,3,0
356,dusclops,3,355,182,1,12,2,4,90,35,0,25,0,3,0
357,tropius,3,,183,5,8,2,4,200,70,0,25,0,1,0
358,chimecho,3,433,184,2,4,3,4,45,70,0,25,0,3,0
359,absol,3,,185,9,8,4,4,30,35,0,25,0,4,0
360,wynaut,3,,100,2,6,1,4,125,70,1,20,0,2,0
361,snorunt,3,,186,4,12,1,4,190,70,0,20,0,2,0
362,glalie,3,361,186,4,1,1,4,75,70,0,20,0,2,0
363,spheal,3,,187,2,3,7,4,255,70,0,20,0,4,0
364,sealeo,3,363,187,2,3,7,4,120,70,0,20,0,4,0
365,walrein,3,364,187,2,8,7,4,45,70,0,20,0,4,0
366,clamperl,3,,188,2,1,7,4,255,70,0,20,0,5,0
367,huntail,3,366,188,2,2,7,4,60,70,0,20,0,5,0
368,gorebyss,3,366,188,6,2,7,4,60,70,0,20,0,5,0
369,relicanth,3,,189,4,3,7,1,25,70,0,40,1,1,0
370,luvdisc,3,,190,6,3,7,6,225,70,0,20,0,3,0
371,bagon,3,,191,2,12,6,4,45,35,0,40,0,1,0
372,shelgon,3,371,191,9,8,6,4,45,35,0,40,0,1,0
373,salamence,3,372,191,2,8,6,4,45,35,0,40,0,1,0
374,beldum,3,,192,2,5,6,-1,3,35,0,40,0,1,0
375,metang,3,374,192,2,4,6,-1,3,35,0,40,0,1,0
376,metagross,3,375,192,2,11,6,-1,3,35,0,40,0,1,0
377,regirock,3,,193,3,12,1,-1,3,35,0,80,0,1,0
378,regice,3,,194,2,12,1,-1,3,35,0,80,0,1,0
379,registeel,3,,195,4,12,1,-1,3,35,0,80,0,1,0
380,latias,3,,196,8,9,9,8,3,90,0,120,0,1,0
381,latios,3,,197,2,9,9,0,3,90,0,120,0,1,0
382,kyogre,3,,198,2,3,7,-1,5,0,0,120,0,1,0
383,groudon,3,,199,8,6,6,-1,5,0,0,120,0,1,0
384,rayquaza,3,,200,5,2,5,-1,3,0,0,120,0,1,0
385,jirachi,3,,201,10,12,4,-1,3,100,0,120,0,1,0
386,deoxys,3,,202,8,12,5,-1,3,0,0,120,0,1,1
387,turtwig,4,,203,5,8,,1,45,70,0,20,0,4,0
388,grotle,4,387,203,5,8,,1,45,70,0,20,0,4,0
389,torterra,4,388,203,5,8,,1,45,70,0,20,0,4,0
390,chimchar,4,,204,3,6,,1,45,70,0,20,0,4,0
391,monferno,4,390,204,3,6,,1,45,70,0,20,0,4,0
392,infernape,4,391,204,3,6,,1,45,70,0,20,0,4,0
393,piplup,4,,205,2,12,,1,45,70,0,20,0,4,0
394,prinplup,4,393,205,2,6,,1,45,70,0,20,0,4,0
395,empoleon,4,394,205,2,6,,1,45,70,0,20,0,4,0
396,starly,4,,206,3,9,,4,255,70,0,15,1,4,0
397,staravia,4,396,206,3,9,,4,120,70,0,15,1,4,0
398,staraptor,4,397,206,3,9,,4,45,70,0,15,1,4,0
399,bidoof,4,,207,3,8,,4,255,70,0,15,1,2,0
400,bibarel,4,399,207,3,6,,4,127,70,0,15,1,2,0
401,kricketot,4,,208,8,12,,4,255,70,0,15,1,4,0
402,kricketune,4,401,208,8,13,,4,45,70,0,15,1,4,0
403,shinx,4,,209,2,8,,4,235,70,0,20,1,4,0
404,luxio,4,403,209,2,8,,4,120,100,0,20,1,4,0
405,luxray,4,404,209,2,8,,4,45,70,0,20,1,4,0
406,budew,4,,158,5,12,,4,255,70,1,20,0,4,0
407,roserade,4,315,158,5,12,,4,75,70,0,20,1,4,0
408,cranidos,4,,211,2,6,,1,45,70,0,30,0,5,0
409,rampardos,4,408,211,2,6,,1,45,70,0,30,0,5,0
410,shieldon,4,,212,4,8,,1,45,70,0,30,0,5,0
411,bastiodon,4,410,212,4,8,,1,45,70,0,30,0,5,0
412,burmy,4,,213,4,2,,4,120,70,0,15,0,2,1
413,wormadam,4,412,213,4,2,,8,45,70,0,15,0,2,0
414,mothim,4,412,213,10,13,,0,45,70,0,15,0,2,0
415,combee,4,,214,10,11,,1,120,70,0,15,1,4,0
416,vespiquen,4,415,214,10,9,,8,45,70,0,15,0,4,0
417,pachirisu,4,,215,9,8,,4,200,100,0,10,1,2,0
418,buizel,4,,216,3,8,,4,190,70,0,20,1,2,0
419,floatzel,4,418,216,3,8,,4,75,70,0,20,1,2,0
420,cherubi,4,,217,6,11,,4,190,70,0,20,0,2,0
421,cherrim,4,420,217,6,7,,4,75,70,0,20,0,2,1
422,shellos,4,,218,7,14,,4,190,70,0,20,0,2,0
423,gastrodon,4,422,218,7,14,,4,75,70,0,20,0,2,0
424,ambipom,4,190,93,7,6,,4,45,100,0,20,1,3,0
425,drifloon,4,,219,7,4,,4,125,70,0,30,0,6,0
426,drifblim,4,425,219,7,4,,4,60,70,0,30,0,6,0
427,buneary,4,,220,3,6,,4,190,0,0,20,0,2,0
428,lopunny,4,427,220,3,6,,4,60,140,0,20,0,2,0
429,mismagius,4,200,98,7,1,,4,45,35,0,25,0,3,0
430,honchkrow,4,198,97,1,9,,4,30,35,0,20,0,4,0
431,glameow,4,,221,4,8,,6,190,70,0,20,0,3,0
432,purugly,4,431,221,4,8,,6,75,70,0,20,0,3,0
433,chingling,4,,184,10,12,,4,120,70,1,25,0,3,0
434,stunky,4,,223,7,8,,4,225,70,0,20,0,2,0
435,skuntank,4,434,223,7,8,,4,60,70,0,20,0,2,0
436,bronzor,4,,224,5,1,,-1,255,70,0,20,0,2,0
437,bronzong,4,436,224,5,4,,-1,90,70,0,20,0,2,0
438,bonsly,4,,91,3,7,,4,255,70,1,20,0,2,0
439,mime-jr,4,,57,6,12,,4,145,70,1,25,0,2,0
440,happiny,4,,51,6,12,,8,130,140,1,40,0,3,0
441,chatot,4,,228,1,9,,4,30,35,0,20,0,4,0
442,spiritomb,4,,229,7,5,,4,100,70,0,30,0,2,0
443,gible,4,,230,2,6,,4,45,70,0,40,1,1,0
444,gabite,4,443,230,2,6,,4,45,70,0,40,1,1,0
445,garchomp,4,444,230,2,6,,4,45,70,0,40,1,1,0
446,munchlax,4,,72,1,12,,1,50,70,1,40,0,1,0
447,riolu,4,,232,2,6,,1,75,70,1,25,0,4,0
448,lucario,4,447,232,2,6,,1,45,70,0,25,0,4,0
449,hippopotas,4,,233,3,8,,4,140,70,0,30,1,1,0
450,hippowdon,4,449,233,3,8,,4,60,70,0,30,1,1,0
451,skorupi,4,,234,7,14,,4,120,70,0,20,0,1,0
452,drapion,4,451,234,7,14,,4,45,70,0,20,0,1,0
453,croagunk,4,,235,2,12,,4,140,100,0,10,1,2,0
454,toxicroak,4,453,235,2,12,,4,75,70,0,20,1,2,0
455,carnivine,4,,236,5,10,,4,200,70,0,25,0,1,0
456,finneon,4,,237,2,3,,4,190,70,0,20,1,5,0
457,lumineon,4,456,237,2,3,,4,75,70,0,20,1,5,0
458,mantyke,4,,116,2,9,,4,25,70,1,25,0,1,0
459,snover,4,,239,9,6,,4,120,70,0,20,1,1,0
460,abomasnow,4,459,239,9,6,,4,60,70,0,20,1,1,0
461,weavile,4,215,109,1,6,,4,45,35,0,20,1,4,0
462,magnezone,4,82,34,4,4,,-1,30,70,0,20,0,2,0
463,lickilicky,4,108,48,6,12,,4,30,70,0,20,0,2,0
464,rhyperior,4,112,50,4,6,,4,30,70,0,20,1,1,0
465,tangrowth,4,114,52,2,12,,4,30,70,0,20,1,2,0
466,electivire,4,125,60,10,6,,2,30,70,0,25,0,2,0
467,magmortar,4,126,61,8,6,,2,30,70,0,25,0,2,0
468,togekiss,4,176,87,9,9,,1,30,70,0,10,0,3,0
469,yanmega,4,193,95,5,13,,4,30,70,0,20,0,2,0
470,leafeon,4,133,67,5,8,,1,45,35,0,35,0,2,0
471,glaceon,4,133,67,2,8,,1,45,35,0,35,0,2,0
472,gliscor,4,207,104,7,9,,4,30,70,0,20,0,4,0
473,mamoswine,4,221,112,3,8,,4,50,70,0,20,1,1,0
474,porygon-z,4,233,68,8,4,,-1,30,70,0,20,0,2,0
475,gallade,4,281,140,9,12,,0,45,35,0,20,0,1,0
476,probopass,4,299,147,4,11,,4,60,70,0,20,0,2,0
477,dusknoir,4,356,182,1,4,,4,45,35,0,25,0,3,0
478,froslass,4,361,186,9,4,,8,75,70,0,20,0,2,0
479,rotom,4,,240,8,1,,-1,45,70,0,20,0,2,1
480,uxie,4,,241,10,6,,-1,3,140,0,80,0,1,0
481,mesprit,4,,242,6,6,,-1,3,140,0,80,0,1,0
482,azelf,4,,243,2,6,,-1,3,140,0,80,0,1,0
483,dialga,4,,244,9,8,,-1,30,0,0,120,0,1,0
484,palkia,4,,245,7,6,,-1,30,0,0,120,0,1,0
485,heatran,4,,246,3,8,,4,3,100,0,10,0,1,0
486,regigigas,4,,247,9,12,,-1,3,0,0,120,0,1,0
487,giratina,4,,248,1,10,,-1,3,0,0,120,0,1,1
488,cresselia,4,,249,10,14,,8,3,100,0,120,0,1,0
489,phione,4,,250,2,4,,-1,30,70,0,40,0,1,0
490,manaphy,4,,250,2,12,,-1,3,70,0,10,0,1,0
491,darkrai,4,,252,1,12,,-1,3,0,0,120,0,1,0
492,shaymin,4,,253,5,8,,-1,45,100,0,120,0,4,1
493,arceus,4,,254,4,8,,-1,3,0,0,120,0,1,1
494,victini,5,,255,10,12,,-1,3,100,0,120,0,1,0
495,snivy,5,,256,5,6,,1,45,70,0,20,0,4,0
496,servine,5,495,256,5,6,,1,45,70,0,20,0,4,0
497,serperior,5,496,256,5,2,,1,45,70,0,20,0,4,0
498,tepig,5,,257,8,8,,1,45,70,0,20,0,4,0
499,pignite,5,498,257,8,6,,1,45,70,0,20,0,4,0
500,emboar,5,499,257,8,6,,1,45,70,0,20,0,4,0
501,oshawott,5,,258,2,6,,1,45,70,0,20,0,4,0
502,dewott,5,501,258,2,6,,1,45,70,0,20,0,4,0
503,samurott,5,502,258,2,8,,1,45,70,0,20,0,4,0
504,patrat,5,,259,3,8,,4,255,70,0,15,0,2,0
505,watchog,5,504,259,3,6,,4,255,70,0,20,0,2,0
506,lillipup,5,,260,3,8,,4,255,70,0,15,0,4,0
507,herdier,5,506,260,4,8,,4,120,70,0,15,0,4,0
508,stoutland,5,507,260,4,8,,4,45,70,0,15,0,4,0
509,purrloin,5,,261,7,8,,4,255,70,0,20,0,2,0
510,liepard,5,509,261,7,8,,4,90,70,0,20,0,2,0
511,pansage,5,,262,5,6,,1,190,70,0,20,0,2,0
512,simisage,5,511,262,5,6,,1,75,70,0,20,0,2,0
513,pansear,5,,263,8,6,,1,190,70,0,20,0,2,0
514,simisear,5,513,263,8,6,,1,75,70,0,20,0,2,0
515,panpour,5,,264,2,6,,1,190,70,0,20,0,2,0
516,simipour,5,515,264,2,6,,1,75,70,0,20,0,2,0
517,munna,5,,265,6,8,,4,190,70,0,10,0,3,0
518,musharna,5,517,265,6,12,,4,75,70,0,10,0,3,0
519,pidove,5,,266,4,9,,4,255,70,0,15,0,4,0
520,tranquill,5,519,266,4,9,,4,120,70,0,15,0,4,0
521,unfezant,5,520,266,4,9,,4,45,70,0,15,1,4,0
522,blitzle,5,,267,1,8,,4,190,70,0,20,0,2,0
523,zebstrika,5,522,267,1,8,,4,75,70,0,20,0,2,0
524,roggenrola,5,,268,2,7,,4,255,70,0,15,0,4,0
525,boldore,5,524,268,2,10,,4,120,70,0,15,0,4,0
526,gigalith,5,525,268,2,10,,4,45,70,0,15,0,4,0
527,woobat,5,,269,2,9,,4,190,70,0,15,0,2,0
528,swoobat,5,527,269,2,9,,4,45,70,0,15,0,2,0
529,drilbur,5,,270,4,6,,4,120,70,0,20,0,2,0
530,excadrill,5,529,270,4,12,,4,60,70,0,20,0,2,0
531,audino,5,,271,6,6,,4,255,70,0,20,0,3,0
532,timburr,5,,272,4,12,,2,180,70,0,20,0,4,0
533,gurdurr,5,532,272,4,12,,2,90,70,0,20,0,4,0
534,conkeldurr,5,533,272,3,12,,2,45,70,0,20,0,4,0
535,tympole,5,,273,2,3,,4,255,70,0,20,0,4,0
536,palpitoad,5,535,273,2,6,,4,120,70,0,20,0,4,0
537,seismitoad,5,536,273,2,12,,4,45,70,0,20,0,4,0
538,throh,5,,274,8,12,,0,45,70,0,20,0,2,0
539,sawk,5,,275,2,12,,0,45,70,0,20,0,2,0
540,sewaddle,5,,276,10,14,,4,255,70,0,15,0,4,0
541,swadloon,5,540,276,5,4,,4,120,70,0,15,0,4,0
542,leavanny,5,541,276,10,12,,4,45,70,0,15,0,4,0
543,venipede,5,,277,8,14,,4,255,70,0,15,0,4,0
544,whirlipede,5,543,277,4,1,,4,120,70,0,15,0,4,0
545,scolipede,5,544,277,8,14,,4,45,70,0,20,0,4,0
546,cottonee,5,,278,5,1,,4,190,70,0,20,0,2,0
547,whimsicott,5,546,278,5,12,,4,75,70,0,20,0,2,0
548,petilil,5,,279,5,5,,8,190,70,0,20,0,2,0
549,lilligant,5,548,279,5,5,,8,75,70,0,20,0,2,0
550,basculin,5,,280,5,3,,4,25,70,0,40,0,2,0
551,sandile,5,,281,3,8,,4,180,70,0,20,0,4,0
552,krokorok,5,551,281,3,8,,4,90,70,0,20,0,4,0
553,krookodile,5,552,281,8,6,,4,45,70,0,20,0,4,0
554,darumaka,5,,282,8,12,,4,120,70,0,20,0,4,0
555,darmanitan,5,554,282,8,8,,4,60,70,0,20,0,4,1
556,maractus,5,,283,5,5,,4,255,70,0,20,0,2,0
557,dwebble,5,,284,8,14,,4,190,70,0,20,0,2,0
558,crustle,5,557,284,8,14,,4,75,70,0,20,0,2,0
559,scraggy,5,,285,10,6,,4,180,35,0,15,0,2,0
560,scrafty,5,559,285,8,6,,4,90,70,0,15,0,2,0
561,sigilyph,5,,286,1,9,,4,45,70,0,20,0,2,0
562,yamask,5,,287,1,4,,4,190,70,0,25,0,2,0
563,cofagrigus,5,562,287,10,5,,4,90,70,0,25,0,2,0
564,tirtouga,5,,288,2,8,,1,45,70,0,30,0,2,0
565,carracosta,5,564,288,2,6,,1,45,70,0,30,0,2,0
566,archen,5,,289,10,9,,1,45,70,0,30,0,2,0
567,archeops,5,566,289,10,9,,1,45,70,0,30,0,2,0
568,trubbish,5,,290,5,12,,4,190,70,0,20,0,2,0
569,garbodor,5,568,290,5,12,,4,60,70,0,20,0,2,0
570,zorua,5,,291,4,8,,1,75,70,0,25,0,4,0
571,zoroark,5,570,291,4,6,,1,45,70,0,20,0,4,0
572,minccino,5,,292,4,8,,6,255,70,0,15,0,3,0
573,cinccino,5,572,292,4,8,,6,60,70,0,15,0,3,0
574,gothita,5,,293,7,12,,6,200,70,0,20,0,4,0
575,gothorita,5,574,293,7,12,,6,100,70,0,20,0,4,0
576,gothitelle,5,575,293,7,12,,6,50,70,0,20,0,4,0
577,solosis,5,,294,5,1,,4,200,70,0,20,0,4,0
578,duosion,5,577,294,5,1,,4,100,70,0,20,0,4,0
579,reuniclus,5,578,294,5,4,,4,50,70,0,20,0,4,0
580,ducklett,5,,295,2,9,,4,190,70,0,20,0,2,0
581,swanna,5,580,295,9,9,,4,45,70,0,20,0,2,0
582,vanillite,5,,296,9,5,,4,255,70,0,20,0,1,0
583,vanillish,5,582,296,9,5,,4,120,70,0,20,0,1,0
584,vanilluxe,5,583,296,9,11,,4,45,70,0,20,0,1,0
585,deerling,5,,297,10,8,,4,190,70,0,20,0,2,1
586,sawsbuck,5,585,297,3,8,,4,75,70,0,20,0,2,1
587,emolga,5,,298,9,8,,4,200,70,0,20,0,2,0
588,karrablast,5,,299,2,12,,4,200,70,0,15,0,2,0
589,escavalier,5,588,299,4,4,,4,75,70,0,15,0,2,0
590,foongus,5,,300,9,4,,4,190,70,0,20,0,2,0
591,amoonguss,5,590,300,9,4,,4,75,70,0,20,0,2,0
592,frillish,5,,301,9,10,,4,190,70,0,20,1,2,0
593,jellicent,5,592,301,9,10,,4,60,70,0,20,1,2,0
594,alomomola,5,,302,6,3,,4,75,70,0,40,0,3,0
595,joltik,5,,303,10,14,,4,190,70,0,20,0,2,0
596,galvantula,5,595,303,10,14,,4,75,70,0,20,0,2,0
597,ferroseed,5,,304,4,1,,4,255,70,0,20,0,2,0
598,ferrothorn,5,597,304,4,10,,4,90,70,0,20,0,2,0
599,klink,5,,305,4,11,,-1,130,70,0,20,0,4,0
600,klang,5,599,305,4,11,,-1,60,70,0,20,0,4,0
601,klinklang,5,600,305,4,11,,-1,30,70,0,20,0,4,0
602,tynamo,5,,306,9,3,,4,190,70,0,20,0,1,0
603,eelektrik,5,602,306,2,3,,4,60,70,0,20,0,1,0
604,eelektross,5,603,306,2,3,,4,30,70,0,20,0,1,0
605,elgyem,5,,307,2,6,,4,255,70,0,20,0,2,0
606,beheeyem,5,605,307,3,12,,4,90,70,0,20,0,2,0
607,litwick,5,,308,9,5,,4,190,70,0,20,0,4,0
608,lampent,5,607,308,1,4,,4,90,70,0,20,0,4,0
609,chandelure,5,608,308,1,4,,4,45,70,0,20,0,4,0
610,axew,5,,309,5,6,,4,75,35,0,40,0,1,0
611,fraxure,5,610,309,5,6,,4,60,35,0,40,0,1,0
612,haxorus,5,611,309,10,6,,4,45,35,0,40,0,1,0
613,cubchoo,5,,310,9,6,,4,120,70,0,20,0,2,0
614,beartic,5,613,310,9,8,,4,60,70,0,20,0,2,0
615,cryogonal,5,,311,2,1,,-1,25,70,0,25,0,2,0
616,shelmet,5,,312,8,1,,4,200,70,0,15,0,2,0
617,accelgor,5,616,312,8,4,,4,75,70,0,15,0,2,0
618,stunfisk,5,,313,3,3,,4,75,70,0,20,0,2,0
619,mienfoo,5,,314,10,6,,4,180,70,0,25,0,4,0
620,mienshao,5,619,314,7,6,,4,45,70,0,25,0,4,0
621,druddigon,5,,315,8,6,,4,45,70,0,30,0,2,0
622,golett,5,,316,5,12,,-1,190,70,0,25,0,2,0
623,golurk,5,622,316,5,12,,-1,90,70,0,25,0,2,0
624,pawniard,5,,317,8,12,,4,120,35,0,20,0,2,0
625,bisharp,5,624,317,8,12,,4,45,35,0,20,0,2,0
626,bouffalant,5,,318,3,8,,4,45,70,0,20,0,2,0
627,rufflet,5,,319,9,9,,0,190,70,0,20,0,1,0
628,braviary,5,627,319,8,9,,0,60,70,0,20,0,1,0
629,vullaby,5,,320,3,9,,8,190,35,0,20,0,1,0
630,mandibuzz,5,629,320,3,9,,8,60,35,0,20,0,1,0
631,heatmor,5,,321,8,6,,4,90,70,0,20,0,2,0
632,durant,5,,322,4,14,,4,90,70,0,20,0,2,0
633,deino,5,,323,2,8,,4,45,35,0,40,0,1,0
634,zweilous,5,633,323,2,8,,4,45,35,0,40,0,1,0
635,hydreigon,5,634,323,2,6,,4,45,35,0,40,0,1,0
636,larvesta,5,,324,9,14,,4,45,70,0,40,0,1,0
637,volcarona,5,636,324,9,13,,4,15,70,0,40,0,1,0
638,cobalion,5,,325,2,8,,-1,3,35,0,80,0,1,0
639,terrakion,5,,326,4,8,,-1,3,35,0,80,0,1,0
640,virizion,5,,327,5,8,,-1,3,35,0,80,0,1,0
641,tornadus,5,,328,5,4,,0,3,90,0,120,0,1,0
642,thundurus,5,,329,2,4,,0,3,90,0,120,0,1,0
643,reshiram,5,,330,9,9,,-1,45,0,0,120,0,1,0
644,zekrom,5,,331,1,6,,-1,45,0,0,120,0,1,0
645,landorus,5,,332,3,4,,0,3,90,0,120,0,1,0
646,kyurem,5,,333,4,6,,-1,3,0,0,120,0,1,0
647,keldeo,5,,334,10,8,,-1,3,35,0,80,0,1,0
648,meloetta,5,,335,9,12,,-1,3,100,0,120,0,1,1
649,genesect,5,,336,7,12,,-1,3,0,0,120,0,1,1
1 id identifier generation_id evolves_from_species_id evolution_chain_id color_id shape_id habitat_id gender_rate capture_rate base_happiness is_baby hatch_counter has_gender_differences growth_rate_id forms_switchable
2 1 bulbasaur 1 1 5 8 3 1 45 70 0 20 0 4 0
3 2 ivysaur 1 1 1 5 8 3 1 45 70 0 20 0 4 0
4 3 venusaur 1 2 1 5 8 3 1 45 70 0 20 1 4 0
5 4 charmander 1 2 8 6 4 1 45 70 0 20 0 4 0
6 5 charmeleon 1 4 2 8 6 4 1 45 70 0 20 0 4 0
7 6 charizard 1 5 2 8 6 4 1 45 70 0 20 0 4 0
8 7 squirtle 1 3 2 6 9 1 45 70 0 20 0 4 0
9 8 wartortle 1 7 3 2 6 9 1 45 70 0 20 0 4 0
10 9 blastoise 1 8 3 2 6 9 1 45 70 0 20 0 4 0
11 10 caterpie 1 4 5 2 2 4 255 70 0 15 0 2 0
12 11 metapod 1 10 4 5 2 2 4 120 70 0 15 0 2 0
13 12 butterfree 1 11 4 9 13 2 4 45 70 0 15 1 2 0
14 13 weedle 1 5 3 2 2 4 255 70 0 15 0 2 0
15 14 kakuna 1 13 5 10 2 2 4 120 70 0 15 0 2 0
16 15 beedrill 1 14 5 10 13 2 4 45 70 0 15 0 2 0
17 16 pidgey 1 6 3 9 2 4 255 70 0 15 0 4 0
18 17 pidgeotto 1 16 6 3 9 2 4 120 70 0 15 0 4 0
19 18 pidgeot 1 17 6 3 9 2 4 45 70 0 15 0 4 0
20 19 rattata 1 7 7 8 3 4 255 70 0 15 1 2 0
21 20 raticate 1 19 7 3 8 3 4 127 70 0 15 1 2 0
22 21 spearow 1 8 3 9 6 4 255 70 0 15 0 2 0
23 22 fearow 1 21 8 3 9 6 4 90 70 0 15 0 2 0
24 23 ekans 1 9 7 2 3 4 255 70 0 20 0 2 0
25 24 arbok 1 23 9 7 2 3 4 90 70 0 20 0 2 0
26 25 pikachu 1 172 10 10 8 2 4 190 70 0 10 1 2 0
27 26 raichu 1 25 10 10 6 2 4 75 70 0 10 1 2 0
28 27 sandshrew 1 11 10 6 6 4 255 70 0 20 0 2 0
29 28 sandslash 1 27 11 10 6 6 4 90 70 0 20 0 2 0
30 29 nidoran-f 1 12 2 8 3 8 235 70 0 20 0 4 0
31 30 nidorina 1 29 12 2 8 3 8 120 70 0 20 0 4 0
32 31 nidoqueen 1 30 12 2 6 3 8 45 70 0 20 0 4 0
33 32 nidoran-m 1 13 7 8 3 0 235 70 0 20 0 4 0
34 33 nidorino 1 32 13 7 8 3 0 120 70 0 20 0 4 0
35 34 nidoking 1 33 13 7 6 3 0 45 70 0 20 0 4 0
36 35 clefairy 1 173 14 6 6 4 6 150 140 0 10 0 3 0
37 36 clefable 1 35 14 6 6 4 6 25 140 0 10 0 3 0
38 37 vulpix 1 15 3 8 3 6 190 70 0 20 0 2 0
39 38 ninetales 1 37 15 10 8 3 6 75 70 0 20 0 2 0
40 39 jigglypuff 1 174 16 6 12 3 6 170 70 0 10 0 3 0
41 40 wigglytuff 1 39 16 6 12 3 6 50 70 0 10 0 3 0
42 41 zubat 1 17 7 9 1 4 255 70 0 15 1 2 0
43 42 golbat 1 41 17 7 9 1 4 90 70 0 15 1 2 0
44 43 oddish 1 18 2 7 3 4 255 70 0 20 0 4 0
45 44 gloom 1 43 18 2 12 3 4 120 70 0 20 1 4 0
46 45 vileplume 1 44 18 8 12 3 4 45 70 0 20 1 4 0
47 46 paras 1 19 8 14 2 4 190 70 0 20 0 2 0
48 47 parasect 1 46 19 8 14 2 4 75 70 0 20 0 2 0
49 48 venonat 1 20 7 12 2 4 190 70 0 20 0 2 0
50 49 venomoth 1 48 20 7 13 2 4 75 70 0 20 0 2 0
51 50 diglett 1 21 3 5 1 4 255 70 0 20 0 2 0
52 51 dugtrio 1 50 21 3 11 1 4 50 70 0 20 0 2 0
53 52 meowth 1 22 10 8 8 4 255 70 0 20 0 2 0
54 53 persian 1 52 22 10 8 8 4 90 70 0 20 0 2 0
55 54 psyduck 1 23 10 6 9 4 190 70 0 20 0 2 0
56 55 golduck 1 54 23 2 6 9 4 75 70 0 20 0 2 0
57 56 mankey 1 24 3 6 4 4 190 70 0 20 0 2 0
58 57 primeape 1 56 24 3 6 4 4 75 70 0 20 0 2 0
59 58 growlithe 1 25 3 8 3 2 190 70 0 20 0 1 0
60 59 arcanine 1 58 25 3 8 3 2 75 70 0 20 0 1 0
61 60 poliwag 1 26 2 7 9 4 255 70 0 20 0 4 0
62 61 poliwhirl 1 60 26 2 12 9 4 120 70 0 20 0 4 0
63 62 poliwrath 1 61 26 2 12 9 4 45 70 0 20 0 4 0
64 63 abra 1 27 3 6 8 2 200 70 0 20 0 4 0
65 64 kadabra 1 63 27 3 6 8 2 100 70 0 20 1 4 0
66 65 alakazam 1 64 27 3 12 8 2 50 70 0 20 1 4 0
67 66 machop 1 28 4 6 4 2 180 70 0 20 0 4 0
68 67 machoke 1 66 28 4 12 4 2 90 70 0 20 0 4 0
69 68 machamp 1 67 28 4 12 4 2 45 70 0 20 0 4 0
70 69 bellsprout 1 29 5 12 2 4 255 70 0 20 0 4 0
71 70 weepinbell 1 69 29 5 5 2 4 120 70 0 20 0 4 0
72 71 victreebel 1 70 29 5 5 2 4 45 70 0 20 0 4 0
73 72 tentacool 1 30 2 10 7 4 190 70 0 20 0 1 0
74 73 tentacruel 1 72 30 2 10 7 4 60 70 0 20 0 1 0
75 74 geodude 1 31 3 4 4 4 255 70 0 15 0 4 0
76 75 graveler 1 74 31 3 12 4 4 120 70 0 15 0 4 0
77 76 golem 1 75 31 3 12 4 4 45 70 0 15 0 4 0
78 77 ponyta 1 32 10 8 3 4 190 70 0 20 0 2 0
79 78 rapidash 1 77 32 10 8 3 4 60 70 0 20 0 2 0
80 79 slowpoke 1 33 6 8 9 4 190 70 0 20 0 2 0
81 80 slowbro 1 79 33 6 6 9 4 75 70 0 20 0 2 0
82 81 magnemite 1 34 4 4 6 -1 190 70 0 20 0 2 0
83 82 magneton 1 81 34 4 11 6 -1 60 70 0 20 0 2 0
84 83 farfetchd 1 35 3 9 3 4 45 70 0 20 0 2 0
85 84 doduo 1 36 3 7 3 4 190 70 0 20 1 2 0
86 85 dodrio 1 84 36 3 7 3 4 45 70 0 20 1 2 0
87 86 seel 1 37 9 3 7 4 190 70 0 20 0 2 0
88 87 dewgong 1 86 37 9 3 7 4 75 70 0 20 0 2 0
89 88 grimer 1 38 7 4 8 4 190 70 0 20 0 2 0
90 89 muk 1 88 38 7 4 8 4 75 70 0 20 0 2 0
91 90 shellder 1 39 7 1 7 4 190 70 0 20 0 1 0
92 91 cloyster 1 90 39 7 1 7 4 60 70 0 20 0 1 0
93 92 gastly 1 40 7 1 1 4 190 70 0 20 0 4 0
94 93 haunter 1 92 40 7 4 1 4 90 70 0 20 0 4 0
95 94 gengar 1 93 40 7 6 1 4 45 70 0 20 0 4 0
96 95 onix 1 41 4 2 1 4 45 70 0 25 0 2 0
97 96 drowzee 1 42 10 12 3 4 190 70 0 20 0 2 0
98 97 hypno 1 96 42 10 12 3 4 75 70 0 20 1 2 0
99 98 krabby 1 43 8 14 9 4 225 70 0 20 0 2 0
100 99 kingler 1 98 43 8 14 9 4 60 70 0 20 0 2 0
101 100 voltorb 1 44 8 1 8 -1 190 70 0 20 0 2 0
102 101 electrode 1 100 44 8 1 8 -1 60 70 0 20 0 2 0
103 102 exeggcute 1 45 6 11 2 4 90 70 0 20 0 1 0
104 103 exeggutor 1 102 45 10 7 2 4 45 70 0 20 0 1 0
105 104 cubone 1 46 3 6 4 4 190 70 0 20 0 2 0
106 105 marowak 1 104 46 3 6 4 4 75 70 0 20 0 2 0
107 106 hitmonlee 1 236 47 3 12 8 0 45 70 0 25 0 2 0
108 107 hitmonchan 1 236 47 3 12 8 0 45 70 0 25 0 2 0
109 108 lickitung 1 48 6 6 3 4 45 70 0 20 0 2 0
110 109 koffing 1 49 7 1 8 4 190 70 0 20 0 2 0
111 110 weezing 1 109 49 7 11 8 4 60 70 0 20 0 2 0
112 111 rhyhorn 1 50 4 8 6 4 120 70 0 20 1 1 0
113 112 rhydon 1 111 50 4 6 6 4 60 70 0 20 1 1 0
114 113 chansey 1 440 51 6 6 8 8 30 140 0 40 0 3 0
115 114 tangela 1 52 2 7 3 4 45 70 0 20 0 2 0
116 115 kangaskhan 1 53 3 6 3 8 45 70 0 20 0 2 0
117 116 horsea 1 54 2 5 7 4 225 70 0 20 0 2 0
118 117 seadra 1 116 54 2 5 7 4 75 70 0 20 0 2 0
119 118 goldeen 1 55 8 3 9 4 225 70 0 20 1 2 0
120 119 seaking 1 118 55 8 3 9 4 60 70 0 20 1 2 0
121 120 staryu 1 56 3 5 7 -1 225 70 0 20 0 1 0
122 121 starmie 1 120 56 7 5 7 -1 60 70 0 20 0 1 0
123 122 mr-mime 1 439 57 6 12 8 4 45 70 0 25 0 2 0
124 123 scyther 1 58 5 13 3 4 45 70 0 25 1 2 0
125 124 jynx 1 238 59 8 12 8 8 45 70 0 25 0 2 0
126 125 electabuzz 1 239 60 10 6 3 2 45 70 0 25 0 2 0
127 126 magmar 1 240 61 8 6 4 2 45 70 0 25 0 2 0
128 127 pinsir 1 62 3 12 2 4 45 70 0 25 0 1 0
129 128 tauros 1 63 3 8 3 0 45 70 0 20 0 1 0
130 129 magikarp 1 64 8 3 9 4 255 70 0 5 1 1 0
131 130 gyarados 1 129 64 2 2 9 4 45 70 0 5 1 1 0
132 131 lapras 1 65 2 3 7 4 45 70 0 40 0 1 0
133 132 ditto 1 66 7 1 8 -1 35 70 0 20 0 2 0
134 133 eevee 1 67 3 8 8 1 45 70 0 35 0 2 0
135 134 vaporeon 1 133 67 2 8 8 1 45 70 0 35 0 2 0
136 135 jolteon 1 133 67 10 8 8 1 45 70 0 35 0 2 0
137 136 flareon 1 133 67 8 8 8 1 45 70 0 35 0 2 0
138 137 porygon 1 68 6 7 8 -1 45 70 0 20 0 2 0
139 138 omanyte 1 69 2 10 7 1 45 70 0 30 0 2 0
140 139 omastar 1 138 69 2 10 7 1 45 70 0 30 0 2 0
141 140 kabuto 1 70 3 14 7 1 45 70 0 30 0 2 0
142 141 kabutops 1 140 70 3 6 7 1 45 70 0 30 0 2 0
143 142 aerodactyl 1 71 7 9 4 1 45 70 0 35 0 1 0
144 143 snorlax 1 446 72 1 12 4 1 25 70 0 40 0 1 0
145 144 articuno 1 73 2 9 5 -1 3 35 0 80 0 1 0
146 145 zapdos 1 74 10 9 5 -1 3 35 0 80 0 1 0
147 146 moltres 1 75 10 9 5 -1 3 35 0 80 0 1 0
148 147 dratini 1 76 2 2 9 4 45 35 0 40 0 1 0
149 148 dragonair 1 147 76 2 2 9 4 45 35 0 40 0 1 0
150 149 dragonite 1 148 76 3 6 9 4 45 35 0 40 0 1 0
151 150 mewtwo 1 77 7 6 5 -1 3 0 0 120 0 1 0
152 151 mew 1 78 6 6 5 -1 45 100 0 120 0 4 0
153 152 chikorita 2 79 5 8 3 1 45 70 0 20 0 4 0
154 153 bayleef 2 152 79 5 8 3 1 45 70 0 20 0 4 0
155 154 meganium 2 153 79 5 8 3 1 45 70 0 20 1 4 0
156 155 cyndaquil 2 80 10 12 3 1 45 70 0 20 0 4 0
157 156 quilava 2 155 80 10 8 3 1 45 70 0 20 0 4 0
158 157 typhlosion 2 156 80 10 8 3 1 45 70 0 20 0 4 0
159 158 totodile 2 81 2 6 9 1 45 70 0 20 0 4 0
160 159 croconaw 2 158 81 2 6 9 1 45 70 0 20 0 4 0
161 160 feraligatr 2 159 81 2 6 9 1 45 70 0 20 0 4 0
162 161 sentret 2 82 3 8 3 4 255 70 0 15 0 2 0
163 162 furret 2 161 82 3 8 3 4 90 70 0 15 0 2 0
164 163 hoothoot 2 83 3 9 2 4 255 70 0 15 0 2 0
165 164 noctowl 2 163 83 3 9 2 4 90 70 0 15 0 2 0
166 165 ledyba 2 84 8 9 2 4 255 70 0 15 1 3 0
167 166 ledian 2 165 84 8 9 2 4 90 70 0 15 1 3 0
168 167 spinarak 2 85 5 14 2 4 255 70 0 15 0 3 0
169 168 ariados 2 167 85 8 14 2 4 90 70 0 15 0 3 0
170 169 crobat 2 42 17 7 13 1 4 90 70 0 15 0 2 0
171 170 chinchou 2 86 2 3 7 4 190 70 0 20 0 1 0
172 171 lanturn 2 170 86 2 3 7 4 75 70 0 20 0 1 0
173 172 pichu 2 10 10 8 2 4 190 70 1 10 0 2 0
174 173 cleffa 2 14 6 6 4 6 150 140 1 10 0 3 0
175 174 igglybuff 2 16 6 12 3 6 170 70 1 10 0 3 0
176 175 togepi 2 87 9 12 2 1 190 70 1 10 0 3 0
177 176 togetic 2 175 87 9 12 2 1 75 70 0 10 0 3 0
178 177 natu 2 88 5 9 2 4 190 70 0 20 0 2 0
179 178 xatu 2 177 88 5 9 2 4 75 70 0 20 1 2 0
180 179 mareep 2 89 9 8 3 4 235 70 0 20 0 4 0
181 180 flaaffy 2 179 89 6 6 3 4 120 70 0 20 0 4 0
182 181 ampharos 2 180 89 10 6 3 4 45 70 0 20 0 4 0
183 182 bellossom 2 44 18 5 12 3 4 45 70 0 20 0 4 0
184 183 marill 2 298 90 2 6 9 4 190 70 0 10 0 3 0
185 184 azumarill 2 183 90 2 6 9 4 75 70 0 10 0 3 0
186 185 sudowoodo 2 438 91 3 12 2 4 65 70 0 20 1 2 0
187 186 politoed 2 61 26 5 12 9 4 45 70 0 20 1 4 0
188 187 hoppip 2 92 6 6 3 4 255 70 0 20 0 4 0
189 188 skiploom 2 187 92 5 6 3 4 120 70 0 20 0 4 0
190 189 jumpluff 2 188 92 2 6 3 4 45 70 0 20 0 4 0
191 190 aipom 2 93 7 6 2 4 45 70 0 20 1 3 0
192 191 sunkern 2 94 10 1 3 4 235 70 0 20 0 4 0
193 192 sunflora 2 191 94 10 12 3 4 120 70 0 20 0 4 0
194 193 yanma 2 95 8 13 2 4 75 70 0 20 0 2 0
195 194 wooper 2 96 2 7 9 4 255 70 0 20 1 2 0
196 195 quagsire 2 194 96 2 6 9 4 90 70 0 20 1 2 0
197 196 espeon 2 133 67 7 8 8 1 45 70 0 35 0 2 0
198 197 umbreon 2 133 67 1 8 8 1 45 35 0 35 0 2 0
199 198 murkrow 2 97 1 9 2 4 30 35 0 20 1 4 0
200 199 slowking 2 79 33 6 6 9 4 70 70 0 20 0 2 0
201 200 misdreavus 2 98 4 1 1 4 45 35 0 25 0 3 0
202 201 unown 2 99 1 1 5 -1 225 70 0 40 0 2 0
203 202 wobbuffet 2 360 100 2 5 1 4 45 70 0 20 1 2 0
204 203 girafarig 2 101 10 8 3 4 60 70 0 20 1 2 0
205 204 pineco 2 102 4 1 2 4 190 70 0 20 0 2 0
206 205 forretress 2 204 102 7 1 2 4 75 70 0 20 0 2 0
207 206 dunsparce 2 103 10 2 1 4 190 70 0 20 0 2 0
208 207 gligar 2 104 7 9 4 4 60 70 0 20 1 4 0
209 208 steelix 2 95 41 4 2 1 4 25 70 0 25 1 2 0
210 209 snubbull 2 105 6 12 8 6 190 70 0 20 0 3 0
211 210 granbull 2 209 105 7 6 8 6 75 70 0 20 0 3 0
212 211 qwilfish 2 106 4 3 7 4 45 70 0 20 0 2 0
213 212 scizor 2 123 58 8 13 3 4 25 70 0 25 1 2 0
214 213 shuckle 2 107 10 14 4 4 190 70 0 20 0 4 0
215 214 heracross 2 108 2 12 2 4 45 70 0 25 1 1 0
216 215 sneasel 2 109 1 6 2 4 60 35 0 20 1 4 0
217 216 teddiursa 2 110 3 6 4 4 120 70 0 20 0 2 0
218 217 ursaring 2 216 110 3 6 4 4 60 70 0 20 1 2 0
219 218 slugma 2 111 8 2 4 4 190 70 0 20 0 2 0
220 219 magcargo 2 218 111 8 2 4 4 75 70 0 20 0 2 0
221 220 swinub 2 112 3 8 1 4 225 70 0 20 0 1 0
222 221 piloswine 2 220 112 3 8 1 4 75 70 0 20 1 1 0
223 222 corsola 2 113 6 14 7 6 60 70 0 20 0 3 0
224 223 remoraid 2 114 4 3 7 4 190 70 0 20 0 2 0
225 224 octillery 2 223 114 8 10 7 4 75 70 0 20 1 2 0
226 225 delibird 2 115 8 9 4 4 45 70 0 20 0 3 0
227 226 mantine 2 458 116 7 9 7 4 25 70 0 25 0 1 0
228 227 skarmory 2 117 4 9 6 4 25 70 0 25 0 1 0
229 228 houndour 2 118 1 8 6 4 120 35 0 20 0 1 0
230 229 houndoom 2 228 118 1 8 6 4 45 35 0 20 1 1 0
231 230 kingdra 2 117 54 2 5 7 4 45 70 0 20 0 2 0
232 231 phanpy 2 119 2 8 6 4 120 70 0 20 0 2 0
233 232 donphan 2 231 119 4 8 6 4 60 70 0 20 1 2 0
234 233 porygon2 2 137 68 8 7 8 -1 45 70 0 20 0 2 0
235 234 stantler 2 120 3 8 2 4 45 70 0 20 0 1 0
236 235 smeargle 2 121 9 6 8 4 45 70 0 20 0 3 0
237 236 tyrogue 2 47 7 12 8 0 75 70 1 25 0 2 0
238 237 hitmontop 2 236 47 3 6 8 0 45 70 0 25 0 2 0
239 238 smoochum 2 59 6 12 8 8 45 70 1 25 0 2 0
240 239 elekid 2 60 10 12 3 2 45 70 1 25 0 2 0
241 240 magby 2 61 8 6 4 2 45 70 1 25 0 2 0
242 241 miltank 2 122 6 6 3 8 45 70 0 20 0 1 0
243 242 blissey 2 113 51 6 12 8 8 30 140 0 40 0 3 0
244 243 raikou 2 123 10 8 3 -1 3 35 0 80 0 1 0
245 244 entei 2 124 3 8 3 -1 3 35 0 80 0 1 0
246 245 suicune 2 125 2 8 3 -1 3 35 0 80 0 1 0
247 246 larvitar 2 126 5 6 4 4 45 35 0 40 0 1 0
248 247 pupitar 2 246 126 4 2 4 4 45 35 0 40 0 1 0
249 248 tyranitar 2 247 126 5 6 4 4 45 35 0 40 0 1 0
250 249 lugia 2 127 9 9 5 -1 3 0 0 120 0 1 0
251 250 ho-oh 2 128 8 9 5 -1 3 0 0 120 0 1 0
252 251 celebi 2 129 5 12 2 -1 45 100 0 120 0 4 0
253 252 treecko 3 130 5 6 2 1 45 70 0 20 0 4 0
254 253 grovyle 3 252 130 5 6 2 1 45 70 0 20 0 4 0
255 254 sceptile 3 253 130 5 6 2 1 45 70 0 20 0 4 0
256 255 torchic 3 131 8 7 3 1 45 70 0 20 1 4 0
257 256 combusken 3 255 131 8 6 3 1 45 70 0 20 1 4 0
258 257 blaziken 3 256 131 8 6 3 1 45 70 0 20 1 4 0
259 258 mudkip 3 132 2 8 9 1 45 70 0 20 0 4 0
260 259 marshtomp 3 258 132 2 6 9 1 45 70 0 20 0 4 0
261 260 swampert 3 259 132 2 6 9 1 45 70 0 20 0 4 0
262 261 poochyena 3 133 4 8 3 4 255 70 0 15 0 2 0
263 262 mightyena 3 261 133 4 8 3 4 127 70 0 15 0 2 0
264 263 zigzagoon 3 134 3 8 3 4 255 70 0 15 0 2 0
265 264 linoone 3 263 134 9 8 3 4 90 70 0 15 0 2 0
266 265 wurmple 3 135 8 2 2 4 255 70 0 15 0 2 0
267 266 silcoon 3 265 135 9 1 2 4 120 70 0 15 0 2 0
268 267 beautifly 3 266 135 10 13 2 4 45 70 0 15 1 2 0
269 268 cascoon 3 265 135 7 1 2 4 120 70 0 15 0 2 0
270 269 dustox 3 268 135 5 13 2 4 45 70 0 15 1 2 0
271 270 lotad 3 136 5 14 9 4 255 70 0 15 0 4 0
272 271 lombre 3 270 136 5 12 9 4 120 70 0 15 0 4 0
273 272 ludicolo 3 271 136 5 12 9 4 45 70 0 15 1 4 0
274 273 seedot 3 137 3 7 2 4 255 70 0 15 0 4 0
275 274 nuzleaf 3 273 137 3 12 2 4 120 70 0 15 1 4 0
276 275 shiftry 3 274 137 3 12 2 4 45 70 0 15 1 4 0
277 276 taillow 3 138 2 9 3 4 200 70 0 15 0 4 0
278 277 swellow 3 276 138 2 9 3 4 45 70 0 15 0 4 0
279 278 wingull 3 139 9 9 7 4 190 70 0 20 0 2 0
280 279 pelipper 3 278 139 10 9 7 4 45 70 0 20 0 2 0
281 280 ralts 3 140 9 12 8 4 235 35 0 20 0 1 0
282 281 kirlia 3 280 140 9 12 8 4 120 35 0 20 0 1 0
283 282 gardevoir 3 281 140 9 12 8 4 45 35 0 20 0 1 0
284 283 surskit 3 141 2 14 9 4 200 70 0 15 0 2 0
285 284 masquerain 3 283 141 2 13 9 4 75 70 0 15 0 2 0
286 285 shroomish 3 142 3 7 2 4 255 70 0 15 0 6 0
287 286 breloom 3 285 142 5 6 2 4 90 70 0 15 0 6 0
288 287 slakoth 3 143 3 8 2 4 255 70 0 15 0 1 0
289 288 vigoroth 3 287 143 9 6 2 4 120 70 0 15 0 1 0
290 289 slaking 3 288 143 3 12 2 4 45 70 0 15 0 1 0
291 290 nincada 3 144 4 14 2 4 255 70 0 15 0 5 0
292 291 ninjask 3 290 144 10 13 2 4 120 70 0 15 0 5 0
293 292 shedinja 3 290 144 3 5 2 -1 45 70 0 15 0 5 0
294 293 whismur 3 145 6 6 1 4 190 70 0 20 0 4 0
295 294 loudred 3 293 145 2 6 1 4 120 70 0 20 0 4 0
296 295 exploud 3 294 145 2 6 1 4 45 70 0 20 0 4 0
297 296 makuhita 3 146 10 12 4 2 180 70 0 20 0 6 0
298 297 hariyama 3 296 146 3 12 4 2 200 70 0 20 0 6 0
299 298 azurill 3 90 2 7 9 6 150 70 1 10 0 3 0
300 299 nosepass 3 147 4 12 1 4 255 70 0 20 0 2 0
301 300 skitty 3 148 6 8 2 6 255 70 0 15 0 3 0
302 301 delcatty 3 300 148 7 8 2 6 60 70 0 15 0 3 0
303 302 sableye 3 149 7 12 1 4 45 35 0 25 0 4 0
304 303 mawile 3 150 1 12 1 4 45 70 0 20 0 3 0
305 304 aron 3 151 4 8 4 4 180 35 0 35 0 1 0
306 305 lairon 3 304 151 4 8 4 4 90 35 0 35 0 1 0
307 306 aggron 3 305 151 4 6 4 4 45 35 0 35 0 1 0
308 307 meditite 3 152 2 12 4 4 180 70 0 20 1 2 0
309 308 medicham 3 307 152 8 12 4 4 90 70 0 20 1 2 0
310 309 electrike 3 153 5 8 3 4 120 70 0 20 0 1 0
311 310 manectric 3 309 153 10 8 3 4 45 70 0 20 0 1 0
312 311 plusle 3 154 10 6 3 4 200 70 0 20 0 2 0
313 312 minun 3 155 10 6 3 4 200 70 0 20 0 2 0
314 313 volbeat 3 156 4 6 2 0 150 70 0 15 0 5 0
315 314 illumise 3 157 7 12 2 8 150 70 0 15 0 6 0
316 315 roselia 3 406 158 5 12 3 4 150 70 0 20 1 4 0
317 316 gulpin 3 159 5 4 3 4 225 70 0 20 1 6 0
318 317 swalot 3 316 159 7 4 3 4 75 70 0 20 1 6 0
319 318 carvanha 3 160 8 3 7 4 225 35 0 20 0 1 0
320 319 sharpedo 3 318 160 2 3 7 4 60 35 0 20 0 1 0
321 320 wailmer 3 161 2 3 7 4 125 70 0 40 0 6 0
322 321 wailord 3 320 161 2 3 7 4 60 70 0 40 0 6 0
323 322 numel 3 162 10 8 4 4 255 70 0 20 1 2 0
324 323 camerupt 3 322 162 8 8 4 4 150 70 0 20 1 2 0
325 324 torkoal 3 163 3 8 4 4 90 70 0 20 0 2 0
326 325 spoink 3 164 1 4 4 4 255 70 0 20 0 3 0
327 326 grumpig 3 325 164 7 6 4 4 60 70 0 20 0 3 0
328 327 spinda 3 165 3 6 4 4 255 70 0 15 0 3 0
329 328 trapinch 3 166 3 14 6 4 255 70 0 20 0 4 0
330 329 vibrava 3 328 166 5 13 6 4 120 70 0 20 0 4 0
331 330 flygon 3 329 166 5 9 6 4 45 70 0 20 0 4 0
332 331 cacnea 3 167 5 12 6 4 190 35 0 20 0 4 0
333 332 cacturne 3 331 167 5 12 6 4 60 35 0 20 1 4 0
334 333 swablu 3 168 2 9 2 4 255 70 0 20 0 5 0
335 334 altaria 3 333 168 2 9 2 4 45 70 0 20 0 5 0
336 335 zangoose 3 169 9 6 3 4 90 70 0 20 0 5 0
337 336 seviper 3 170 1 2 3 4 90 70 0 20 0 6 0
338 337 lunatone 3 171 10 1 1 -1 45 70 0 25 0 3 0
339 338 solrock 3 172 8 1 1 -1 45 70 0 25 0 3 0
340 339 barboach 3 173 4 3 9 4 190 70 0 20 0 2 0
341 340 whiscash 3 339 173 2 3 9 4 75 70 0 20 0 2 0
342 341 corphish 3 174 8 14 9 4 205 70 0 15 0 6 0
343 342 crawdaunt 3 341 174 8 14 9 4 155 70 0 15 0 6 0
344 343 baltoy 3 175 3 4 6 -1 255 70 0 20 0 2 0
345 344 claydol 3 343 175 1 4 6 -1 90 70 0 20 0 2 0
346 345 lileep 3 176 7 5 7 1 45 70 0 30 0 5 0
347 346 cradily 3 345 176 5 5 7 1 45 70 0 30 0 5 0
348 347 anorith 3 177 4 14 9 1 45 70 0 30 0 5 0
349 348 armaldo 3 347 177 4 6 9 1 45 70 0 30 0 5 0
350 349 feebas 3 178 3 3 9 4 255 70 0 20 0 5 0
351 350 milotic 3 349 178 6 2 9 4 60 70 0 20 1 5 0
352 351 castform 3 179 9 1 3 4 45 70 0 25 0 2 1
353 352 kecleon 3 180 5 6 2 4 200 70 0 20 0 4 0
354 353 shuppet 3 181 1 1 8 4 225 35 0 25 0 3 0
355 354 banette 3 353 181 1 6 8 4 45 35 0 25 0 3 0
356 355 duskull 3 182 1 4 2 4 190 35 0 25 0 3 0
357 356 dusclops 3 355 182 1 12 2 4 90 35 0 25 0 3 0
358 357 tropius 3 183 5 8 2 4 200 70 0 25 0 1 0
359 358 chimecho 3 433 184 2 4 3 4 45 70 0 25 0 3 0
360 359 absol 3 185 9 8 4 4 30 35 0 25 0 4 0
361 360 wynaut 3 100 2 6 1 4 125 70 1 20 0 2 0
362 361 snorunt 3 186 4 12 1 4 190 70 0 20 0 2 0
363 362 glalie 3 361 186 4 1 1 4 75 70 0 20 0 2 0
364 363 spheal 3 187 2 3 7 4 255 70 0 20 0 4 0
365 364 sealeo 3 363 187 2 3 7 4 120 70 0 20 0 4 0
366 365 walrein 3 364 187 2 8 7 4 45 70 0 20 0 4 0
367 366 clamperl 3 188 2 1 7 4 255 70 0 20 0 5 0
368 367 huntail 3 366 188 2 2 7 4 60 70 0 20 0 5 0
369 368 gorebyss 3 366 188 6 2 7 4 60 70 0 20 0 5 0
370 369 relicanth 3 189 4 3 7 1 25 70 0 40 1 1 0
371 370 luvdisc 3 190 6 3 7 6 225 70 0 20 0 3 0
372 371 bagon 3 191 2 12 6 4 45 35 0 40 0 1 0
373 372 shelgon 3 371 191 9 8 6 4 45 35 0 40 0 1 0
374 373 salamence 3 372 191 2 8 6 4 45 35 0 40 0 1 0
375 374 beldum 3 192 2 5 6 -1 3 35 0 40 0 1 0
376 375 metang 3 374 192 2 4 6 -1 3 35 0 40 0 1 0
377 376 metagross 3 375 192 2 11 6 -1 3 35 0 40 0 1 0
378 377 regirock 3 193 3 12 1 -1 3 35 0 80 0 1 0
379 378 regice 3 194 2 12 1 -1 3 35 0 80 0 1 0
380 379 registeel 3 195 4 12 1 -1 3 35 0 80 0 1 0
381 380 latias 3 196 8 9 9 8 3 90 0 120 0 1 0
382 381 latios 3 197 2 9 9 0 3 90 0 120 0 1 0
383 382 kyogre 3 198 2 3 7 -1 5 0 0 120 0 1 0
384 383 groudon 3 199 8 6 6 -1 5 0 0 120 0 1 0
385 384 rayquaza 3 200 5 2 5 -1 3 0 0 120 0 1 0
386 385 jirachi 3 201 10 12 4 -1 3 100 0 120 0 1 0
387 386 deoxys 3 202 8 12 5 -1 3 0 0 120 0 1 1
388 387 turtwig 4 203 5 8 1 45 70 0 20 0 4 0
389 388 grotle 4 387 203 5 8 1 45 70 0 20 0 4 0
390 389 torterra 4 388 203 5 8 1 45 70 0 20 0 4 0
391 390 chimchar 4 204 3 6 1 45 70 0 20 0 4 0
392 391 monferno 4 390 204 3 6 1 45 70 0 20 0 4 0
393 392 infernape 4 391 204 3 6 1 45 70 0 20 0 4 0
394 393 piplup 4 205 2 12 1 45 70 0 20 0 4 0
395 394 prinplup 4 393 205 2 6 1 45 70 0 20 0 4 0
396 395 empoleon 4 394 205 2 6 1 45 70 0 20 0 4 0
397 396 starly 4 206 3 9 4 255 70 0 15 1 4 0
398 397 staravia 4 396 206 3 9 4 120 70 0 15 1 4 0
399 398 staraptor 4 397 206 3 9 4 45 70 0 15 1 4 0
400 399 bidoof 4 207 3 8 4 255 70 0 15 1 2 0
401 400 bibarel 4 399 207 3 6 4 127 70 0 15 1 2 0
402 401 kricketot 4 208 8 12 4 255 70 0 15 1 4 0
403 402 kricketune 4 401 208 8 13 4 45 70 0 15 1 4 0
404 403 shinx 4 209 2 8 4 235 70 0 20 1 4 0
405 404 luxio 4 403 209 2 8 4 120 100 0 20 1 4 0
406 405 luxray 4 404 209 2 8 4 45 70 0 20 1 4 0
407 406 budew 4 158 5 12 4 255 70 1 20 0 4 0
408 407 roserade 4 315 158 5 12 4 75 70 0 20 1 4 0
409 408 cranidos 4 211 2 6 1 45 70 0 30 0 5 0
410 409 rampardos 4 408 211 2 6 1 45 70 0 30 0 5 0
411 410 shieldon 4 212 4 8 1 45 70 0 30 0 5 0
412 411 bastiodon 4 410 212 4 8 1 45 70 0 30 0 5 0
413 412 burmy 4 213 4 2 4 120 70 0 15 0 2 1
414 413 wormadam 4 412 213 4 2 8 45 70 0 15 0 2 0
415 414 mothim 4 412 213 10 13 0 45 70 0 15 0 2 0
416 415 combee 4 214 10 11 1 120 70 0 15 1 4 0
417 416 vespiquen 4 415 214 10 9 8 45 70 0 15 0 4 0
418 417 pachirisu 4 215 9 8 4 200 100 0 10 1 2 0
419 418 buizel 4 216 3 8 4 190 70 0 20 1 2 0
420 419 floatzel 4 418 216 3 8 4 75 70 0 20 1 2 0
421 420 cherubi 4 217 6 11 4 190 70 0 20 0 2 0
422 421 cherrim 4 420 217 6 7 4 75 70 0 20 0 2 1
423 422 shellos 4 218 7 14 4 190 70 0 20 0 2 0
424 423 gastrodon 4 422 218 7 14 4 75 70 0 20 0 2 0
425 424 ambipom 4 190 93 7 6 4 45 100 0 20 1 3 0
426 425 drifloon 4 219 7 4 4 125 70 0 30 0 6 0
427 426 drifblim 4 425 219 7 4 4 60 70 0 30 0 6 0
428 427 buneary 4 220 3 6 4 190 0 0 20 0 2 0
429 428 lopunny 4 427 220 3 6 4 60 140 0 20 0 2 0
430 429 mismagius 4 200 98 7 1 4 45 35 0 25 0 3 0
431 430 honchkrow 4 198 97 1 9 4 30 35 0 20 0 4 0
432 431 glameow 4 221 4 8 6 190 70 0 20 0 3 0
433 432 purugly 4 431 221 4 8 6 75 70 0 20 0 3 0
434 433 chingling 4 184 10 12 4 120 70 1 25 0 3 0
435 434 stunky 4 223 7 8 4 225 70 0 20 0 2 0
436 435 skuntank 4 434 223 7 8 4 60 70 0 20 0 2 0
437 436 bronzor 4 224 5 1 -1 255 70 0 20 0 2 0
438 437 bronzong 4 436 224 5 4 -1 90 70 0 20 0 2 0
439 438 bonsly 4 91 3 7 4 255 70 1 20 0 2 0
440 439 mime-jr 4 57 6 12 4 145 70 1 25 0 2 0
441 440 happiny 4 51 6 12 8 130 140 1 40 0 3 0
442 441 chatot 4 228 1 9 4 30 35 0 20 0 4 0
443 442 spiritomb 4 229 7 5 4 100 70 0 30 0 2 0
444 443 gible 4 230 2 6 4 45 70 0 40 1 1 0
445 444 gabite 4 443 230 2 6 4 45 70 0 40 1 1 0
446 445 garchomp 4 444 230 2 6 4 45 70 0 40 1 1 0
447 446 munchlax 4 72 1 12 1 50 70 1 40 0 1 0
448 447 riolu 4 232 2 6 1 75 70 1 25 0 4 0
449 448 lucario 4 447 232 2 6 1 45 70 0 25 0 4 0
450 449 hippopotas 4 233 3 8 4 140 70 0 30 1 1 0
451 450 hippowdon 4 449 233 3 8 4 60 70 0 30 1 1 0
452 451 skorupi 4 234 7 14 4 120 70 0 20 0 1 0
453 452 drapion 4 451 234 7 14 4 45 70 0 20 0 1 0
454 453 croagunk 4 235 2 12 4 140 100 0 10 1 2 0
455 454 toxicroak 4 453 235 2 12 4 75 70 0 20 1 2 0
456 455 carnivine 4 236 5 10 4 200 70 0 25 0 1 0
457 456 finneon 4 237 2 3 4 190 70 0 20 1 5 0
458 457 lumineon 4 456 237 2 3 4 75 70 0 20 1 5 0
459 458 mantyke 4 116 2 9 4 25 70 1 25 0 1 0
460 459 snover 4 239 9 6 4 120 70 0 20 1 1 0
461 460 abomasnow 4 459 239 9 6 4 60 70 0 20 1 1 0
462 461 weavile 4 215 109 1 6 4 45 35 0 20 1 4 0
463 462 magnezone 4 82 34 4 4 -1 30 70 0 20 0 2 0
464 463 lickilicky 4 108 48 6 12 4 30 70 0 20 0 2 0
465 464 rhyperior 4 112 50 4 6 4 30 70 0 20 1 1 0
466 465 tangrowth 4 114 52 2 12 4 30 70 0 20 1 2 0
467 466 electivire 4 125 60 10 6 2 30 70 0 25 0 2 0
468 467 magmortar 4 126 61 8 6 2 30 70 0 25 0 2 0
469 468 togekiss 4 176 87 9 9 1 30 70 0 10 0 3 0
470 469 yanmega 4 193 95 5 13 4 30 70 0 20 0 2 0
471 470 leafeon 4 133 67 5 8 1 45 35 0 35 0 2 0
472 471 glaceon 4 133 67 2 8 1 45 35 0 35 0 2 0
473 472 gliscor 4 207 104 7 9 4 30 70 0 20 0 4 0
474 473 mamoswine 4 221 112 3 8 4 50 70 0 20 1 1 0
475 474 porygon-z 4 233 68 8 4 -1 30 70 0 20 0 2 0
476 475 gallade 4 281 140 9 12 0 45 35 0 20 0 1 0
477 476 probopass 4 299 147 4 11 4 60 70 0 20 0 2 0
478 477 dusknoir 4 356 182 1 4 4 45 35 0 25 0 3 0
479 478 froslass 4 361 186 9 4 8 75 70 0 20 0 2 0
480 479 rotom 4 240 8 1 -1 45 70 0 20 0 2 1
481 480 uxie 4 241 10 6 -1 3 140 0 80 0 1 0
482 481 mesprit 4 242 6 6 -1 3 140 0 80 0 1 0
483 482 azelf 4 243 2 6 -1 3 140 0 80 0 1 0
484 483 dialga 4 244 9 8 -1 30 0 0 120 0 1 0
485 484 palkia 4 245 7 6 -1 30 0 0 120 0 1 0
486 485 heatran 4 246 3 8 4 3 100 0 10 0 1 0
487 486 regigigas 4 247 9 12 -1 3 0 0 120 0 1 0
488 487 giratina 4 248 1 10 -1 3 0 0 120 0 1 1
489 488 cresselia 4 249 10 14 8 3 100 0 120 0 1 0
490 489 phione 4 250 2 4 -1 30 70 0 40 0 1 0
491 490 manaphy 4 250 2 12 -1 3 70 0 10 0 1 0
492 491 darkrai 4 252 1 12 -1 3 0 0 120 0 1 0
493 492 shaymin 4 253 5 8 -1 45 100 0 120 0 4 1
494 493 arceus 4 254 4 8 -1 3 0 0 120 0 1 1
495 494 victini 5 255 10 12 -1 3 100 0 120 0 1 0
496 495 snivy 5 256 5 6 1 45 70 0 20 0 4 0
497 496 servine 5 495 256 5 6 1 45 70 0 20 0 4 0
498 497 serperior 5 496 256 5 2 1 45 70 0 20 0 4 0
499 498 tepig 5 257 8 8 1 45 70 0 20 0 4 0
500 499 pignite 5 498 257 8 6 1 45 70 0 20 0 4 0
501 500 emboar 5 499 257 8 6 1 45 70 0 20 0 4 0
502 501 oshawott 5 258 2 6 1 45 70 0 20 0 4 0
503 502 dewott 5 501 258 2 6 1 45 70 0 20 0 4 0
504 503 samurott 5 502 258 2 8 1 45 70 0 20 0 4 0
505 504 patrat 5 259 3 8 4 255 70 0 15 0 2 0
506 505 watchog 5 504 259 3 6 4 255 70 0 20 0 2 0
507 506 lillipup 5 260 3 8 4 255 70 0 15 0 4 0
508 507 herdier 5 506 260 4 8 4 120 70 0 15 0 4 0
509 508 stoutland 5 507 260 4 8 4 45 70 0 15 0 4 0
510 509 purrloin 5 261 7 8 4 255 70 0 20 0 2 0
511 510 liepard 5 509 261 7 8 4 90 70 0 20 0 2 0
512 511 pansage 5 262 5 6 1 190 70 0 20 0 2 0
513 512 simisage 5 511 262 5 6 1 75 70 0 20 0 2 0
514 513 pansear 5 263 8 6 1 190 70 0 20 0 2 0
515 514 simisear 5 513 263 8 6 1 75 70 0 20 0 2 0
516 515 panpour 5 264 2 6 1 190 70 0 20 0 2 0
517 516 simipour 5 515 264 2 6 1 75 70 0 20 0 2 0
518 517 munna 5 265 6 8 4 190 70 0 10 0 3 0
519 518 musharna 5 517 265 6 12 4 75 70 0 10 0 3 0
520 519 pidove 5 266 4 9 4 255 70 0 15 0 4 0
521 520 tranquill 5 519 266 4 9 4 120 70 0 15 0 4 0
522 521 unfezant 5 520 266 4 9 4 45 70 0 15 1 4 0
523 522 blitzle 5 267 1 8 4 190 70 0 20 0 2 0
524 523 zebstrika 5 522 267 1 8 4 75 70 0 20 0 2 0
525 524 roggenrola 5 268 2 7 4 255 70 0 15 0 4 0
526 525 boldore 5 524 268 2 10 4 120 70 0 15 0 4 0
527 526 gigalith 5 525 268 2 10 4 45 70 0 15 0 4 0
528 527 woobat 5 269 2 9 4 190 70 0 15 0 2 0
529 528 swoobat 5 527 269 2 9 4 45 70 0 15 0 2 0
530 529 drilbur 5 270 4 6 4 120 70 0 20 0 2 0
531 530 excadrill 5 529 270 4 12 4 60 70 0 20 0 2 0
532 531 audino 5 271 6 6 4 255 70 0 20 0 3 0
533 532 timburr 5 272 4 12 2 180 70 0 20 0 4 0
534 533 gurdurr 5 532 272 4 12 2 90 70 0 20 0 4 0
535 534 conkeldurr 5 533 272 3 12 2 45 70 0 20 0 4 0
536 535 tympole 5 273 2 3 4 255 70 0 20 0 4 0
537 536 palpitoad 5 535 273 2 6 4 120 70 0 20 0 4 0
538 537 seismitoad 5 536 273 2 12 4 45 70 0 20 0 4 0
539 538 throh 5 274 8 12 0 45 70 0 20 0 2 0
540 539 sawk 5 275 2 12 0 45 70 0 20 0 2 0
541 540 sewaddle 5 276 10 14 4 255 70 0 15 0 4 0
542 541 swadloon 5 540 276 5 4 4 120 70 0 15 0 4 0
543 542 leavanny 5 541 276 10 12 4 45 70 0 15 0 4 0
544 543 venipede 5 277 8 14 4 255 70 0 15 0 4 0
545 544 whirlipede 5 543 277 4 1 4 120 70 0 15 0 4 0
546 545 scolipede 5 544 277 8 14 4 45 70 0 20 0 4 0
547 546 cottonee 5 278 5 1 4 190 70 0 20 0 2 0
548 547 whimsicott 5 546 278 5 12 4 75 70 0 20 0 2 0
549 548 petilil 5 279 5 5 8 190 70 0 20 0 2 0
550 549 lilligant 5 548 279 5 5 8 75 70 0 20 0 2 0
551 550 basculin 5 280 5 3 4 25 70 0 40 0 2 0
552 551 sandile 5 281 3 8 4 180 70 0 20 0 4 0
553 552 krokorok 5 551 281 3 8 4 90 70 0 20 0 4 0
554 553 krookodile 5 552 281 8 6 4 45 70 0 20 0 4 0
555 554 darumaka 5 282 8 12 4 120 70 0 20 0 4 0
556 555 darmanitan 5 554 282 8 8 4 60 70 0 20 0 4 1
557 556 maractus 5 283 5 5 4 255 70 0 20 0 2 0
558 557 dwebble 5 284 8 14 4 190 70 0 20 0 2 0
559 558 crustle 5 557 284 8 14 4 75 70 0 20 0 2 0
560 559 scraggy 5 285 10 6 4 180 35 0 15 0 2 0
561 560 scrafty 5 559 285 8 6 4 90 70 0 15 0 2 0
562 561 sigilyph 5 286 1 9 4 45 70 0 20 0 2 0
563 562 yamask 5 287 1 4 4 190 70 0 25 0 2 0
564 563 cofagrigus 5 562 287 10 5 4 90 70 0 25 0 2 0
565 564 tirtouga 5 288 2 8 1 45 70 0 30 0 2 0
566 565 carracosta 5 564 288 2 6 1 45 70 0 30 0 2 0
567 566 archen 5 289 10 9 1 45 70 0 30 0 2 0
568 567 archeops 5 566 289 10 9 1 45 70 0 30 0 2 0
569 568 trubbish 5 290 5 12 4 190 70 0 20 0 2 0
570 569 garbodor 5 568 290 5 12 4 60 70 0 20 0 2 0
571 570 zorua 5 291 4 8 1 75 70 0 25 0 4 0
572 571 zoroark 5 570 291 4 6 1 45 70 0 20 0 4 0
573 572 minccino 5 292 4 8 6 255 70 0 15 0 3 0
574 573 cinccino 5 572 292 4 8 6 60 70 0 15 0 3 0
575 574 gothita 5 293 7 12 6 200 70 0 20 0 4 0
576 575 gothorita 5 574 293 7 12 6 100 70 0 20 0 4 0
577 576 gothitelle 5 575 293 7 12 6 50 70 0 20 0 4 0
578 577 solosis 5 294 5 1 4 200 70 0 20 0 4 0
579 578 duosion 5 577 294 5 1 4 100 70 0 20 0 4 0
580 579 reuniclus 5 578 294 5 4 4 50 70 0 20 0 4 0
581 580 ducklett 5 295 2 9 4 190 70 0 20 0 2 0
582 581 swanna 5 580 295 9 9 4 45 70 0 20 0 2 0
583 582 vanillite 5 296 9 5 4 255 70 0 20 0 1 0
584 583 vanillish 5 582 296 9 5 4 120 70 0 20 0 1 0
585 584 vanilluxe 5 583 296 9 11 4 45 70 0 20 0 1 0
586 585 deerling 5 297 10 8 4 190 70 0 20 0 2 1
587 586 sawsbuck 5 585 297 3 8 4 75 70 0 20 0 2 1
588 587 emolga 5 298 9 8 4 200 70 0 20 0 2 0
589 588 karrablast 5 299 2 12 4 200 70 0 15 0 2 0
590 589 escavalier 5 588 299 4 4 4 75 70 0 15 0 2 0
591 590 foongus 5 300 9 4 4 190 70 0 20 0 2 0
592 591 amoonguss 5 590 300 9 4 4 75 70 0 20 0 2 0
593 592 frillish 5 301 9 10 4 190 70 0 20 1 2 0
594 593 jellicent 5 592 301 9 10 4 60 70 0 20 1 2 0
595 594 alomomola 5 302 6 3 4 75 70 0 40 0 3 0
596 595 joltik 5 303 10 14 4 190 70 0 20 0 2 0
597 596 galvantula 5 595 303 10 14 4 75 70 0 20 0 2 0
598 597 ferroseed 5 304 4 1 4 255 70 0 20 0 2 0
599 598 ferrothorn 5 597 304 4 10 4 90 70 0 20 0 2 0
600 599 klink 5 305 4 11 -1 130 70 0 20 0 4 0
601 600 klang 5 599 305 4 11 -1 60 70 0 20 0 4 0
602 601 klinklang 5 600 305 4 11 -1 30 70 0 20 0 4 0
603 602 tynamo 5 306 9 3 4 190 70 0 20 0 1 0
604 603 eelektrik 5 602 306 2 3 4 60 70 0 20 0 1 0
605 604 eelektross 5 603 306 2 3 4 30 70 0 20 0 1 0
606 605 elgyem 5 307 2 6 4 255 70 0 20 0 2 0
607 606 beheeyem 5 605 307 3 12 4 90 70 0 20 0 2 0
608 607 litwick 5 308 9 5 4 190 70 0 20 0 4 0
609 608 lampent 5 607 308 1 4 4 90 70 0 20 0 4 0
610 609 chandelure 5 608 308 1 4 4 45 70 0 20 0 4 0
611 610 axew 5 309 5 6 4 75 35 0 40 0 1 0
612 611 fraxure 5 610 309 5 6 4 60 35 0 40 0 1 0
613 612 haxorus 5 611 309 10 6 4 45 35 0 40 0 1 0
614 613 cubchoo 5 310 9 6 4 120 70 0 20 0 2 0
615 614 beartic 5 613 310 9 8 4 60 70 0 20 0 2 0
616 615 cryogonal 5 311 2 1 -1 25 70 0 25 0 2 0
617 616 shelmet 5 312 8 1 4 200 70 0 15 0 2 0
618 617 accelgor 5 616 312 8 4 4 75 70 0 15 0 2 0
619 618 stunfisk 5 313 3 3 4 75 70 0 20 0 2 0
620 619 mienfoo 5 314 10 6 4 180 70 0 25 0 4 0
621 620 mienshao 5 619 314 7 6 4 45 70 0 25 0 4 0
622 621 druddigon 5 315 8 6 4 45 70 0 30 0 2 0
623 622 golett 5 316 5 12 -1 190 70 0 25 0 2 0
624 623 golurk 5 622 316 5 12 -1 90 70 0 25 0 2 0
625 624 pawniard 5 317 8 12 4 120 35 0 20 0 2 0
626 625 bisharp 5 624 317 8 12 4 45 35 0 20 0 2 0
627 626 bouffalant 5 318 3 8 4 45 70 0 20 0 2 0
628 627 rufflet 5 319 9 9 0 190 70 0 20 0 1 0
629 628 braviary 5 627 319 8 9 0 60 70 0 20 0 1 0
630 629 vullaby 5 320 3 9 8 190 35 0 20 0 1 0
631 630 mandibuzz 5 629 320 3 9 8 60 35 0 20 0 1 0
632 631 heatmor 5 321 8 6 4 90 70 0 20 0 2 0
633 632 durant 5 322 4 14 4 90 70 0 20 0 2 0
634 633 deino 5 323 2 8 4 45 35 0 40 0 1 0
635 634 zweilous 5 633 323 2 8 4 45 35 0 40 0 1 0
636 635 hydreigon 5 634 323 2 6 4 45 35 0 40 0 1 0
637 636 larvesta 5 324 9 14 4 45 70 0 40 0 1 0
638 637 volcarona 5 636 324 9 13 4 15 70 0 40 0 1 0
639 638 cobalion 5 325 2 8 -1 3 35 0 80 0 1 0
640 639 terrakion 5 326 4 8 -1 3 35 0 80 0 1 0
641 640 virizion 5 327 5 8 -1 3 35 0 80 0 1 0
642 641 tornadus 5 328 5 4 0 3 90 0 120 0 1 0
643 642 thundurus 5 329 2 4 0 3 90 0 120 0 1 0
644 643 reshiram 5 330 9 9 -1 45 0 0 120 0 1 0
645 644 zekrom 5 331 1 6 -1 45 0 0 120 0 1 0
646 645 landorus 5 332 3 4 0 3 90 0 120 0 1 0
647 646 kyurem 5 333 4 6 -1 3 0 0 120 0 1 0
648 647 keldeo 5 334 10 8 -1 3 35 0 80 0 1 0
649 648 meloetta 5 335 9 12 -1 3 100 0 120 0 1 1
650 649 genesect 5 336 7 12 -1 3 0 0 120 0 1 1

View file

@ -0,0 +1 @@
pokemon_species_id,local_language_id,flavor_summary
1 pokemon_species_id local_language_id flavor_summary

View file

@ -1,4 +1,4 @@
pokemon_id,version_id,language_id,flavor_text
species_id,version_id,language_id,flavor_text
1,1,9,"A strange seed was
planted on its
back at birth. The plant sprouts
Can't render this file because it is too large.

View file

@ -1,4 +1,4 @@
pokemon_id,local_language_id,name,species
pokemon_species_id,local_language_id,name,genus
1,1,フシギダネ,
1,2,Fushigidane,
1,3,이상해씨,
@ -4081,21 +4081,3 @@ pokemon_id,local_language_id,name,species
649,5,Genesect,
649,6,Genesect,
649,9,Genesect,Paleozoic
10001,9,Deoxys,DNA
10002,9,Deoxys,DNA
10003,9,Deoxys,DNA
10004,9,Wormadam,Bagworm
10005,9,Wormadam,Bagworm
10006,9,Shaymin,Gratitude
10007,9,Giratina,Renegade
10008,9,Rotom,Plasma
10009,9,Rotom,Plasma
10010,9,Rotom,Plasma
10011,9,Rotom,Plasma
10012,9,Rotom,Plasma
10013,9,Castform,Weather
10014,9,Castform,Weather
10015,9,Castform,Weather
10016,9,Basculin,Hostile
10017,9,Darmanitan,Blazing
10018,9,Meloetta,Melody
1 pokemon_id pokemon_species_id local_language_id name species genus
2 1 1 フシギダネ
3 1 2 Fushigidane
4 1 3 이상해씨
4081 649 5 Genesect
4082 649 6 Genesect
4083 649 9 Genesect Paleozoic
10001 9 Deoxys DNA
10002 9 Deoxys DNA
10003 9 Deoxys DNA
10004 9 Wormadam Bagworm
10005 9 Wormadam Bagworm
10006 9 Shaymin Gratitude
10007 9 Giratina Renegade
10008 9 Rotom Plasma
10009 9 Rotom Plasma
10010 9 Rotom Plasma
10011 9 Rotom Plasma
10012 9 Rotom Plasma
10013 9 Castform Weather
10014 9 Castform Weather
10015 9 Castform Weather
10016 9 Basculin Hostile
10017 9 Darmanitan Blazing
10018 9 Meloetta Melody

View file

@ -0,0 +1,20 @@
pokemon_species_id,local_language_id,form_description
172,9,"Spiky-eared Pichu can only be received by taking the shiny Pichu from an official promotion to []{pokemon:celebi}'s shrine in []{location:ilex-forest}. Spiky-eared Pichu is always female, cannot evolve, and cannot be taken into the Wi-Fi Club or the Union Room, but is otherwise a normal Pichu."
201,9,Forms only affect appearance. A form is determined at random before a wild encounter and cannot be changed.
351,9,"Form changes along with type to match the [weather]{mechanic:weather} in battle, due to []{ability:forecast}. Castform is always in its normal form outside of battle, regardless of weather."
386,9,"Forms have different stats and movepools. In Generation III, Deoxys's form depends on the game: Normal Forme in Ruby and Sapphire, Attack Forme in FireRed, Defense Forme in LeafGreen, and Speed Forme in Emerald. In Generation IV, every form exists: form is preserved when transferring via []{location:pal-park}, and meteorites in the southeast corner of []{location:veilstone-city} or at the west end of []{location:unova-route-3} can be used to switch between forms."
412,9,"Forms only affect appearance, although they become permanent upon evolution. Wild and newly-hatched Burmy are always in a Plant Cloak. Burmy's cloak changes to match the terrain after a battle it participated in: Plant Cloak by default; Sandy Cloak in sandy or rocky areas, such as beaches, caves, and trails; and Trash Cloak in buildings."
413,9,"Forms have different stats and movepools. During evolution, Burmy's current cloak becomes Wormadam's form, and can no longer be changed."
421,9,"Sunshine form is active during [strong sunlight]{mechanic:strong-sunlight}. Otherwise, Cherrim defaults to its Overcast form."
422,9,"Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh, or inherited from the mother when breeding, and cannot be changed."
423,9,Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh and cannot be changed.
479,9,"Forms have different signature moves, and the appliance forms' stats are different from the normal form's. When switching forms, the old signature move (if any) is removed and the new one must be learned, overwriting another move if need be, or the switch will be cancelled; however, it can be forgotten while in the new form. There are appliances for switching forms in a secret room in the Team Galactic Eterna Building or the Silph Co. Office Building; the room in the Galactic Building requires a []{item:secret-key}, but the room in Silph Co. is freely accessible when walking with Rotom. Rotom can be returned to its normal form by checking the space its appliance occupied. It also reverts to its normal form upon entering the Wi-Fi Club or the Union Room."
487,9,"Forms have different stats. Giratina transforms into Origin Forme in the []{location:distortion-world} or while holding a []{item:griseous-orb}. Otherwise, it assumes its Altered Forme. The Griseous Orb returns to the bag upon entering the Wi-Fi Club or the Union Room."
492,9,"Forms have different stats and movepools. Shaymin transforms into Sky Forme with the use of a []{item:gracidea}. It is limited to Land Forme at night, when [frozen]{mechanic:frozen}, in the storage system boxes, in the Wi-Fi Club, and in the Union Room; under these conditions, Sky Shaymin reverts to Land Forme, and the Gracidea has no effect. The Gracidea must be used again to return to Sky Forme. A Gracidea may be received by showing a woman in southwest []{location:floaroma-town} or the []{location:goldenrod-city} flower shop a Shaymin met in a fateful encounter."
493,9,"Form changes along with type to match a held Plate, due to []{ability:multitype}."
550,9,"Forms have one different ability and different wild held items. Blue-Striped Basculin are rarer in Black Version, and Red-Striped Basculin in White Version."
555,9,"Forms have different stats and types. Darmanitan changes to Zen Mode below 50% HP if it has []{ability:zen-mode} as its ability, and back to Standard Mode above 50% HP."
585,9,"Form changes to match the season. To switch forms, Deerling must be in the party when loading the game."
586,9,"Form changes to match the season. To switch forms, Sawsbuck must be in the party when loading the game."
648,9,"Forms have different stats and types. Meloetta changes form upon using []{move:relic-song} in battle, and reverts to Aria Forme outside of battle."
649,9,Form changes to match Genesect's held Drive. The only differences are the color of its weapon and []{move:techno-blast}'s type.
1 pokemon_species_id local_language_id form_description
2 172 9 Spiky-eared Pichu can only be received by taking the shiny Pichu from an official promotion to []{pokemon:celebi}'s shrine in []{location:ilex-forest}. Spiky-eared Pichu is always female, cannot evolve, and cannot be taken into the Wi-Fi Club or the Union Room, but is otherwise a normal Pichu.
3 201 9 Forms only affect appearance. A form is determined at random before a wild encounter and cannot be changed.
4 351 9 Form changes along with type to match the [weather]{mechanic:weather} in battle, due to []{ability:forecast}. Castform is always in its normal form outside of battle, regardless of weather.
5 386 9 Forms have different stats and movepools. In Generation III, Deoxys's form depends on the game: Normal Forme in Ruby and Sapphire, Attack Forme in FireRed, Defense Forme in LeafGreen, and Speed Forme in Emerald. In Generation IV, every form exists: form is preserved when transferring via []{location:pal-park}, and meteorites in the southeast corner of []{location:veilstone-city} or at the west end of []{location:unova-route-3} can be used to switch between forms.
6 412 9 Forms only affect appearance, although they become permanent upon evolution. Wild and newly-hatched Burmy are always in a Plant Cloak. Burmy's cloak changes to match the terrain after a battle it participated in: Plant Cloak by default; Sandy Cloak in sandy or rocky areas, such as beaches, caves, and trails; and Trash Cloak in buildings.
7 413 9 Forms have different stats and movepools. During evolution, Burmy's current cloak becomes Wormadam's form, and can no longer be changed.
8 421 9 Sunshine form is active during [strong sunlight]{mechanic:strong-sunlight}. Otherwise, Cherrim defaults to its Overcast form.
9 422 9 Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh, or inherited from the mother when breeding, and cannot be changed.
10 423 9 Forms only affect appearance. A form is determined before a wild encounter based on whether the battle is in western or eastern Sinnoh and cannot be changed.
11 479 9 Forms have different signature moves, and the appliance forms' stats are different from the normal form's. When switching forms, the old signature move (if any) is removed and the new one must be learned, overwriting another move if need be, or the switch will be cancelled; however, it can be forgotten while in the new form. There are appliances for switching forms in a secret room in the Team Galactic Eterna Building or the Silph Co. Office Building; the room in the Galactic Building requires a []{item:secret-key}, but the room in Silph Co. is freely accessible when walking with Rotom. Rotom can be returned to its normal form by checking the space its appliance occupied. It also reverts to its normal form upon entering the Wi-Fi Club or the Union Room.
12 487 9 Forms have different stats. Giratina transforms into Origin Forme in the []{location:distortion-world} or while holding a []{item:griseous-orb}. Otherwise, it assumes its Altered Forme. The Griseous Orb returns to the bag upon entering the Wi-Fi Club or the Union Room.
13 492 9 Forms have different stats and movepools. Shaymin transforms into Sky Forme with the use of a []{item:gracidea}. It is limited to Land Forme at night, when [frozen]{mechanic:frozen}, in the storage system boxes, in the Wi-Fi Club, and in the Union Room; under these conditions, Sky Shaymin reverts to Land Forme, and the Gracidea has no effect. The Gracidea must be used again to return to Sky Forme. A Gracidea may be received by showing a woman in southwest []{location:floaroma-town} or the []{location:goldenrod-city} flower shop a Shaymin met in a fateful encounter.
14 493 9 Form changes along with type to match a held Plate, due to []{ability:multitype}.
15 550 9 Forms have one different ability and different wild held items. Blue-Striped Basculin are rarer in Black Version, and Red-Striped Basculin in White Version.
16 555 9 Forms have different stats and types. Darmanitan changes to Zen Mode below 50% HP if it has []{ability:zen-mode} as its ability, and back to Standard Mode above 50% HP.
17 585 9 Form changes to match the season. To switch forms, Deerling must be in the party when loading the game.
18 586 9 Form changes to match the season. To switch forms, Sawsbuck must be in the party when loading the game.
19 648 9 Forms have different stats and types. Meloetta changes form upon using []{move:relic-song} in battle, and reverts to Aria Forme outside of battle.
20 649 9 Form changes to match Genesect's held Drive. The only differences are the color of its weapon and []{move:techno-blast}'s type.

View file

@ -3893,111 +3893,111 @@ pokemon_id,stat_id,base_stat,effort
649,4,120,1
649,5,95,0
649,6,99,1
10001,1,50,0
10001,2,180,2
10001,3,20,0
10001,4,180,1
10001,5,20,0
10001,6,150,0
10002,1,50,0
10002,2,70,0
10002,3,160,2
10002,4,70,0
10002,5,160,1
10002,6,90,0
10003,1,50,0
10003,2,95,0
10003,3,90,0
10003,4,95,0
10003,5,90,0
10003,6,180,3
10004,1,60,0
10004,2,79,0
10004,3,105,2
10004,4,59,0
10004,5,85,0
10004,6,36,0
10005,1,60,0
10005,2,69,0
10005,3,95,1
10005,4,69,0
10005,5,95,1
10005,6,36,0
10006,1,100,0
10006,2,103,0
10006,3,75,0
10006,4,120,0
10006,5,75,0
10006,6,127,3
10007,1,150,3
10007,2,120,0
10007,3,100,0
10007,4,120,0
10007,5,100,0
10007,6,90,0
10008,1,50,0
10008,2,65,0
10008,3,107,0
10008,4,105,1
10008,5,107,0
10008,6,86,1
10009,1,50,0
10009,2,65,0
10009,3,107,0
10009,4,105,1
10009,5,107,0
10009,6,86,1
10010,1,50,0
10010,2,65,0
10010,3,107,0
10010,4,105,1
10010,5,107,0
10010,6,86,1
10011,1,50,0
10011,2,65,0
10011,3,107,0
10011,4,105,1
10011,5,107,0
10011,6,86,1
10012,1,50,0
10012,2,65,0
10012,3,107,0
10012,4,105,1
10012,5,107,0
10012,6,86,1
10013,1,70,1
10013,2,70,0
10013,3,70,0
10013,4,70,0
10013,5,70,0
10013,6,70,0
10014,1,70,1
10014,2,70,0
10014,3,70,0
10014,4,70,0
10014,5,70,0
10014,6,70,0
10015,1,70,1
10015,2,70,0
10015,3,70,0
10015,4,70,0
10015,5,70,0
10015,6,70,0
10016,1,70,0
10016,2,92,0
10016,3,65,0
10016,4,80,0
10016,5,55,0
10016,6,98,2
10017,1,105,0
10017,2,30,0
10017,3,105,0
10017,4,140,2
10017,5,105,0
10017,6,55,0
10018,1,100,0
10018,2,128,1
10018,3,90,1
10018,4,77,0
10018,5,77,0
10018,6,128,1
650,1,50,0
650,2,180,2
650,3,20,0
650,4,180,1
650,5,20,0
650,6,150,0
651,1,50,0
651,2,70,0
651,3,160,2
651,4,70,0
651,5,160,1
651,6,90,0
652,1,50,0
652,2,95,0
652,3,90,0
652,4,95,0
652,5,90,0
652,6,180,3
653,1,60,0
653,2,79,0
653,3,105,2
653,4,59,0
653,5,85,0
653,6,36,0
654,1,60,0
654,2,69,0
654,3,95,1
654,4,69,0
654,5,95,1
654,6,36,0
655,1,100,0
655,2,103,0
655,3,75,0
655,4,120,0
655,5,75,0
655,6,127,3
656,1,150,3
656,2,120,0
656,3,100,0
656,4,120,0
656,5,100,0
656,6,90,0
657,1,50,0
657,2,65,0
657,3,107,0
657,4,105,1
657,5,107,0
657,6,86,1
658,1,50,0
658,2,65,0
658,3,107,0
658,4,105,1
658,5,107,0
658,6,86,1
659,1,50,0
659,2,65,0
659,3,107,0
659,4,105,1
659,5,107,0
659,6,86,1
660,1,50,0
660,2,65,0
660,3,107,0
660,4,105,1
660,5,107,0
660,6,86,1
661,1,50,0
661,2,65,0
661,3,107,0
661,4,105,1
661,5,107,0
661,6,86,1
662,1,70,1
662,2,70,0
662,3,70,0
662,4,70,0
662,5,70,0
662,6,70,0
663,1,70,1
663,2,70,0
663,3,70,0
663,4,70,0
663,5,70,0
663,6,70,0
664,1,70,1
664,2,70,0
664,3,70,0
664,4,70,0
664,5,70,0
664,6,70,0
665,1,70,0
665,2,92,0
665,3,65,0
665,4,80,0
665,5,55,0
665,6,98,2
666,1,105,0
666,2,30,0
666,3,105,0
666,4,140,2
666,5,105,0
666,6,55,0
667,1,100,0
667,2,128,1
667,3,90,1
667,4,77,0
667,5,77,0
667,6,128,1

1 pokemon_id stat_id base_stat effort
3893 649 4 120 1
3894 649 5 95 0
3895 649 6 99 1
3896 10001 650 1 50 0
3897 10001 650 2 180 2
3898 10001 650 3 20 0
3899 10001 650 4 180 1
3900 10001 650 5 20 0
3901 10001 650 6 150 0
3902 10002 651 1 50 0
3903 10002 651 2 70 0
3904 10002 651 3 160 2
3905 10002 651 4 70 0
3906 10002 651 5 160 1
3907 10002 651 6 90 0
3908 10003 652 1 50 0
3909 10003 652 2 95 0
3910 10003 652 3 90 0
3911 10003 652 4 95 0
3912 10003 652 5 90 0
3913 10003 652 6 180 3
3914 10004 653 1 60 0
3915 10004 653 2 79 0
3916 10004 653 3 105 2
3917 10004 653 4 59 0
3918 10004 653 5 85 0
3919 10004 653 6 36 0
3920 10005 654 1 60 0
3921 10005 654 2 69 0
3922 10005 654 3 95 1
3923 10005 654 4 69 0
3924 10005 654 5 95 1
3925 10005 654 6 36 0
3926 10006 655 1 100 0
3927 10006 655 2 103 0
3928 10006 655 3 75 0
3929 10006 655 4 120 0
3930 10006 655 5 75 0
3931 10006 655 6 127 3
3932 10007 656 1 150 3
3933 10007 656 2 120 0
3934 10007 656 3 100 0
3935 10007 656 4 120 0
3936 10007 656 5 100 0
3937 10007 656 6 90 0
3938 10008 657 1 50 0
3939 10008 657 2 65 0
3940 10008 657 3 107 0
3941 10008 657 4 105 1
3942 10008 657 5 107 0
3943 10008 657 6 86 1
3944 10009 658 1 50 0
3945 10009 658 2 65 0
3946 10009 658 3 107 0
3947 10009 658 4 105 1
3948 10009 658 5 107 0
3949 10009 658 6 86 1
3950 10010 659 1 50 0
3951 10010 659 2 65 0
3952 10010 659 3 107 0
3953 10010 659 4 105 1
3954 10010 659 5 107 0
3955 10010 659 6 86 1
3956 10011 660 1 50 0
3957 10011 660 2 65 0
3958 10011 660 3 107 0
3959 10011 660 4 105 1
3960 10011 660 5 107 0
3961 10011 660 6 86 1
3962 10012 661 1 50 0
3963 10012 661 2 65 0
3964 10012 661 3 107 0
3965 10012 661 4 105 1
3966 10012 661 5 107 0
3967 10012 661 6 86 1
3968 10013 662 1 70 1
3969 10013 662 2 70 0
3970 10013 662 3 70 0
3971 10013 662 4 70 0
3972 10013 662 5 70 0
3973 10013 662 6 70 0
3974 10014 663 1 70 1
3975 10014 663 2 70 0
3976 10014 663 3 70 0
3977 10014 663 4 70 0
3978 10014 663 5 70 0
3979 10014 663 6 70 0
3980 10015 664 1 70 1
3981 10015 664 2 70 0
3982 10015 664 3 70 0
3983 10015 664 4 70 0
3984 10015 664 5 70 0
3985 10015 664 6 70 0
3986 10016 665 1 70 0
3987 10016 665 2 92 0
3988 10016 665 3 65 0
3989 10016 665 4 80 0
3990 10016 665 5 55 0
3991 10016 665 6 98 2
3992 10017 666 1 105 0
3993 10017 666 2 30 0
3994 10017 666 3 105 0
3995 10017 666 4 140 2
3996 10017 666 5 105 0
3997 10017 666 6 55 0
3998 10018 667 1 100 0
3999 10018 667 2 128 1
4000 10018 667 3 90 1
4001 10018 667 4 77 0
4002 10018 667 5 77 0
4003 10018 667 6 128 1

View file

@ -943,32 +943,32 @@ pokemon_id,type_id,slot
648,14,2
649,7,1
649,9,2
10001,14,1
10002,14,1
10003,14,1
10004,7,1
10004,5,2
10005,7,1
10005,9,2
10006,12,1
10006,3,2
10007,8,1
10007,16,2
10008,13,1
10008,10,2
10009,13,1
10009,11,2
10010,13,1
10010,15,2
10011,13,1
10011,3,2
10012,13,1
10012,12,2
10013,10,1
10014,11,1
10015,15,1
10016,11,1
10017,10,1
10017,14,2
10018,1,1
10018,2,2
650,14,1
651,14,1
652,14,1
653,7,1
653,5,2
654,7,1
654,9,2
655,12,1
655,3,2
656,8,1
656,16,2
657,13,1
657,10,2
658,13,1
658,11,2
659,13,1
659,15,2
660,13,1
660,3,2
661,13,1
661,12,2
662,10,1
663,11,1
664,15,1
665,11,1
666,10,1
666,14,2
667,1,1
667,2,2

1 pokemon_id type_id slot
943 648 14 2
944 649 7 1
945 649 9 2
946 10001 650 14 1
947 10002 651 14 1
948 10003 652 14 1
949 10004 653 7 1
950 10004 653 5 2
951 10005 654 7 1
952 10005 654 9 2
953 10006 655 12 1
954 10006 655 3 2
955 10007 656 8 1
956 10007 656 16 2
957 10008 657 13 1
958 10008 657 10 2
959 10009 658 13 1
960 10009 658 11 2
961 10010 659 13 1
962 10010 659 15 2
963 10011 660 13 1
964 10011 660 3 2
965 10012 661 13 1
966 10012 661 12 2
967 10013 662 10 1
968 10014 663 11 1
969 10015 664 15 1
970 10016 665 11 1
971 10017 666 10 1
972 10017 666 14 2
973 10018 667 1 1
974 10018 667 2 2

View file

@ -1030,84 +1030,64 @@ Působí na protivníky."
10,Pokedex,6,description,f3d57c4c,Platinum Sinnohský dex—rozšířená verze dexu z Diamond a Pearl
10,Pokedex,7,description,56afcca4,HeartGold/SoulSilver Johto dex dex z Gold/Silver/Crystal rozšířený o nové vývoje
10,Pokedex,8,description,79a9ade7,Black/White Unovský dex
10,Pokemon,1,flavor_summary,fe4d8c9a,"Od narození má na zádech divné semínko, které roste a vyvíjí se společně s ním. Uvnitř má zásobu živin, kterou využívají zejména malí Bulbasauři. I později ale může celé dny nejíst.
10,PokemonSpecies,1,flavor_summary,fe4d8c9a,"Od narození má na zádech divné semínko, které roste a vyvíjí se společně s ním. Uvnitř má zásobu živin, kterou využívají zejména malí Bulbasauři. I později ale může celé dny nejíst.
Bulbasauři rádi odpočívají na sluníčku. Semínko na zádech jim tak roste rychleji."
10,Pokemon,1,species,e4b54c38,Semínkový
10,Pokemon,2,species,e4b54c38,Semínkový
10,Pokemon,3,species,e4b54c38,Semínkový
10,Pokemon,4,species,473b2152,Ještěrkovitý
10,Pokemon,5,species,c4ff3365,Plamenný
10,Pokemon,6,species,c4ff3365,Plamenný
10,Pokemon,7,species,a662e558,Malý želví
10,Pokemon,8,species,71b19d1a,Želví
10,Pokemon,9,species,4a927f13,Korýší
10,Pokemon,10,species,1a1f628b,Červí
10,Pokemon,11,species,011bd63a,Kuklový
10,Pokemon,12,species,4666d1bf,Motýlí
10,Pokemon,14,species,011bd63a,Kuklový
10,Pokemon,35,species,e1dde8d1,diblíci
10,Pokemon,36,species,e1dde8d1,diblíci
10,Pokemon,66,species,55017b02,Supersilný
10,Pokemon,67,species,55017b02,Supersilný
10,Pokemon,68,species,55017b02,Supersilný
10,Pokemon,88,species,63411a53,Kalový
10,Pokemon,89,species,63411a53,Kalový
10,Pokemon,96,species,834b9610,Hypnotický
10,Pokemon,97,species,834b9610,Hypnotický
10,Pokemon,111,species,11201819,Střepinový
10,Pokemon,120,species,a62f8434,Hvězdicovitý
10,Pokemon,121,species,abfc4744,Záhadný
10,Pokemon,122,species,2ef3c334,Bariérový
10,Pokemon,132,species,f543030e,Transformační
10,Pokemon,133,species,c0fdaa30,Vývoj
10,Pokemon,136,species,c4ff3365,Plamenný
10,Pokemon,140,species,4a927f13,Korýší
10,Pokemon,141,species,4a927f13,Korýší
10,Pokemon,144,species,413df12c,Zmražení
10,Pokemon,146,species,c4ff3365,Plamenný
10,Pokemon,173,species,a62f8434,Hvězdicovitý
10,Pokemon,191,species,e4b54c38,Semínkový
10,Pokemon,197,species,2227bb25,Měsíční
10,Pokemon,200,species,cd7e3dfb,Skřípavý
10,Pokemon,209,species,e1dde8d1,diblíci
10,Pokemon,210,species,e1dde8d1,diblíci
10,Pokemon,243,species,adc59c6c,Bleskový
10,Pokemon,261,species,21d49620,Kousavý
10,Pokemon,262,species,21d49620,Kousavý
10,Pokemon,265,species,1a1f628b,Červí
10,Pokemon,266,species,011bd63a,Kuklový
10,Pokemon,267,species,4666d1bf,Motýlí
10,Pokemon,268,species,011bd63a,Kuklový
10,Pokemon,277,species,211da6d8,Polykací
10,Pokemon,307,species,d2b08c9e,Meditační
10,Pokemon,308,species,d2b08c9e,Meditační
10,Pokemon,323,species,36a1520c,Erupční
10,Pokemon,325,species,8590f16f,Skákavý
10,Pokemon,351,species,836deaf2,Počasí
10,Pokemon,385,species,77e3dbf7,Přání
10,Pokemon,392,species,c4ff3365,Plamenný
10,Pokemon,403,species,6e0f7007,Jiskrový
10,Pokemon,404,species,5cd2e029,Jiskrový
10,Pokemon,466,species,f6d30876,Bleskový
10,Pokemon,523,species,f6d30876,Bleskový
10,Pokemon,613,species,eda9f31f,Studený
10,Pokemon,614,species,93e0b150,Mrazící
10,Pokemon,615,species,22733a94,Krystalizující
10,Pokemon,618,species,1ebdd00d,Pasťový
10,Pokemon,10013,species,836deaf2,Počasí
10,Pokemon,10014,species,836deaf2,Počasí
10,Pokemon,10015,species,836deaf2,Počasí
10,PokemonSpecies,1,genus,e4b54c38,Semínkový
10,PokemonSpecies,2,genus,e4b54c38,Semínkový
10,PokemonSpecies,3,genus,e4b54c38,Semínkový
10,PokemonSpecies,4,genus,473b2152,Ještěrkovitý
10,PokemonSpecies,5,genus,c4ff3365,Plamenný
10,PokemonSpecies,6,genus,c4ff3365,Plamenný
10,PokemonSpecies,7,genus,a662e558,Malý želví
10,PokemonSpecies,8,genus,71b19d1a,Želví
10,PokemonSpecies,9,genus,4a927f13,Korýší
10,PokemonSpecies,10,genus,1a1f628b,Červí
10,PokemonSpecies,11,genus,011bd63a,Kuklový
10,PokemonSpecies,12,genus,4666d1bf,Motýlí
10,PokemonSpecies,14,genus,011bd63a,Kuklový
10,PokemonSpecies,66,genus,55017b02,Supersilný
10,PokemonSpecies,67,genus,55017b02,Supersilný
10,PokemonSpecies,68,genus,55017b02,Supersilný
10,PokemonSpecies,88,genus,63411a53,Kalový
10,PokemonSpecies,89,genus,63411a53,Kalový
10,PokemonSpecies,96,genus,834b9610,Hypnotický
10,PokemonSpecies,97,genus,834b9610,Hypnotický
10,PokemonSpecies,111,genus,11201819,Střepinový
10,PokemonSpecies,120,genus,a62f8434,Hvězdicovitý
10,PokemonSpecies,121,genus,abfc4744,Záhadný
10,PokemonSpecies,122,genus,2ef3c334,Bariérový
10,PokemonSpecies,132,genus,f543030e,Transformační
10,PokemonSpecies,136,genus,c4ff3365,Plamenný
10,PokemonSpecies,140,genus,4a927f13,Korýší
10,PokemonSpecies,141,genus,4a927f13,Korýší
10,PokemonSpecies,146,genus,c4ff3365,Plamenný
10,PokemonSpecies,173,genus,a62f8434,Hvězdicovitý
10,PokemonSpecies,191,genus,e4b54c38,Semínkový
10,PokemonSpecies,197,genus,2227bb25,Měsíční
10,PokemonSpecies,200,genus,cd7e3dfb,Skřípavý
10,PokemonSpecies,243,genus,adc59c6c,Bleskový
10,PokemonSpecies,261,genus,21d49620,Kousavý
10,PokemonSpecies,262,genus,21d49620,Kousavý
10,PokemonSpecies,265,genus,1a1f628b,Červí
10,PokemonSpecies,266,genus,011bd63a,Kuklový
10,PokemonSpecies,267,genus,4666d1bf,Motýlí
10,PokemonSpecies,268,genus,011bd63a,Kuklový
10,PokemonSpecies,277,genus,211da6d8,Polykací
10,PokemonSpecies,307,genus,d2b08c9e,Meditační
10,PokemonSpecies,308,genus,d2b08c9e,Meditační
10,PokemonSpecies,323,genus,36a1520c,Erupční
10,PokemonSpecies,325,genus,8590f16f,Skákavý
10,PokemonSpecies,392,genus,c4ff3365,Plamenný
10,PokemonSpecies,403,genus,6e0f7007,Jiskrový
10,PokemonSpecies,404,genus,5cd2e029,Jiskrový
10,PokemonSpecies,466,genus,f6d30876,Bleskový
10,PokemonSpecies,523,genus,f6d30876,Bleskový
10,PokemonSpecies,613,genus,eda9f31f,Studený
10,PokemonSpecies,614,genus,93e0b150,Mrazící
10,PokemonSpecies,615,genus,22733a94,Krystalizující
10,PokemonSpecies,618,genus,1ebdd00d,Pasťový
10,PokemonColor,4,name,25cd90d8,Šedá
10,PokemonForm,412,name,6ac22276,rostliny
10,PokemonForm,413,name,6ac22276,rostliny
10,PokemonForm,10077,name,f560b23a,Popálení
10,PokemonFormGroup,386,term,c82a81a2,Forma
10,PokemonFormGroup,412,term,4d8cf314,Plášť
10,PokemonFormGroup,413,term,4d8cf314,Plášť
10,PokemonFormGroup,487,term,c82a81a2,Forma
10,PokemonFormGroup,492,term,c82a81a2,Forma
10,PokemonFormGroup,648,term,c82a81a2,Forma
10,PokemonHabitat,1,name,057f6d41,jeskyně
10,PokemonHabitat,2,name,a85d53b4,lesy
10,PokemonHabitat,3,name,a73fc6cb,lučiny

1 language_id table id column source_crc string
1030 10 Pokemon PokemonSpecies 3 species genus e4b54c38 Semínkový
1031 10 Pokemon PokemonSpecies 4 species genus 473b2152 Ještěrkovitý
1032 10 Pokemon PokemonSpecies 5 species genus c4ff3365 Plamenný
1033 10 Pokemon PokemonSpecies 6 species genus c4ff3365 Plamenný
1034 10 Pokemon PokemonSpecies 7 species genus a662e558 Malý želví
1035 10 Pokemon PokemonSpecies 8 species genus 71b19d1a Želví
1036 10 Pokemon PokemonSpecies 9 species genus 4a927f13 Korýší
1037 10 Pokemon PokemonSpecies 10 species genus 1a1f628b Červí
1038 10 Pokemon PokemonSpecies 11 species genus 011bd63a Kuklový
1039 10 Pokemon PokemonSpecies 12 species genus 4666d1bf Motýlí
1040 10 Pokemon PokemonSpecies 14 species genus 011bd63a Kuklový
1041 10 Pokemon PokemonSpecies 35 66 species genus e1dde8d1 55017b02 diblíci Supersilný
1042 10 Pokemon PokemonSpecies 36 67 species genus e1dde8d1 55017b02 diblíci Supersilný
1043 10 Pokemon PokemonSpecies 66 68 species genus 55017b02 Supersilný
1044 10 Pokemon PokemonSpecies 67 88 species genus 55017b02 63411a53 Supersilný Kalový
1045 10 Pokemon PokemonSpecies 68 89 species genus 55017b02 63411a53 Supersilný Kalový
1046 10 Pokemon PokemonSpecies 88 96 species genus 63411a53 834b9610 Kalový Hypnotický
1047 10 Pokemon PokemonSpecies 89 97 species genus 63411a53 834b9610 Kalový Hypnotický
1048 10 Pokemon PokemonSpecies 96 111 species genus 834b9610 11201819 Hypnotický Střepinový
1049 10 Pokemon PokemonSpecies 97 120 species genus 834b9610 a62f8434 Hypnotický Hvězdicovitý
1050 10 Pokemon PokemonSpecies 111 121 species genus 11201819 abfc4744 Střepinový Záhadný
1051 10 Pokemon PokemonSpecies 120 122 species genus a62f8434 2ef3c334 Hvězdicovitý Bariérový
1052 10 Pokemon PokemonSpecies 121 132 species genus abfc4744 f543030e Záhadný Transformační
1053 10 Pokemon PokemonSpecies 122 136 species genus 2ef3c334 c4ff3365 Bariérový Plamenný
1054 10 Pokemon PokemonSpecies 132 140 species genus f543030e 4a927f13 Transformační Korýší
1055 10 Pokemon PokemonSpecies 133 141 species genus c0fdaa30 4a927f13 Vývoj Korýší
1056 10 Pokemon PokemonSpecies 136 146 species genus c4ff3365 Plamenný
1057 10 Pokemon PokemonSpecies 140 173 species genus 4a927f13 a62f8434 Korýší Hvězdicovitý
1058 10 Pokemon PokemonSpecies 141 191 species genus 4a927f13 e4b54c38 Korýší Semínkový
1059 10 Pokemon PokemonSpecies 144 197 species genus 413df12c 2227bb25 Zmražení Měsíční
1060 10 Pokemon PokemonSpecies 146 200 species genus c4ff3365 cd7e3dfb Plamenný Skřípavý
1061 10 Pokemon PokemonSpecies 173 243 species genus a62f8434 adc59c6c Hvězdicovitý Bleskový
1062 10 Pokemon PokemonSpecies 191 261 species genus e4b54c38 21d49620 Semínkový Kousavý
1063 10 Pokemon PokemonSpecies 197 262 species genus 2227bb25 21d49620 Měsíční Kousavý
1064 10 Pokemon PokemonSpecies 200 265 species genus cd7e3dfb 1a1f628b Skřípavý Červí
1065 10 Pokemon PokemonSpecies 209 266 species genus e1dde8d1 011bd63a diblíci Kuklový
1066 10 Pokemon PokemonSpecies 210 267 species genus e1dde8d1 4666d1bf diblíci Motýlí
1067 10 Pokemon PokemonSpecies 243 268 species genus adc59c6c 011bd63a Bleskový Kuklový
1068 10 Pokemon PokemonSpecies 261 277 species genus 21d49620 211da6d8 Kousavý Polykací
1069 10 Pokemon PokemonSpecies 262 307 species genus 21d49620 d2b08c9e Kousavý Meditační
1070 10 Pokemon PokemonSpecies 265 308 species genus 1a1f628b d2b08c9e Červí Meditační
1071 10 Pokemon PokemonSpecies 266 323 species genus 011bd63a 36a1520c Kuklový Erupční
1072 10 Pokemon PokemonSpecies 267 325 species genus 4666d1bf 8590f16f Motýlí Skákavý
1073 10 Pokemon PokemonSpecies 268 392 species genus 011bd63a c4ff3365 Kuklový Plamenný
1074 10 Pokemon PokemonSpecies 277 403 species genus 211da6d8 6e0f7007 Polykací Jiskrový
1075 10 Pokemon PokemonSpecies 307 404 species genus d2b08c9e 5cd2e029 Meditační Jiskrový
1076 10 Pokemon PokemonSpecies 308 466 species genus d2b08c9e f6d30876 Meditační Bleskový
1077 10 Pokemon PokemonSpecies 323 523 species genus 36a1520c f6d30876 Erupční Bleskový
1078 10 Pokemon PokemonSpecies 325 613 species genus 8590f16f eda9f31f Skákavý Studený
1079 10 Pokemon PokemonSpecies 351 614 species genus 836deaf2 93e0b150 Počasí Mrazící
1080 10 Pokemon PokemonSpecies 385 615 species genus 77e3dbf7 22733a94 Přání Krystalizující
1081 10 Pokemon PokemonSpecies 392 618 species genus c4ff3365 1ebdd00d Plamenný Pasťový
1082 10 Pokemon PokemonColor 403 4 species name 6e0f7007 25cd90d8 Jiskrový Šedá
1083 10 Pokemon PokemonHabitat 404 1 species name 5cd2e029 057f6d41 Jiskrový jeskyně
1084 10 Pokemon PokemonHabitat 466 2 species name f6d30876 a85d53b4 Bleskový lesy
1085 10 Pokemon PokemonHabitat 523 3 species name f6d30876 a73fc6cb Bleskový lučiny
1086 10 Pokemon PokemonHabitat 613 4 species name eda9f31f 9da2093c Studený hory
1087 10 Pokemon PokemonHabitat 614 5 species name 93e0b150 89b698bf Mrazící vzácní
1088 10 Pokemon PokemonHabitat 615 6 species name 22733a94 788350a9 Krystalizující vysočiny
1089 10 Pokemon PokemonHabitat 618 7 species name 1ebdd00d 8bc9c137 Pasťový moře
10 Pokemon 10013 species 836deaf2 Počasí
10 Pokemon 10014 species 836deaf2 Počasí
10 Pokemon 10015 species 836deaf2 Počasí
10 PokemonColor 4 name 25cd90d8 Šedá
10 PokemonForm 412 name 6ac22276 rostliny
10 PokemonForm 413 name 6ac22276 rostliny
10 PokemonForm 10077 name f560b23a Popálení
10 PokemonFormGroup 386 term c82a81a2 Forma
10 PokemonFormGroup 412 term 4d8cf314 Plášť
10 PokemonFormGroup 413 term 4d8cf314 Plášť
10 PokemonFormGroup 487 term c82a81a2 Forma
1090 10 PokemonFormGroup PokemonHabitat 492 8 term name c82a81a2 ab99f942 Forma města
10 PokemonFormGroup 648 term c82a81a2 Forma
10 PokemonHabitat 1 name 057f6d41 jeskyně
10 PokemonHabitat 2 name a85d53b4 lesy
10 PokemonHabitat 3 name a73fc6cb lučiny
10 PokemonHabitat 4 name 9da2093c hory
10 PokemonHabitat 5 name 89b698bf vzácní
10 PokemonHabitat 6 name 788350a9 vysočiny
10 PokemonHabitat 7 name 8bc9c137 moře
10 PokemonHabitat 8 name ab99f942 města
1091 10 PokemonHabitat 9 name af51cb0b břehy
1092 10 PokemonMoveMethod 1 description 9d07ab12 Učení dosažením určité úrovně.
1093 10 PokemonMoveMethod 1 name 05c78fbc Úrovní

View file

@ -154,7 +154,7 @@ class PokedexLinkPattern(markdown.inlinepatterns.Pattern):
item=tables.Item,
location=tables.Location,
move=tables.Move,
pokemon=tables.Pokemon,
pokemon=tables.PokemonSpecies,
type=tables.Type,
)[category]
except KeyError:

View file

@ -141,6 +141,8 @@ def create_translation_table(_table_name, foreign_class, relation_name,
if string_getter:
def getset_factory(underlying_type, instance):
def getter(translations):
if translations is None:
return None
text = getattr(translations, column.name)
if text is None:
return text

View file

@ -409,8 +409,6 @@ class EvolutionChain(TableBase):
__tablename__ = 'evolution_chains'
id = Column(Integer, primary_key=True, nullable=False,
info=dict(description="A numeric ID"))
growth_rate_id = Column(Integer, ForeignKey('growth_rates.id'), nullable=False,
info=dict(description="ID of the growth rate for this family"))
baby_trigger_item_id = Column(Integer, ForeignKey('items.id'), nullable=True,
info=dict(description="Item that a parent must hold while breeding to produce a baby"))
@ -1058,88 +1056,28 @@ create_translation_table('pokedex_prose', Pokedex, 'prose',
)
class Pokemon(TableBase):
u"""A species of Pokémon. The core to this whole mess.
u"""A Pokémon. The core to this whole mess.
"""
__tablename__ = 'pokemon'
__singlename__ = 'pokemon'
id = Column(Integer, primary_key=True, nullable=False,
info=dict(description=u"A numeric ID"))
identifier = Column(Unicode(20), nullable=False,
info=dict(description=u"An identifier", format='identifier'))
generation_id = Column(Integer, ForeignKey('generations.id'),
info=dict(description=u"ID of the generation this species first appeared in"))
evolution_chain_id = Column(Integer, ForeignKey('evolution_chains.id'),
info=dict(description=u"ID of the species' evolution chain (a.k.a. family)"))
evolves_from_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True,
info=dict(description=u"The Pokémon species from which this one evolves"))
species_id = Column(Integer, ForeignKey('pokemon_species.id'),
info=dict(description=u"ID of the species this Pokémon belongs to"))
height = Column(Integer, nullable=False,
info=dict(description=u"The height of the Pokémon, in decimeters (tenths of a meter)"))
weight = Column(Integer, nullable=False,
info=dict(description=u"The weight of the Pokémon, in tenths of a kilogram (decigrams)"))
color_id = Column(Integer, ForeignKey('pokemon_colors.id'), nullable=False,
info=dict(description=u"ID of this Pokémon's Pokédex color, as used for a gimmick search function in the games."))
pokemon_shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=False,
info=dict(description=u"ID of this Pokémon's body shape, as used for a gimmick search function in the games."))
habitat_id = Column(Integer, ForeignKey('pokemon_habitats.id'), nullable=True,
info=dict(description=u"ID of this Pokémon's habitat, as used for a gimmick search function in the games."))
gender_rate = Column(Integer, nullable=False,
info=dict(description=u"The chance of this Pokémon being female, in eighths; or -1 for genderless"))
capture_rate = Column(Integer, nullable=False,
info=dict(description=u"The base capture rate; up to 255"))
base_experience = Column(Integer, nullable=False,
info=dict(description=u"The base EXP gained when defeating this Pokémon")) # XXX: Is this correct?
base_happiness = Column(Integer, nullable=False,
info=dict(description=u"The tameness when caught by a normal ball"))
is_baby = Column(Boolean, nullable=False,
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."))
hatch_counter = Column(Integer, nullable=False,
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"))
has_gender_differences = Column(Boolean, nullable=False,
info=dict(description=u"Set iff the species exhibits enough sexual dimorphism to have separate sets of sprites in Gen IV and beyond."))
order = Column(Integer, nullable=False, index=True,
info=dict(description=u"Order for sorting. Almost national order, except families and forms are grouped together."))
### Stuff to handle alternate Pokémon forms
info=dict(description=u"Order for sorting. Almost national order, except families are grouped together."))
is_default = Column(Boolean, nullable=False, index=True,
info=dict(description=u'Set for exactly one pokemon used as the default for each species.'))
@property
def is_base_form(self):
u"""Returns True iff the Pokémon is the base form for its species,
e.g. Land Shaymin.
"""
return self.unique_form is None or self.unique_form.is_default
@property
def form_name(self):
u"""Returns the Pokémon's form name if it represents a particular form
and that form has a name, or None otherwise.
"""
# If self.unique_form is None, the short-circuit "and" will go ahead
# and return that. Otherwise, it'll return the form's name, which may
# also be None.
return self.unique_form and self.unique_form.name
@property
def full_name(self):
u"""Returns the Pokémon's name, including its form if applicable."""
if self.form_name:
return u'%s %s' % (self.form_name, self.name)
else:
return self.name
@property
def normal_form(self):
u"""Returns the normal form for this Pokémon; i.e., this will return
regular Deoxys when called on any Deoxys form.
"""
if self.unique_form:
return self.unique_form.form_base_pokemon
return self
### Not forms!
def name(self):
return self.default_form.pokemon_name or self.species.name
def stat(self, stat_name):
u"""Returns a PokemonStat record for the given stat name (or Stat row
@ -1175,19 +1113,6 @@ class Pokemon(TableBase):
else:
return None
create_translation_table('pokemon_names', Pokemon, 'names',
relation_lazy='joined',
name = Column(Unicode(20), nullable=True, index=True,
info=dict(description="The name", format='plaintext', official=True, ripped=True)),
species = Column(Unicode(16), nullable=True,
info=dict(description=u'The short flavor text, such as "Seed" or "Lizard"; usually affixed with the word "Pokémon"',
official=True, format='plaintext')),
)
create_translation_table('pokemon_flavor_summaries', Pokemon, 'flavor_summaries',
flavor_summary = Column(Unicode(512), nullable=True,
info=dict(description=u"Text containing facts from all flavor texts, for languages without official game translations", official=False, format='plaintext', ripped=True)),
)
class PokemonAbility(TableBase):
u"""Maps an ability to a Pokémon that can have it
"""
@ -1221,22 +1146,22 @@ create_translation_table('pokemon_color_names', PokemonColor, 'names',
)
class PokemonDexNumber(TableBase):
u"""The number of a Pokémon in a particular Pokédex (e.g. Jigglypuff is #138 in Hoenn's 'dex)
u"""The number of a species in a particular Pokédex (e.g. Jigglypuff is #138 in Hoenn's 'dex)
"""
__tablename__ = 'pokemon_dex_numbers'
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the Pokémon"))
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the species"))
pokedex_id = Column(Integer, ForeignKey('pokedexes.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the Pokédex"))
pokedex_number = Column(Integer, nullable=False,
info=dict(description=u"Number of the Pokémon in that the Pokédex"))
class PokemonEggGroup(TableBase):
u"""Maps an Egg group to a Pokémon; each Pokémon belongs to one or two egg groups
u"""Maps an Egg group to a species; each species belongs to one or two egg groups
"""
__tablename__ = 'pokemon_egg_groups'
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the Pokémon"))
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the species"))
egg_group_id = Column(Integer, ForeignKey('egg_groups.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the egg group"))
@ -1249,8 +1174,8 @@ class PokemonEvolution(TableBase):
__tablename__ = 'pokemon_evolution'
id = Column(Integer, primary_key=True, nullable=False,
info=dict(description=u"A numeric ID"))
evolved_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False,
info=dict(description=u"The ID of the post-evolution Pokémon."))
evolved_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=False,
info=dict(description=u"The ID of the post-evolution species."))
evolution_trigger_id = Column(Integer, ForeignKey('evolution_triggers.id'), nullable=False,
info=dict(description=u"The ID of the evolution trigger."))
trigger_item_id = Column(Integer, ForeignKey('items.id'), nullable=True,
@ -1273,24 +1198,10 @@ class PokemonEvolution(TableBase):
info=dict(description=u"The minimum Beauty value the Pokémon must have."))
relative_physical_stats = Column(Integer, nullable=True,
info=dict(description=u"The required relation between the Pokémon's Attack and Defense stats, as sgn(atk-def)."))
party_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True,
info=dict(description=u"The ID of the Pokémon that must be present in the party."))
trade_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True,
info=dict(description=u"The ID of the Pokémon for which this Pokémon must be traded."))
class PokemonFlavorText(TableBase):
u"""In-game Pokédex descrption of a Pokémon.
"""
__tablename__ = 'pokemon_flavor_text'
summary_column = Pokemon.flavor_summaries_table, 'flavor_summary'
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the Pokémon"))
version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the version that has this flavor text"))
language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False,
info=dict(description="The language"))
flavor_text = Column(Unicode(255), nullable=False,
info=dict(description=u"The flavor text", official=True, format='gametext'))
party_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
info=dict(description=u"The ID of the species that must be present in the party."))
trade_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
info=dict(description=u"The ID of the species for which this one must be traded."))
class PokemonForm(TableBase):
u"""An individual form of a Pokémon.
@ -1302,63 +1213,29 @@ class PokemonForm(TableBase):
__singlename__ = 'pokemon_form'
id = Column(Integer, primary_key=True, nullable=False,
info=dict(description=u'A unique ID for this form.'))
identifier = Column(Unicode(16), nullable=True,
info=dict(description=u"An identifier", format='identifier'))
form_base_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, autoincrement=False,
form_identifier = Column(Unicode(16), nullable=True,
info=dict(description=u"An identifier of the form, uniue among a species. May be None for the default form of the species.", format='identifier'))
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, autoincrement=False,
info=dict(description=u'The ID of the base Pokémon for this form.'))
unique_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), autoincrement=False,
info=dict(description=u'The ID of a Pokémon that represents specifically this form, for Pokémon with functionally-different forms like Wormadam.'))
introduced_in_version_group_id = Column(Integer, ForeignKey('version_groups.id'), autoincrement=False,
info=dict(description=u'The ID of the version group in which this form first appeared.'))
is_default = Column(Boolean, nullable=False,
info=dict(description=u'Set for exactly one form used as the default for each species.'))
info=dict(description=u'Set for exactly one form used as the default for each pokemon (not necessarily species).'))
is_battle_only = Column(Boolean, nullable=False,
info=dict(description=u'Set iff the form can only appear in battle.'))
order = Column(Integer, nullable=False, autoincrement=False,
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.'))
@property
def full_name(self):
u"""Returns the full name of this form, e.g. "Plant Cloak"."""
if not self.name:
return None
elif self.form_group and self.form_group.term:
return u'%s %s' % (self.name, self.form_group.term)
else:
return self.name
@property
def pokemon_name(self):
u"""Returns the name of this Pokémon with this form, e.g. "Plant
Burmy".
"""
if self.name:
return u'%s %s' % (self.name, self.form_base_pokemon.name)
else:
return self.form_base_pokemon.name
def name(self):
return self.pokemon_name or self.species.name
create_translation_table('pokemon_form_names', PokemonForm, 'names',
relation_lazy='joined',
name = Column(Unicode(16), nullable=False, index=True,
info=dict(description="The name", format='plaintext', official=True)),
)
class PokemonFormGroup(TableBase):
u"""Information about a Pokémon's forms as a group."""
__tablename__ = 'pokemon_form_groups'
__singlename__ = 'pokemon_form_group'
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the base form Pokémon"))
is_battle_only = Column(Boolean, nullable=False,
info=dict(description=u"Set iff the forms only change in battle"))
# FIXME remooove
PokemonFormGroup.id = PokemonFormGroup.pokemon_id
create_translation_table('pokemon_form_group_prose', PokemonFormGroup, 'prose',
term = Column(Unicode(16), nullable=True,
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')),
description = Column(Unicode(1024), nullable=True,
info=dict(description=u"Description of how the forms work", format='markdown', string_getter=markdown.MarkdownString)),
form_name = Column(Unicode(32), nullable=True, index=True,
info=dict(description=u"The full form name, e.g. 'Sky Forme', for pokémon with different forms", format='plaintext', official=True)),
pokemon_name = Column(Unicode(32), nullable=True, index=True,
info=dict(description=u"The full pokémon name, e.g. 'Sky Shaymin', for pokémon with different forms", format='plaintext', official=True)),
)
class PokemonFormPokeathlonStat(TableBase):
@ -1473,6 +1350,75 @@ create_translation_table('pokemon_shape_prose', PokemonShape, 'prose',
info=dict(description=u"A splendiferous name of the body shape", format='plaintext')),
)
class PokemonSpecies(TableBase):
u"""A Pokémon species: group of Pokémon with the same Pokédex number
"""
__tablename__ = 'pokemon_species'
__singlename__ = 'pokemon_species'
id = Column(Integer, primary_key=True, nullable=False,
info=dict(description=u"A numeric ID"))
identifier = Column(Unicode(20), nullable=False,
info=dict(description=u"An identifier", format='identifier'))
generation_id = Column(Integer, ForeignKey('generations.id'),
info=dict(description=u"ID of the generation this species first appeared in"))
evolves_from_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
info=dict(description=u"The species from which this one evolves"))
evolution_chain_id = Column(Integer, ForeignKey('evolution_chains.id'),
info=dict(description=u"ID of the species' evolution chain (a.k.a. family)"))
color_id = Column(Integer, ForeignKey('pokemon_colors.id'), nullable=False,
info=dict(description=u"ID of this Pokémon's Pokédex color, as used for a gimmick search function in the games."))
shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=False,
info=dict(description=u"ID of this Pokémon's body shape, as used for a gimmick search function in the games."))
habitat_id = Column(Integer, ForeignKey('pokemon_habitats.id'), nullable=True,
info=dict(description=u"ID of this Pokémon's habitat, as used for a gimmick search function in the games."))
gender_rate = Column(Integer, nullable=False,
info=dict(description=u"The chance of this Pokémon being female, in eighths; or -1 for genderless"))
capture_rate = Column(Integer, nullable=False,
info=dict(description=u"The base capture rate; up to 255"))
base_happiness = Column(Integer, nullable=False,
info=dict(description=u"The tameness when caught by a normal ball"))
is_baby = Column(Boolean, nullable=False,
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."))
hatch_counter = Column(Integer, nullable=False,
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"))
has_gender_differences = Column(Boolean, nullable=False,
info=dict(description=u"Set iff the species exhibits enough sexual dimorphism to have separate sets of sprites in Gen IV and beyond."))
growth_rate_id = Column(Integer, ForeignKey('growth_rates.id'), nullable=False,
info=dict(description="ID of the growth rate for this family"))
forms_switchable = Column(Boolean, nullable=False,
info=dict(description=u"True iff a particular individual of this species can switch beween its different forms."))
create_translation_table('pokemon_species_names', PokemonSpecies, 'names',
relation_lazy='joined',
name = Column(Unicode(20), nullable=True, index=True,
info=dict(description="The name", format='plaintext', official=True, ripped=True)),
genus = Column(Unicode(16), nullable=True,
info=dict(description=u'The short flavor text, such as "Seed" or "Lizard"; usually affixed with the word "Pokémon"',
official=True, format='plaintext')),
)
create_translation_table('pokemon_species_flavor_summaries', PokemonSpecies, 'flavor_summaries',
flavor_summary = Column(Unicode(512), nullable=True,
info=dict(description=u"Text containing facts from all flavor texts, for languages without official game translations", official=False, format='plaintext', ripped=True)),
)
create_translation_table('pokemon_species_prose', PokemonSpecies, 'prose',
form_description = Column(Unicode(1024), nullable=True,
info=dict(description=u"Description of how the forms work", format='markdown', string_getter=markdown.MarkdownString)),
)
class PokemonSpeciesFlavorText(TableBase):
u"""In-game Pokédex descrption of a Pokémon.
"""
__tablename__ = 'pokemon_species_flavor_text'
summary_column = PokemonSpecies.flavor_summaries_table, 'flavor_summary'
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the Pokémon"))
version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False,
info=dict(description=u"ID of the version that has this flavor text"))
language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False,
info=dict(description="The language"))
flavor_text = Column(Unicode(255), nullable=False,
info=dict(description=u"The flavor text", official=True, format='gametext'))
class PokemonStat(TableBase):
u"""A stat value of a Pokémon
"""
@ -1718,9 +1664,6 @@ EncounterSlot.method = relationship(EncounterMethod,
EncounterSlot.version_group = relationship(VersionGroup, innerjoin=True)
EvolutionChain.growth_rate = relationship(GrowthRate,
innerjoin=True,
backref='evolution_chains')
EvolutionChain.baby_trigger_item = relationship(Item,
backref='evolution_chains')
@ -1963,68 +1906,28 @@ Pokemon.dream_ability = relationship(Ability,
order_by=Pokemon.order,
),
)
Pokemon.pokemon_color = relationship(PokemonColor,
innerjoin=True,
backref='pokemon')
Pokemon.color = association_proxy('pokemon_color', 'name')
Pokemon.dex_numbers = relationship(PokemonDexNumber,
innerjoin=True,
order_by=PokemonDexNumber.pokedex_id.asc(),
backref='pokemon')
Pokemon.egg_groups = relationship(EggGroup,
secondary=PokemonEggGroup.__table__,
innerjoin=True,
order_by=PokemonEggGroup.egg_group_id.asc(),
backref=backref('pokemon', order_by=Pokemon.order.asc()))
Pokemon.evolution_chain = relationship(EvolutionChain,
innerjoin=True,
backref=backref('pokemon', order_by=Pokemon.order.asc()))
Pokemon.parent_pokemon = relationship(Pokemon,
primaryjoin=Pokemon.evolves_from_pokemon_id==Pokemon.id,
remote_side=[Pokemon.id],
backref='child_pokemon')
Pokemon.evolutions = relationship(PokemonEvolution,
primaryjoin=Pokemon.id==PokemonEvolution.evolved_pokemon_id,
backref=backref('evolved_pokemon', innerjoin=True, lazy='joined'))
Pokemon.flavor_text = relationship(PokemonFlavorText,
order_by=PokemonFlavorText.version_id.asc(),
backref='pokemon')
Pokemon.forms = relationship(PokemonForm,
primaryjoin=Pokemon.id==PokemonForm.form_base_pokemon_id,
order_by=(PokemonForm.order.asc(), PokemonForm.identifier.asc()))
primaryjoin=Pokemon.id==PokemonForm.pokemon_id,
order_by=(PokemonForm.order.asc(), PokemonForm.form_identifier.asc()))
Pokemon.default_form = relationship(PokemonForm,
primaryjoin=and_(
Pokemon.id==PokemonForm.form_base_pokemon_id,
Pokemon.id==PokemonForm.pokemon_id,
PokemonForm.is_default==True),
uselist=False)
Pokemon.pokemon_habitat = relationship(PokemonHabitat,
backref='pokemon')
Pokemon.habitat = association_proxy('pokemon_habitat', 'name')
uselist=False, lazy='joined')
Pokemon.items = relationship(PokemonItem,
backref='pokemon')
Pokemon.generation = relationship(Generation,
innerjoin=True,
backref='pokemon')
Pokemon.shape = relationship(PokemonShape,
innerjoin=True,
backref='pokemon')
Pokemon.stats = relationship(PokemonStat,
innerjoin=True,
order_by=PokemonStat.stat_id.asc(),
backref='pokemon')
Pokemon.species = relationship(PokemonSpecies,
innerjoin=True,
backref='pokemon')
Pokemon.types = relationship(Type,
secondary=PokemonType.__table__,
innerjoin=True,
innerjoin=True, lazy='joined',
order_by=PokemonType.slot.asc(),
backref=backref('pokemon', order_by=Pokemon.order))
Pokemon.form = relationship(PokemonForm,
primaryjoin=or_(
PokemonForm.unique_pokemon_id==Pokemon.id,
and_(PokemonForm.unique_pokemon_id==None,
PokemonForm.form_base_pokemon_id==Pokemon.id,
PokemonForm.is_default==True)
),
uselist=False)
PokemonDexNumber.pokedex = relationship(Pokedex,
innerjoin=True, lazy='joined')
@ -2042,38 +1945,22 @@ PokemonEvolution.location = relationship(Location,
backref='triggered_evolutions')
PokemonEvolution.known_move = relationship(Move,
backref='triggered_evolutions')
PokemonEvolution.party_pokemon = relationship(Pokemon,
primaryjoin=PokemonEvolution.party_pokemon_id==Pokemon.id,
PokemonEvolution.party_species = relationship(PokemonSpecies,
primaryjoin=PokemonEvolution.party_species_id==PokemonSpecies.id,
backref='triggered_evolutions')
PokemonEvolution.trade_pokemon = relationship(Pokemon,
primaryjoin=PokemonEvolution.trade_pokemon_id==Pokemon.id)
PokemonEvolution.trade_species = relationship(PokemonSpecies,
primaryjoin=PokemonEvolution.trade_species_id==PokemonSpecies.id)
PokemonFlavorText.version = relationship(Version, innerjoin=True, lazy='joined')
PokemonFlavorText.language = relationship(Language, innerjoin=True, lazy='joined')
PokemonForm.form_base_pokemon = relationship(Pokemon,
primaryjoin=PokemonForm.form_base_pokemon_id==Pokemon.id,
innerjoin=True)
PokemonForm.unique_pokemon = relationship(Pokemon,
primaryjoin=PokemonForm.unique_pokemon_id==Pokemon.id,
backref=backref('unique_form', uselist=False))
PokemonForm.pokemon = relationship(Pokemon,
primaryjoin=or_(
PokemonForm.unique_pokemon_id==Pokemon.id,
and_(PokemonForm.unique_pokemon_id==None,
PokemonForm.form_base_pokemon_id==Pokemon.id)
), uselist=False)
primaryjoin=PokemonForm.pokemon_id==Pokemon.id,
innerjoin=True, lazy='joined')
PokemonForm.species = association_proxy('pokemon', 'species')
PokemonForm.version_group = relationship(VersionGroup,
innerjoin=True)
PokemonForm.form_group = association_proxy('form_base_pokemon', 'form_group')
PokemonForm.pokeathlon_stats = relationship(PokemonFormPokeathlonStat,
order_by=PokemonFormPokeathlonStat.pokeathlon_stat_id,
backref='pokemon_form')
PokemonFormGroup.pokemon = relationship(Pokemon,
innerjoin=True,
backref=backref('form_group', uselist=False))
PokemonFormPokeathlonStat.pokeathlon_stat = relationship(PokeathlonStat,
innerjoin=True, lazy='joined')
@ -2104,6 +1991,62 @@ PokemonMove.method = relationship(PokemonMoveMethod,
PokemonStat.stat = relationship(Stat,
innerjoin=True, lazy='joined')
PokemonSpecies.parent_species = relationship(PokemonSpecies,
primaryjoin=PokemonSpecies.evolves_from_species_id==PokemonSpecies.id,
remote_side=[PokemonSpecies.id],
backref='child_species')
PokemonSpecies.evolutions = relationship(PokemonEvolution,
primaryjoin=PokemonSpecies.id==PokemonEvolution.evolved_species_id,
backref=backref('evolved_species', innerjoin=True, lazy='joined'))
PokemonSpecies.flavor_text = relationship(PokemonSpeciesFlavorText,
order_by=PokemonSpeciesFlavorText.version_id.asc(),
backref='species')
PokemonSpecies.growth_rate = relationship(GrowthRate,
innerjoin=True,
backref='evolution_chains')
PokemonSpecies.habitat = relationship(PokemonHabitat,
backref='species')
PokemonSpecies.color = relationship(PokemonColor,
innerjoin=True,
backref='species')
PokemonSpecies.egg_groups = relationship(EggGroup,
secondary=PokemonEggGroup.__table__,
innerjoin=True,
order_by=PokemonEggGroup.egg_group_id.asc(),
backref=backref('species', order_by=Pokemon.order.asc()))
PokemonSpecies.forms = relationship(PokemonForm,
secondary=Pokemon.__table__,
primaryjoin=PokemonSpecies.id==Pokemon.species_id,
secondaryjoin=Pokemon.id==PokemonForm.pokemon_id,
order_by=(PokemonForm.order.asc(), PokemonForm.form_identifier.asc()))
PokemonSpecies.default_form = relationship(PokemonForm,
secondary=Pokemon.__table__,
primaryjoin=and_(PokemonSpecies.id==Pokemon.species_id,
Pokemon.is_default==True),
secondaryjoin=and_(Pokemon.id==PokemonForm.pokemon_id,
PokemonForm.is_default==True),
uselist=False)
PokemonSpecies.default_pokemon = relationship(Pokemon,
primaryjoin=and_(
PokemonSpecies.id==Pokemon.species_id,
Pokemon.is_default==True),
uselist=False, lazy='joined')
PokemonSpecies.evolution_chain = relationship(EvolutionChain,
innerjoin=True,
backref=backref('species', order_by=PokemonSpecies.id.asc()))
PokemonSpecies.dex_numbers = relationship(PokemonDexNumber,
innerjoin=True,
order_by=PokemonDexNumber.pokedex_id.asc(),
backref='species')
PokemonSpecies.generation = relationship(Generation,
innerjoin=True,
backref='species')
PokemonSpecies.shape = relationship(PokemonShape,
innerjoin=True,
backref='species')
PokemonSpeciesFlavorText.version = relationship(Version, innerjoin=True, lazy='joined')
PokemonSpeciesFlavorText.language = relationship(Language, innerjoin=True, lazy='joined')
Region.generation = relationship(Generation, uselist=False)
Region.version_group_regions = relationship(VersionGroupRegion,

View file

@ -7,13 +7,13 @@ of pokemon, and filtering/ordering by name.
from sqlalchemy.orm import aliased
from sqlalchemy.sql.expression import func
from sqlalchemy.sql.functions import coalesce
from sqlalchemy.orm.exc import NoResultFound
from pokedex.db import tables
### Getter
def get(session, table, identifier=None, name=None, id=None,
form_identifier=None, form_name=None, language=None, is_pokemon=None):
def get(session, table, identifier=None, name=None, id=None, language=None):
"""Get one object from the database.
session: The session to use (from pokedex.db.connect())
@ -22,26 +22,16 @@ def get(session, table, identifier=None, name=None, id=None,
identifier: Identifier of the object
name: The name of the object
id: The ID number of the object
form_identifier: For pokemon, identifier of the form
form_name: For pokemon, name of the form
language: A Language to use for name and form_name
is_pokemon: If true, specifies that the table should be treated as a
pokemon table (handling forms specially). If None and table is the
(unaliased) Pokemon, it is set to True. Otherwise, the pokemon forms
aren't handled.
All conditions must match, so it's not a good idea to specify more than one
of identifier/name/id at once.
If zero or more than one objects matching the criteria are found, the
appropriate SQLAlchemy exception is raised.
Exception: for pokemon, selects the form base unless form_* is given.
"""
if is_pokemon is None:
is_pokemon = (table is tables.Pokemon)
query = session.query(table)
if identifier is not None:
@ -51,54 +41,42 @@ def get(session, table, identifier=None, name=None, id=None,
query = filter_name(query, table, name, language)
if id is not None:
query = query.filter_by(id=id)
if form_identifier is not None or form_name is not None:
if is_pokemon:
query = query.join(table.unique_form)
if form_identifier is not None:
query = query.filter(tables.PokemonForm.identifier ==
form_identifier)
if form_name is not None:
query = filter_name(query, table, form_name, language)
# ASSUMPTION: id is the primary key of the table.
result = query.get(id)
if result is None:
# Keep the API
raise NoResultFound
else:
raise ValueError(
"form_identifier and form_name only make sense for pokemon")
elif is_pokemon:
query = filter_base_forms(query)
return result
return query.one()
### Helpers
def filter_name(query, table, name, language):
def filter_name(query, table, name, language, name_attribute='name'):
"""Filter a query by name, return the resulting query
query: The query to filter
table: The table of named objects
name: The name to look for. May be a tuple of alternatives.
language: The language for "name", or None for the session default
name_attribute: the attribute to use; defaults to 'name'
"""
if language is None:
query = query.filter(table.name == name)
query = query.filter(getattr(table, name_attribute) == name)
else:
names_table = table.names_table
name_column = getattr(names_table, name_attribute)
query = query.join(names_table)
query = query.filter(names_table.foreign_id == table.id)
query = query.filter(names_table.local_language_id == language.id)
if isinstance(name, tuple):
query = query.filter(names_table.name in name)
query = query.filter(name_column in name)
else:
query = query.filter(names_table.name == name)
query = query.filter(name_column == name)
return query
def filter_base_forms(query):
"""Filter only base forms of pokemon, and return the resulting query
"""
query = query.filter(tables.Pokemon.forms.any())
return query
def order_by_name(query, table, language=None, *extra_languages):
def order_by_name(query, table, language=None, *extra_languages, **kwargs):
"""Order a query by name.
query: The query to order
@ -108,12 +86,17 @@ def order_by_name(query, table, language=None, *extra_languages):
extra_languages: Extra languages to order by, should the translations for
`language` be incomplete (or ambiguous).
name_attribute (keyword argument): the attribute to use; defaults to 'name'
Uses the identifier as a fallback ordering.
"""
name_attribute = kwargs.pop('name', 'name')
if kwargs:
raise ValueError('Unexpected keyword arguments: %s' % kwargs.keys())
order_columns = []
if language is None:
query = query.outerjoin(table.names_local)
order_columns.append(func.lower(table.names_table.name))
order_columns.append(func.lower(getattr(table.names_table, name_attribute)))
else:
extra_languages = (language, ) + extra_languages
for language in extra_languages:
@ -121,7 +104,7 @@ def order_by_name(query, table, language=None, *extra_languages):
query = query.outerjoin(names_table)
query = query.filter(names_table.foreign_id == table.id)
query = query.filter(names_table.local_language_id == language.id)
order_columns.append(func.lower(names_table.name))
order_columns.append(func.lower(getattr(names_table, name_attribute)))
order_columns.append(table.identifier)
query = query.order_by(coalesce(*order_columns))
return query

View file

@ -103,7 +103,7 @@ class PokedexLookup(object):
tables.Location,
tables.Move,
tables.Nature,
tables.Pokemon,
tables.PokemonSpecies,
tables.PokemonForm,
tables.Type,
)
@ -193,7 +193,7 @@ class PokedexLookup(object):
# Index every name in all our tables of interest
speller_entries = set()
for cls in self.indexed_tables.values():
q = self.session.query(cls)
q = self.session.query(cls).order_by(cls.id)
for row in q.yield_per(5):
row_key = dict(table=unicode(cls.__tablename__),
@ -211,21 +211,17 @@ class PokedexLookup(object):
speller_entries.add(normalized_name)
# Add the basic English name to the index
if cls == tables.Pokemon:
# Don't re-add alternate forms of the same Pokémon; they'll
# be added as Pokémon forms instead
if not row.is_base_form:
continue
elif cls == tables.PokemonForm:
if row.name:
add(row.pokemon_name, None, u'en', u'us')
continue
if cls == tables.PokemonForm:
name_map = 'pokemon_name_map'
else:
name_map = 'name_map'
# Some things also have other languages' names
# XXX other language form names..?
seen = set()
for language, name in getattr(row, 'name_map', {}).items():
seen = set([None])
for language, name in sorted(getattr(row, name_map, {}).items(),
# Sort English first for now
key=lambda (l, n): (l.identifier != 'en', not l.official)):
if not name:
continue
if name in seen:
# Don't add the name again as a different
# language; no point and it makes spell results
@ -301,6 +297,11 @@ class PokedexLookup(object):
prefix = prefix.strip()
if prefix:
user_valid_types.append(prefix)
if prefix == 'pokemon':
# When the user says 'pokemon', they really meant both
# species & form.
user_valid_types.append('pokemon_species')
user_valid_types.append('pokemon_form')
# Merge the valid types together. Only types that appear in BOTH lists
# may be used.
@ -413,9 +414,6 @@ class PokedexLookup(object):
This function currently ONLY does fuzzy matching if there are no exact
matches.
Formes are not returned unless requested; "Shaymin" will return only
grass Shaymin.
Extraneous whitespace is removed with extreme prejudice.
Recognizes:
@ -430,7 +428,6 @@ class PokedexLookup(object):
- Language restrictions. "@fr:charge" will only return Tackle, which
is called "Charge" in French. These can be combined with type
restrictions, e.g., "@fr,move:charge".
- Alternate formes can be specified merely like "wash rotom".
`input`
Name of the thing to look for.
@ -448,7 +445,6 @@ class PokedexLookup(object):
name = self.normalize_name(input)
exact = True
form = None
# Pop off any type prefix and merge with valid_types
name, merged_valid_types, type_term = \

View file

@ -1,6 +1,45 @@
def setup():
# XXX This needs to recreate the database, someday. :(
pass
def teardown():
pass
import inspect
from functools import wraps
# test support code
def params(funcarglist):
"""Basic list-of-dicts test parametrization
From: http://pytest.org/funcargs.html
Example:
@params([dict(a=1, b=2), dict(a=3, b=4)])
def test_lt(a, b):
assert a < b
"""
def decorator(function):
function.funcarglist = funcarglist
return function
return decorator
def positional_params(*paramlist):
"""Magic list-of-lists parametrization
Example:
@params([(1, 2), (3, 4)])
def test_lt(a, b):
assert a < b
"""
def decorator(function):
function.posarglist = paramlist
return function
return decorator
def single_params(*paramlist):
"""Magic list-of-lists parametrization
Example:
@params('1', '2', '3', '4'])
def test_int(k):
assert int(k)
"""
def decorator(function):
function.posarglist = [[param] for param in paramlist]
return function
return decorator

View file

@ -1,5 +1,6 @@
from nose.tools import *
import unittest
import pytest
from sqlalchemy.orm import aliased
from sqlalchemy.orm.exc import NoResultFound
@ -21,8 +22,8 @@ def test_encounter_slots():
.join((version_group_b, tables.Version.version_group)) \
.filter(version_group_a.id != version_group_b.id)
assert_equal(sanity_q.count(), 0,
"Encounter slots all match the encounters they belong to")
# Encounter slots all match the encounters they belong to
assert sanity_q.count() == 0
def test_nonzero_autoincrement_ids():
"""Check that autoincrementing ids don't contain zeroes
@ -34,8 +35,8 @@ def test_nonzero_autoincrement_ids():
for cls in tables.mapped_classes:
if 'id' in cls.__table__.c:
if cls.__table__.c.id.autoincrement:
@raises(NoResultFound)
def nonzero_id(cls):
util.get(session, cls, id=0)
with pytest.raises(NoResultFound):
util.get(session, cls, id=0)
nonzero_id.description = "No zero id in %s" % cls.__name__
yield nonzero_id, cls

View file

@ -1,104 +1,91 @@
# encoding: utf8
from nose.tools import *
import unittest
# Encoding: UTF-8
from pokedex.tests import *
from pokedex.lookup import PokedexLookup
lookup = None
lookup = PokedexLookup()
def setup():
# Recreate data
global lookup
lookup = PokedexLookup()
def test_exact_lookup():
tests = [
@positional_params(
# Simple lookups
(u'Eevee', 'pokemon', 133),
(u'Eevee', 'pokemon_species',133),
(u'Scratch', 'moves', 10),
(u'Master Ball', 'items', 1),
(u'normal', 'types', 1),
(u'Run Away', 'abilities', 50),
# Funny characters
(u'Mr. Mime', 'pokemon', 122),
(u"Farfetch'd", 'pokemon', 83),
(u'Poké Ball', 'items', 4),
(u'Mr. Mime', 'pokemon_species', 122),
(u"Farfetch'd", 'pokemon_species', 83),
(u'Poké Ball', 'items', 4),
# Forms
(u'Rotom', 'pokemon', 479),
(u'Wash Rotom', 'pokemon_forms',10059),
(u'East Shellos', 'pokemon_forms',10039),
(u'Rotom', 'pokemon_species', 479),
(u'Wash Rotom', 'pokemon_forms', 708),
(u'East Shellos', 'pokemon_forms', 688),
# Other languages
(u'イーブイ', 'pokemon', 133),
(u'Iibui', 'pokemon', 133),
(u'Eievui', 'pokemon', 133),
(u'이브이', 'pokemon', 133),
(u'伊布', 'pokemon', 133),
(u'Evoli', 'pokemon', 133),
]
(u'イーブイ', 'pokemon_species', 133),
(u'Iibui', 'pokemon_species', 133),
(u'Eievui', 'pokemon_species', 133),
(u'이브이', 'pokemon_species', 133),
(u'伊布', 'pokemon_species', 133),
(u'Evoli', 'pokemon_species', 133),
)
def test_exact_lookup(input, table, id):
results = lookup.lookup(input)
assert len(results) == 1
assert results[0].exact == True
for input, table, id in tests:
results = lookup.lookup(input)
assert_equal(len(results), 1, u"'%s' returns one result" % input)
assert_equal(results[0].exact, True, u"'%s' match exactly" % input)
row = results[0].object
assert_equal(row.__tablename__, table, u"'%s' is in the right table" % input)
assert_equal(row.id, id, u"'%s' returns the right id" % input)
row = results[0].object
assert row.__tablename__ == table
assert row.id == id
def test_id_lookup():
results = lookup.lookup(u'1')
assert_true(len(results) >= 5, u'At least five things have id 1')
assert_true(all(_.object.id == 1 for _ in results),
u'All results have id 1')
assert len(results) >= 5
assert all(result.object.id == 1 for result in results)
def test_multi_lookup():
results = lookup.lookup(u'Metronome')
assert_equal(len(results), 2, u'Two things called "Metronome"')
assert_true(results[0].exact, u'Metronome matches are exact')
assert len(results) == 2
assert results[0].exact
def test_type_lookup():
results = lookup.lookup(u'pokemon:1')
assert_equal(results[0].object.__tablename__, 'pokemon',
u'Type restriction works correctly')
assert_equal(len(results), 1, u'Only one id result when type is specified')
assert_equal(results[0].object.name, u'Bulbasaur',
u'Type + id returns the right result')
assert results[0].object.__tablename__ == 'pokemon_species'
assert len(results) == 1
assert results[0].object.name == u'Bulbasaur'
results = lookup.lookup(u'1', valid_types=['pokemon_species'])
assert results[0].object.name == u'Bulbasaur'
results = lookup.lookup(u'1', valid_types=['pokemon'])
assert_equal(results[0].object.name, u'Bulbasaur',
u'valid_types works as well as type: prefix')
def test_language_lookup():
# There are two objects named "charge": the move Charge, and the move
# Tackle, which is called "Charge" in French.
results = lookup.lookup(u'charge')
assert_true(len(results) > 1, u'There are multiple "charge"s')
assert len(results) > 1
results = lookup.lookup(u'@fr:charge')
assert_equal(results[0].iso639, u'fr', u'Language restriction works correctly')
assert_equal(len(results), 1, u'Only one "charge" result when language is specified')
assert_equal(results[0].object.name, u'Tackle',
u'Language + vague name returns the right result')
assert results[0].iso639 == u'fr'
assert len(results) == 1
assert results[0].object.name == u'Tackle'
results = lookup.lookup(u'charge', valid_types=['@fr'])
assert_equal(results[0].object.name, u'Tackle',
u'valid_types works as well as @lang: prefix')
assert results[0].object.name == u'Tackle'
results = lookup.lookup(u'@fr,move:charge')
assert_equal(results[0].object.name, u'Tackle',
u'Languages and types both work together')
assert results[0].object.name == u'Tackle'
results = lookup.lookup(u'@fr:charge', valid_types=['move'])
assert_equal(results[0].object.name, u'Tackle',
u'valid_types and language prefixes get along')
assert results[0].object.name, u'Tackle'
def test_fuzzy_lookup():
tests = [
@positional_params(
# Regular English names
(u'chamander', u'Charmander'),
(u'pokeball', u'Poké Ball'),
@ -110,44 +97,51 @@ def test_fuzzy_lookup():
# Sufficiently long foreign names
(u'カクレオ', u'Kecleon'),
(u'Yamikrasu', u'Murkrow'),
]
)
def test_fuzzy_lookup(misspelling, name):
results = lookup.lookup(misspelling)
first_result = results[0]
assert first_result.object.name == name
for misspelling, name in tests:
results = lookup.lookup(misspelling)
first_result = results[0]
assert_equal(first_result.object.name, name,
u'Simple misspellings are corrected')
def test_nidoran():
results = lookup.lookup(u'Nidoran')
top_names = [_.object.name for _ in results[0:2]]
assert_true(u'Nidoran♂' in top_names, u'Nidoran♂ is a top result for "Nidoran"')
assert_true(u'Nidoran♀' in top_names, u'Nidoran♀ is a top result for "Nidoran"')
top_names = [result.object.name for result in results[0:2]]
assert u'Nidoran♂' in top_names
assert u'Nidoran♀' in top_names
def test_wildcard_lookup():
tests = [
@positional_params(
(u'pokemon:*meleon', u'Charmeleon'),
(u'item:master*', u'Master Ball'),
(u'ee?ee', u'Eevee'),
]
)
def test_wildcard_lookup(wildcard, name):
results = lookup.lookup(wildcard)
first_result = results[0]
assert first_result.object.name == name
for wildcard, name in tests:
results = lookup.lookup(wildcard)
first_result = results[0]
assert_equal(first_result.object.name, name,
u'Wildcards work correctly')
def test_random_lookup():
for _ in xrange(5):
def test_bare_random():
for i in range(5):
results = lookup.lookup(u'random')
assert_equal(len(results), 1, u'Random returns one result')
assert len(results) == 1
@positional_params(
[u'pokemon_species'],
[u'moves'],
[u'items'],
[u'abilities'],
[u'types'],
)
def test_qualified_random(table_name):
results = lookup.lookup(u'random', valid_types=[table_name])
assert len(results) == 1
assert results[0].object.__tablename__ == table_name
for table_name in [u'pokemon', u'moves', u'items', u'abilities', u'types']:
results = lookup.lookup(u'random', valid_types=[table_name])
assert_equal(len(results), 1, u'Constrained random returns one result')
assert_equal(results[0].object.__tablename__, table_name,
u'Constrained random returns result from the right table')
def test_crash_empty_prefix():
"""Searching for ':foo' used to crash, augh!"""
results = lookup.lookup(u':Eevee')
assert_equal(results[0].object.name, u'Eevee', u'Empty prefix dun crash')
assert results[0].object.name == u'Eevee'

View file

@ -1,4 +1,3 @@
"""Test the media accessors.
If run directly from the command line, also tests the accessors and the names
@ -6,73 +5,77 @@ of all the media by getting just about everything in a naive brute-force way.
This, of course, takes a lot of time to run.
"""
import pytest
import os
import re
from nose.tools import *
from nose.plugins.skip import SkipTest
import nose
import pkg_resources
from pokedex.db import tables, connect
from pokedex.util import media
def pytest_funcarg__root(request):
root = request.config.option.media_root
if not root:
root = os.path.join(os.path.dirname(__file__), *'../data/media'.split('/'))
if not media.BaseMedia(root).available:
raise pytest.skip("Media unavailable")
return root
session = connect()
basedir = pkg_resources.resource_filename('pokedex', 'data/media')
path_re = re.compile('^[-a-z0-9./]*$')
def test_totodile():
def test_totodile(root):
"""Totodile's female sprite -- same as male"""
totodile = session.query(tables.Pokemon).filter_by(identifier=u'totodile').one()
accessor = media.PokemonMedia(totodile)
totodile = session.query(tables.PokemonSpecies).filter_by(identifier=u'totodile').one()
accessor = media.PokemonSpeciesMedia(root, totodile)
assert accessor.sprite() == accessor.sprite(female=True)
def test_chimecho():
def test_chimecho(root):
"""Chimecho's Platinum female backsprite -- diffeent from male"""
chimecho = session.query(tables.Pokemon).filter_by(identifier=u'chimecho').one()
accessor = media.PokemonMedia(chimecho)
chimecho = session.query(tables.PokemonSpecies).filter_by(identifier=u'chimecho').one()
accessor = media.PokemonSpeciesMedia(root, chimecho)
male = accessor.sprite('platinum', back=True, frame=2)
female = accessor.sprite('platinum', back=True, female=True, frame=2)
assert male != female
def test_venonat():
def test_venonat(root):
"""Venonat's shiny Yellow sprite -- same as non-shiny"""
venonat = session.query(tables.Pokemon).filter_by(identifier=u'venonat').one()
accessor = media.PokemonMedia(venonat)
venonat = session.query(tables.PokemonSpecies).filter_by(identifier=u'venonat').one()
accessor = media.PokemonSpeciesMedia(root, venonat)
assert accessor.sprite('yellow') == accessor.sprite('yellow', shiny=True)
def test_arceus_icon():
def test_arceus_icon(root):
"""Arceus fire-form icon -- same as base icon"""
arceus = session.query(tables.Pokemon).filter_by(identifier=u'arceus').one()
accessor = media.PokemonMedia(arceus)
fire_arceus = [f for f in arceus.forms if f.identifier == 'fire'][0]
fire_accessor = media.PokemonFormMedia(fire_arceus)
arceus = session.query(tables.PokemonSpecies).filter_by(identifier=u'arceus').one()
accessor = media.PokemonSpeciesMedia(root, arceus)
fire_arceus = [f for f in arceus.forms if f.form_identifier == 'fire'][0]
fire_accessor = media.PokemonFormMedia(root, fire_arceus)
assert accessor.icon() == fire_accessor.icon()
@raises(ValueError)
def test_strict_castform():
def test_strict_castform(root):
"""Castform rainy form overworld with strict -- unavailable"""
castform = session.query(tables.Pokemon).filter_by(identifier=u'castform').first()
rainy_castform = [f for f in castform.forms if f.identifier == 'rainy'][0]
rainy_castform = media.PokemonFormMedia(rainy_castform)
rainy_castform.overworld('up', strict=True)
with pytest.raises(ValueError):
castform = session.query(tables.PokemonSpecies).filter_by(identifier=u'castform').first()
rainy_castform = [f for f in castform.forms if f.form_identifier == 'rainy'][0]
print rainy_castform
rainy_castform = media.PokemonFormMedia(root, rainy_castform)
rainy_castform.overworld('up', strict=True)
@raises(ValueError)
def test_strict_exeggcute():
def test_strict_exeggcute(root):
"""Exeggcutes's female backsprite, with strict -- unavailable"""
exeggcute = session.query(tables.Pokemon).filter_by(identifier=u'exeggcute').one()
accessor = media.PokemonMedia(exeggcute)
accessor.sprite(female=True, strict=True)
with pytest.raises(ValueError):
exeggcute = session.query(tables.PokemonSpecies).filter_by(identifier=u'exeggcute').one()
accessor = media.PokemonSpeciesMedia(root, exeggcute)
accessor.sprite(female=True, strict=True)
def get_all_filenames():
print 'Reading all filenames...'
def get_all_filenames(root):
all_filenames = set()
for dirpath, dirnames, filenames in os.walk(basedir):
for dirpath, dirnames, filenames in os.walk(root):
dirnames[:] = [dirname for dirname in dirnames if dirname != '.git']
for filename in filenames:
path = os.path.join(dirpath, filename)
assert path_re.match(path), path
@ -101,7 +104,8 @@ def hit(filenames, method, *args, **kwargs):
pass
return True
def check_get_everything():
@pytest.mark.skipif("not config.getvalue('all')", reason='`--all` not specified')
def test_get_everything(root, pytestconfig):
"""
For every the accessor method, loop over the Cartesian products of all
possible values for its arguments.
@ -110,34 +114,35 @@ def check_get_everything():
Well, there are exceptions of course.
"""
assert pytestconfig.getvalue('all')
versions = list(session.query(tables.Version).all())
versions.append('red-green')
black = session.query(tables.Version).filter_by(identifier=u'black').one()
filenames = get_all_filenames()
filenames = get_all_filenames(root)
# Some small stuff first
for damage_class in session.query(tables.MoveDamageClass).all():
assert hit(filenames, media.DamageClassMedia(damage_class).icon)
assert hit(filenames, media.DamageClassMedia(root, damage_class).icon)
for habitat in session.query(tables.PokemonHabitat).all():
assert hit(filenames, media.HabitatMedia(habitat).icon)
assert hit(filenames, media.HabitatMedia(root, habitat).icon)
for shape in session.query(tables.PokemonShape).all():
assert hit(filenames, media.ShapeMedia(shape).icon)
assert hit(filenames, media.ShapeMedia(root, shape).icon)
for item_pocket in session.query(tables.ItemPocket).all():
assert hit(filenames, media.ItemPocketMedia(item_pocket).icon)
assert hit(filenames, media.ItemPocketMedia(item_pocket).icon, selected=True)
assert hit(filenames, media.ItemPocketMedia(root, item_pocket).icon)
assert hit(filenames, media.ItemPocketMedia(root, item_pocket).icon, selected=True)
for contest_type in session.query(tables.ContestType).all():
assert hit(filenames, media.ContestTypeMedia(contest_type).icon)
assert hit(filenames, media.ContestTypeMedia(root, contest_type).icon)
for elemental_type in session.query(tables.Type).all():
assert hit(filenames, media.TypeMedia(elemental_type).icon)
assert hit(filenames, media.TypeMedia(root, elemental_type).icon)
# Items
versions_for_items = [
@ -146,7 +151,7 @@ def check_get_everything():
]
for item in session.query(tables.Item).all():
accessor = media.ItemMedia(item)
accessor = media.ItemMedia(root, item)
assert hit(filenames, accessor.berry_image) or not item.berry
for rotation in (0, 90, 180, 270):
assert hit(filenames, accessor.underground, rotation=rotation) or (
@ -158,11 +163,11 @@ def check_get_everything():
for color in 'red green blue pale prism'.split():
for big in (True, False):
accessor = media.UndergroundSphereMedia(color=color, big=big)
accessor = media.UndergroundSphereMedia(root, color=color, big=big)
assert hit(filenames, accessor.underground)
for rock_type in 'i ii o o-big s t z'.split():
accessor = media.UndergroundRockMedia(rock_type)
accessor = media.UndergroundRockMedia(root, rock_type)
for rotation in (0, 90, 180, 270):
success = hit(filenames, accessor.underground, rotation=rotation)
assert success or rotation
@ -170,30 +175,28 @@ def check_get_everything():
# Pokemon!
accessors = []
accessors.append(media.UnknownPokemonMedia())
accessors.append(media.EggMedia())
manaphy = session.query(tables.Pokemon).filter_by(identifier=u'manaphy').one()
accessors.append(media.EggMedia(manaphy))
accessors.append(media.SubstituteMedia())
accessors.append(media.UnknownPokemonMedia(root))
accessors.append(media.EggMedia(root))
manaphy = session.query(tables.PokemonSpecies).filter_by(identifier=u'manaphy').one()
accessors.append(media.EggMedia(root, manaphy))
accessors.append(media.SubstituteMedia(root))
print 'Loading pokemon'
for form in session.query(tables.PokemonForm).all():
accessors.append(media.PokemonFormMedia(root, form))
for form in session.query(tables.PokemonForm).filter(tables.PokemonForm.identifier != '').all():
accessors.append(media.PokemonFormMedia(form))
for pokemon in session.query(tables.Pokemon).all():
accessors.append(media.PokemonMedia(pokemon))
for pokemon in session.query(tables.PokemonSpecies).all():
accessors.append(media.PokemonSpeciesMedia(root, pokemon))
for accessor in accessors:
assert hit(filenames, accessor.footprint) or not accessor.form
assert hit(filenames, accessor.trozei) or not accessor.form or (
accessor.form.pokemon.generation.id > 3)
assert hit(filenames, accessor.cry) or not accessor.form
assert hit(filenames, accessor.cropped_sprite) or not accessor.form
assert hit(filenames, accessor.footprint) or not accessor.is_proper
assert hit(filenames, accessor.trozei) or not accessor.is_proper or (
accessor.introduced_in > 3)
assert hit(filenames, accessor.cry) or not accessor.is_proper
assert hit(filenames, accessor.cropped_sprite) or not accessor.is_proper
for female in (True, False):
assert hit(filenames, accessor.icon, female=female) or not accessor.form
assert hit(filenames, accessor.icon, female=female) or not accessor.is_proper
assert hit(filenames, accessor.sugimori, female=female) or (
not accessor.form or accessor.form.pokemon.id >= 647)
not accessor.is_proper or int(accessor.species_id) >= 647)
for shiny in (True, False):
for frame in (1, 2):
for direction in 'up down left right'.split():
@ -202,8 +205,8 @@ def check_get_everything():
shiny=shiny,
female=female,
frame=frame,
) or not accessor.form or (
accessor.form.pokemon.generation.id > 4)
) or not accessor.is_proper or (
accessor.introduced_in > 4)
for version in versions:
for animated in (True, False):
for back in (True, False):
@ -223,34 +226,29 @@ def check_get_everything():
shiny and not female and
frame == 1):
# All pokemon are in Black
assert success or not accessor.form
if (str(accessor.pokemon_id) == '1'
assert success or not accessor.is_proper
if (str(accessor.species_id) == '1'
and not animated and not color and
frame == 1):
# Bulbasaur is in all versions
assert success
# Remove exceptions
exceptions = [os.path.join(basedir, dirname) for dirname in
exceptions = [os.path.join(root, dirname) for dirname in
'chrome fonts ribbons'.split()]
exceptions.append(os.path.join(basedir, 'items', 'hm-'))
exceptions.append(os.path.join(root, 'items', 'hm-'))
exceptions = tuple(exceptions)
for filename in tuple(filenames):
unaccessed_filenames = set(filenames)
for filename in filenames:
if filename.startswith(exceptions):
filenames.remove(filename)
unaccessed_filenames.remove(filename)
if len(filenames):
print
print '-----------------'
print 'Unaccessed stuff:'
for filename in sorted(filenames):
if unaccessed_filenames:
print 'Unaccessed files:'
for filename in unaccessed_filenames:
print filename
print len(filenames), 'unaccessed files :('
assert unaccessed_filenames == set()
return (not filenames)
if __name__ == '__main__':
result = nose.run(defaultTest=__file__)
result = result and check_get_everything()
exit(not result)

View file

@ -1,12 +1,9 @@
# encoding: utf8
from nose.tools import *
import unittest
import pokedex.roomaji
from pokedex.tests import positional_params
def test_roomaji():
tests = [
@positional_params(
(u'ヤミカラス', 'yamikarasu'),
# Elongated vowel
@ -24,14 +21,13 @@ def test_roomaji():
(u'ラティアス', 'ratiasu'),
(u'ウィー', 'wii'),
(u'セレビィ', 'sereby'),
]
)
def test_roomaji(kana, roomaji):
result = pokedex.roomaji.romanize(kana)
assert result == roomaji
for kana, roomaji in tests:
result = pokedex.roomaji.romanize(kana)
assert_equal(result, roomaji, u"'%s' romanizes correctly" % roomaji)
def test_roomaji_cs():
tests = [
@positional_params(
(u'ヤミカラス', u'jamikarasu'),
# Elongated vowel
@ -49,8 +45,7 @@ def test_roomaji_cs():
(u'ラティアス', u'ratiasu'),
(u'ウィー', u''),
(u'セレビィ', u'serebí'),
]
for kana, roomaji in tests:
result = pokedex.roomaji.romanize(kana, 'cs')
assert_equal(result, roomaji, u"'%s' romanizes correctly for Czech" % roomaji)
)
def test_roomaji_cs(kana, roomaji):
result = pokedex.roomaji.romanize(kana, 'cs')
assert result == roomaji

View file

@ -1,6 +1,7 @@
# encoding: utf8
from nose.tools import *
import unittest
from pokedex.tests import single_params
from sqlalchemy import Column, Integer, String, create_engine
from sqlalchemy.orm import class_mapper, joinedload, sessionmaker
from sqlalchemy.orm.session import Session
@ -10,22 +11,23 @@ from pokedex.db import tables, markdown
from pokedex.db.multilang import MultilangScopedSession, MultilangSession, \
create_translation_table
def test_variable_names():
@single_params(*dir(tables))
def test_variable_names(varname):
"""We want pokedex.db.tables to export tables using the class name"""
for varname in dir(tables):
if not varname[0].isupper():
continue
table = getattr(tables, varname)
try:
if not issubclass(table, tables.TableBase) or table is tables.TableBase:
continue
except TypeError:
continue
classname = table.__name__
if classname and varname[0].isupper():
assert varname == classname, '%s refers to %s' % (varname, classname)
for table in tables.mapped_classes:
assert getattr(tables, table.__name__) is table
table = getattr(tables, varname)
try:
if not issubclass(table, tables.TableBase) or table is tables.TableBase:
return
except TypeError:
return
classname = table.__name__
if classname and varname[0].isupper():
assert varname == classname, '%s refers to %s' % (varname, classname)
@single_params(*tables.mapped_classes)
def test_variable_names_2(table):
"""We also want all of the tables exported"""
assert getattr(tables, table.__name__) is table
def test_class_order():
"""The declarative classes should be defined in alphabetical order.
@ -156,51 +158,52 @@ def test_i18n_table_creation():
assert foo.name_map[lang_en] == 'different english'
assert foo.name_map[lang_ru] == 'new russian'
def test_texts():
classes = []
for cls in tables.mapped_classes:
classes.append(cls)
classes += cls.translation_classes
@single_params(*classes)
def test_texts(cls):
"""Check DB schema for integrity of text columns & translations.
Mostly protects against copy/paste oversights and rebase hiccups.
If there's a reason to relax the tests, do it
"""
classes = []
for cls in tables.mapped_classes:
classes.append(cls)
classes += cls.translation_classes
for cls in classes:
if hasattr(cls, 'local_language') or hasattr(cls, 'language'):
good_formats = 'markdown plaintext gametext'.split()
assert_text = '%s is language-specific'
if hasattr(cls, 'local_language') or hasattr(cls, 'language'):
good_formats = 'markdown plaintext gametext'.split()
assert_text = '%s is language-specific'
else:
good_formats = 'identifier latex'.split()
assert_text = '%s is not language-specific'
columns = sorted(cls.__table__.c, key=lambda c: c.name)
text_columns = []
for column in columns:
format = column.info.get('format', None)
if format is not None:
if format not in good_formats:
raise AssertionError(assert_text % column)
if (format != 'identifier') and (column.name == 'identifier'):
raise AssertionError('%s: identifier column name/type mismatch' % column)
if column.info.get('official', None) and format not in 'gametext plaintext':
raise AssertionError('%s: official text with bad format' % column)
text_columns.append(column)
else:
good_formats = 'identifier latex'.split()
assert_text = '%s is not language-specific'
columns = sorted(cls.__table__.c, key=lambda c: c.name)
text_columns = []
for column in columns:
format = column.info.get('format', None)
if format is not None:
if format not in good_formats:
raise AssertionError(assert_text % column)
if (format != 'identifier') and (column.name == 'identifier'):
raise AssertionError('%s: identifier column name/type mismatch' % column)
if column.info.get('official', None) and format not in 'gametext plaintext':
raise AssertionError('%s: official text with bad format' % column)
text_columns.append(column)
else:
if isinstance(column.type, tables.Unicode):
raise AssertionError('%s: text column without format' % column)
if column.name == 'name' and format != 'plaintext':
raise AssertionError('%s: non-plaintext name' % column)
# No mention of English in the description
assert 'English' not in column.info['description'], column
# If there's more than one text column in a translation table,
# they have to be nullable, to support missing translations
if hasattr(cls, 'local_language') and len(text_columns) > 1:
for column in text_columns:
assert column.nullable
if isinstance(column.type, tables.Unicode):
raise AssertionError('%s: text column without format' % column)
if column.name == 'name' and format != 'plaintext':
raise AssertionError('%s: non-plaintext name' % column)
# No mention of English in the description
assert 'English' not in column.info['description'], column
# If there's more than one text column in a translation table,
# they have to be nullable, to support missing translations
if hasattr(cls, 'local_language') and len(text_columns) > 1:
for column in text_columns:
assert column.nullable
def test_identifiers_with_names():
@single_params(*tables.mapped_classes)
def test_identifiers_with_names(table):
"""Test that named tables have identifiers
"""
for table in sorted(tables.mapped_classes, key=lambda t: t.__name__):
if hasattr(table, 'name'):
for translation_class in table.translation_classes:
if hasattr(translation_class, 'name'):
assert hasattr(table, 'identifier'), table

View file

@ -1,150 +1,147 @@
# Encoding: UTF-8
from nose.tools import *
from sqlalchemy.orm.exc import NoResultFound
import pytest
from pokedex.tests import positional_params
from pokedex.db import tables, connect, util, markdown
class TestStrings(object):
def setup(self):
self.connection = connect()
connection = connect()
def teardown(self):
self.connection.rollback()
def test_filter():
q = connection.query(tables.PokemonSpecies).filter(
tables.PokemonSpecies.name == u"Marowak")
assert q.one().identifier == 'marowak'
def test_filter(self):
q = self.connection.query(tables.Pokemon).filter(
tables.Pokemon.name == u"Marowak")
assert q.one().identifier == 'marowak'
def test_languages():
q = connection.query(tables.PokemonSpecies).filter(
tables.PokemonSpecies.name == u"Mightyena")
pkmn = q.one()
for lang, name in (
('en', u'Mightyena'),
('ja', u'グラエナ'),
('roomaji', u'Guraena'),
('fr', u'Grahyèna'),
):
language = connection.query(tables.Language).filter_by(
identifier=lang).one()
assert pkmn.name_map[language] == name
def test_languages(self):
q = self.connection.query(tables.Pokemon).filter(
tables.Pokemon.name == u"Mightyena")
pkmn = q.one()
for lang, name in (
('en', u'Mightyena'),
('ja', u'グラエナ'),
('roomaji', u'Guraena'),
('fr', u'Grahyèna'),
):
language = self.connection.query(tables.Language).filter_by(
identifier=lang).one()
assert pkmn.name_map[language] == name
@raises(KeyError)
def test_bad_lang(self):
q = self.connection.query(tables.Pokemon).filter(
tables.Pokemon.name == u"Mightyena")
def test_bad_lang():
with pytest.raises(KeyError):
q = connection.query(tables.PokemonSpecies).filter(
tables.PokemonSpecies.name == u"Mightyena")
pkmn = q.one()
pkmn.names["identifier of a language that doesn't exist"]
def test_mutating(self):
item = self.connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
language = self.connection.query(tables.Language).filter_by(
identifier=u"de").one()
item.name_map[language] = u"foo"
assert item.name_map[language] == "foo"
item.name_map[language] = u"xyzzy"
assert item.name_map[language] == "xyzzy"
def test_mutating():
item = connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
language = connection.query(tables.Language).filter_by(
identifier=u"de").one()
item.name_map[language] = u"foo"
assert item.name_map[language] == "foo"
item.name_map[language] = u"xyzzy"
assert item.name_map[language] == "xyzzy"
def test_mutating_default(self):
item = self.connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
item.name = u"foo"
assert item.name == "foo"
def test_mutating_default():
item = connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
item.name = u"foo"
assert item.name == "foo"
def test_string_mapping(self):
item = self.connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
assert len(item.name_map) == len(item.names)
for lang in item.names:
assert item.name_map[lang] == item.names[lang].name
assert lang in item.name_map
assert "language that doesn't exist" not in item.name_map
assert tables.Language() not in item.name_map
def test_string_mapping():
item = connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
assert len(item.name_map) == len(item.names)
for lang in item.names:
assert item.name_map[lang] == item.names[lang].name
assert lang in item.name_map
assert "language that doesn't exist" not in item.name_map
assert tables.Language() not in item.name_map
def test_new_language(self):
item = self.connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
language = tables.Language()
language.id = -1
language.identifier = u'test'
language.iso639 = language.iso3166 = u'--'
language.official = False
self.connection.add(language)
item.name_map[language] = u"foo"
assert item.name_map[language] == "foo"
assert language in item.name_map
item.name_map[language] = u"xyzzy"
assert item.name_map[language] == "xyzzy"
def test_new_language():
item = connection.query(tables.Item).filter_by(
identifier=u"jade-orb").one()
language = tables.Language()
language.id = -1
language.identifier = u'test'
language.iso639 = language.iso3166 = u'--'
language.official = False
connection.add(language)
item.name_map[language] = u"foo"
assert item.name_map[language] == "foo"
assert language in item.name_map
item.name_map[language] = u"xyzzy"
assert item.name_map[language] == "xyzzy"
def test_markdown(self):
move = self.connection.query(tables.Move).filter_by(
identifier=u"thunderbolt").one()
language = self.connection.query(tables.Language).filter_by(
identifier=u"en").one()
assert '10%' in move.effect.as_text()
assert '10%' in move.effect_map[language].as_text()
assert '10%' in move.effect.as_html()
assert '10%' in move.effect_map[language].as_html()
assert '10%' in unicode(move.effect)
assert '10%' in unicode(move.effect_map[language])
assert '10%' in move.effect.__html__()
assert '10%' in move.effect_map[language].__html__()
def test_markdown():
move = connection.query(tables.Move).filter_by(
identifier=u"thunderbolt").one()
language = connection.query(tables.Language).filter_by(
identifier=u"en").one()
assert '10%' in move.effect.as_text()
assert '10%' in move.effect_map[language].as_text()
assert '10%' in move.effect.as_html()
assert '10%' in move.effect_map[language].as_html()
assert '10%' in unicode(move.effect)
assert '10%' in unicode(move.effect_map[language])
assert '10%' in move.effect.__html__()
assert '10%' in move.effect_map[language].__html__()
def test_markdown_string(self):
en = util.get(self.connection, tables.Language, 'en')
md = markdown.MarkdownString('[]{move:thunderbolt} [paralyzes]{mechanic:paralysis}', self.connection, en)
assert unicode(md) == 'Thunderbolt paralyzes'
assert md.as_html() == '<p><span>Thunderbolt</span> <span>paralyzes</span></p>'
assert md.as_html(object_url=lambda category, obj: "%s/%s" % (category, obj.identifier)) == (
'<p><a href="move/thunderbolt">Thunderbolt</a> <span>paralyzes</span></p>')
print md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident))
assert md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident)) == (
'<p><a href="move/thunderbolt">Thunderbolt</a> <a href="mechanic/paralysis">paralyzes</a></p>')
def test_markdown_string():
en = util.get(connection, tables.Language, 'en')
md = markdown.MarkdownString('[]{move:thunderbolt} [paralyzes]{mechanic:paralysis}', connection, en)
assert unicode(md) == 'Thunderbolt paralyzes'
assert md.as_html() == '<p><span>Thunderbolt</span> <span>paralyzes</span></p>'
assert md.as_html(object_url=lambda category, obj: "%s/%s" % (category, obj.identifier)) == (
'<p><a href="move/thunderbolt">Thunderbolt</a> <span>paralyzes</span></p>')
print md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident))
assert md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident)) == (
'<p><a href="move/thunderbolt">Thunderbolt</a> <a href="mechanic/paralysis">paralyzes</a></p>')
def test_markdown_values(self):
"""Check all markdown values
def markdown_column_params():
"""Check all markdown values
Scans the database schema for Markdown columns, runs through every value
in each, and ensures that it's valid Markdown.
"""
Scans the database schema for Markdown columns, runs through every value
in each, and ensures that it's valid Markdown.
"""
# Move effects have their own special wrappers. Explicitly test them separately
yield self.check_markdown_column, tables.Move, None, 'effect'
yield self.check_markdown_column, tables.Move, None, 'short_effect'
# Move effects have their own special wrappers. Explicitly test them separately
yield tables.Move, None, 'effect'
yield tables.Move, None, 'short_effect'
for cls in tables.mapped_classes:
for translation_cls in cls.translation_classes:
for column in translation_cls.__table__.c:
if column.info.get('string_getter') == markdown.MarkdownString:
yield self.check_markdown_column, cls, translation_cls, column.name
for cls in tables.mapped_classes:
for translation_cls in cls.translation_classes:
for column in translation_cls.__table__.c:
if column.info.get('string_getter') == markdown.MarkdownString:
yield cls, translation_cls, column.name
def check_markdown_column(self, parent_class, translation_class, column_name):
"""Implementation for the above"""
query = self.connection.query(parent_class)
if translation_class:
query = query.join(translation_class)
for item in query:
for language, markdown in getattr(item, column_name + '_map').items():
@positional_params(*markdown_column_params())
def test_markdown_values(parent_class, translation_class, column_name):
"""Implementation for the above"""
query = connection.query(parent_class)
if translation_class:
query = query.join(translation_class)
for item in query:
for language, markdown in getattr(item, column_name + '_map').items():
if markdown is None:
continue
if markdown is None:
continue
key = u"Markdown in {0} #{1}'s {2} (lang={3})".format(
parent_class.__name__, item.id, column_name, language.identifier)
key = u"Markdown in {0} #{1}'s {2} (lang={3})".format(
parent_class.__name__, item.id, column_name, language.identifier)
try:
text = markdown.as_text()
except NoResultFound:
assert False, u"{0} references something that doesn't exist:\n{1}".format(
key, markdown.source_text)
except AttributeError:
print markdown
raise
try:
text = markdown.as_text()
except NoResultFound:
assert False, u"{0} references something that doesn't exist:\n{1}".format(
key, markdown.source_text)
except AttributeError:
print markdown
raise
error_message = u"{0} leaves syntax cruft:\n{1}"
error_message = error_message.format(key, text)
error_message = u"{0} leaves syntax cruft:\n{1}"
error_message = error_message.format(key, text)
ok_(not any(char in text for char in '[]{}'), error_message)
assert not any(char in text for char in '[]{}'), error_message

View file

@ -2,7 +2,7 @@
import csv
from nose.tools import *
import pytest
from pokedex.db import translations, tables

View file

@ -1,9 +1,9 @@
# encoding: utf8
from nose.tools import *
import unittest
# Encoding: utf8
import pytest
from pokedex.tests import single_params
from pokedex.db import connect, tables, util
from pokedex.util import simple
session = connect()
@ -19,32 +19,21 @@ def test_get_english_by_identifier():
language = util.get(session, tables.Language, 'en')
assert language.name == 'English'
def test_get_pokemon_baseform_identifier():
for identifier in 'burmy shaymin unown cresselia'.split():
poke = util.get(session, tables.Pokemon, identifier=identifier)
assert poke.identifier == identifier
assert poke.is_base_form
@single_params(*'burmy shaymin unown cresselia'.split())
def test_get_pokemon_identifier(identifier):
poke = util.get(session, tables.PokemonSpecies, identifier=identifier)
assert poke.identifier == identifier
def test_get_pokemon_baseform_name():
for name in 'Burmy Shaymin Unown Cresselia'.split():
poke = util.get(session, tables.Pokemon, name=name)
assert poke.name == name
assert poke.is_base_form
@single_params(*'Burmy Shaymin Unown Cresselia'.split())
def test_get_pokemon_name(name):
poke = util.get(session, tables.PokemonSpecies, name=name)
assert poke.name == name
def test_get_pokemon_baseform_name_explicit_language():
@single_params(*'Cheniti Shaymin Zarbi Cresselia'.split())
def test_get_pokemon_name_explicit_language(name):
french = util.get(session, tables.Language, 'fr')
for name in 'Cheniti Shaymin Zarbi Cresselia'.split():
poke = util.get(session, tables.Pokemon, name=name, language=french)
assert poke.name_map[french] == name, poke.name_map[french]
assert poke.is_base_form
def test_get_pokemon_other_form_identifier():
for ii in 'wormadam/trash shaymin/sky shaymin/land'.split():
pokemon_identifier, form_identifier = ii.split('/')
poke = util.get(session, tables.Pokemon, identifier=pokemon_identifier, form_identifier=form_identifier)
assert poke.identifier == pokemon_identifier
if poke.form.unique_pokemon_id:
assert poke.form.identifier == form_identifier
poke = util.get(session, tables.PokemonSpecies, name=name, language=french)
assert poke.name_map[french] == name, poke.name_map[french]
def test_types_french_order():
french = util.get(session, tables.Language, 'fr')
@ -53,23 +42,8 @@ def test_types_french_order():
assert types[0].name_map[french] == 'Acier', types[0].name_map[french]
assert types[-1].name_map[french] == 'Vol', types[-1].name_map[french]
def test_simple_pokemon():
pokemon = simple.pokemon(session)
assert pokemon[0].identifier == 'bulbasaur'
assert pokemon[-1].identifier == 'genesect'
def test_simple_types():
types = simple.types(session)
assert types[0].identifier == 'bug'
assert types[-1].identifier == 'water'
def test_simple_moves():
moves = simple.moves(session)
assert moves[0].identifier == 'absorb'
assert moves[-1].identifier == 'zen-headbutt'
def test_simple_items():
items = simple.items(session)
assert items[0].identifier == 'ability-urge'
assert items[-1].identifier == 'zoom-lens'
@single_params(*range(1, 10) * 2)
def test_get_pokemon_id(id):
result = util.get(session, tables.Pokemon, id=id)
assert result.id == id
assert result.__tablename__ == 'pokemon'

View file

@ -1,7 +1,12 @@
"""Media accessors
Most media accessor __init__s take an ORM object from the pokedex package.
All media accessor __init__s take a `root` argument, which should be a path
to the root of the media directory.
Alternatively, `root` can be a custom MediaFile subclass.
Most __init__s take an ORM object as a second argument.
Their various methods take a number of arguments specifying exactly which
file you want (such as the female sprite, backsprite, etc.).
ValueError is raised when the specified file cannot be found.
@ -26,22 +31,25 @@ All images are in the PNG format, except animations (GIF). All sounds are OGGs.
"""
import os
import pkg_resources
from functools import partial
class MediaFile(object):
"""Represents a file: picture, sound, etc.
Attributes:
relative_path: Filesystem path relative to the media directory
path_elements: List of directory/file names that make up relative_path
relative_path: Filesystem path relative to the root
path: Absolute path to the file
exists: True if the file exists
media_available: false if no media is available at the given root.
open(): Open the file
"""
def __init__(self, *path_elements):
def __init__(self, root, *path_elements):
self.path_elements = path_elements
self._dexpath = '/'.join(('data', 'media') + path_elements)
self.root = root
@property
def relative_path(self):
@ -49,7 +57,7 @@ class MediaFile(object):
@property
def path(self):
return pkg_resources.resource_filename('pokedex', self._dexpath)
return os.path.join(self.root, *self.path_elements)
def open(self):
"""Open this file for reading, in the appropriate mode (i.e. binary)
@ -58,7 +66,11 @@ class MediaFile(object):
@property
def exists(self):
return pkg_resources.resource_exists('pokedex', self._dexpath)
return os.path.exists(self.path)
@property
def media_available(self):
return os.path.isdir(self.root)
def __eq__(self, other):
return self.path == other.path
@ -70,20 +82,31 @@ class MediaFile(object):
return '<Pokedex file %s>' % self.relative_path
class BaseMedia(object):
def __init__(self, root):
if isinstance(root, basestring):
self.file_class = partial(MediaFile, root)
else:
self.file_class = root
@property
def available(self):
return self.file_class().media_available
def from_path_elements(self, path_elements, basename, extension,
surely_exists=False):
filename = basename + extension
path_elements = [self.toplevel_dir] + path_elements + [filename]
mfile = MediaFile(*path_elements)
mfile = self.file_class(*path_elements)
if surely_exists or mfile.exists:
return mfile
else:
raise ValueError('File %s not found' % mfile.relative_path)
raise ValueError('File %s not found' % mfile.path)
class _BasePokemonMedia(BaseMedia):
toplevel_dir = 'pokemon'
has_gender_differences = False
form = None
is_species = False
is_proper = False
introduced_in = 0
# Info about of what's inside the pokemon main sprite directories, so we
@ -104,13 +127,13 @@ class _BasePokemonMedia(BaseMedia):
'black-white': (5, set('back shiny female'.split())),
}
def __init__(self, pokemon_id, form_postfix=None):
BaseMedia.__init__(self)
self.pokemon_id = str(pokemon_id)
def __init__(self, root, species_id, form_postfix=None):
BaseMedia.__init__(self, root)
self.species_id = str(species_id)
self.form_postfix = form_postfix
def _get_file(self, path_elements, extension, strict, surely_exists=False):
basename = str(self.pokemon_id)
basename = str(self.species_id)
if self.form_postfix:
fullname = basename + self.form_postfix
try:
@ -173,7 +196,7 @@ class _BasePokemonMedia(BaseMedia):
generation, info = self._pokemon_sprite_info[version_dir]
if generation < self.introduced_in:
raise ValueError("Pokemon %s didn't exist in %s" % (
self.pokemon_id, version_dir))
self.species_id, version_dir))
path_elements = ['main-sprites', version_dir]
if animated:
if 'animated' not in info:
@ -213,7 +236,7 @@ class _BasePokemonMedia(BaseMedia):
# Chimecho's female back frame 2 sprite has one hand in
# a slightly different pose, in Platinum and HGSS
# (we have duplicate sprites frame 1, for convenience)
if self.pokemon_id == '358' and back and version_dir in (
if self.species_id == '358' and back and version_dir in (
'platinum', 'heartgold-soulsilver'):
female_sprite = True
female_sprite = female_sprite and 'female' in info
@ -221,7 +244,7 @@ class _BasePokemonMedia(BaseMedia):
path_elements.append('female')
elif strict:
raise ValueError(
'Pokemon %s has no gender differences' % self.pokemon_id)
'Pokemon %s has no gender differences' % self.species_id)
if not frame or frame == 1:
pass
elif frame == 2:
@ -233,9 +256,8 @@ class _BasePokemonMedia(BaseMedia):
raise ValueError("Bad frame %s" % frame)
return self._get_file(path_elements, extension, strict=strict,
# Avoid a stat in the common case
surely_exists=(self.form and version_dir == 'black-white'
and not back and not female
and not self.form_postfix))
surely_exists=(self.is_species and version_dir == 'black-white'
and not back and not female))
def _maybe_female(self, path_elements, female, strict):
if female:
@ -248,7 +270,7 @@ class _BasePokemonMedia(BaseMedia):
raise
elif strict:
raise ValueError(
'Pokemon %s has no gender differences' % self.pokemon_id)
'Pokemon %s has no gender differences' % self.species_id)
return self._get_file(path_elements, '.png', strict=strict)
def icon(self, female=False, strict=False):
@ -314,58 +336,62 @@ class _BasePokemonMedia(BaseMedia):
return self._get_file(['cropped'], '.png', strict=strict)
class PokemonFormMedia(_BasePokemonMedia):
"""Media related to a Pokemon form
"""Media related to a PokemonForm
"""
def __init__(self, pokemon_form):
pokemon_id = pokemon_form.form_base_pokemon_id
if pokemon_form.identifier:
form_postfix = '-' + pokemon_form.identifier
is_proper = True
def __init__(self, root, pokemon_form):
species_id = pokemon_form.species.id
if pokemon_form.form_identifier:
form_postfix = '-' + pokemon_form.form_identifier
else:
form_postfix = None
_BasePokemonMedia.__init__(self, pokemon_id, form_postfix)
_BasePokemonMedia.__init__(self, root, species_id, form_postfix)
self.form = pokemon_form
pokemon = pokemon_form.form_base_pokemon
self.has_gender_differences = pokemon.has_gender_differences
self.introduced_in = pokemon.generation_id
species = pokemon_form.species
self.has_gender_differences = species.has_gender_differences
self.introduced_in = pokemon_form.version_group.generation_id
class PokemonMedia(_BasePokemonMedia):
"""Media related to a Pokemon
class PokemonSpeciesMedia(_BasePokemonMedia):
"""Media related to a PokemonSpecies
"""
def __init__(self, pokemon):
_BasePokemonMedia.__init__(self, pokemon.id)
self.form = pokemon.default_form
self.has_gender_differences = (pokemon.has_gender_differences)
self.introduced_in = pokemon.generation_id
is_species = True
is_proper = True
def __init__(self, root, species):
_BasePokemonMedia.__init__(self, root, species.id)
self.has_gender_differences = species.has_gender_differences
self.introduced_in = species.generation_id
class UnknownPokemonMedia(_BasePokemonMedia):
"""Media related to the unknown Pokemon ("?")
Note that not a lot of files are available for it.
"""
def __init__(self):
_BasePokemonMedia.__init__(self, '0')
def __init__(self, root):
_BasePokemonMedia.__init__(self, root, '0')
class EggMedia(_BasePokemonMedia):
"""Media related to a pokemon egg
Note that not a lot of files are available for these.
Give a Manaphy as `pokemon` to get the Manaphy egg.
Give a Manaphy as `species` to get the Manaphy egg.
"""
def __init__(self, pokemon=None):
if pokemon and pokemon.identifier == 'manaphy':
def __init__(self, root, species=None):
if species and species.identifier == 'manaphy':
postfix = '-manaphy'
else:
postfix = None
_BasePokemonMedia.__init__(self, 'egg', postfix)
_BasePokemonMedia.__init__(self, root, 'egg', postfix)
class SubstituteMedia(_BasePokemonMedia):
"""Media related to the Substitute sprite
Note that not a lot of files are available for Substitute.
"""
def __init__(self):
_BasePokemonMedia.__init__(self, 'substitute')
def __init__(self, root):
_BasePokemonMedia.__init__(self, root, 'substitute')
class _BaseItemMedia(BaseMedia):
toplevel_dir = 'items'
@ -383,7 +409,8 @@ class _BaseItemMedia(BaseMedia):
class ItemMedia(_BaseItemMedia):
"""Media related to an item
"""
def __init__(self, item):
def __init__(self, root, item):
_BaseItemMedia.__init__(self, root)
self.item = item
self.identifier = item.identifier
@ -459,7 +486,8 @@ class UndergroundRockMedia(_BaseItemMedia):
rock_type can be one of: i, ii, o, o-big, s, t, z
"""
def __init__(self, rock_type):
def __init__(self, root, rock_type):
_BaseItemMedia.__init__(self, root)
self.identifier = 'rock-%s' % rock_type
class UndergroundSphereMedia(_BaseItemMedia):
@ -467,13 +495,15 @@ class UndergroundSphereMedia(_BaseItemMedia):
color can be one of: red, blue, green, pale, prism
"""
def __init__(self, color, big=False):
def __init__(self, root, color, big=False):
_BaseItemMedia.__init__(self, root)
self.identifier = '%s-sphere' % color
if big:
self.identifier += '-big'
class _SimpleIconMedia(BaseMedia):
def __init__(self, thing):
def __init__(self, root, thing):
BaseMedia.__init__(self, root)
self.identifier = thing.identifier
def icon(self):

View file

@ -1,66 +0,0 @@
"""Simple lists of things for simple scripts
If you want to get a pokemon list, and you don't want it to include three
Wormadams and a whole bunch of Rotoms because of how the database is
structured, this module is for you.
The returned queries basically contain what a pokedex would show you.
You should make no other assumptions about them.
If you need to make assumptions, feel free to use these functions as examples
of what to watch out for.
"""
from pokedex.db import tables
from pokedex.db.util import filter_base_forms, order_by_name
def pokemon(session):
"""Get a "sane" list of pokemon
WARNING: The result of this function is not very well defined.
If you want something specific, build that specific query yourself.
Currently, all base forms are returned, in evolution-preserving order
"""
query = session.query(tables.Pokemon)
query = query.order_by(tables.Pokemon.order)
query = filter_base_forms(query)
return query
def moves(session):
"""Get a "sane" list of moves
WARNING: The result of this function is not very well defined.
If you want something specific, build that specific query yourself.
Currently, moves from mainline games are returned, sored by name
"""
query = session.query(tables.Move)
query = order_by_name(query, tables.Move)
query = query.filter(tables.Move.id < 10000)
return query
def types(session):
"""Get a "sane" list of types
WARNING: The result of this function is not very well defined.
If you want something specific, build that specific query yourself.
Currently, generation V types are returned, sored by name
"""
query = session.query(tables.Type)
query = order_by_name(query, tables.Type)
query = query.filter(tables.Type.id < 10000)
return query
def items(session):
"""Get a "sane" list of items
WARNING: The result of this function is not very well defined.
If you want something specific, build that specific query yourself.
Currently, items are sored by name
"""
query = session.query(tables.Item)
query = order_by_name(query, tables.Item)
return query

164
scripts/pokemon_species.py Normal file
View file

@ -0,0 +1,164 @@
# Encoding: UTF-8
"""Reorganize Pokemon, PokemonForm, etc. to Species, Pokemon, etc.
This is an unmaintained one-shot script, only included in the repo for
reference.
"""
import csv
import os
from pokedex import defaults
number_of_species = 649
high_id_start = 10000
csv_dir = defaults.get_default_csv_dir()
def to_dict(filename):
fullname = os.path.join(csv_dir, filename)
reader = csv.reader(open(fullname))
column_names = reader.next()
entries = dict()
for row in reader:
row_dict = dict(zip(column_names, row))
entries[row_dict.get('id', row_dict.get('pokemon_id'))] = row_dict
return entries, column_names
pokemon, pokemon_columns = to_dict('pokemon.csv')
forms, form_columns = to_dict('pokemon_forms.csv')
form_groups, form_group_columns = to_dict('pokemon_form_groups.csv')
evolution_chains, evolution_chain_columns = to_dict('evolution_chains.csv')
result_columns = dict(
species='''id identifier generation_id evolves_from_species_id
evolution_chain_id color_id shape_id habitat_id
growth_rate_id gender_rate capture_rate base_happiness is_baby
hatch_counter has_gender_differences forms_switchable'''.split(),
pokemon='''id species_id height weight base_experience order'''.split(),
form='''id form_identifier pokemon_id introduced_in_version_group_id
is_default is_battle_only order'''.split(),
chain='''id baby_trigger_item_id'''.split(),
)
def normalize_id(id):
id = int(id)
if id > number_of_species:
id = id - high_id_start + number_of_species
return id
def put(dct, entry):
"""Put entry in dct. If already there, check it's the same.
"""
id = int(entry['id'])
if id in dct:
if entry == dct[id]:
pass
else:
print entry
print dct[id]
assert False
else:
dct[id] = entry
forms_switchable = dict(
castform=True,
unown=False,
darmanitan=True,
basculin=False,
rotom=True,
shaymin=True,
deerling=True,
sawsbuck=True,
arceus=True,
pichu=False,
giratina=True,
burmy=True,
wormadam=False,
deoxys=True,
genesect=True,
meloetta=True,
gastrodon=False,
cherrim=True,
shellos=False,
)
result_species = dict()
result_pokemon = dict()
result_forms = dict()
result_chains = dict()
for form_id, source_form in forms.items():
pokemon_id = source_form['unique_pokemon_id'] or source_form['form_base_pokemon_id']
species_id = source_form['form_base_pokemon_id']
source_pokemon = pokemon[pokemon_id]
source_evolution_chain = evolution_chains[source_pokemon['evolution_chain_id']]
try:
source_group = form_groups[species_id]
except KeyError:
source_group = dict(is_battle_only=0)
all_fields = dict(source_form)
all_fields.update(source_group)
all_fields.update(source_pokemon)
all_fields.update(source_evolution_chain)
del all_fields['id']
new_species = dict()
for column_name in result_columns['species']:
if column_name == 'id':
new_species[column_name] = normalize_id(species_id)
elif column_name == 'evolves_from_species_id':
new_species[column_name] = pokemon[species_id]['evolves_from_pokemon_id']
elif column_name == 'shape_id':
new_species[column_name] = all_fields['pokemon_shape_id']
elif column_name == 'forms_switchable':
if species_id in form_groups:
new_species[column_name] = forms_switchable[source_pokemon['identifier']]
else:
new_species[column_name] = 0
else:
new_species[column_name] = all_fields[column_name]
put(result_species, new_species)
new_pokemon = dict()
for column_name in result_columns['pokemon']:
if column_name == 'id':
new_pokemon[column_name] = normalize_id(pokemon_id)
elif column_name == 'species_id':
new_pokemon[column_name] = species_id
else:
new_pokemon[column_name] = all_fields[column_name]
put(result_pokemon, new_pokemon)
new_form = dict()
for column_name in result_columns['form']:
if column_name == 'id':
new_form[column_name] = normalize_id(form_id)
elif column_name == 'pokemon_id':
new_form[column_name] = normalize_id(pokemon_id)
elif column_name == 'form_identifier':
new_form[column_name] = source_form['identifier']
elif column_name == 'is_battle_only':
if source_form['unique_pokemon_id'] == source_form['form_base_pokemon_id']:
# Default form, herefore not battle-only
new_form[column_name] = '0'
else:
# Keep
new_form[column_name] = all_fields[column_name]
else:
new_form[column_name] = all_fields[column_name]
put(result_forms, new_form)
new_chain = dict(source_evolution_chain)
del new_chain['growth_rate_id']
put(result_chains, new_chain)
def write_csv(dct, fieldnames, filename):
fullname = os.path.join(csv_dir, filename)
reader = csv.DictWriter(open(fullname, 'w'), fieldnames)
reader.writerow(dict((n,n) for n in fieldnames))
for id, row in sorted(dct.items()):
reader.writerow(row)
write_csv(result_species, result_columns['species'], 'pokemon_species.csv')
write_csv(result_pokemon, result_columns['pokemon'], 'pokemon.csv')
write_csv(result_forms, result_columns['form'], 'pokemon_forms.csv')
write_csv(result_chains, result_columns['chain'], 'evolution_chains.csv')