mirror of
https://github.com/veekun/pokedex.git
synced 2024-07-05 11:55:50 +00:00
Merge branch 'encukou-species-split'
This commit is contained in:
commit
339d5d7da6
21
conftest.py
Normal file
21
conftest.py
Normal 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)))
|
|
@ -1,330 +1,329 @@
|
||||||
id,growth_rate_id,baby_trigger_item_id
|
id,baby_trigger_item_id
|
||||||
1,4,
|
1,
|
||||||
2,4,
|
2,
|
||||||
3,4,
|
3,
|
||||||
4,2,
|
4,
|
||||||
5,2,
|
5,
|
||||||
6,4,
|
6,
|
||||||
7,2,
|
7,
|
||||||
8,2,
|
8,
|
||||||
9,2,
|
9,
|
||||||
10,2,
|
10,
|
||||||
11,2,
|
11,
|
||||||
12,4,
|
12,
|
||||||
13,4,
|
13,
|
||||||
14,3,
|
14,
|
||||||
15,2,
|
15,
|
||||||
16,3,
|
16,
|
||||||
17,2,
|
17,
|
||||||
18,4,
|
18,
|
||||||
19,2,
|
19,
|
||||||
20,2,
|
20,
|
||||||
21,2,
|
21,
|
||||||
22,2,
|
22,
|
||||||
23,2,
|
23,
|
||||||
24,2,
|
24,
|
||||||
25,1,
|
25,
|
||||||
26,4,
|
26,
|
||||||
27,4,
|
27,
|
||||||
28,4,
|
28,
|
||||||
29,4,
|
29,
|
||||||
30,1,
|
30,
|
||||||
31,4,
|
31,
|
||||||
32,2,
|
32,
|
||||||
33,2,
|
33,
|
||||||
34,2,
|
34,
|
||||||
35,2,
|
35,
|
||||||
36,2,
|
36,
|
||||||
37,2,
|
37,
|
||||||
38,2,
|
38,
|
||||||
39,1,
|
39,
|
||||||
40,4,
|
40,
|
||||||
41,2,
|
41,
|
||||||
42,2,
|
42,
|
||||||
43,2,
|
43,
|
||||||
44,2,
|
44,
|
||||||
45,1,
|
45,
|
||||||
46,2,
|
46,
|
||||||
47,2,
|
47,
|
||||||
48,2,
|
48,
|
||||||
49,2,
|
49,
|
||||||
50,1,
|
50,
|
||||||
51,3,296
|
51,296
|
||||||
52,2,
|
52,
|
||||||
53,2,
|
53,
|
||||||
54,2,
|
54,
|
||||||
55,2,
|
55,
|
||||||
56,1,
|
56,
|
||||||
57,2,291
|
57,291
|
||||||
58,2,
|
58,
|
||||||
59,2,
|
59,
|
||||||
60,2,
|
60,
|
||||||
61,2,
|
61,
|
||||||
62,1,
|
62,
|
||||||
63,1,
|
63,
|
||||||
64,1,
|
64,
|
||||||
65,1,
|
65,
|
||||||
66,2,
|
66,
|
||||||
67,2,
|
67,
|
||||||
68,2,
|
68,
|
||||||
69,2,
|
69,
|
||||||
70,2,
|
70,
|
||||||
71,1,
|
71,
|
||||||
72,1,293
|
72,293
|
||||||
73,1,
|
73,
|
||||||
74,1,
|
74,
|
||||||
75,1,
|
75,
|
||||||
76,1,
|
76,
|
||||||
77,1,
|
77,
|
||||||
78,4,
|
78,
|
||||||
79,4,
|
79,
|
||||||
80,4,
|
80,
|
||||||
81,4,
|
81,
|
||||||
82,2,
|
82,
|
||||||
83,2,
|
83,
|
||||||
84,3,
|
84,
|
||||||
85,3,
|
85,
|
||||||
86,1,
|
86,
|
||||||
87,3,
|
87,
|
||||||
88,2,
|
88,
|
||||||
89,4,
|
89,
|
||||||
90,3,231
|
90,231
|
||||||
91,2,292
|
91,292
|
||||||
92,4,
|
92,
|
||||||
93,3,
|
93,
|
||||||
94,4,
|
94,
|
||||||
95,2,
|
95,
|
||||||
96,2,
|
96,
|
||||||
97,4,
|
97,
|
||||||
98,3,
|
98,
|
||||||
99,2,
|
99,
|
||||||
100,2,232
|
100,232
|
||||||
101,2,
|
101,
|
||||||
102,2,
|
102,
|
||||||
103,2,
|
103,
|
||||||
104,4,
|
104,
|
||||||
105,3,
|
105,
|
||||||
106,2,
|
106,
|
||||||
107,4,
|
107,
|
||||||
108,1,
|
108,
|
||||||
109,4,
|
109,
|
||||||
110,2,
|
110,
|
||||||
111,2,
|
111,
|
||||||
112,1,
|
112,
|
||||||
113,3,
|
113,
|
||||||
114,2,
|
114,
|
||||||
115,3,
|
115,
|
||||||
116,1,294
|
116,294
|
||||||
117,1,
|
117,
|
||||||
118,1,
|
118,
|
||||||
119,2,
|
119,
|
||||||
120,1,
|
120,
|
||||||
121,3,
|
121,
|
||||||
122,1,
|
122,
|
||||||
123,1,
|
123,
|
||||||
124,1,
|
124,
|
||||||
125,1,
|
125,
|
||||||
126,1,
|
126,
|
||||||
127,1,
|
127,
|
||||||
128,1,
|
128,
|
||||||
129,4,
|
129,
|
||||||
130,4,
|
130,
|
||||||
131,4,
|
131,
|
||||||
132,4,
|
132,
|
||||||
133,2,
|
133,
|
||||||
134,2,
|
134,
|
||||||
135,2,
|
135,
|
||||||
136,4,
|
136,
|
||||||
137,4,
|
137,
|
||||||
138,4,
|
138,
|
||||||
139,2,
|
139,
|
||||||
140,1,
|
140,
|
||||||
141,2,
|
141,
|
||||||
142,6,
|
142,
|
||||||
143,1,
|
143,
|
||||||
144,5,
|
144,
|
||||||
145,4,
|
145,
|
||||||
146,6,
|
146,
|
||||||
147,2,
|
147,
|
||||||
148,3,
|
148,
|
||||||
149,4,
|
149,
|
||||||
150,3,
|
150,
|
||||||
151,1,
|
151,
|
||||||
152,2,
|
152,
|
||||||
153,1,
|
153,
|
||||||
154,2,
|
154,
|
||||||
155,2,
|
155,
|
||||||
156,5,
|
156,
|
||||||
157,6,
|
157,
|
||||||
158,4,295
|
158,295
|
||||||
159,6,
|
159,
|
||||||
160,1,
|
160,
|
||||||
161,6,
|
161,
|
||||||
162,2,
|
162,
|
||||||
163,2,
|
163,
|
||||||
164,3,
|
164,
|
||||||
165,3,
|
165,
|
||||||
166,4,
|
166,
|
||||||
167,4,
|
167,
|
||||||
168,5,
|
168,
|
||||||
169,5,
|
169,
|
||||||
170,6,
|
170,
|
||||||
171,3,
|
171,
|
||||||
172,3,
|
172,
|
||||||
173,2,
|
173,
|
||||||
174,6,
|
174,
|
||||||
175,2,
|
175,
|
||||||
176,5,
|
176,
|
||||||
177,5,
|
177,
|
||||||
178,5,
|
178,
|
||||||
179,2,
|
179,
|
||||||
180,4,
|
180,
|
||||||
181,3,
|
181,
|
||||||
182,3,
|
182,
|
||||||
183,1,
|
183,
|
||||||
184,3,297
|
184,297
|
||||||
185,4,
|
185,
|
||||||
186,2,
|
186,
|
||||||
187,4,
|
187,
|
||||||
188,5,
|
188,
|
||||||
189,1,
|
189,
|
||||||
190,3,
|
190,
|
||||||
191,1,
|
191,
|
||||||
192,1,
|
192,
|
||||||
193,1,
|
193,
|
||||||
194,1,
|
194,
|
||||||
195,1,
|
195,
|
||||||
196,1,
|
196,
|
||||||
197,1,
|
197,
|
||||||
198,1,
|
198,
|
||||||
199,1,
|
199,
|
||||||
200,1,
|
200,
|
||||||
201,1,
|
201,
|
||||||
202,1,
|
202,
|
||||||
203,4,
|
203,
|
||||||
204,4,
|
204,
|
||||||
205,4,
|
205,
|
||||||
206,4,
|
206,
|
||||||
207,2,
|
207,
|
||||||
208,4,
|
208,
|
||||||
209,4,
|
209,
|
||||||
211,5,
|
211,
|
||||||
212,5,
|
212,
|
||||||
213,2,
|
213,
|
||||||
214,4,
|
214,
|
||||||
215,2,
|
215,
|
||||||
216,2,
|
216,
|
||||||
217,2,
|
217,
|
||||||
218,2,
|
218,
|
||||||
219,6,
|
219,
|
||||||
220,2,
|
220,
|
||||||
221,3,
|
221,
|
||||||
223,2,
|
223,
|
||||||
224,2,
|
224,
|
||||||
228,4,
|
228,
|
||||||
229,2,
|
229,
|
||||||
230,1,
|
230,
|
||||||
232,4,
|
232,
|
||||||
233,1,
|
233,
|
||||||
234,1,
|
234,
|
||||||
235,2,
|
235,
|
||||||
236,1,
|
236,
|
||||||
237,5,
|
237,
|
||||||
239,1,
|
239,
|
||||||
240,2,
|
240,
|
||||||
241,1,
|
241,
|
||||||
242,1,
|
242,
|
||||||
243,1,
|
243,
|
||||||
244,1,
|
244,
|
||||||
245,1,
|
245,
|
||||||
246,1,
|
246,
|
||||||
247,1,
|
247,
|
||||||
248,1,
|
248,
|
||||||
249,1,
|
249,
|
||||||
250,1,
|
250,
|
||||||
251,1,
|
252,
|
||||||
252,1,
|
253,
|
||||||
253,4,
|
254,
|
||||||
254,1,
|
255,
|
||||||
255,1,
|
256,
|
||||||
256,4,
|
257,
|
||||||
257,4,
|
258,
|
||||||
258,4,
|
259,
|
||||||
259,2,
|
260,
|
||||||
260,4,
|
261,
|
||||||
261,2,
|
262,
|
||||||
262,2,
|
263,
|
||||||
263,2,
|
264,
|
||||||
264,2,
|
265,
|
||||||
265,3,
|
266,
|
||||||
266,4,
|
267,
|
||||||
267,2,
|
268,
|
||||||
268,4,
|
269,
|
||||||
269,2,
|
270,
|
||||||
270,2,
|
271,
|
||||||
271,3,
|
272,
|
||||||
272,4,
|
273,
|
||||||
273,4,
|
274,
|
||||||
274,2,
|
275,
|
||||||
275,2,
|
276,
|
||||||
276,4,
|
277,
|
||||||
277,4,
|
278,
|
||||||
278,2,
|
279,
|
||||||
279,2,
|
280,
|
||||||
280,2,
|
281,
|
||||||
281,4,
|
282,
|
||||||
282,4,
|
283,
|
||||||
283,2,
|
284,
|
||||||
284,2,
|
285,
|
||||||
285,2,
|
286,
|
||||||
286,2,
|
287,
|
||||||
287,2,
|
288,
|
||||||
288,2,
|
289,
|
||||||
289,2,
|
290,
|
||||||
290,2,
|
291,
|
||||||
291,4,
|
292,
|
||||||
292,3,
|
293,
|
||||||
293,4,
|
294,
|
||||||
294,4,
|
295,
|
||||||
295,2,
|
296,
|
||||||
296,1,
|
297,
|
||||||
297,2,
|
298,
|
||||||
298,2,
|
299,
|
||||||
299,2,
|
300,
|
||||||
300,2,
|
301,
|
||||||
301,2,
|
302,
|
||||||
302,3,
|
303,
|
||||||
303,2,
|
304,
|
||||||
304,2,
|
305,
|
||||||
305,4,
|
306,
|
||||||
306,1,
|
307,
|
||||||
307,2,
|
308,
|
||||||
308,4,
|
309,
|
||||||
309,1,
|
310,
|
||||||
310,2,
|
311,
|
||||||
311,2,
|
312,
|
||||||
312,2,
|
313,
|
||||||
313,2,
|
314,
|
||||||
314,4,
|
315,
|
||||||
315,2,
|
316,
|
||||||
316,2,
|
317,
|
||||||
317,2,
|
318,
|
||||||
318,2,
|
319,
|
||||||
319,1,
|
320,
|
||||||
320,1,
|
321,
|
||||||
321,2,
|
322,
|
||||||
322,2,
|
323,
|
||||||
323,1,
|
324,
|
||||||
324,1,
|
325,
|
||||||
325,1,
|
326,
|
||||||
326,1,
|
327,
|
||||||
327,1,
|
328,
|
||||||
328,1,
|
329,
|
||||||
329,1,
|
330,
|
||||||
330,1,
|
331,
|
||||||
331,1,
|
332,
|
||||||
332,1,
|
333,
|
||||||
333,1,
|
334,
|
||||||
334,1,
|
335,
|
||||||
335,1,
|
336,
|
||||||
336,1,
|
|
||||||
|
|
|
File diff suppressed because it is too large
Load diff
|
@ -1601,27 +1601,27 @@ pokemon_id,ability_id,is_dream,slot
|
||||||
647,154,0,1
|
647,154,0,1
|
||||||
648,32,0,1
|
648,32,0,1
|
||||||
649,88,0,1
|
649,88,0,1
|
||||||
10001,46,0,1
|
650,46,0,1
|
||||||
10002,46,0,1
|
651,46,0,1
|
||||||
10003,46,0,1
|
652,46,0,1
|
||||||
10004,107,0,1
|
653,107,0,1
|
||||||
10004,142,1,3
|
653,142,1,3
|
||||||
10005,107,0,1
|
654,107,0,1
|
||||||
10005,142,1,3
|
654,142,1,3
|
||||||
10006,32,0,1
|
655,32,0,1
|
||||||
10007,26,0,1
|
656,26,0,1
|
||||||
10007,26,1,3
|
656,26,1,3
|
||||||
10008,26,0,1
|
657,26,0,1
|
||||||
10009,26,0,1
|
658,26,0,1
|
||||||
10010,26,0,1
|
659,26,0,1
|
||||||
10011,26,0,1
|
660,26,0,1
|
||||||
10012,26,0,1
|
661,26,0,1
|
||||||
10013,59,0,1
|
662,59,0,1
|
||||||
10014,59,0,1
|
663,59,0,1
|
||||||
10015,59,0,1
|
664,59,0,1
|
||||||
10016,69,0,1
|
665,69,0,1
|
||||||
10016,91,0,2
|
665,91,0,2
|
||||||
10016,104,1,3
|
665,104,1,3
|
||||||
10017,125,0,1
|
666,125,0,1
|
||||||
10017,161,1,3
|
666,161,1,3
|
||||||
10018,32,0,1
|
667,32,0,1
|
||||||
|
|
|
|
@ -1,4 +1,4 @@
|
||||||
pokemon_id,pokedex_id,pokedex_number
|
species_id,pokedex_id,pokedex_number
|
||||||
1,1,1
|
1,1,1
|
||||||
1,2,1
|
1,2,1
|
||||||
1,3,226
|
1,3,226
|
||||||
|
|
|
|
@ -1,4 +1,4 @@
|
||||||
pokemon_id,egg_group_id
|
species_id,egg_group_id
|
||||||
1,1
|
1,1
|
||||||
1,7
|
1,7
|
||||||
2,1
|
2,1
|
||||||
|
@ -823,24 +823,3 @@ pokemon_id,egg_group_id
|
||||||
647,15
|
647,15
|
||||||
648,15
|
648,15
|
||||||
649,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,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,,,,,,,,,,
|
1,2,1,,16,,,,,,,,,,
|
||||||
2,3,1,,32,,,,,,,,,,
|
2,3,1,,32,,,,,,,,,,
|
||||||
3,5,1,,16,,,,,,,,,,
|
3,5,1,,16,,,,,,,,,,
|
||||||
|
|
|
|
@ -1 +0,0 @@
|
||||||
pokemon_id,local_language_id,flavor_summary
|
|
|
|
@ -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.
|
|
|
File diff suppressed because it is too large
Load diff
|
@ -2464,308 +2464,308 @@ pokemon_form_id,pokeathlon_stat_id,minimum_stat,base_stat,maximum_stat
|
||||||
493,3,1,4,5
|
493,3,1,4,5
|
||||||
493,4,1,5,5
|
493,4,1,5,5
|
||||||
493,5,2,4,5
|
493,5,2,4,5
|
||||||
10001,1,1,2,4
|
650,1,1,2,4
|
||||||
10001,2,1,2,3
|
650,2,1,2,3
|
||||||
10001,3,1,2,4
|
650,3,1,2,4
|
||||||
10001,4,1,2,4
|
650,4,1,2,4
|
||||||
10001,5,2,2,5
|
650,5,2,2,5
|
||||||
10002,1,1,2,4
|
651,1,1,2,4
|
||||||
10002,2,1,2,3
|
651,2,1,2,3
|
||||||
10002,3,1,2,4
|
651,3,1,2,4
|
||||||
10002,4,1,2,4
|
651,4,1,2,4
|
||||||
10002,5,2,2,5
|
651,5,2,2,5
|
||||||
10003,1,1,2,4
|
652,1,1,2,4
|
||||||
10003,2,1,2,3
|
652,2,1,2,3
|
||||||
10003,3,1,2,4
|
652,3,1,2,4
|
||||||
10003,4,1,2,4
|
652,4,1,2,4
|
||||||
10003,5,2,2,5
|
652,5,2,2,5
|
||||||
10004,1,1,2,4
|
653,1,1,2,4
|
||||||
10004,2,1,2,3
|
653,2,1,2,3
|
||||||
10004,3,1,2,4
|
653,3,1,2,4
|
||||||
10004,4,1,2,4
|
653,4,1,2,4
|
||||||
10004,5,2,2,5
|
653,5,2,2,5
|
||||||
10005,1,1,2,4
|
654,1,1,2,4
|
||||||
10005,2,1,2,3
|
654,2,1,2,3
|
||||||
10005,3,1,2,4
|
654,3,1,2,4
|
||||||
10005,4,1,2,4
|
654,4,1,2,4
|
||||||
10005,5,2,2,5
|
654,5,2,2,5
|
||||||
10006,1,1,2,4
|
655,1,1,2,4
|
||||||
10006,2,1,2,3
|
655,2,1,2,3
|
||||||
10006,3,1,2,4
|
655,3,1,2,4
|
||||||
10006,4,1,2,4
|
655,4,1,2,4
|
||||||
10006,5,2,2,5
|
655,5,2,2,5
|
||||||
10007,1,1,2,4
|
656,1,1,2,4
|
||||||
10007,2,1,2,3
|
656,2,1,2,3
|
||||||
10007,3,1,2,4
|
656,3,1,2,4
|
||||||
10007,4,1,2,4
|
656,4,1,2,4
|
||||||
10007,5,2,2,5
|
656,5,2,2,5
|
||||||
10008,1,1,2,4
|
657,1,1,2,4
|
||||||
10008,2,1,2,3
|
657,2,1,2,3
|
||||||
10008,3,1,2,4
|
657,3,1,2,4
|
||||||
10008,4,1,2,4
|
657,4,1,2,4
|
||||||
10008,5,2,2,5
|
657,5,2,2,5
|
||||||
10009,1,1,2,4
|
658,1,1,2,4
|
||||||
10009,2,1,2,3
|
658,2,1,2,3
|
||||||
10009,3,1,2,4
|
658,3,1,2,4
|
||||||
10009,4,1,2,4
|
658,4,1,2,4
|
||||||
10009,5,2,2,5
|
658,5,2,2,5
|
||||||
10010,1,1,2,4
|
659,1,1,2,4
|
||||||
10010,2,1,2,3
|
659,2,1,2,3
|
||||||
10010,3,1,2,4
|
659,3,1,2,4
|
||||||
10010,4,1,2,4
|
659,4,1,2,4
|
||||||
10010,5,2,2,5
|
659,5,2,2,5
|
||||||
10011,1,1,2,4
|
660,1,1,2,4
|
||||||
10011,2,1,2,3
|
660,2,1,2,3
|
||||||
10011,3,1,2,4
|
660,3,1,2,4
|
||||||
10011,4,1,2,4
|
660,4,1,2,4
|
||||||
10011,5,2,2,5
|
660,5,2,2,5
|
||||||
10012,1,1,2,4
|
661,1,1,2,4
|
||||||
10012,2,1,2,3
|
661,2,1,2,3
|
||||||
10012,3,1,2,4
|
661,3,1,2,4
|
||||||
10012,4,1,2,4
|
661,4,1,2,4
|
||||||
10012,5,2,2,5
|
661,5,2,2,5
|
||||||
10013,1,1,2,4
|
662,1,1,2,4
|
||||||
10013,2,1,2,3
|
662,2,1,2,3
|
||||||
10013,3,1,2,4
|
662,3,1,2,4
|
||||||
10013,4,1,2,4
|
662,4,1,2,4
|
||||||
10013,5,2,2,5
|
662,5,2,2,5
|
||||||
10014,1,1,2,4
|
663,1,1,2,4
|
||||||
10014,2,1,2,3
|
663,2,1,2,3
|
||||||
10014,3,1,2,4
|
663,3,1,2,4
|
||||||
10014,4,1,2,4
|
663,4,1,2,4
|
||||||
10014,5,2,2,5
|
663,5,2,2,5
|
||||||
10015,1,1,2,4
|
664,1,1,2,4
|
||||||
10015,2,1,2,3
|
664,2,1,2,3
|
||||||
10015,3,1,2,4
|
664,3,1,2,4
|
||||||
10015,4,1,2,4
|
664,4,1,2,4
|
||||||
10015,5,2,2,5
|
664,5,2,2,5
|
||||||
10016,1,1,2,4
|
665,1,1,2,4
|
||||||
10016,2,1,2,3
|
665,2,1,2,3
|
||||||
10016,3,1,2,4
|
665,3,1,2,4
|
||||||
10016,4,1,2,4
|
665,4,1,2,4
|
||||||
10016,5,2,2,5
|
665,5,2,2,5
|
||||||
10017,1,1,2,4
|
666,1,1,2,4
|
||||||
10017,2,1,2,3
|
666,2,1,2,3
|
||||||
10017,3,1,2,4
|
666,3,1,2,4
|
||||||
10017,4,1,2,4
|
666,4,1,2,4
|
||||||
10017,5,2,2,5
|
666,5,2,2,5
|
||||||
10018,1,1,2,4
|
667,1,1,2,4
|
||||||
10018,2,1,2,3
|
667,2,1,2,3
|
||||||
10018,3,1,2,4
|
667,3,1,2,4
|
||||||
10018,4,1,2,4
|
667,4,1,2,4
|
||||||
10018,5,2,2,5
|
667,5,2,2,5
|
||||||
10019,1,1,2,4
|
668,1,1,2,4
|
||||||
10019,2,1,2,3
|
668,2,1,2,3
|
||||||
10019,3,1,2,4
|
668,3,1,2,4
|
||||||
10019,4,1,2,4
|
668,4,1,2,4
|
||||||
10019,5,2,2,5
|
668,5,2,2,5
|
||||||
10020,1,1,2,4
|
669,1,1,2,4
|
||||||
10020,2,1,2,3
|
669,2,1,2,3
|
||||||
10020,3,1,2,4
|
669,3,1,2,4
|
||||||
10020,4,1,2,4
|
669,4,1,2,4
|
||||||
10020,5,2,2,5
|
669,5,2,2,5
|
||||||
10021,1,1,2,4
|
670,1,1,2,4
|
||||||
10021,2,1,2,3
|
670,2,1,2,3
|
||||||
10021,3,1,2,4
|
670,3,1,2,4
|
||||||
10021,4,1,2,4
|
670,4,1,2,4
|
||||||
10021,5,2,2,5
|
670,5,2,2,5
|
||||||
10022,1,1,2,4
|
671,1,1,2,4
|
||||||
10022,2,1,2,3
|
671,2,1,2,3
|
||||||
10022,3,1,2,4
|
671,3,1,2,4
|
||||||
10022,4,1,2,4
|
671,4,1,2,4
|
||||||
10022,5,2,2,5
|
671,5,2,2,5
|
||||||
10023,1,1,2,4
|
672,1,1,2,4
|
||||||
10023,2,1,2,3
|
672,2,1,2,3
|
||||||
10023,3,1,2,4
|
672,3,1,2,4
|
||||||
10023,4,1,2,4
|
672,4,1,2,4
|
||||||
10023,5,2,2,5
|
672,5,2,2,5
|
||||||
10024,1,1,2,4
|
673,1,1,2,4
|
||||||
10024,2,1,2,3
|
673,2,1,2,3
|
||||||
10024,3,1,2,4
|
673,3,1,2,4
|
||||||
10024,4,1,2,4
|
673,4,1,2,4
|
||||||
10024,5,2,2,5
|
673,5,2,2,5
|
||||||
10025,1,1,2,4
|
674,1,1,2,4
|
||||||
10025,2,1,2,3
|
674,2,1,2,3
|
||||||
10025,3,1,2,4
|
674,3,1,2,4
|
||||||
10025,4,1,2,4
|
674,4,1,2,4
|
||||||
10025,5,2,2,5
|
674,5,2,2,5
|
||||||
10026,1,1,2,4
|
675,1,1,2,4
|
||||||
10026,2,1,2,3
|
675,2,1,2,3
|
||||||
10026,3,1,2,5
|
675,3,1,2,5
|
||||||
10026,4,1,2,4
|
675,4,1,2,4
|
||||||
10026,5,2,2,5
|
675,5,2,2,5
|
||||||
10027,1,1,2,4
|
676,1,1,2,4
|
||||||
10027,2,1,2,3
|
676,2,1,2,3
|
||||||
10027,3,1,2,5
|
676,3,1,2,5
|
||||||
10027,4,1,2,4
|
676,4,1,2,4
|
||||||
10027,5,2,2,5
|
676,5,2,2,5
|
||||||
10031,1,2,4,5
|
680,1,2,4,5
|
||||||
10031,2,4,5,5
|
680,2,4,5,5
|
||||||
10031,3,1,4,5
|
680,3,1,4,5
|
||||||
10031,4,1,2,3
|
680,4,1,2,3
|
||||||
10031,5,2,3,4
|
680,5,2,3,4
|
||||||
10032,1,1,3,3
|
681,1,1,3,3
|
||||||
10032,2,1,3,4
|
681,2,1,3,4
|
||||||
10032,3,2,4,5
|
681,3,2,4,5
|
||||||
10032,4,4,5,5
|
681,4,4,5,5
|
||||||
10032,5,2,2,3
|
681,5,2,2,3
|
||||||
10033,1,4,5,5
|
682,1,4,5,5
|
||||||
10033,2,1,2,3
|
682,2,1,2,3
|
||||||
10033,3,2,4,5
|
682,3,2,4,5
|
||||||
10033,4,1,3,4
|
682,4,1,3,4
|
||||||
10033,5,2,4,4
|
682,5,2,4,4
|
||||||
10034,1,1,1,4
|
683,1,1,1,4
|
||||||
10034,2,1,1,4
|
683,2,1,1,4
|
||||||
10034,3,1,1,4
|
683,3,1,1,4
|
||||||
10034,4,1,1,5
|
683,4,1,1,5
|
||||||
10034,5,2,2,3
|
683,5,2,2,3
|
||||||
10035,1,1,1,4
|
684,1,1,1,4
|
||||||
10035,2,1,1,5
|
684,2,1,1,5
|
||||||
10035,3,1,1,3
|
684,3,1,1,3
|
||||||
10035,4,1,1,5
|
684,4,1,1,5
|
||||||
10035,5,2,2,3
|
684,5,2,2,3
|
||||||
10036,1,1,2,3
|
685,1,1,2,3
|
||||||
10036,2,3,4,5
|
685,2,3,4,5
|
||||||
10036,3,1,2,2
|
685,3,1,2,2
|
||||||
10036,4,1,4,5
|
685,4,1,4,5
|
||||||
10036,5,2,2,3
|
685,5,2,2,3
|
||||||
10037,1,1,1,3
|
686,1,1,1,3
|
||||||
10037,2,1,3,5
|
686,2,1,3,5
|
||||||
10037,3,1,2,3
|
686,3,1,2,3
|
||||||
10037,4,5,5,5
|
686,4,5,5,5
|
||||||
10037,5,2,2,2
|
686,5,2,2,2
|
||||||
10039,1,1,1,3
|
688,1,1,1,3
|
||||||
10039,2,1,1,4
|
688,2,1,1,4
|
||||||
10039,3,1,1,3
|
688,3,1,1,3
|
||||||
10039,4,1,3,5
|
688,4,1,3,5
|
||||||
10039,5,2,2,2
|
688,5,2,2,2
|
||||||
10040,1,1,1,2
|
689,1,1,1,2
|
||||||
10040,2,3,4,5
|
689,2,3,4,5
|
||||||
10040,3,1,3,3
|
689,3,1,3,3
|
||||||
10040,4,4,5,5
|
689,4,4,5,5
|
||||||
10040,5,2,2,2
|
689,5,2,2,2
|
||||||
10041,1,5,5,5
|
690,1,5,5,5
|
||||||
10041,2,1,4,5
|
690,2,1,4,5
|
||||||
10041,3,1,4,5
|
690,3,1,4,5
|
||||||
10041,4,1,4,5
|
690,4,1,4,5
|
||||||
10041,5,2,5,5
|
690,5,2,5,5
|
||||||
10042,1,1,4,5
|
691,1,1,4,5
|
||||||
10042,2,5,5,5
|
691,2,5,5,5
|
||||||
10042,3,1,5,5
|
691,3,1,5,5
|
||||||
10042,4,1,4,5
|
691,4,1,4,5
|
||||||
10042,5,2,4,5
|
691,5,2,4,5
|
||||||
10043,1,1,3,5
|
692,1,1,3,5
|
||||||
10043,2,1,5,5
|
692,2,1,5,5
|
||||||
10043,3,1,5,5
|
692,3,1,5,5
|
||||||
10043,4,1,5,5
|
692,4,1,5,5
|
||||||
10043,5,2,5,5
|
692,5,2,5,5
|
||||||
10044,1,5,5,5
|
693,1,5,5,5
|
||||||
10044,2,1,4,5
|
693,2,1,4,5
|
||||||
10044,3,1,5,5
|
693,3,1,5,5
|
||||||
10044,4,1,4,5
|
693,4,1,4,5
|
||||||
10044,5,2,4,5
|
693,5,2,4,5
|
||||||
10045,1,1,4,5
|
694,1,1,4,5
|
||||||
10045,2,1,5,5
|
694,2,1,5,5
|
||||||
10045,3,5,5,5
|
694,3,5,5,5
|
||||||
10045,4,1,4,5
|
694,4,1,4,5
|
||||||
10045,5,2,4,5
|
694,5,2,4,5
|
||||||
10046,1,1,4,5
|
695,1,1,4,5
|
||||||
10046,2,5,5,5
|
695,2,5,5,5
|
||||||
10046,3,1,4,5
|
695,3,1,4,5
|
||||||
10046,4,1,5,5
|
695,4,1,5,5
|
||||||
10046,5,2,4,5
|
695,5,2,4,5
|
||||||
10047,1,1,5,5
|
696,1,1,5,5
|
||||||
10047,2,1,4,5
|
696,2,1,4,5
|
||||||
10047,3,1,4,5
|
696,3,1,4,5
|
||||||
10047,4,1,4,5
|
696,4,1,4,5
|
||||||
10047,5,5,5,5
|
696,5,5,5,5
|
||||||
10048,1,1,4,5
|
697,1,1,4,5
|
||||||
10048,2,1,4,5
|
697,2,1,4,5
|
||||||
10048,3,1,5,5
|
697,3,1,5,5
|
||||||
10048,4,1,4,5
|
697,4,1,4,5
|
||||||
10048,5,5,5,5
|
697,5,5,5,5
|
||||||
10049,1,1,4,5
|
698,1,1,4,5
|
||||||
10049,2,1,4,5
|
698,2,1,4,5
|
||||||
10049,3,1,4,5
|
698,3,1,4,5
|
||||||
10049,4,5,5,5
|
698,4,5,5,5
|
||||||
10049,5,2,5,5
|
698,5,2,5,5
|
||||||
10050,1,1,4,5
|
699,1,1,4,5
|
||||||
10050,2,1,5,5
|
699,2,1,5,5
|
||||||
10050,3,1,4,5
|
699,3,1,4,5
|
||||||
10050,4,5,5,5
|
699,4,5,5,5
|
||||||
10050,5,2,4,5
|
699,5,2,4,5
|
||||||
10051,1,5,5,5
|
700,1,5,5,5
|
||||||
10051,2,1,5,5
|
700,2,1,5,5
|
||||||
10051,3,1,4,5
|
700,3,1,4,5
|
||||||
10051,4,1,4,5
|
700,4,1,4,5
|
||||||
10051,5,2,4,5
|
700,5,2,4,5
|
||||||
10052,1,1,4,5
|
701,1,1,4,5
|
||||||
10052,2,1,4,5
|
701,2,1,4,5
|
||||||
10052,3,5,5,5
|
701,3,5,5,5
|
||||||
10052,4,1,5,5
|
701,4,1,5,5
|
||||||
10052,5,2,4,5
|
701,5,2,4,5
|
||||||
10053,1,1,5,5
|
702,1,1,5,5
|
||||||
10053,2,1,4,5
|
702,2,1,4,5
|
||||||
10053,3,5,5,5
|
702,3,5,5,5
|
||||||
10053,4,1,4,5
|
702,4,1,4,5
|
||||||
10053,5,2,4,5
|
702,5,2,4,5
|
||||||
10054,1,1,4,5
|
703,1,1,4,5
|
||||||
10054,2,5,5,5
|
703,2,5,5,5
|
||||||
10054,3,1,4,5
|
703,3,1,4,5
|
||||||
10054,4,1,5,5
|
703,4,1,5,5
|
||||||
10054,5,2,4,5
|
703,5,2,4,5
|
||||||
10055,1,1,4,5
|
704,1,1,4,5
|
||||||
10055,2,1,4,5
|
704,2,1,4,5
|
||||||
10055,3,1,5,5
|
704,3,1,5,5
|
||||||
10055,4,5,5,5
|
704,4,5,5,5
|
||||||
10055,5,2,4,5
|
704,5,2,4,5
|
||||||
10056,1,1,5,5
|
705,1,1,5,5
|
||||||
10056,2,1,4,5
|
705,2,1,4,5
|
||||||
10056,3,5,5,5
|
705,3,5,5,5
|
||||||
10056,4,1,4,5
|
705,4,1,4,5
|
||||||
10056,5,2,4,5
|
705,5,2,4,5
|
||||||
10057,1,1,5,5
|
706,1,1,5,5
|
||||||
10057,2,1,5,5
|
706,2,1,5,5
|
||||||
10057,3,1,5,5
|
706,3,1,5,5
|
||||||
10057,4,1,5,5
|
706,4,1,5,5
|
||||||
10057,5,2,5,5
|
706,5,2,5,5
|
||||||
10058,1,2,3,4
|
707,1,2,3,4
|
||||||
10058,2,2,4,4
|
707,2,2,4,4
|
||||||
10058,3,1,3,4
|
707,3,1,3,4
|
||||||
10058,4,1,3,4
|
707,4,1,3,4
|
||||||
10058,5,2,4,4
|
707,5,2,4,4
|
||||||
10059,1,1,3,3
|
708,1,1,3,3
|
||||||
10059,2,1,3,3
|
708,2,1,3,3
|
||||||
10059,3,1,3,4
|
708,3,1,3,4
|
||||||
10059,4,1,4,4
|
708,4,1,4,4
|
||||||
10059,5,2,2,4
|
708,5,2,2,4
|
||||||
10060,1,1,3,4
|
709,1,1,3,4
|
||||||
10060,2,1,2,3
|
709,2,1,2,3
|
||||||
10060,3,3,4,5
|
709,3,3,4,5
|
||||||
10060,4,1,3,3
|
709,4,1,3,3
|
||||||
10060,5,3,3,4
|
709,5,3,3,4
|
||||||
10061,1,3,3,5
|
710,1,3,3,5
|
||||||
10061,2,1,3,5
|
710,2,1,3,5
|
||||||
10061,3,1,3,3
|
710,3,1,3,3
|
||||||
10061,4,1,2,3
|
710,4,1,2,3
|
||||||
10061,5,4,5,5
|
710,5,4,5,5
|
||||||
10062,1,1,3,3
|
711,1,1,3,3
|
||||||
10062,2,1,3,3
|
711,2,1,3,3
|
||||||
10062,3,3,5,5
|
711,3,3,5,5
|
||||||
10062,4,3,3,4
|
711,4,3,3,4
|
||||||
10062,5,2,2,4
|
711,5,2,2,4
|
||||||
10063,1,1,3,5
|
712,1,1,3,5
|
||||||
10063,2,1,3,5
|
712,2,1,3,5
|
||||||
10063,3,1,3,5
|
712,3,1,3,5
|
||||||
10063,4,1,3,5
|
712,4,1,3,5
|
||||||
10063,5,2,3,5
|
712,5,2,3,5
|
||||||
10064,1,3,3,5
|
713,1,3,3,5
|
||||||
10064,2,1,4,4
|
713,2,1,4,4
|
||||||
10064,3,1,3,4
|
713,3,1,3,4
|
||||||
10064,4,1,3,3
|
713,4,1,3,3
|
||||||
10064,5,3,5,5
|
713,5,3,5,5
|
||||||
10065,1,3,5,5
|
714,1,3,5,5
|
||||||
10065,2,1,1,1
|
714,2,1,1,1
|
||||||
10065,3,1,3,5
|
714,3,1,3,5
|
||||||
10065,4,1,1,3
|
714,4,1,1,3
|
||||||
10065,5,2,3,4
|
714,5,2,3,4
|
||||||
|
|
|
File diff suppressed because it is too large
Load diff
|
@ -1929,33 +1929,33 @@ pokemon_id,generation_id,game_index
|
||||||
647,5,647
|
647,5,647
|
||||||
648,5,648
|
648,5,648
|
||||||
649,5,649
|
649,5,649
|
||||||
10001,4,496
|
650,4,496
|
||||||
10001,5,650
|
650,5,650
|
||||||
10002,4,497
|
651,4,497
|
||||||
10002,5,651
|
651,5,651
|
||||||
10003,4,498
|
652,4,498
|
||||||
10003,5,652
|
652,5,652
|
||||||
10004,4,499
|
653,4,499
|
||||||
10004,5,653
|
653,5,653
|
||||||
10005,4,500
|
654,4,500
|
||||||
10005,5,654
|
654,5,654
|
||||||
10006,4,502
|
655,4,502
|
||||||
10006,5,655
|
655,5,655
|
||||||
10007,4,501
|
656,4,501
|
||||||
10007,5,656
|
656,5,656
|
||||||
10008,4,503
|
657,4,503
|
||||||
10008,5,657
|
657,5,657
|
||||||
10009,4,504
|
658,4,504
|
||||||
10009,5,658
|
658,5,658
|
||||||
10010,4,505
|
659,4,505
|
||||||
10010,5,659
|
659,5,659
|
||||||
10011,4,506
|
660,4,506
|
||||||
10011,5,660
|
660,5,660
|
||||||
10012,4,507
|
661,4,507
|
||||||
10012,5,661
|
661,5,661
|
||||||
10013,5,662
|
662,5,662
|
||||||
10014,5,663
|
663,5,663
|
||||||
10015,5,664
|
664,5,664
|
||||||
10016,5,665
|
665,5,665
|
||||||
10017,5,666
|
666,5,666
|
||||||
10018,5,667
|
667,5,667
|
||||||
|
|
|
|
@ -2343,34 +2343,34 @@ pokemon_id,version_id,item_id,rarity
|
||||||
637,18,199,100
|
637,18,199,100
|
||||||
648,17,91,100
|
648,17,91,100
|
||||||
648,18,91,100
|
648,18,91,100
|
||||||
10004,12,199,5
|
653,12,199,5
|
||||||
10004,13,199,5
|
653,13,199,5
|
||||||
10004,14,199,5
|
653,14,199,5
|
||||||
10004,15,199,5
|
653,15,199,5
|
||||||
10004,16,199,5
|
653,16,199,5
|
||||||
10004,17,199,5
|
653,17,199,5
|
||||||
10004,18,199,5
|
653,18,199,5
|
||||||
10005,12,199,5
|
654,12,199,5
|
||||||
10005,13,199,5
|
654,13,199,5
|
||||||
10005,14,199,5
|
654,14,199,5
|
||||||
10005,15,199,5
|
654,15,199,5
|
||||||
10005,16,199,5
|
654,16,199,5
|
||||||
10005,17,199,5
|
654,17,199,5
|
||||||
10005,18,199,5
|
654,18,199,5
|
||||||
10006,14,134,100
|
655,14,134,100
|
||||||
10006,15,134,100
|
655,15,134,100
|
||||||
10006,16,134,100
|
655,16,134,100
|
||||||
10006,17,134,100
|
655,17,134,100
|
||||||
10006,18,134,100
|
655,18,134,100
|
||||||
10013,17,220,100
|
662,17,220,100
|
||||||
10013,18,220,100
|
662,18,220,100
|
||||||
10014,17,220,100
|
663,17,220,100
|
||||||
10014,18,220,100
|
663,18,220,100
|
||||||
10015,17,220,100
|
664,17,220,100
|
||||||
10015,18,220,100
|
664,18,220,100
|
||||||
10016,17,204,5
|
665,17,204,5
|
||||||
10016,18,204,5
|
665,18,204,5
|
||||||
10017,17,129,50
|
666,17,129,50
|
||||||
10017,18,129,50
|
666,18,129,50
|
||||||
10018,17,91,100
|
667,17,91,100
|
||||||
10018,18,91,100
|
667,18,91,100
|
||||||
|
|
|
File diff suppressed because it is too large
Load diff
650
pokedex/data/csv/pokemon_species.csv
Normal file
650
pokedex/data/csv/pokemon_species.csv
Normal 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
pokedex/data/csv/pokemon_species_flavor_summaries.csv
Normal file
1
pokedex/data/csv/pokemon_species_flavor_summaries.csv
Normal file
|
@ -0,0 +1 @@
|
||||||
|
pokemon_species_id,local_language_id,flavor_summary
|
|
|
@ -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
|
1,1,9,"A strange seed was
|
||||||
planted on its
|
planted on its
|
||||||
back at birth.The plant sprouts
|
back at birth.The plant sprouts
|
Can't render this file because it is too large.
|
|
@ -1,4 +1,4 @@
|
||||||
pokemon_id,local_language_id,name,species
|
pokemon_species_id,local_language_id,name,genus
|
||||||
1,1,フシギダネ,
|
1,1,フシギダネ,
|
||||||
1,2,Fushigidane,
|
1,2,Fushigidane,
|
||||||
1,3,이상해씨,
|
1,3,이상해씨,
|
||||||
|
@ -4081,21 +4081,3 @@ pokemon_id,local_language_id,name,species
|
||||||
649,5,Genesect,
|
649,5,Genesect,
|
||||||
649,6,Genesect,
|
649,6,Genesect,
|
||||||
649,9,Genesect,Paleozoic
|
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
|
|
|
20
pokedex/data/csv/pokemon_species_prose.csv
Normal file
20
pokedex/data/csv/pokemon_species_prose.csv
Normal 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.
|
|
|
@ -3893,111 +3893,111 @@ pokemon_id,stat_id,base_stat,effort
|
||||||
649,4,120,1
|
649,4,120,1
|
||||||
649,5,95,0
|
649,5,95,0
|
||||||
649,6,99,1
|
649,6,99,1
|
||||||
10001,1,50,0
|
650,1,50,0
|
||||||
10001,2,180,2
|
650,2,180,2
|
||||||
10001,3,20,0
|
650,3,20,0
|
||||||
10001,4,180,1
|
650,4,180,1
|
||||||
10001,5,20,0
|
650,5,20,0
|
||||||
10001,6,150,0
|
650,6,150,0
|
||||||
10002,1,50,0
|
651,1,50,0
|
||||||
10002,2,70,0
|
651,2,70,0
|
||||||
10002,3,160,2
|
651,3,160,2
|
||||||
10002,4,70,0
|
651,4,70,0
|
||||||
10002,5,160,1
|
651,5,160,1
|
||||||
10002,6,90,0
|
651,6,90,0
|
||||||
10003,1,50,0
|
652,1,50,0
|
||||||
10003,2,95,0
|
652,2,95,0
|
||||||
10003,3,90,0
|
652,3,90,0
|
||||||
10003,4,95,0
|
652,4,95,0
|
||||||
10003,5,90,0
|
652,5,90,0
|
||||||
10003,6,180,3
|
652,6,180,3
|
||||||
10004,1,60,0
|
653,1,60,0
|
||||||
10004,2,79,0
|
653,2,79,0
|
||||||
10004,3,105,2
|
653,3,105,2
|
||||||
10004,4,59,0
|
653,4,59,0
|
||||||
10004,5,85,0
|
653,5,85,0
|
||||||
10004,6,36,0
|
653,6,36,0
|
||||||
10005,1,60,0
|
654,1,60,0
|
||||||
10005,2,69,0
|
654,2,69,0
|
||||||
10005,3,95,1
|
654,3,95,1
|
||||||
10005,4,69,0
|
654,4,69,0
|
||||||
10005,5,95,1
|
654,5,95,1
|
||||||
10005,6,36,0
|
654,6,36,0
|
||||||
10006,1,100,0
|
655,1,100,0
|
||||||
10006,2,103,0
|
655,2,103,0
|
||||||
10006,3,75,0
|
655,3,75,0
|
||||||
10006,4,120,0
|
655,4,120,0
|
||||||
10006,5,75,0
|
655,5,75,0
|
||||||
10006,6,127,3
|
655,6,127,3
|
||||||
10007,1,150,3
|
656,1,150,3
|
||||||
10007,2,120,0
|
656,2,120,0
|
||||||
10007,3,100,0
|
656,3,100,0
|
||||||
10007,4,120,0
|
656,4,120,0
|
||||||
10007,5,100,0
|
656,5,100,0
|
||||||
10007,6,90,0
|
656,6,90,0
|
||||||
10008,1,50,0
|
657,1,50,0
|
||||||
10008,2,65,0
|
657,2,65,0
|
||||||
10008,3,107,0
|
657,3,107,0
|
||||||
10008,4,105,1
|
657,4,105,1
|
||||||
10008,5,107,0
|
657,5,107,0
|
||||||
10008,6,86,1
|
657,6,86,1
|
||||||
10009,1,50,0
|
658,1,50,0
|
||||||
10009,2,65,0
|
658,2,65,0
|
||||||
10009,3,107,0
|
658,3,107,0
|
||||||
10009,4,105,1
|
658,4,105,1
|
||||||
10009,5,107,0
|
658,5,107,0
|
||||||
10009,6,86,1
|
658,6,86,1
|
||||||
10010,1,50,0
|
659,1,50,0
|
||||||
10010,2,65,0
|
659,2,65,0
|
||||||
10010,3,107,0
|
659,3,107,0
|
||||||
10010,4,105,1
|
659,4,105,1
|
||||||
10010,5,107,0
|
659,5,107,0
|
||||||
10010,6,86,1
|
659,6,86,1
|
||||||
10011,1,50,0
|
660,1,50,0
|
||||||
10011,2,65,0
|
660,2,65,0
|
||||||
10011,3,107,0
|
660,3,107,0
|
||||||
10011,4,105,1
|
660,4,105,1
|
||||||
10011,5,107,0
|
660,5,107,0
|
||||||
10011,6,86,1
|
660,6,86,1
|
||||||
10012,1,50,0
|
661,1,50,0
|
||||||
10012,2,65,0
|
661,2,65,0
|
||||||
10012,3,107,0
|
661,3,107,0
|
||||||
10012,4,105,1
|
661,4,105,1
|
||||||
10012,5,107,0
|
661,5,107,0
|
||||||
10012,6,86,1
|
661,6,86,1
|
||||||
10013,1,70,1
|
662,1,70,1
|
||||||
10013,2,70,0
|
662,2,70,0
|
||||||
10013,3,70,0
|
662,3,70,0
|
||||||
10013,4,70,0
|
662,4,70,0
|
||||||
10013,5,70,0
|
662,5,70,0
|
||||||
10013,6,70,0
|
662,6,70,0
|
||||||
10014,1,70,1
|
663,1,70,1
|
||||||
10014,2,70,0
|
663,2,70,0
|
||||||
10014,3,70,0
|
663,3,70,0
|
||||||
10014,4,70,0
|
663,4,70,0
|
||||||
10014,5,70,0
|
663,5,70,0
|
||||||
10014,6,70,0
|
663,6,70,0
|
||||||
10015,1,70,1
|
664,1,70,1
|
||||||
10015,2,70,0
|
664,2,70,0
|
||||||
10015,3,70,0
|
664,3,70,0
|
||||||
10015,4,70,0
|
664,4,70,0
|
||||||
10015,5,70,0
|
664,5,70,0
|
||||||
10015,6,70,0
|
664,6,70,0
|
||||||
10016,1,70,0
|
665,1,70,0
|
||||||
10016,2,92,0
|
665,2,92,0
|
||||||
10016,3,65,0
|
665,3,65,0
|
||||||
10016,4,80,0
|
665,4,80,0
|
||||||
10016,5,55,0
|
665,5,55,0
|
||||||
10016,6,98,2
|
665,6,98,2
|
||||||
10017,1,105,0
|
666,1,105,0
|
||||||
10017,2,30,0
|
666,2,30,0
|
||||||
10017,3,105,0
|
666,3,105,0
|
||||||
10017,4,140,2
|
666,4,140,2
|
||||||
10017,5,105,0
|
666,5,105,0
|
||||||
10017,6,55,0
|
666,6,55,0
|
||||||
10018,1,100,0
|
667,1,100,0
|
||||||
10018,2,128,1
|
667,2,128,1
|
||||||
10018,3,90,1
|
667,3,90,1
|
||||||
10018,4,77,0
|
667,4,77,0
|
||||||
10018,5,77,0
|
667,5,77,0
|
||||||
10018,6,128,1
|
667,6,128,1
|
||||||
|
|
|
|
@ -943,32 +943,32 @@ pokemon_id,type_id,slot
|
||||||
648,14,2
|
648,14,2
|
||||||
649,7,1
|
649,7,1
|
||||||
649,9,2
|
649,9,2
|
||||||
10001,14,1
|
650,14,1
|
||||||
10002,14,1
|
651,14,1
|
||||||
10003,14,1
|
652,14,1
|
||||||
10004,7,1
|
653,7,1
|
||||||
10004,5,2
|
653,5,2
|
||||||
10005,7,1
|
654,7,1
|
||||||
10005,9,2
|
654,9,2
|
||||||
10006,12,1
|
655,12,1
|
||||||
10006,3,2
|
655,3,2
|
||||||
10007,8,1
|
656,8,1
|
||||||
10007,16,2
|
656,16,2
|
||||||
10008,13,1
|
657,13,1
|
||||||
10008,10,2
|
657,10,2
|
||||||
10009,13,1
|
658,13,1
|
||||||
10009,11,2
|
658,11,2
|
||||||
10010,13,1
|
659,13,1
|
||||||
10010,15,2
|
659,15,2
|
||||||
10011,13,1
|
660,13,1
|
||||||
10011,3,2
|
660,3,2
|
||||||
10012,13,1
|
661,13,1
|
||||||
10012,12,2
|
661,12,2
|
||||||
10013,10,1
|
662,10,1
|
||||||
10014,11,1
|
663,11,1
|
||||||
10015,15,1
|
664,15,1
|
||||||
10016,11,1
|
665,11,1
|
||||||
10017,10,1
|
666,10,1
|
||||||
10017,14,2
|
666,14,2
|
||||||
10018,1,1
|
667,1,1
|
||||||
10018,2,2
|
667,2,2
|
||||||
|
|
|
|
@ -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,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,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,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."
|
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,PokemonSpecies,1,genus,e4b54c38,Semínkový
|
||||||
10,Pokemon,2,species,e4b54c38,Semínkový
|
10,PokemonSpecies,2,genus,e4b54c38,Semínkový
|
||||||
10,Pokemon,3,species,e4b54c38,Semínkový
|
10,PokemonSpecies,3,genus,e4b54c38,Semínkový
|
||||||
10,Pokemon,4,species,473b2152,Ještěrkovitý
|
10,PokemonSpecies,4,genus,473b2152,Ještěrkovitý
|
||||||
10,Pokemon,5,species,c4ff3365,Plamenný
|
10,PokemonSpecies,5,genus,c4ff3365,Plamenný
|
||||||
10,Pokemon,6,species,c4ff3365,Plamenný
|
10,PokemonSpecies,6,genus,c4ff3365,Plamenný
|
||||||
10,Pokemon,7,species,a662e558,Malý želví
|
10,PokemonSpecies,7,genus,a662e558,Malý želví
|
||||||
10,Pokemon,8,species,71b19d1a,Želví
|
10,PokemonSpecies,8,genus,71b19d1a,Želví
|
||||||
10,Pokemon,9,species,4a927f13,Korýší
|
10,PokemonSpecies,9,genus,4a927f13,Korýší
|
||||||
10,Pokemon,10,species,1a1f628b,Červí
|
10,PokemonSpecies,10,genus,1a1f628b,Červí
|
||||||
10,Pokemon,11,species,011bd63a,Kuklový
|
10,PokemonSpecies,11,genus,011bd63a,Kuklový
|
||||||
10,Pokemon,12,species,4666d1bf,Motýlí
|
10,PokemonSpecies,12,genus,4666d1bf,Motýlí
|
||||||
10,Pokemon,14,species,011bd63a,Kuklový
|
10,PokemonSpecies,14,genus,011bd63a,Kuklový
|
||||||
10,Pokemon,35,species,e1dde8d1,diblíci
|
10,PokemonSpecies,66,genus,55017b02,Supersilný
|
||||||
10,Pokemon,36,species,e1dde8d1,diblíci
|
10,PokemonSpecies,67,genus,55017b02,Supersilný
|
||||||
10,Pokemon,66,species,55017b02,Supersilný
|
10,PokemonSpecies,68,genus,55017b02,Supersilný
|
||||||
10,Pokemon,67,species,55017b02,Supersilný
|
10,PokemonSpecies,88,genus,63411a53,Kalový
|
||||||
10,Pokemon,68,species,55017b02,Supersilný
|
10,PokemonSpecies,89,genus,63411a53,Kalový
|
||||||
10,Pokemon,88,species,63411a53,Kalový
|
10,PokemonSpecies,96,genus,834b9610,Hypnotický
|
||||||
10,Pokemon,89,species,63411a53,Kalový
|
10,PokemonSpecies,97,genus,834b9610,Hypnotický
|
||||||
10,Pokemon,96,species,834b9610,Hypnotický
|
10,PokemonSpecies,111,genus,11201819,Střepinový
|
||||||
10,Pokemon,97,species,834b9610,Hypnotický
|
10,PokemonSpecies,120,genus,a62f8434,Hvězdicovitý
|
||||||
10,Pokemon,111,species,11201819,Střepinový
|
10,PokemonSpecies,121,genus,abfc4744,Záhadný
|
||||||
10,Pokemon,120,species,a62f8434,Hvězdicovitý
|
10,PokemonSpecies,122,genus,2ef3c334,Bariérový
|
||||||
10,Pokemon,121,species,abfc4744,Záhadný
|
10,PokemonSpecies,132,genus,f543030e,Transformační
|
||||||
10,Pokemon,122,species,2ef3c334,Bariérový
|
10,PokemonSpecies,136,genus,c4ff3365,Plamenný
|
||||||
10,Pokemon,132,species,f543030e,Transformační
|
10,PokemonSpecies,140,genus,4a927f13,Korýší
|
||||||
10,Pokemon,133,species,c0fdaa30,Vývoj
|
10,PokemonSpecies,141,genus,4a927f13,Korýší
|
||||||
10,Pokemon,136,species,c4ff3365,Plamenný
|
10,PokemonSpecies,146,genus,c4ff3365,Plamenný
|
||||||
10,Pokemon,140,species,4a927f13,Korýší
|
10,PokemonSpecies,173,genus,a62f8434,Hvězdicovitý
|
||||||
10,Pokemon,141,species,4a927f13,Korýší
|
10,PokemonSpecies,191,genus,e4b54c38,Semínkový
|
||||||
10,Pokemon,144,species,413df12c,Zmražení
|
10,PokemonSpecies,197,genus,2227bb25,Měsíční
|
||||||
10,Pokemon,146,species,c4ff3365,Plamenný
|
10,PokemonSpecies,200,genus,cd7e3dfb,Skřípavý
|
||||||
10,Pokemon,173,species,a62f8434,Hvězdicovitý
|
10,PokemonSpecies,243,genus,adc59c6c,Bleskový
|
||||||
10,Pokemon,191,species,e4b54c38,Semínkový
|
10,PokemonSpecies,261,genus,21d49620,Kousavý
|
||||||
10,Pokemon,197,species,2227bb25,Měsíční
|
10,PokemonSpecies,262,genus,21d49620,Kousavý
|
||||||
10,Pokemon,200,species,cd7e3dfb,Skřípavý
|
10,PokemonSpecies,265,genus,1a1f628b,Červí
|
||||||
10,Pokemon,209,species,e1dde8d1,diblíci
|
10,PokemonSpecies,266,genus,011bd63a,Kuklový
|
||||||
10,Pokemon,210,species,e1dde8d1,diblíci
|
10,PokemonSpecies,267,genus,4666d1bf,Motýlí
|
||||||
10,Pokemon,243,species,adc59c6c,Bleskový
|
10,PokemonSpecies,268,genus,011bd63a,Kuklový
|
||||||
10,Pokemon,261,species,21d49620,Kousavý
|
10,PokemonSpecies,277,genus,211da6d8,Polykací
|
||||||
10,Pokemon,262,species,21d49620,Kousavý
|
10,PokemonSpecies,307,genus,d2b08c9e,Meditační
|
||||||
10,Pokemon,265,species,1a1f628b,Červí
|
10,PokemonSpecies,308,genus,d2b08c9e,Meditační
|
||||||
10,Pokemon,266,species,011bd63a,Kuklový
|
10,PokemonSpecies,323,genus,36a1520c,Erupční
|
||||||
10,Pokemon,267,species,4666d1bf,Motýlí
|
10,PokemonSpecies,325,genus,8590f16f,Skákavý
|
||||||
10,Pokemon,268,species,011bd63a,Kuklový
|
10,PokemonSpecies,392,genus,c4ff3365,Plamenný
|
||||||
10,Pokemon,277,species,211da6d8,Polykací
|
10,PokemonSpecies,403,genus,6e0f7007,Jiskrový
|
||||||
10,Pokemon,307,species,d2b08c9e,Meditační
|
10,PokemonSpecies,404,genus,5cd2e029,Jiskrový
|
||||||
10,Pokemon,308,species,d2b08c9e,Meditační
|
10,PokemonSpecies,466,genus,f6d30876,Bleskový
|
||||||
10,Pokemon,323,species,36a1520c,Erupční
|
10,PokemonSpecies,523,genus,f6d30876,Bleskový
|
||||||
10,Pokemon,325,species,8590f16f,Skákavý
|
10,PokemonSpecies,613,genus,eda9f31f,Studený
|
||||||
10,Pokemon,351,species,836deaf2,Počasí
|
10,PokemonSpecies,614,genus,93e0b150,Mrazící
|
||||||
10,Pokemon,385,species,77e3dbf7,Přání
|
10,PokemonSpecies,615,genus,22733a94,Krystalizující
|
||||||
10,Pokemon,392,species,c4ff3365,Plamenný
|
10,PokemonSpecies,618,genus,1ebdd00d,Pasťový
|
||||||
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,PokemonColor,4,name,25cd90d8,Šedá
|
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,1,name,057f6d41,jeskyně
|
||||||
10,PokemonHabitat,2,name,a85d53b4,lesy
|
10,PokemonHabitat,2,name,a85d53b4,lesy
|
||||||
10,PokemonHabitat,3,name,a73fc6cb,lučiny
|
10,PokemonHabitat,3,name,a73fc6cb,lučiny
|
||||||
|
|
|
|
@ -154,7 +154,7 @@ class PokedexLinkPattern(markdown.inlinepatterns.Pattern):
|
||||||
item=tables.Item,
|
item=tables.Item,
|
||||||
location=tables.Location,
|
location=tables.Location,
|
||||||
move=tables.Move,
|
move=tables.Move,
|
||||||
pokemon=tables.Pokemon,
|
pokemon=tables.PokemonSpecies,
|
||||||
type=tables.Type,
|
type=tables.Type,
|
||||||
)[category]
|
)[category]
|
||||||
except KeyError:
|
except KeyError:
|
||||||
|
|
|
@ -141,6 +141,8 @@ def create_translation_table(_table_name, foreign_class, relation_name,
|
||||||
if string_getter:
|
if string_getter:
|
||||||
def getset_factory(underlying_type, instance):
|
def getset_factory(underlying_type, instance):
|
||||||
def getter(translations):
|
def getter(translations):
|
||||||
|
if translations is None:
|
||||||
|
return None
|
||||||
text = getattr(translations, column.name)
|
text = getattr(translations, column.name)
|
||||||
if text is None:
|
if text is None:
|
||||||
return text
|
return text
|
||||||
|
|
|
@ -409,8 +409,6 @@ class EvolutionChain(TableBase):
|
||||||
__tablename__ = 'evolution_chains'
|
__tablename__ = 'evolution_chains'
|
||||||
id = Column(Integer, primary_key=True, nullable=False,
|
id = Column(Integer, primary_key=True, nullable=False,
|
||||||
info=dict(description="A numeric ID"))
|
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,
|
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"))
|
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):
|
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'
|
__tablename__ = 'pokemon'
|
||||||
__singlename__ = 'pokemon'
|
__singlename__ = 'pokemon'
|
||||||
id = Column(Integer, primary_key=True, nullable=False,
|
id = Column(Integer, primary_key=True, nullable=False,
|
||||||
info=dict(description=u"A numeric ID"))
|
info=dict(description=u"A numeric ID"))
|
||||||
identifier = Column(Unicode(20), nullable=False,
|
species_id = Column(Integer, ForeignKey('pokemon_species.id'),
|
||||||
info=dict(description=u"An identifier", format='identifier'))
|
info=dict(description=u"ID of the species this Pokémon belongs to"))
|
||||||
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"))
|
|
||||||
height = Column(Integer, nullable=False,
|
height = Column(Integer, nullable=False,
|
||||||
info=dict(description=u"The height of the Pokémon, in decimeters (tenths of a meter)"))
|
info=dict(description=u"The height of the Pokémon, in decimeters (tenths of a meter)"))
|
||||||
weight = Column(Integer, nullable=False,
|
weight = Column(Integer, nullable=False,
|
||||||
info=dict(description=u"The weight of the Pokémon, in tenths of a kilogram (decigrams)"))
|
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,
|
base_experience = Column(Integer, nullable=False,
|
||||||
info=dict(description=u"The base EXP gained when defeating this Pokémon")) # XXX: Is this correct?
|
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,
|
order = Column(Integer, nullable=False, index=True,
|
||||||
info=dict(description=u"Order for sorting. Almost national order, except families and forms are grouped together."))
|
info=dict(description=u"Order for sorting. Almost national order, except families are grouped together."))
|
||||||
|
is_default = Column(Boolean, nullable=False, index=True,
|
||||||
### Stuff to handle alternate Pokémon forms
|
info=dict(description=u'Set for exactly one pokemon used as the default for each species.'))
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_base_form(self):
|
def name(self):
|
||||||
u"""Returns True iff the Pokémon is the base form for its species,
|
return self.default_form.pokemon_name or self.species.name
|
||||||
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 stat(self, stat_name):
|
def stat(self, stat_name):
|
||||||
u"""Returns a PokemonStat record for the given stat name (or Stat row
|
u"""Returns a PokemonStat record for the given stat name (or Stat row
|
||||||
|
@ -1175,19 +1113,6 @@ class Pokemon(TableBase):
|
||||||
else:
|
else:
|
||||||
return None
|
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):
|
class PokemonAbility(TableBase):
|
||||||
u"""Maps an ability to a Pokémon that can have it
|
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):
|
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'
|
__tablename__ = 'pokemon_dex_numbers'
|
||||||
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
|
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||||
info=dict(description=u"ID of the Pokémon"))
|
info=dict(description=u"ID of the species"))
|
||||||
pokedex_id = Column(Integer, ForeignKey('pokedexes.id'), primary_key=True, nullable=False, autoincrement=False,
|
pokedex_id = Column(Integer, ForeignKey('pokedexes.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||||
info=dict(description=u"ID of the Pokédex"))
|
info=dict(description=u"ID of the Pokédex"))
|
||||||
pokedex_number = Column(Integer, nullable=False,
|
pokedex_number = Column(Integer, nullable=False,
|
||||||
info=dict(description=u"Number of the Pokémon in that the Pokédex"))
|
info=dict(description=u"Number of the Pokémon in that the Pokédex"))
|
||||||
|
|
||||||
class PokemonEggGroup(TableBase):
|
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'
|
__tablename__ = 'pokemon_egg_groups'
|
||||||
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
|
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||||
info=dict(description=u"ID of the Pokémon"))
|
info=dict(description=u"ID of the species"))
|
||||||
egg_group_id = Column(Integer, ForeignKey('egg_groups.id'), primary_key=True, nullable=False, autoincrement=False,
|
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"))
|
info=dict(description=u"ID of the egg group"))
|
||||||
|
|
||||||
|
@ -1249,8 +1174,8 @@ class PokemonEvolution(TableBase):
|
||||||
__tablename__ = 'pokemon_evolution'
|
__tablename__ = 'pokemon_evolution'
|
||||||
id = Column(Integer, primary_key=True, nullable=False,
|
id = Column(Integer, primary_key=True, nullable=False,
|
||||||
info=dict(description=u"A numeric ID"))
|
info=dict(description=u"A numeric ID"))
|
||||||
evolved_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False,
|
evolved_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=False,
|
||||||
info=dict(description=u"The ID of the post-evolution Pokémon."))
|
info=dict(description=u"The ID of the post-evolution species."))
|
||||||
evolution_trigger_id = Column(Integer, ForeignKey('evolution_triggers.id'), nullable=False,
|
evolution_trigger_id = Column(Integer, ForeignKey('evolution_triggers.id'), nullable=False,
|
||||||
info=dict(description=u"The ID of the evolution trigger."))
|
info=dict(description=u"The ID of the evolution trigger."))
|
||||||
trigger_item_id = Column(Integer, ForeignKey('items.id'), nullable=True,
|
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."))
|
info=dict(description=u"The minimum Beauty value the Pokémon must have."))
|
||||||
relative_physical_stats = Column(Integer, nullable=True,
|
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)."))
|
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,
|
party_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
|
||||||
info=dict(description=u"The ID of the Pokémon that must be present in the party."))
|
info=dict(description=u"The ID of the species that must be present in the party."))
|
||||||
trade_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True,
|
trade_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
|
||||||
info=dict(description=u"The ID of the Pokémon for which this Pokémon must be traded."))
|
info=dict(description=u"The ID of the species for which this one 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'))
|
|
||||||
|
|
||||||
class PokemonForm(TableBase):
|
class PokemonForm(TableBase):
|
||||||
u"""An individual form of a Pokémon.
|
u"""An individual form of a Pokémon.
|
||||||
|
@ -1302,63 +1213,29 @@ class PokemonForm(TableBase):
|
||||||
__singlename__ = 'pokemon_form'
|
__singlename__ = 'pokemon_form'
|
||||||
id = Column(Integer, primary_key=True, nullable=False,
|
id = Column(Integer, primary_key=True, nullable=False,
|
||||||
info=dict(description=u'A unique ID for this form.'))
|
info=dict(description=u'A unique ID for this form.'))
|
||||||
identifier = Column(Unicode(16), nullable=True,
|
form_identifier = Column(Unicode(16), nullable=True,
|
||||||
info=dict(description=u"An identifier", format='identifier'))
|
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'))
|
||||||
form_base_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, autoincrement=False,
|
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.'))
|
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,
|
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.'))
|
info=dict(description=u'The ID of the version group in which this form first appeared.'))
|
||||||
is_default = Column(Boolean, nullable=False,
|
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,
|
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.'))
|
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
|
@property
|
||||||
def full_name(self):
|
def name(self):
|
||||||
u"""Returns the full name of this form, e.g. "Plant Cloak"."""
|
return self.pokemon_name or self.species.name
|
||||||
|
|
||||||
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
|
|
||||||
|
|
||||||
create_translation_table('pokemon_form_names', PokemonForm, 'names',
|
create_translation_table('pokemon_form_names', PokemonForm, 'names',
|
||||||
relation_lazy='joined',
|
relation_lazy='joined',
|
||||||
name = Column(Unicode(16), nullable=False, index=True,
|
form_name = Column(Unicode(32), nullable=True, index=True,
|
||||||
info=dict(description="The name", format='plaintext', official=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 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)),
|
|
||||||
)
|
)
|
||||||
|
|
||||||
class PokemonFormPokeathlonStat(TableBase):
|
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')),
|
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):
|
class PokemonStat(TableBase):
|
||||||
u"""A stat value of a Pokémon
|
u"""A stat value of a Pokémon
|
||||||
"""
|
"""
|
||||||
|
@ -1718,9 +1664,6 @@ EncounterSlot.method = relationship(EncounterMethod,
|
||||||
EncounterSlot.version_group = relationship(VersionGroup, innerjoin=True)
|
EncounterSlot.version_group = relationship(VersionGroup, innerjoin=True)
|
||||||
|
|
||||||
|
|
||||||
EvolutionChain.growth_rate = relationship(GrowthRate,
|
|
||||||
innerjoin=True,
|
|
||||||
backref='evolution_chains')
|
|
||||||
EvolutionChain.baby_trigger_item = relationship(Item,
|
EvolutionChain.baby_trigger_item = relationship(Item,
|
||||||
backref='evolution_chains')
|
backref='evolution_chains')
|
||||||
|
|
||||||
|
@ -1963,68 +1906,28 @@ Pokemon.dream_ability = relationship(Ability,
|
||||||
order_by=Pokemon.order,
|
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,
|
Pokemon.forms = relationship(PokemonForm,
|
||||||
primaryjoin=Pokemon.id==PokemonForm.form_base_pokemon_id,
|
primaryjoin=Pokemon.id==PokemonForm.pokemon_id,
|
||||||
order_by=(PokemonForm.order.asc(), PokemonForm.identifier.asc()))
|
order_by=(PokemonForm.order.asc(), PokemonForm.form_identifier.asc()))
|
||||||
Pokemon.default_form = relationship(PokemonForm,
|
Pokemon.default_form = relationship(PokemonForm,
|
||||||
primaryjoin=and_(
|
primaryjoin=and_(
|
||||||
Pokemon.id==PokemonForm.form_base_pokemon_id,
|
Pokemon.id==PokemonForm.pokemon_id,
|
||||||
PokemonForm.is_default==True),
|
PokemonForm.is_default==True),
|
||||||
uselist=False)
|
uselist=False, lazy='joined')
|
||||||
Pokemon.pokemon_habitat = relationship(PokemonHabitat,
|
|
||||||
backref='pokemon')
|
|
||||||
Pokemon.habitat = association_proxy('pokemon_habitat', 'name')
|
|
||||||
Pokemon.items = relationship(PokemonItem,
|
Pokemon.items = relationship(PokemonItem,
|
||||||
backref='pokemon')
|
backref='pokemon')
|
||||||
Pokemon.generation = relationship(Generation,
|
|
||||||
innerjoin=True,
|
|
||||||
backref='pokemon')
|
|
||||||
Pokemon.shape = relationship(PokemonShape,
|
|
||||||
innerjoin=True,
|
|
||||||
backref='pokemon')
|
|
||||||
Pokemon.stats = relationship(PokemonStat,
|
Pokemon.stats = relationship(PokemonStat,
|
||||||
innerjoin=True,
|
innerjoin=True,
|
||||||
order_by=PokemonStat.stat_id.asc(),
|
order_by=PokemonStat.stat_id.asc(),
|
||||||
backref='pokemon')
|
backref='pokemon')
|
||||||
|
Pokemon.species = relationship(PokemonSpecies,
|
||||||
|
innerjoin=True,
|
||||||
|
backref='pokemon')
|
||||||
Pokemon.types = relationship(Type,
|
Pokemon.types = relationship(Type,
|
||||||
secondary=PokemonType.__table__,
|
secondary=PokemonType.__table__,
|
||||||
innerjoin=True,
|
innerjoin=True, lazy='joined',
|
||||||
order_by=PokemonType.slot.asc(),
|
order_by=PokemonType.slot.asc(),
|
||||||
backref=backref('pokemon', order_by=Pokemon.order))
|
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,
|
PokemonDexNumber.pokedex = relationship(Pokedex,
|
||||||
innerjoin=True, lazy='joined')
|
innerjoin=True, lazy='joined')
|
||||||
|
@ -2042,38 +1945,22 @@ PokemonEvolution.location = relationship(Location,
|
||||||
backref='triggered_evolutions')
|
backref='triggered_evolutions')
|
||||||
PokemonEvolution.known_move = relationship(Move,
|
PokemonEvolution.known_move = relationship(Move,
|
||||||
backref='triggered_evolutions')
|
backref='triggered_evolutions')
|
||||||
PokemonEvolution.party_pokemon = relationship(Pokemon,
|
PokemonEvolution.party_species = relationship(PokemonSpecies,
|
||||||
primaryjoin=PokemonEvolution.party_pokemon_id==Pokemon.id,
|
primaryjoin=PokemonEvolution.party_species_id==PokemonSpecies.id,
|
||||||
backref='triggered_evolutions')
|
backref='triggered_evolutions')
|
||||||
PokemonEvolution.trade_pokemon = relationship(Pokemon,
|
PokemonEvolution.trade_species = relationship(PokemonSpecies,
|
||||||
primaryjoin=PokemonEvolution.trade_pokemon_id==Pokemon.id)
|
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,
|
PokemonForm.pokemon = relationship(Pokemon,
|
||||||
primaryjoin=or_(
|
primaryjoin=PokemonForm.pokemon_id==Pokemon.id,
|
||||||
PokemonForm.unique_pokemon_id==Pokemon.id,
|
innerjoin=True, lazy='joined')
|
||||||
and_(PokemonForm.unique_pokemon_id==None,
|
PokemonForm.species = association_proxy('pokemon', 'species')
|
||||||
PokemonForm.form_base_pokemon_id==Pokemon.id)
|
|
||||||
), uselist=False)
|
|
||||||
PokemonForm.version_group = relationship(VersionGroup,
|
PokemonForm.version_group = relationship(VersionGroup,
|
||||||
innerjoin=True)
|
innerjoin=True)
|
||||||
PokemonForm.form_group = association_proxy('form_base_pokemon', 'form_group')
|
|
||||||
PokemonForm.pokeathlon_stats = relationship(PokemonFormPokeathlonStat,
|
PokemonForm.pokeathlon_stats = relationship(PokemonFormPokeathlonStat,
|
||||||
order_by=PokemonFormPokeathlonStat.pokeathlon_stat_id,
|
order_by=PokemonFormPokeathlonStat.pokeathlon_stat_id,
|
||||||
backref='pokemon_form')
|
backref='pokemon_form')
|
||||||
|
|
||||||
PokemonFormGroup.pokemon = relationship(Pokemon,
|
|
||||||
innerjoin=True,
|
|
||||||
backref=backref('form_group', uselist=False))
|
|
||||||
|
|
||||||
PokemonFormPokeathlonStat.pokeathlon_stat = relationship(PokeathlonStat,
|
PokemonFormPokeathlonStat.pokeathlon_stat = relationship(PokeathlonStat,
|
||||||
innerjoin=True, lazy='joined')
|
innerjoin=True, lazy='joined')
|
||||||
|
|
||||||
|
@ -2104,6 +1991,62 @@ PokemonMove.method = relationship(PokemonMoveMethod,
|
||||||
PokemonStat.stat = relationship(Stat,
|
PokemonStat.stat = relationship(Stat,
|
||||||
innerjoin=True, lazy='joined')
|
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.generation = relationship(Generation, uselist=False)
|
||||||
Region.version_group_regions = relationship(VersionGroupRegion,
|
Region.version_group_regions = relationship(VersionGroupRegion,
|
||||||
|
|
|
@ -7,13 +7,13 @@ of pokemon, and filtering/ordering by name.
|
||||||
from sqlalchemy.orm import aliased
|
from sqlalchemy.orm import aliased
|
||||||
from sqlalchemy.sql.expression import func
|
from sqlalchemy.sql.expression import func
|
||||||
from sqlalchemy.sql.functions import coalesce
|
from sqlalchemy.sql.functions import coalesce
|
||||||
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
from pokedex.db import tables
|
from pokedex.db import tables
|
||||||
|
|
||||||
### Getter
|
### Getter
|
||||||
|
|
||||||
def get(session, table, identifier=None, name=None, id=None,
|
def get(session, table, identifier=None, name=None, id=None, language=None):
|
||||||
form_identifier=None, form_name=None, language=None, is_pokemon=None):
|
|
||||||
"""Get one object from the database.
|
"""Get one object from the database.
|
||||||
|
|
||||||
session: The session to use (from pokedex.db.connect())
|
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
|
identifier: Identifier of the object
|
||||||
name: The name of the object
|
name: The name of the object
|
||||||
id: The ID number 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
|
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
|
All conditions must match, so it's not a good idea to specify more than one
|
||||||
of identifier/name/id at once.
|
of identifier/name/id at once.
|
||||||
|
|
||||||
If zero or more than one objects matching the criteria are found, the
|
If zero or more than one objects matching the criteria are found, the
|
||||||
appropriate SQLAlchemy exception is raised.
|
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)
|
query = session.query(table)
|
||||||
|
|
||||||
if identifier is not None:
|
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)
|
query = filter_name(query, table, name, language)
|
||||||
|
|
||||||
if id is not None:
|
if id is not None:
|
||||||
query = query.filter_by(id=id)
|
# ASSUMPTION: id is the primary key of the table.
|
||||||
|
result = query.get(id)
|
||||||
if form_identifier is not None or form_name is not None:
|
if result is None:
|
||||||
if is_pokemon:
|
# Keep the API
|
||||||
query = query.join(table.unique_form)
|
raise NoResultFound
|
||||||
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)
|
|
||||||
else:
|
else:
|
||||||
raise ValueError(
|
return result
|
||||||
"form_identifier and form_name only make sense for pokemon")
|
|
||||||
elif is_pokemon:
|
|
||||||
query = filter_base_forms(query)
|
|
||||||
|
|
||||||
return query.one()
|
return query.one()
|
||||||
|
|
||||||
### Helpers
|
### 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
|
"""Filter a query by name, return the resulting query
|
||||||
|
|
||||||
query: The query to filter
|
query: The query to filter
|
||||||
table: The table of named objects
|
table: The table of named objects
|
||||||
name: The name to look for. May be a tuple of alternatives.
|
name: The name to look for. May be a tuple of alternatives.
|
||||||
language: The language for "name", or None for the session default
|
language: The language for "name", or None for the session default
|
||||||
|
name_attribute: the attribute to use; defaults to 'name'
|
||||||
"""
|
"""
|
||||||
if language is None:
|
if language is None:
|
||||||
query = query.filter(table.name == name)
|
query = query.filter(getattr(table, name_attribute) == name)
|
||||||
else:
|
else:
|
||||||
names_table = table.names_table
|
names_table = table.names_table
|
||||||
|
name_column = getattr(names_table, name_attribute)
|
||||||
query = query.join(names_table)
|
query = query.join(names_table)
|
||||||
query = query.filter(names_table.foreign_id == table.id)
|
query = query.filter(names_table.foreign_id == table.id)
|
||||||
query = query.filter(names_table.local_language_id == language.id)
|
query = query.filter(names_table.local_language_id == language.id)
|
||||||
if isinstance(name, tuple):
|
if isinstance(name, tuple):
|
||||||
query = query.filter(names_table.name in name)
|
query = query.filter(name_column in name)
|
||||||
else:
|
else:
|
||||||
query = query.filter(names_table.name == name)
|
query = query.filter(name_column == name)
|
||||||
return query
|
return query
|
||||||
|
|
||||||
def filter_base_forms(query):
|
def order_by_name(query, table, language=None, *extra_languages, **kwargs):
|
||||||
"""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):
|
|
||||||
"""Order a query by name.
|
"""Order a query by name.
|
||||||
|
|
||||||
query: The query to order
|
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
|
extra_languages: Extra languages to order by, should the translations for
|
||||||
`language` be incomplete (or ambiguous).
|
`language` be incomplete (or ambiguous).
|
||||||
|
|
||||||
|
name_attribute (keyword argument): the attribute to use; defaults to 'name'
|
||||||
|
|
||||||
Uses the identifier as a fallback ordering.
|
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 = []
|
order_columns = []
|
||||||
if language is None:
|
if language is None:
|
||||||
query = query.outerjoin(table.names_local)
|
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:
|
else:
|
||||||
extra_languages = (language, ) + extra_languages
|
extra_languages = (language, ) + extra_languages
|
||||||
for language in 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.outerjoin(names_table)
|
||||||
query = query.filter(names_table.foreign_id == table.id)
|
query = query.filter(names_table.foreign_id == table.id)
|
||||||
query = query.filter(names_table.local_language_id == language.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)
|
order_columns.append(table.identifier)
|
||||||
query = query.order_by(coalesce(*order_columns))
|
query = query.order_by(coalesce(*order_columns))
|
||||||
return query
|
return query
|
||||||
|
|
|
@ -103,7 +103,7 @@ class PokedexLookup(object):
|
||||||
tables.Location,
|
tables.Location,
|
||||||
tables.Move,
|
tables.Move,
|
||||||
tables.Nature,
|
tables.Nature,
|
||||||
tables.Pokemon,
|
tables.PokemonSpecies,
|
||||||
tables.PokemonForm,
|
tables.PokemonForm,
|
||||||
tables.Type,
|
tables.Type,
|
||||||
)
|
)
|
||||||
|
@ -193,7 +193,7 @@ class PokedexLookup(object):
|
||||||
# Index every name in all our tables of interest
|
# Index every name in all our tables of interest
|
||||||
speller_entries = set()
|
speller_entries = set()
|
||||||
for cls in self.indexed_tables.values():
|
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):
|
for row in q.yield_per(5):
|
||||||
row_key = dict(table=unicode(cls.__tablename__),
|
row_key = dict(table=unicode(cls.__tablename__),
|
||||||
|
@ -211,21 +211,17 @@ class PokedexLookup(object):
|
||||||
speller_entries.add(normalized_name)
|
speller_entries.add(normalized_name)
|
||||||
|
|
||||||
|
|
||||||
# Add the basic English name to the index
|
if cls == tables.PokemonForm:
|
||||||
if cls == tables.Pokemon:
|
name_map = 'pokemon_name_map'
|
||||||
# Don't re-add alternate forms of the same Pokémon; they'll
|
else:
|
||||||
# be added as Pokémon forms instead
|
name_map = 'name_map'
|
||||||
if not row.is_base_form:
|
|
||||||
continue
|
|
||||||
elif cls == tables.PokemonForm:
|
|
||||||
if row.name:
|
|
||||||
add(row.pokemon_name, None, u'en', u'us')
|
|
||||||
continue
|
|
||||||
|
|
||||||
# Some things also have other languages' names
|
seen = set([None])
|
||||||
# XXX other language form names..?
|
for language, name in sorted(getattr(row, name_map, {}).items(),
|
||||||
seen = set()
|
# Sort English first for now
|
||||||
for language, name in getattr(row, 'name_map', {}).items():
|
key=lambda (l, n): (l.identifier != 'en', not l.official)):
|
||||||
|
if not name:
|
||||||
|
continue
|
||||||
if name in seen:
|
if name in seen:
|
||||||
# Don't add the name again as a different
|
# Don't add the name again as a different
|
||||||
# language; no point and it makes spell results
|
# language; no point and it makes spell results
|
||||||
|
@ -301,6 +297,11 @@ class PokedexLookup(object):
|
||||||
prefix = prefix.strip()
|
prefix = prefix.strip()
|
||||||
if prefix:
|
if prefix:
|
||||||
user_valid_types.append(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
|
# Merge the valid types together. Only types that appear in BOTH lists
|
||||||
# may be used.
|
# may be used.
|
||||||
|
@ -413,9 +414,6 @@ class PokedexLookup(object):
|
||||||
This function currently ONLY does fuzzy matching if there are no exact
|
This function currently ONLY does fuzzy matching if there are no exact
|
||||||
matches.
|
matches.
|
||||||
|
|
||||||
Formes are not returned unless requested; "Shaymin" will return only
|
|
||||||
grass Shaymin.
|
|
||||||
|
|
||||||
Extraneous whitespace is removed with extreme prejudice.
|
Extraneous whitespace is removed with extreme prejudice.
|
||||||
|
|
||||||
Recognizes:
|
Recognizes:
|
||||||
|
@ -430,7 +428,6 @@ class PokedexLookup(object):
|
||||||
- Language restrictions. "@fr:charge" will only return Tackle, which
|
- Language restrictions. "@fr:charge" will only return Tackle, which
|
||||||
is called "Charge" in French. These can be combined with type
|
is called "Charge" in French. These can be combined with type
|
||||||
restrictions, e.g., "@fr,move:charge".
|
restrictions, e.g., "@fr,move:charge".
|
||||||
- Alternate formes can be specified merely like "wash rotom".
|
|
||||||
|
|
||||||
`input`
|
`input`
|
||||||
Name of the thing to look for.
|
Name of the thing to look for.
|
||||||
|
@ -448,7 +445,6 @@ class PokedexLookup(object):
|
||||||
|
|
||||||
name = self.normalize_name(input)
|
name = self.normalize_name(input)
|
||||||
exact = True
|
exact = True
|
||||||
form = None
|
|
||||||
|
|
||||||
# Pop off any type prefix and merge with valid_types
|
# Pop off any type prefix and merge with valid_types
|
||||||
name, merged_valid_types, type_term = \
|
name, merged_valid_types, type_term = \
|
||||||
|
|
|
@ -1,6 +1,45 @@
|
||||||
def setup():
|
|
||||||
# XXX This needs to recreate the database, someday. :(
|
|
||||||
pass
|
|
||||||
|
|
||||||
def teardown():
|
import inspect
|
||||||
pass
|
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
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
from nose.tools import *
|
|
||||||
import unittest
|
import pytest
|
||||||
|
|
||||||
from sqlalchemy.orm import aliased
|
from sqlalchemy.orm import aliased
|
||||||
from sqlalchemy.orm.exc import NoResultFound
|
from sqlalchemy.orm.exc import NoResultFound
|
||||||
|
|
||||||
|
@ -21,8 +22,8 @@ def test_encounter_slots():
|
||||||
.join((version_group_b, tables.Version.version_group)) \
|
.join((version_group_b, tables.Version.version_group)) \
|
||||||
.filter(version_group_a.id != version_group_b.id)
|
.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():
|
def test_nonzero_autoincrement_ids():
|
||||||
"""Check that autoincrementing ids don't contain zeroes
|
"""Check that autoincrementing ids don't contain zeroes
|
||||||
|
@ -34,8 +35,8 @@ def test_nonzero_autoincrement_ids():
|
||||||
for cls in tables.mapped_classes:
|
for cls in tables.mapped_classes:
|
||||||
if 'id' in cls.__table__.c:
|
if 'id' in cls.__table__.c:
|
||||||
if cls.__table__.c.id.autoincrement:
|
if cls.__table__.c.id.autoincrement:
|
||||||
@raises(NoResultFound)
|
|
||||||
def nonzero_id(cls):
|
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__
|
nonzero_id.description = "No zero id in %s" % cls.__name__
|
||||||
yield nonzero_id, cls
|
yield nonzero_id, cls
|
||||||
|
|
|
@ -1,104 +1,91 @@
|
||||||
# encoding: utf8
|
# Encoding: UTF-8
|
||||||
from nose.tools import *
|
|
||||||
import unittest
|
from pokedex.tests import *
|
||||||
|
|
||||||
from pokedex.lookup import PokedexLookup
|
from pokedex.lookup import PokedexLookup
|
||||||
|
|
||||||
lookup = None
|
lookup = PokedexLookup()
|
||||||
|
|
||||||
def setup():
|
@positional_params(
|
||||||
# Recreate data
|
|
||||||
global lookup
|
|
||||||
lookup = PokedexLookup()
|
|
||||||
|
|
||||||
def test_exact_lookup():
|
|
||||||
tests = [
|
|
||||||
# Simple lookups
|
# Simple lookups
|
||||||
(u'Eevee', 'pokemon', 133),
|
(u'Eevee', 'pokemon_species',133),
|
||||||
(u'Scratch', 'moves', 10),
|
(u'Scratch', 'moves', 10),
|
||||||
(u'Master Ball', 'items', 1),
|
(u'Master Ball', 'items', 1),
|
||||||
(u'normal', 'types', 1),
|
(u'normal', 'types', 1),
|
||||||
(u'Run Away', 'abilities', 50),
|
(u'Run Away', 'abilities', 50),
|
||||||
|
|
||||||
# Funny characters
|
# Funny characters
|
||||||
(u'Mr. Mime', 'pokemon', 122),
|
(u'Mr. Mime', 'pokemon_species', 122),
|
||||||
(u"Farfetch'd", 'pokemon', 83),
|
(u"Farfetch'd", 'pokemon_species', 83),
|
||||||
(u'Poké Ball', 'items', 4),
|
(u'Poké Ball', 'items', 4),
|
||||||
|
|
||||||
# Forms
|
# Forms
|
||||||
(u'Rotom', 'pokemon', 479),
|
(u'Rotom', 'pokemon_species', 479),
|
||||||
(u'Wash Rotom', 'pokemon_forms',10059),
|
(u'Wash Rotom', 'pokemon_forms', 708),
|
||||||
(u'East Shellos', 'pokemon_forms',10039),
|
(u'East Shellos', 'pokemon_forms', 688),
|
||||||
|
|
||||||
# Other languages
|
# Other languages
|
||||||
(u'イーブイ', 'pokemon', 133),
|
(u'イーブイ', 'pokemon_species', 133),
|
||||||
(u'Iibui', 'pokemon', 133),
|
(u'Iibui', 'pokemon_species', 133),
|
||||||
(u'Eievui', 'pokemon', 133),
|
(u'Eievui', 'pokemon_species', 133),
|
||||||
(u'이브이', 'pokemon', 133),
|
(u'이브이', 'pokemon_species', 133),
|
||||||
(u'伊布', 'pokemon', 133),
|
(u'伊布', 'pokemon_species', 133),
|
||||||
(u'Evoli', 'pokemon', 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:
|
row = results[0].object
|
||||||
results = lookup.lookup(input)
|
assert row.__tablename__ == table
|
||||||
assert_equal(len(results), 1, u"'%s' returns one result" % input)
|
assert row.id == id
|
||||||
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)
|
|
||||||
|
|
||||||
|
|
||||||
def test_id_lookup():
|
def test_id_lookup():
|
||||||
results = lookup.lookup(u'1')
|
results = lookup.lookup(u'1')
|
||||||
assert_true(len(results) >= 5, u'At least five things have id 1')
|
assert len(results) >= 5
|
||||||
assert_true(all(_.object.id == 1 for _ in results),
|
assert all(result.object.id == 1 for result in results)
|
||||||
u'All results have id 1')
|
|
||||||
|
|
||||||
def test_multi_lookup():
|
def test_multi_lookup():
|
||||||
results = lookup.lookup(u'Metronome')
|
results = lookup.lookup(u'Metronome')
|
||||||
assert_equal(len(results), 2, u'Two things called "Metronome"')
|
assert len(results) == 2
|
||||||
assert_true(results[0].exact, u'Metronome matches are exact')
|
assert results[0].exact
|
||||||
|
|
||||||
|
|
||||||
def test_type_lookup():
|
def test_type_lookup():
|
||||||
results = lookup.lookup(u'pokemon:1')
|
results = lookup.lookup(u'pokemon:1')
|
||||||
assert_equal(results[0].object.__tablename__, 'pokemon',
|
assert results[0].object.__tablename__ == 'pokemon_species'
|
||||||
u'Type restriction works correctly')
|
assert len(results) == 1
|
||||||
assert_equal(len(results), 1, u'Only one id result when type is specified')
|
assert results[0].object.name == u'Bulbasaur'
|
||||||
assert_equal(results[0].object.name, u'Bulbasaur',
|
|
||||||
u'Type + id returns the right result')
|
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():
|
def test_language_lookup():
|
||||||
# There are two objects named "charge": the move Charge, and the move
|
# There are two objects named "charge": the move Charge, and the move
|
||||||
# Tackle, which is called "Charge" in French.
|
# Tackle, which is called "Charge" in French.
|
||||||
results = lookup.lookup(u'charge')
|
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')
|
results = lookup.lookup(u'@fr:charge')
|
||||||
assert_equal(results[0].iso639, u'fr', u'Language restriction works correctly')
|
assert results[0].iso639 == u'fr'
|
||||||
assert_equal(len(results), 1, u'Only one "charge" result when language is specified')
|
assert len(results) == 1
|
||||||
assert_equal(results[0].object.name, u'Tackle',
|
assert results[0].object.name == u'Tackle'
|
||||||
u'Language + vague name returns the right result')
|
|
||||||
|
|
||||||
results = lookup.lookup(u'charge', valid_types=['@fr'])
|
results = lookup.lookup(u'charge', valid_types=['@fr'])
|
||||||
assert_equal(results[0].object.name, u'Tackle',
|
assert results[0].object.name == u'Tackle'
|
||||||
u'valid_types works as well as @lang: prefix')
|
|
||||||
|
|
||||||
results = lookup.lookup(u'@fr,move:charge')
|
results = lookup.lookup(u'@fr,move:charge')
|
||||||
assert_equal(results[0].object.name, u'Tackle',
|
assert results[0].object.name == u'Tackle'
|
||||||
u'Languages and types both work together')
|
|
||||||
|
|
||||||
results = lookup.lookup(u'@fr:charge', valid_types=['move'])
|
results = lookup.lookup(u'@fr:charge', valid_types=['move'])
|
||||||
assert_equal(results[0].object.name, u'Tackle',
|
assert results[0].object.name, u'Tackle'
|
||||||
u'valid_types and language prefixes get along')
|
|
||||||
|
|
||||||
def test_fuzzy_lookup():
|
|
||||||
tests = [
|
@positional_params(
|
||||||
# Regular English names
|
# Regular English names
|
||||||
(u'chamander', u'Charmander'),
|
(u'chamander', u'Charmander'),
|
||||||
(u'pokeball', u'Poké Ball'),
|
(u'pokeball', u'Poké Ball'),
|
||||||
|
@ -110,44 +97,51 @@ def test_fuzzy_lookup():
|
||||||
# Sufficiently long foreign names
|
# Sufficiently long foreign names
|
||||||
(u'カクレオ', u'Kecleon'),
|
(u'カクレオ', u'Kecleon'),
|
||||||
(u'Yamikrasu', u'Murkrow'),
|
(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')
|
results = lookup.lookup(u'Nidoran')
|
||||||
top_names = [_.object.name for _ in results[0:2]]
|
top_names = [result.object.name for result in results[0:2]]
|
||||||
assert_true(u'Nidoran♂' in top_names, u'Nidoran♂ is a top result for "Nidoran"')
|
assert u'Nidoran♂' in top_names
|
||||||
assert_true(u'Nidoran♀' in top_names, u'Nidoran♀ is a top result for "Nidoran"')
|
assert u'Nidoran♀' in top_names
|
||||||
|
|
||||||
def test_wildcard_lookup():
|
|
||||||
tests = [
|
@positional_params(
|
||||||
(u'pokemon:*meleon', u'Charmeleon'),
|
(u'pokemon:*meleon', u'Charmeleon'),
|
||||||
(u'item:master*', u'Master Ball'),
|
(u'item:master*', u'Master Ball'),
|
||||||
(u'ee?ee', u'Eevee'),
|
(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():
|
def test_bare_random():
|
||||||
for _ in xrange(5):
|
for i in range(5):
|
||||||
results = lookup.lookup(u'random')
|
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():
|
def test_crash_empty_prefix():
|
||||||
"""Searching for ':foo' used to crash, augh!"""
|
"""Searching for ':foo' used to crash, augh!"""
|
||||||
results = lookup.lookup(u':Eevee')
|
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'
|
||||||
|
|
|
@ -1,4 +1,3 @@
|
||||||
|
|
||||||
"""Test the media accessors.
|
"""Test the media accessors.
|
||||||
|
|
||||||
If run directly from the command line, also tests the accessors and the names
|
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.
|
This, of course, takes a lot of time to run.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
import os
|
import os
|
||||||
import re
|
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.db import tables, connect
|
||||||
from pokedex.util import media
|
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()
|
session = connect()
|
||||||
basedir = pkg_resources.resource_filename('pokedex', 'data/media')
|
|
||||||
|
|
||||||
path_re = re.compile('^[-a-z0-9./]*$')
|
path_re = re.compile('^[-a-z0-9./]*$')
|
||||||
|
|
||||||
def test_totodile():
|
def test_totodile(root):
|
||||||
"""Totodile's female sprite -- same as male"""
|
"""Totodile's female sprite -- same as male"""
|
||||||
totodile = session.query(tables.Pokemon).filter_by(identifier=u'totodile').one()
|
totodile = session.query(tables.PokemonSpecies).filter_by(identifier=u'totodile').one()
|
||||||
accessor = media.PokemonMedia(totodile)
|
accessor = media.PokemonSpeciesMedia(root, totodile)
|
||||||
assert accessor.sprite() == accessor.sprite(female=True)
|
assert accessor.sprite() == accessor.sprite(female=True)
|
||||||
|
|
||||||
def test_chimecho():
|
def test_chimecho(root):
|
||||||
"""Chimecho's Platinum female backsprite -- diffeent from male"""
|
"""Chimecho's Platinum female backsprite -- diffeent from male"""
|
||||||
chimecho = session.query(tables.Pokemon).filter_by(identifier=u'chimecho').one()
|
chimecho = session.query(tables.PokemonSpecies).filter_by(identifier=u'chimecho').one()
|
||||||
accessor = media.PokemonMedia(chimecho)
|
accessor = media.PokemonSpeciesMedia(root, chimecho)
|
||||||
male = accessor.sprite('platinum', back=True, frame=2)
|
male = accessor.sprite('platinum', back=True, frame=2)
|
||||||
female = accessor.sprite('platinum', back=True, female=True, frame=2)
|
female = accessor.sprite('platinum', back=True, female=True, frame=2)
|
||||||
assert male != female
|
assert male != female
|
||||||
|
|
||||||
def test_venonat():
|
def test_venonat(root):
|
||||||
"""Venonat's shiny Yellow sprite -- same as non-shiny"""
|
"""Venonat's shiny Yellow sprite -- same as non-shiny"""
|
||||||
venonat = session.query(tables.Pokemon).filter_by(identifier=u'venonat').one()
|
venonat = session.query(tables.PokemonSpecies).filter_by(identifier=u'venonat').one()
|
||||||
accessor = media.PokemonMedia(venonat)
|
accessor = media.PokemonSpeciesMedia(root, venonat)
|
||||||
assert accessor.sprite('yellow') == accessor.sprite('yellow', shiny=True)
|
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 fire-form icon -- same as base icon"""
|
||||||
arceus = session.query(tables.Pokemon).filter_by(identifier=u'arceus').one()
|
arceus = session.query(tables.PokemonSpecies).filter_by(identifier=u'arceus').one()
|
||||||
accessor = media.PokemonMedia(arceus)
|
accessor = media.PokemonSpeciesMedia(root, arceus)
|
||||||
fire_arceus = [f for f in arceus.forms if f.identifier == 'fire'][0]
|
fire_arceus = [f for f in arceus.forms if f.form_identifier == 'fire'][0]
|
||||||
fire_accessor = media.PokemonFormMedia(fire_arceus)
|
fire_accessor = media.PokemonFormMedia(root, fire_arceus)
|
||||||
assert accessor.icon() == fire_accessor.icon()
|
assert accessor.icon() == fire_accessor.icon()
|
||||||
|
|
||||||
@raises(ValueError)
|
def test_strict_castform(root):
|
||||||
def test_strict_castform():
|
|
||||||
"""Castform rainy form overworld with strict -- unavailable"""
|
"""Castform rainy form overworld with strict -- unavailable"""
|
||||||
castform = session.query(tables.Pokemon).filter_by(identifier=u'castform').first()
|
with pytest.raises(ValueError):
|
||||||
rainy_castform = [f for f in castform.forms if f.identifier == 'rainy'][0]
|
castform = session.query(tables.PokemonSpecies).filter_by(identifier=u'castform').first()
|
||||||
rainy_castform = media.PokemonFormMedia(rainy_castform)
|
rainy_castform = [f for f in castform.forms if f.form_identifier == 'rainy'][0]
|
||||||
rainy_castform.overworld('up', strict=True)
|
print rainy_castform
|
||||||
|
rainy_castform = media.PokemonFormMedia(root, rainy_castform)
|
||||||
|
rainy_castform.overworld('up', strict=True)
|
||||||
|
|
||||||
@raises(ValueError)
|
def test_strict_exeggcute(root):
|
||||||
def test_strict_exeggcute():
|
|
||||||
"""Exeggcutes's female backsprite, with strict -- unavailable"""
|
"""Exeggcutes's female backsprite, with strict -- unavailable"""
|
||||||
exeggcute = session.query(tables.Pokemon).filter_by(identifier=u'exeggcute').one()
|
with pytest.raises(ValueError):
|
||||||
accessor = media.PokemonMedia(exeggcute)
|
exeggcute = session.query(tables.PokemonSpecies).filter_by(identifier=u'exeggcute').one()
|
||||||
accessor.sprite(female=True, strict=True)
|
accessor = media.PokemonSpeciesMedia(root, exeggcute)
|
||||||
|
accessor.sprite(female=True, strict=True)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
def get_all_filenames():
|
def get_all_filenames(root):
|
||||||
print 'Reading all filenames...'
|
|
||||||
|
|
||||||
all_filenames = set()
|
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:
|
for filename in filenames:
|
||||||
path = os.path.join(dirpath, filename)
|
path = os.path.join(dirpath, filename)
|
||||||
assert path_re.match(path), path
|
assert path_re.match(path), path
|
||||||
|
@ -101,7 +104,8 @@ def hit(filenames, method, *args, **kwargs):
|
||||||
pass
|
pass
|
||||||
return True
|
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
|
For every the accessor method, loop over the Cartesian products of all
|
||||||
possible values for its arguments.
|
possible values for its arguments.
|
||||||
|
@ -110,34 +114,35 @@ def check_get_everything():
|
||||||
|
|
||||||
Well, there are exceptions of course.
|
Well, there are exceptions of course.
|
||||||
"""
|
"""
|
||||||
|
assert pytestconfig.getvalue('all')
|
||||||
|
|
||||||
versions = list(session.query(tables.Version).all())
|
versions = list(session.query(tables.Version).all())
|
||||||
versions.append('red-green')
|
versions.append('red-green')
|
||||||
|
|
||||||
black = session.query(tables.Version).filter_by(identifier=u'black').one()
|
black = session.query(tables.Version).filter_by(identifier=u'black').one()
|
||||||
|
|
||||||
filenames = get_all_filenames()
|
filenames = get_all_filenames(root)
|
||||||
|
|
||||||
# Some small stuff first
|
# Some small stuff first
|
||||||
|
|
||||||
for damage_class in session.query(tables.MoveDamageClass).all():
|
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():
|
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():
|
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():
|
for item_pocket in session.query(tables.ItemPocket).all():
|
||||||
assert hit(filenames, media.ItemPocketMedia(item_pocket).icon)
|
assert hit(filenames, media.ItemPocketMedia(root, item_pocket).icon)
|
||||||
assert hit(filenames, media.ItemPocketMedia(item_pocket).icon, selected=True)
|
assert hit(filenames, media.ItemPocketMedia(root, item_pocket).icon, selected=True)
|
||||||
|
|
||||||
for contest_type in session.query(tables.ContestType).all():
|
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():
|
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
|
# Items
|
||||||
versions_for_items = [
|
versions_for_items = [
|
||||||
|
@ -146,7 +151,7 @@ def check_get_everything():
|
||||||
]
|
]
|
||||||
|
|
||||||
for item in session.query(tables.Item).all():
|
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
|
assert hit(filenames, accessor.berry_image) or not item.berry
|
||||||
for rotation in (0, 90, 180, 270):
|
for rotation in (0, 90, 180, 270):
|
||||||
assert hit(filenames, accessor.underground, rotation=rotation) or (
|
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 color in 'red green blue pale prism'.split():
|
||||||
for big in (True, False):
|
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)
|
assert hit(filenames, accessor.underground)
|
||||||
|
|
||||||
for rock_type in 'i ii o o-big s t z'.split():
|
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):
|
for rotation in (0, 90, 180, 270):
|
||||||
success = hit(filenames, accessor.underground, rotation=rotation)
|
success = hit(filenames, accessor.underground, rotation=rotation)
|
||||||
assert success or rotation
|
assert success or rotation
|
||||||
|
@ -170,30 +175,28 @@ def check_get_everything():
|
||||||
# Pokemon!
|
# Pokemon!
|
||||||
accessors = []
|
accessors = []
|
||||||
|
|
||||||
accessors.append(media.UnknownPokemonMedia())
|
accessors.append(media.UnknownPokemonMedia(root))
|
||||||
accessors.append(media.EggMedia())
|
accessors.append(media.EggMedia(root))
|
||||||
manaphy = session.query(tables.Pokemon).filter_by(identifier=u'manaphy').one()
|
manaphy = session.query(tables.PokemonSpecies).filter_by(identifier=u'manaphy').one()
|
||||||
accessors.append(media.EggMedia(manaphy))
|
accessors.append(media.EggMedia(root, manaphy))
|
||||||
accessors.append(media.SubstituteMedia())
|
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():
|
for pokemon in session.query(tables.PokemonSpecies).all():
|
||||||
accessors.append(media.PokemonFormMedia(form))
|
accessors.append(media.PokemonSpeciesMedia(root, pokemon))
|
||||||
|
|
||||||
for pokemon in session.query(tables.Pokemon).all():
|
|
||||||
accessors.append(media.PokemonMedia(pokemon))
|
|
||||||
|
|
||||||
for accessor in accessors:
|
for accessor in accessors:
|
||||||
assert hit(filenames, accessor.footprint) or not accessor.form
|
assert hit(filenames, accessor.footprint) or not accessor.is_proper
|
||||||
assert hit(filenames, accessor.trozei) or not accessor.form or (
|
assert hit(filenames, accessor.trozei) or not accessor.is_proper or (
|
||||||
accessor.form.pokemon.generation.id > 3)
|
accessor.introduced_in > 3)
|
||||||
assert hit(filenames, accessor.cry) or not accessor.form
|
assert hit(filenames, accessor.cry) or not accessor.is_proper
|
||||||
assert hit(filenames, accessor.cropped_sprite) or not accessor.form
|
assert hit(filenames, accessor.cropped_sprite) or not accessor.is_proper
|
||||||
for female in (True, False):
|
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 (
|
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 shiny in (True, False):
|
||||||
for frame in (1, 2):
|
for frame in (1, 2):
|
||||||
for direction in 'up down left right'.split():
|
for direction in 'up down left right'.split():
|
||||||
|
@ -202,8 +205,8 @@ def check_get_everything():
|
||||||
shiny=shiny,
|
shiny=shiny,
|
||||||
female=female,
|
female=female,
|
||||||
frame=frame,
|
frame=frame,
|
||||||
) or not accessor.form or (
|
) or not accessor.is_proper or (
|
||||||
accessor.form.pokemon.generation.id > 4)
|
accessor.introduced_in > 4)
|
||||||
for version in versions:
|
for version in versions:
|
||||||
for animated in (True, False):
|
for animated in (True, False):
|
||||||
for back in (True, False):
|
for back in (True, False):
|
||||||
|
@ -223,34 +226,29 @@ def check_get_everything():
|
||||||
shiny and not female and
|
shiny and not female and
|
||||||
frame == 1):
|
frame == 1):
|
||||||
# All pokemon are in Black
|
# All pokemon are in Black
|
||||||
assert success or not accessor.form
|
assert success or not accessor.is_proper
|
||||||
if (str(accessor.pokemon_id) == '1'
|
if (str(accessor.species_id) == '1'
|
||||||
and not animated and not color and
|
and not animated and not color and
|
||||||
frame == 1):
|
frame == 1):
|
||||||
# Bulbasaur is in all versions
|
# Bulbasaur is in all versions
|
||||||
assert success
|
assert success
|
||||||
|
|
||||||
# Remove exceptions
|
# Remove exceptions
|
||||||
exceptions = [os.path.join(basedir, dirname) for dirname in
|
exceptions = [os.path.join(root, dirname) for dirname in
|
||||||
'chrome fonts ribbons'.split()]
|
'chrome fonts ribbons'.split()]
|
||||||
exceptions.append(os.path.join(basedir, 'items', 'hm-'))
|
exceptions.append(os.path.join(root, 'items', 'hm-'))
|
||||||
exceptions = tuple(exceptions)
|
exceptions = tuple(exceptions)
|
||||||
|
|
||||||
for filename in tuple(filenames):
|
unaccessed_filenames = set(filenames)
|
||||||
|
for filename in filenames:
|
||||||
if filename.startswith(exceptions):
|
if filename.startswith(exceptions):
|
||||||
filenames.remove(filename)
|
unaccessed_filenames.remove(filename)
|
||||||
|
|
||||||
if len(filenames):
|
if unaccessed_filenames:
|
||||||
print
|
print 'Unaccessed files:'
|
||||||
print '-----------------'
|
for filename in unaccessed_filenames:
|
||||||
print 'Unaccessed stuff:'
|
|
||||||
for filename in sorted(filenames):
|
|
||||||
print filename
|
print filename
|
||||||
print len(filenames), 'unaccessed files :('
|
|
||||||
|
assert unaccessed_filenames == set()
|
||||||
|
|
||||||
return (not filenames)
|
return (not filenames)
|
||||||
|
|
||||||
if __name__ == '__main__':
|
|
||||||
result = nose.run(defaultTest=__file__)
|
|
||||||
result = result and check_get_everything()
|
|
||||||
exit(not result)
|
|
||||||
|
|
|
@ -1,12 +1,9 @@
|
||||||
# encoding: utf8
|
# encoding: utf8
|
||||||
from nose.tools import *
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
import pokedex.roomaji
|
import pokedex.roomaji
|
||||||
|
from pokedex.tests import positional_params
|
||||||
|
|
||||||
|
@positional_params(
|
||||||
def test_roomaji():
|
|
||||||
tests = [
|
|
||||||
(u'ヤミカラス', 'yamikarasu'),
|
(u'ヤミカラス', 'yamikarasu'),
|
||||||
|
|
||||||
# Elongated vowel
|
# Elongated vowel
|
||||||
|
@ -24,14 +21,13 @@ def test_roomaji():
|
||||||
(u'ラティアス', 'ratiasu'),
|
(u'ラティアス', 'ratiasu'),
|
||||||
(u'ウィー', 'wii'),
|
(u'ウィー', 'wii'),
|
||||||
(u'セレビィ', 'sereby'),
|
(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():
|
@positional_params(
|
||||||
tests = [
|
|
||||||
(u'ヤミカラス', u'jamikarasu'),
|
(u'ヤミカラス', u'jamikarasu'),
|
||||||
|
|
||||||
# Elongated vowel
|
# Elongated vowel
|
||||||
|
@ -49,8 +45,7 @@ def test_roomaji_cs():
|
||||||
(u'ラティアス', u'ratiasu'),
|
(u'ラティアス', u'ratiasu'),
|
||||||
(u'ウィー', u'wí'),
|
(u'ウィー', u'wí'),
|
||||||
(u'セレビィ', u'serebí'),
|
(u'セレビィ', u'serebí'),
|
||||||
]
|
)
|
||||||
|
def test_roomaji_cs(kana, roomaji):
|
||||||
for kana, roomaji in tests:
|
result = pokedex.roomaji.romanize(kana, 'cs')
|
||||||
result = pokedex.roomaji.romanize(kana, 'cs')
|
assert result == roomaji
|
||||||
assert_equal(result, roomaji, u"'%s' romanizes correctly for Czech" % roomaji)
|
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
# encoding: utf8
|
# encoding: utf8
|
||||||
from nose.tools import *
|
|
||||||
import unittest
|
from pokedex.tests import single_params
|
||||||
|
|
||||||
from sqlalchemy import Column, Integer, String, create_engine
|
from sqlalchemy import Column, Integer, String, create_engine
|
||||||
from sqlalchemy.orm import class_mapper, joinedload, sessionmaker
|
from sqlalchemy.orm import class_mapper, joinedload, sessionmaker
|
||||||
from sqlalchemy.orm.session import Session
|
from sqlalchemy.orm.session import Session
|
||||||
|
@ -10,22 +11,23 @@ from pokedex.db import tables, markdown
|
||||||
from pokedex.db.multilang import MultilangScopedSession, MultilangSession, \
|
from pokedex.db.multilang import MultilangScopedSession, MultilangSession, \
|
||||||
create_translation_table
|
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"""
|
"""We want pokedex.db.tables to export tables using the class name"""
|
||||||
for varname in dir(tables):
|
table = getattr(tables, varname)
|
||||||
if not varname[0].isupper():
|
try:
|
||||||
continue
|
if not issubclass(table, tables.TableBase) or table is tables.TableBase:
|
||||||
table = getattr(tables, varname)
|
return
|
||||||
try:
|
except TypeError:
|
||||||
if not issubclass(table, tables.TableBase) or table is tables.TableBase:
|
return
|
||||||
continue
|
classname = table.__name__
|
||||||
except TypeError:
|
if classname and varname[0].isupper():
|
||||||
continue
|
assert varname == classname, '%s refers to %s' % (varname, classname)
|
||||||
classname = table.__name__
|
|
||||||
if classname and varname[0].isupper():
|
@single_params(*tables.mapped_classes)
|
||||||
assert varname == classname, '%s refers to %s' % (varname, classname)
|
def test_variable_names_2(table):
|
||||||
for table in tables.mapped_classes:
|
"""We also want all of the tables exported"""
|
||||||
assert getattr(tables, table.__name__) is table
|
assert getattr(tables, table.__name__) is table
|
||||||
|
|
||||||
def test_class_order():
|
def test_class_order():
|
||||||
"""The declarative classes should be defined in alphabetical 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_en] == 'different english'
|
||||||
assert foo.name_map[lang_ru] == 'new russian'
|
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.
|
"""Check DB schema for integrity of text columns & translations.
|
||||||
|
|
||||||
Mostly protects against copy/paste oversights and rebase hiccups.
|
Mostly protects against copy/paste oversights and rebase hiccups.
|
||||||
If there's a reason to relax the tests, do it
|
If there's a reason to relax the tests, do it
|
||||||
"""
|
"""
|
||||||
classes = []
|
if hasattr(cls, 'local_language') or hasattr(cls, 'language'):
|
||||||
for cls in tables.mapped_classes:
|
good_formats = 'markdown plaintext gametext'.split()
|
||||||
classes.append(cls)
|
assert_text = '%s is language-specific'
|
||||||
classes += cls.translation_classes
|
else:
|
||||||
for cls in classes:
|
good_formats = 'identifier latex'.split()
|
||||||
if hasattr(cls, 'local_language') or hasattr(cls, 'language'):
|
assert_text = '%s is not language-specific'
|
||||||
good_formats = 'markdown plaintext gametext'.split()
|
columns = sorted(cls.__table__.c, key=lambda c: c.name)
|
||||||
assert_text = '%s is language-specific'
|
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:
|
else:
|
||||||
good_formats = 'identifier latex'.split()
|
if isinstance(column.type, tables.Unicode):
|
||||||
assert_text = '%s is not language-specific'
|
raise AssertionError('%s: text column without format' % column)
|
||||||
columns = sorted(cls.__table__.c, key=lambda c: c.name)
|
if column.name == 'name' and format != 'plaintext':
|
||||||
text_columns = []
|
raise AssertionError('%s: non-plaintext name' % column)
|
||||||
for column in columns:
|
# No mention of English in the description
|
||||||
format = column.info.get('format', None)
|
assert 'English' not in column.info['description'], column
|
||||||
if format is not None:
|
# If there's more than one text column in a translation table,
|
||||||
if format not in good_formats:
|
# they have to be nullable, to support missing translations
|
||||||
raise AssertionError(assert_text % column)
|
if hasattr(cls, 'local_language') and len(text_columns) > 1:
|
||||||
if (format != 'identifier') and (column.name == 'identifier'):
|
for column in text_columns:
|
||||||
raise AssertionError('%s: identifier column name/type mismatch' % column)
|
assert column.nullable
|
||||||
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
|
|
||||||
|
|
||||||
def test_identifiers_with_names():
|
@single_params(*tables.mapped_classes)
|
||||||
|
def test_identifiers_with_names(table):
|
||||||
"""Test that named tables have identifiers
|
"""Test that named tables have identifiers
|
||||||
"""
|
"""
|
||||||
for table in sorted(tables.mapped_classes, key=lambda t: t.__name__):
|
for translation_class in table.translation_classes:
|
||||||
if hasattr(table, 'name'):
|
if hasattr(translation_class, 'name'):
|
||||||
assert hasattr(table, 'identifier'), table
|
assert hasattr(table, 'identifier'), table
|
||||||
|
|
|
@ -1,150 +1,147 @@
|
||||||
# Encoding: UTF-8
|
# Encoding: UTF-8
|
||||||
|
|
||||||
from nose.tools import *
|
import pytest
|
||||||
from sqlalchemy.orm.exc import NoResultFound
|
|
||||||
|
from pokedex.tests import positional_params
|
||||||
|
|
||||||
from pokedex.db import tables, connect, util, markdown
|
from pokedex.db import tables, connect, util, markdown
|
||||||
|
|
||||||
class TestStrings(object):
|
connection = connect()
|
||||||
def setup(self):
|
|
||||||
self.connection = connect()
|
|
||||||
|
|
||||||
def teardown(self):
|
def test_filter():
|
||||||
self.connection.rollback()
|
q = connection.query(tables.PokemonSpecies).filter(
|
||||||
|
tables.PokemonSpecies.name == u"Marowak")
|
||||||
|
assert q.one().identifier == 'marowak'
|
||||||
|
|
||||||
def test_filter(self):
|
def test_languages():
|
||||||
q = self.connection.query(tables.Pokemon).filter(
|
q = connection.query(tables.PokemonSpecies).filter(
|
||||||
tables.Pokemon.name == u"Marowak")
|
tables.PokemonSpecies.name == u"Mightyena")
|
||||||
assert q.one().identifier == 'marowak'
|
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):
|
def test_bad_lang():
|
||||||
q = self.connection.query(tables.Pokemon).filter(
|
with pytest.raises(KeyError):
|
||||||
tables.Pokemon.name == u"Mightyena")
|
q = connection.query(tables.PokemonSpecies).filter(
|
||||||
pkmn = q.one()
|
tables.PokemonSpecies.name == u"Mightyena")
|
||||||
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")
|
|
||||||
pkmn = q.one()
|
pkmn = q.one()
|
||||||
pkmn.names["identifier of a language that doesn't exist"]
|
pkmn.names["identifier of a language that doesn't exist"]
|
||||||
|
|
||||||
def test_mutating(self):
|
def test_mutating():
|
||||||
item = self.connection.query(tables.Item).filter_by(
|
item = connection.query(tables.Item).filter_by(
|
||||||
identifier=u"jade-orb").one()
|
identifier=u"jade-orb").one()
|
||||||
language = self.connection.query(tables.Language).filter_by(
|
language = connection.query(tables.Language).filter_by(
|
||||||
identifier=u"de").one()
|
identifier=u"de").one()
|
||||||
item.name_map[language] = u"foo"
|
item.name_map[language] = u"foo"
|
||||||
assert item.name_map[language] == "foo"
|
assert item.name_map[language] == "foo"
|
||||||
item.name_map[language] = u"xyzzy"
|
item.name_map[language] = u"xyzzy"
|
||||||
assert item.name_map[language] == "xyzzy"
|
assert item.name_map[language] == "xyzzy"
|
||||||
|
|
||||||
def test_mutating_default(self):
|
def test_mutating_default():
|
||||||
item = self.connection.query(tables.Item).filter_by(
|
item = connection.query(tables.Item).filter_by(
|
||||||
identifier=u"jade-orb").one()
|
identifier=u"jade-orb").one()
|
||||||
item.name = u"foo"
|
item.name = u"foo"
|
||||||
assert item.name == "foo"
|
assert item.name == "foo"
|
||||||
|
|
||||||
def test_string_mapping(self):
|
def test_string_mapping():
|
||||||
item = self.connection.query(tables.Item).filter_by(
|
item = connection.query(tables.Item).filter_by(
|
||||||
identifier=u"jade-orb").one()
|
identifier=u"jade-orb").one()
|
||||||
assert len(item.name_map) == len(item.names)
|
assert len(item.name_map) == len(item.names)
|
||||||
for lang in item.names:
|
for lang in item.names:
|
||||||
assert item.name_map[lang] == item.names[lang].name
|
assert item.name_map[lang] == item.names[lang].name
|
||||||
assert lang in item.name_map
|
assert lang in item.name_map
|
||||||
assert "language that doesn't exist" not in item.name_map
|
assert "language that doesn't exist" not in item.name_map
|
||||||
assert tables.Language() not in item.name_map
|
assert tables.Language() not in item.name_map
|
||||||
|
|
||||||
def test_new_language(self):
|
def test_new_language():
|
||||||
item = self.connection.query(tables.Item).filter_by(
|
item = connection.query(tables.Item).filter_by(
|
||||||
identifier=u"jade-orb").one()
|
identifier=u"jade-orb").one()
|
||||||
language = tables.Language()
|
language = tables.Language()
|
||||||
language.id = -1
|
language.id = -1
|
||||||
language.identifier = u'test'
|
language.identifier = u'test'
|
||||||
language.iso639 = language.iso3166 = u'--'
|
language.iso639 = language.iso3166 = u'--'
|
||||||
language.official = False
|
language.official = False
|
||||||
self.connection.add(language)
|
connection.add(language)
|
||||||
item.name_map[language] = u"foo"
|
item.name_map[language] = u"foo"
|
||||||
assert item.name_map[language] == "foo"
|
assert item.name_map[language] == "foo"
|
||||||
assert language in item.name_map
|
assert language in item.name_map
|
||||||
item.name_map[language] = u"xyzzy"
|
item.name_map[language] = u"xyzzy"
|
||||||
assert item.name_map[language] == "xyzzy"
|
assert item.name_map[language] == "xyzzy"
|
||||||
|
|
||||||
def test_markdown(self):
|
def test_markdown():
|
||||||
move = self.connection.query(tables.Move).filter_by(
|
move = connection.query(tables.Move).filter_by(
|
||||||
identifier=u"thunderbolt").one()
|
identifier=u"thunderbolt").one()
|
||||||
language = self.connection.query(tables.Language).filter_by(
|
language = connection.query(tables.Language).filter_by(
|
||||||
identifier=u"en").one()
|
identifier=u"en").one()
|
||||||
assert '10%' in move.effect.as_text()
|
assert '10%' in move.effect.as_text()
|
||||||
assert '10%' in move.effect_map[language].as_text()
|
assert '10%' in move.effect_map[language].as_text()
|
||||||
assert '10%' in move.effect.as_html()
|
assert '10%' in move.effect.as_html()
|
||||||
assert '10%' in move.effect_map[language].as_html()
|
assert '10%' in move.effect_map[language].as_html()
|
||||||
assert '10%' in unicode(move.effect)
|
assert '10%' in unicode(move.effect)
|
||||||
assert '10%' in unicode(move.effect_map[language])
|
assert '10%' in unicode(move.effect_map[language])
|
||||||
assert '10%' in move.effect.__html__()
|
assert '10%' in move.effect.__html__()
|
||||||
assert '10%' in move.effect_map[language].__html__()
|
assert '10%' in move.effect_map[language].__html__()
|
||||||
|
|
||||||
def test_markdown_string(self):
|
def test_markdown_string():
|
||||||
en = util.get(self.connection, tables.Language, 'en')
|
en = util.get(connection, tables.Language, 'en')
|
||||||
md = markdown.MarkdownString('[]{move:thunderbolt} [paralyzes]{mechanic:paralysis}', self.connection, en)
|
md = markdown.MarkdownString('[]{move:thunderbolt} [paralyzes]{mechanic:paralysis}', connection, en)
|
||||||
assert unicode(md) == 'Thunderbolt paralyzes'
|
assert unicode(md) == 'Thunderbolt paralyzes'
|
||||||
assert md.as_html() == '<p><span>Thunderbolt</span> <span>paralyzes</span></p>'
|
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)) == (
|
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>')
|
'<p><a href="move/thunderbolt">Thunderbolt</a> <span>paralyzes</span></p>')
|
||||||
print md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident))
|
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)) == (
|
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>')
|
'<p><a href="move/thunderbolt">Thunderbolt</a> <a href="mechanic/paralysis">paralyzes</a></p>')
|
||||||
|
|
||||||
def test_markdown_values(self):
|
def markdown_column_params():
|
||||||
"""Check all markdown values
|
"""Check all markdown values
|
||||||
|
|
||||||
Scans the database schema for Markdown columns, runs through every value
|
Scans the database schema for Markdown columns, runs through every value
|
||||||
in each, and ensures that it's valid Markdown.
|
in each, and ensures that it's valid Markdown.
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# Move effects have their own special wrappers. Explicitly test them separately
|
# Move effects have their own special wrappers. Explicitly test them separately
|
||||||
yield self.check_markdown_column, tables.Move, None, 'effect'
|
yield tables.Move, None, 'effect'
|
||||||
yield self.check_markdown_column, tables.Move, None, 'short_effect'
|
yield tables.Move, None, 'short_effect'
|
||||||
|
|
||||||
for cls in tables.mapped_classes:
|
for cls in tables.mapped_classes:
|
||||||
for translation_cls in cls.translation_classes:
|
for translation_cls in cls.translation_classes:
|
||||||
for column in translation_cls.__table__.c:
|
for column in translation_cls.__table__.c:
|
||||||
if column.info.get('string_getter') == markdown.MarkdownString:
|
if column.info.get('string_getter') == markdown.MarkdownString:
|
||||||
yield self.check_markdown_column, cls, translation_cls, column.name
|
yield cls, translation_cls, column.name
|
||||||
|
|
||||||
def check_markdown_column(self, parent_class, translation_class, column_name):
|
@positional_params(*markdown_column_params())
|
||||||
"""Implementation for the above"""
|
def test_markdown_values(parent_class, translation_class, column_name):
|
||||||
query = self.connection.query(parent_class)
|
"""Implementation for the above"""
|
||||||
if translation_class:
|
query = connection.query(parent_class)
|
||||||
query = query.join(translation_class)
|
if translation_class:
|
||||||
for item in query:
|
query = query.join(translation_class)
|
||||||
for language, markdown in getattr(item, column_name + '_map').items():
|
for item in query:
|
||||||
|
for language, markdown in getattr(item, column_name + '_map').items():
|
||||||
|
|
||||||
if markdown is None:
|
if markdown is None:
|
||||||
continue
|
continue
|
||||||
|
|
||||||
key = u"Markdown in {0} #{1}'s {2} (lang={3})".format(
|
key = u"Markdown in {0} #{1}'s {2} (lang={3})".format(
|
||||||
parent_class.__name__, item.id, column_name, language.identifier)
|
parent_class.__name__, item.id, column_name, language.identifier)
|
||||||
|
|
||||||
try:
|
try:
|
||||||
text = markdown.as_text()
|
text = markdown.as_text()
|
||||||
except NoResultFound:
|
except NoResultFound:
|
||||||
assert False, u"{0} references something that doesn't exist:\n{1}".format(
|
assert False, u"{0} references something that doesn't exist:\n{1}".format(
|
||||||
key, markdown.source_text)
|
key, markdown.source_text)
|
||||||
except AttributeError:
|
except AttributeError:
|
||||||
print markdown
|
print markdown
|
||||||
raise
|
raise
|
||||||
|
|
||||||
error_message = u"{0} leaves syntax cruft:\n{1}"
|
error_message = u"{0} leaves syntax cruft:\n{1}"
|
||||||
error_message = error_message.format(key, text)
|
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
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
import csv
|
import csv
|
||||||
|
|
||||||
from nose.tools import *
|
import pytest
|
||||||
|
|
||||||
from pokedex.db import translations, tables
|
from pokedex.db import translations, tables
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,9 @@
|
||||||
# encoding: utf8
|
# Encoding: utf8
|
||||||
from nose.tools import *
|
|
||||||
import unittest
|
|
||||||
|
|
||||||
|
import pytest
|
||||||
|
|
||||||
|
from pokedex.tests import single_params
|
||||||
from pokedex.db import connect, tables, util
|
from pokedex.db import connect, tables, util
|
||||||
from pokedex.util import simple
|
|
||||||
|
|
||||||
session = connect()
|
session = connect()
|
||||||
|
|
||||||
|
@ -19,32 +19,21 @@ def test_get_english_by_identifier():
|
||||||
language = util.get(session, tables.Language, 'en')
|
language = util.get(session, tables.Language, 'en')
|
||||||
assert language.name == 'English'
|
assert language.name == 'English'
|
||||||
|
|
||||||
def test_get_pokemon_baseform_identifier():
|
@single_params(*'burmy shaymin unown cresselia'.split())
|
||||||
for identifier in 'burmy shaymin unown cresselia'.split():
|
def test_get_pokemon_identifier(identifier):
|
||||||
poke = util.get(session, tables.Pokemon, identifier=identifier)
|
poke = util.get(session, tables.PokemonSpecies, identifier=identifier)
|
||||||
assert poke.identifier == identifier
|
assert poke.identifier == identifier
|
||||||
assert poke.is_base_form
|
|
||||||
|
|
||||||
def test_get_pokemon_baseform_name():
|
@single_params(*'Burmy Shaymin Unown Cresselia'.split())
|
||||||
for name in 'Burmy Shaymin Unown Cresselia'.split():
|
def test_get_pokemon_name(name):
|
||||||
poke = util.get(session, tables.Pokemon, name=name)
|
poke = util.get(session, tables.PokemonSpecies, name=name)
|
||||||
assert poke.name == name
|
assert poke.name == name
|
||||||
assert poke.is_base_form
|
|
||||||
|
|
||||||
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')
|
french = util.get(session, tables.Language, 'fr')
|
||||||
for name in 'Cheniti Shaymin Zarbi Cresselia'.split():
|
poke = util.get(session, tables.PokemonSpecies, name=name, language=french)
|
||||||
poke = util.get(session, tables.Pokemon, name=name, language=french)
|
assert poke.name_map[french] == name, poke.name_map[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
|
|
||||||
|
|
||||||
def test_types_french_order():
|
def test_types_french_order():
|
||||||
french = util.get(session, tables.Language, 'fr')
|
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[0].name_map[french] == 'Acier', types[0].name_map[french]
|
||||||
assert types[-1].name_map[french] == 'Vol', types[-1].name_map[french]
|
assert types[-1].name_map[french] == 'Vol', types[-1].name_map[french]
|
||||||
|
|
||||||
def test_simple_pokemon():
|
@single_params(*range(1, 10) * 2)
|
||||||
pokemon = simple.pokemon(session)
|
def test_get_pokemon_id(id):
|
||||||
assert pokemon[0].identifier == 'bulbasaur'
|
result = util.get(session, tables.Pokemon, id=id)
|
||||||
assert pokemon[-1].identifier == 'genesect'
|
assert result.id == id
|
||||||
|
assert result.__tablename__ == 'pokemon'
|
||||||
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'
|
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,12 @@
|
||||||
|
|
||||||
"""Media accessors
|
"""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
|
Their various methods take a number of arguments specifying exactly which
|
||||||
file you want (such as the female sprite, backsprite, etc.).
|
file you want (such as the female sprite, backsprite, etc.).
|
||||||
ValueError is raised when the specified file cannot be found.
|
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 os
|
||||||
import pkg_resources
|
from functools import partial
|
||||||
|
|
||||||
class MediaFile(object):
|
class MediaFile(object):
|
||||||
"""Represents a file: picture, sound, etc.
|
"""Represents a file: picture, sound, etc.
|
||||||
|
|
||||||
Attributes:
|
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
|
path: Absolute path to the file
|
||||||
|
|
||||||
exists: True if the file exists
|
exists: True if the file exists
|
||||||
|
|
||||||
|
media_available: false if no media is available at the given root.
|
||||||
|
|
||||||
open(): Open the file
|
open(): Open the file
|
||||||
"""
|
"""
|
||||||
def __init__(self, *path_elements):
|
def __init__(self, root, *path_elements):
|
||||||
self.path_elements = path_elements
|
self.path_elements = path_elements
|
||||||
self._dexpath = '/'.join(('data', 'media') + path_elements)
|
self.root = root
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def relative_path(self):
|
def relative_path(self):
|
||||||
|
@ -49,7 +57,7 @@ class MediaFile(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def path(self):
|
def path(self):
|
||||||
return pkg_resources.resource_filename('pokedex', self._dexpath)
|
return os.path.join(self.root, *self.path_elements)
|
||||||
|
|
||||||
def open(self):
|
def open(self):
|
||||||
"""Open this file for reading, in the appropriate mode (i.e. binary)
|
"""Open this file for reading, in the appropriate mode (i.e. binary)
|
||||||
|
@ -58,7 +66,11 @@ class MediaFile(object):
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def exists(self):
|
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):
|
def __eq__(self, other):
|
||||||
return self.path == other.path
|
return self.path == other.path
|
||||||
|
@ -70,20 +82,31 @@ class MediaFile(object):
|
||||||
return '<Pokedex file %s>' % self.relative_path
|
return '<Pokedex file %s>' % self.relative_path
|
||||||
|
|
||||||
class BaseMedia(object):
|
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,
|
def from_path_elements(self, path_elements, basename, extension,
|
||||||
surely_exists=False):
|
surely_exists=False):
|
||||||
filename = basename + extension
|
filename = basename + extension
|
||||||
path_elements = [self.toplevel_dir] + path_elements + [filename]
|
path_elements = [self.toplevel_dir] + path_elements + [filename]
|
||||||
mfile = MediaFile(*path_elements)
|
mfile = self.file_class(*path_elements)
|
||||||
if surely_exists or mfile.exists:
|
if surely_exists or mfile.exists:
|
||||||
return mfile
|
return mfile
|
||||||
else:
|
else:
|
||||||
raise ValueError('File %s not found' % mfile.relative_path)
|
raise ValueError('File %s not found' % mfile.path)
|
||||||
|
|
||||||
class _BasePokemonMedia(BaseMedia):
|
class _BasePokemonMedia(BaseMedia):
|
||||||
toplevel_dir = 'pokemon'
|
toplevel_dir = 'pokemon'
|
||||||
has_gender_differences = False
|
has_gender_differences = False
|
||||||
form = None
|
is_species = False
|
||||||
|
is_proper = False
|
||||||
introduced_in = 0
|
introduced_in = 0
|
||||||
|
|
||||||
# Info about of what's inside the pokemon main sprite directories, so we
|
# 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())),
|
'black-white': (5, set('back shiny female'.split())),
|
||||||
}
|
}
|
||||||
|
|
||||||
def __init__(self, pokemon_id, form_postfix=None):
|
def __init__(self, root, species_id, form_postfix=None):
|
||||||
BaseMedia.__init__(self)
|
BaseMedia.__init__(self, root)
|
||||||
self.pokemon_id = str(pokemon_id)
|
self.species_id = str(species_id)
|
||||||
self.form_postfix = form_postfix
|
self.form_postfix = form_postfix
|
||||||
|
|
||||||
def _get_file(self, path_elements, extension, strict, surely_exists=False):
|
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:
|
if self.form_postfix:
|
||||||
fullname = basename + self.form_postfix
|
fullname = basename + self.form_postfix
|
||||||
try:
|
try:
|
||||||
|
@ -173,7 +196,7 @@ class _BasePokemonMedia(BaseMedia):
|
||||||
generation, info = self._pokemon_sprite_info[version_dir]
|
generation, info = self._pokemon_sprite_info[version_dir]
|
||||||
if generation < self.introduced_in:
|
if generation < self.introduced_in:
|
||||||
raise ValueError("Pokemon %s didn't exist in %s" % (
|
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]
|
path_elements = ['main-sprites', version_dir]
|
||||||
if animated:
|
if animated:
|
||||||
if 'animated' not in info:
|
if 'animated' not in info:
|
||||||
|
@ -213,7 +236,7 @@ class _BasePokemonMedia(BaseMedia):
|
||||||
# Chimecho's female back frame 2 sprite has one hand in
|
# Chimecho's female back frame 2 sprite has one hand in
|
||||||
# a slightly different pose, in Platinum and HGSS
|
# a slightly different pose, in Platinum and HGSS
|
||||||
# (we have duplicate sprites frame 1, for convenience)
|
# (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'):
|
'platinum', 'heartgold-soulsilver'):
|
||||||
female_sprite = True
|
female_sprite = True
|
||||||
female_sprite = female_sprite and 'female' in info
|
female_sprite = female_sprite and 'female' in info
|
||||||
|
@ -221,7 +244,7 @@ class _BasePokemonMedia(BaseMedia):
|
||||||
path_elements.append('female')
|
path_elements.append('female')
|
||||||
elif strict:
|
elif strict:
|
||||||
raise ValueError(
|
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:
|
if not frame or frame == 1:
|
||||||
pass
|
pass
|
||||||
elif frame == 2:
|
elif frame == 2:
|
||||||
|
@ -233,9 +256,8 @@ class _BasePokemonMedia(BaseMedia):
|
||||||
raise ValueError("Bad frame %s" % frame)
|
raise ValueError("Bad frame %s" % frame)
|
||||||
return self._get_file(path_elements, extension, strict=strict,
|
return self._get_file(path_elements, extension, strict=strict,
|
||||||
# Avoid a stat in the common case
|
# Avoid a stat in the common case
|
||||||
surely_exists=(self.form and version_dir == 'black-white'
|
surely_exists=(self.is_species and version_dir == 'black-white'
|
||||||
and not back and not female
|
and not back and not female))
|
||||||
and not self.form_postfix))
|
|
||||||
|
|
||||||
def _maybe_female(self, path_elements, female, strict):
|
def _maybe_female(self, path_elements, female, strict):
|
||||||
if female:
|
if female:
|
||||||
|
@ -248,7 +270,7 @@ class _BasePokemonMedia(BaseMedia):
|
||||||
raise
|
raise
|
||||||
elif strict:
|
elif strict:
|
||||||
raise ValueError(
|
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)
|
return self._get_file(path_elements, '.png', strict=strict)
|
||||||
|
|
||||||
def icon(self, female=False, strict=False):
|
def icon(self, female=False, strict=False):
|
||||||
|
@ -314,58 +336,62 @@ class _BasePokemonMedia(BaseMedia):
|
||||||
return self._get_file(['cropped'], '.png', strict=strict)
|
return self._get_file(['cropped'], '.png', strict=strict)
|
||||||
|
|
||||||
class PokemonFormMedia(_BasePokemonMedia):
|
class PokemonFormMedia(_BasePokemonMedia):
|
||||||
"""Media related to a Pokemon form
|
"""Media related to a PokemonForm
|
||||||
"""
|
"""
|
||||||
def __init__(self, pokemon_form):
|
is_proper = True
|
||||||
pokemon_id = pokemon_form.form_base_pokemon_id
|
|
||||||
if pokemon_form.identifier:
|
def __init__(self, root, pokemon_form):
|
||||||
form_postfix = '-' + pokemon_form.identifier
|
species_id = pokemon_form.species.id
|
||||||
|
if pokemon_form.form_identifier:
|
||||||
|
form_postfix = '-' + pokemon_form.form_identifier
|
||||||
else:
|
else:
|
||||||
form_postfix = None
|
form_postfix = None
|
||||||
_BasePokemonMedia.__init__(self, pokemon_id, form_postfix)
|
_BasePokemonMedia.__init__(self, root, species_id, form_postfix)
|
||||||
self.form = pokemon_form
|
self.form = pokemon_form
|
||||||
pokemon = pokemon_form.form_base_pokemon
|
species = pokemon_form.species
|
||||||
self.has_gender_differences = pokemon.has_gender_differences
|
self.has_gender_differences = species.has_gender_differences
|
||||||
self.introduced_in = pokemon.generation_id
|
self.introduced_in = pokemon_form.version_group.generation_id
|
||||||
|
|
||||||
class PokemonMedia(_BasePokemonMedia):
|
class PokemonSpeciesMedia(_BasePokemonMedia):
|
||||||
"""Media related to a Pokemon
|
"""Media related to a PokemonSpecies
|
||||||
"""
|
"""
|
||||||
def __init__(self, pokemon):
|
is_species = True
|
||||||
_BasePokemonMedia.__init__(self, pokemon.id)
|
is_proper = True
|
||||||
self.form = pokemon.default_form
|
|
||||||
self.has_gender_differences = (pokemon.has_gender_differences)
|
def __init__(self, root, species):
|
||||||
self.introduced_in = pokemon.generation_id
|
_BasePokemonMedia.__init__(self, root, species.id)
|
||||||
|
self.has_gender_differences = species.has_gender_differences
|
||||||
|
self.introduced_in = species.generation_id
|
||||||
|
|
||||||
class UnknownPokemonMedia(_BasePokemonMedia):
|
class UnknownPokemonMedia(_BasePokemonMedia):
|
||||||
"""Media related to the unknown Pokemon ("?")
|
"""Media related to the unknown Pokemon ("?")
|
||||||
|
|
||||||
Note that not a lot of files are available for it.
|
Note that not a lot of files are available for it.
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self, root):
|
||||||
_BasePokemonMedia.__init__(self, '0')
|
_BasePokemonMedia.__init__(self, root, '0')
|
||||||
|
|
||||||
class EggMedia(_BasePokemonMedia):
|
class EggMedia(_BasePokemonMedia):
|
||||||
"""Media related to a pokemon egg
|
"""Media related to a pokemon egg
|
||||||
|
|
||||||
Note that not a lot of files are available for these.
|
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):
|
def __init__(self, root, species=None):
|
||||||
if pokemon and pokemon.identifier == 'manaphy':
|
if species and species.identifier == 'manaphy':
|
||||||
postfix = '-manaphy'
|
postfix = '-manaphy'
|
||||||
else:
|
else:
|
||||||
postfix = None
|
postfix = None
|
||||||
_BasePokemonMedia.__init__(self, 'egg', postfix)
|
_BasePokemonMedia.__init__(self, root, 'egg', postfix)
|
||||||
|
|
||||||
class SubstituteMedia(_BasePokemonMedia):
|
class SubstituteMedia(_BasePokemonMedia):
|
||||||
"""Media related to the Substitute sprite
|
"""Media related to the Substitute sprite
|
||||||
|
|
||||||
Note that not a lot of files are available for Substitute.
|
Note that not a lot of files are available for Substitute.
|
||||||
"""
|
"""
|
||||||
def __init__(self):
|
def __init__(self, root):
|
||||||
_BasePokemonMedia.__init__(self, 'substitute')
|
_BasePokemonMedia.__init__(self, root, 'substitute')
|
||||||
|
|
||||||
class _BaseItemMedia(BaseMedia):
|
class _BaseItemMedia(BaseMedia):
|
||||||
toplevel_dir = 'items'
|
toplevel_dir = 'items'
|
||||||
|
@ -383,7 +409,8 @@ class _BaseItemMedia(BaseMedia):
|
||||||
class ItemMedia(_BaseItemMedia):
|
class ItemMedia(_BaseItemMedia):
|
||||||
"""Media related to an item
|
"""Media related to an item
|
||||||
"""
|
"""
|
||||||
def __init__(self, item):
|
def __init__(self, root, item):
|
||||||
|
_BaseItemMedia.__init__(self, root)
|
||||||
self.item = item
|
self.item = item
|
||||||
self.identifier = item.identifier
|
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
|
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
|
self.identifier = 'rock-%s' % rock_type
|
||||||
|
|
||||||
class UndergroundSphereMedia(_BaseItemMedia):
|
class UndergroundSphereMedia(_BaseItemMedia):
|
||||||
|
@ -467,13 +495,15 @@ class UndergroundSphereMedia(_BaseItemMedia):
|
||||||
|
|
||||||
color can be one of: red, blue, green, pale, prism
|
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
|
self.identifier = '%s-sphere' % color
|
||||||
if big:
|
if big:
|
||||||
self.identifier += '-big'
|
self.identifier += '-big'
|
||||||
|
|
||||||
class _SimpleIconMedia(BaseMedia):
|
class _SimpleIconMedia(BaseMedia):
|
||||||
def __init__(self, thing):
|
def __init__(self, root, thing):
|
||||||
|
BaseMedia.__init__(self, root)
|
||||||
self.identifier = thing.identifier
|
self.identifier = thing.identifier
|
||||||
|
|
||||||
def icon(self):
|
def icon(self):
|
||||||
|
|
|
@ -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
164
scripts/pokemon_species.py
Normal 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')
|
||||||
|
|
Loading…
Reference in a new issue