mirror of
https://github.com/veekun/pokedex.git
synced 2024-08-20 18:16:34 +00:00
Merge branch 'encukou-species-split'
This commit is contained in:
commit
339d5d7da6
40 changed files with 7455 additions and 6784 deletions
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
|
||||
1,4,
|
||||
2,4,
|
||||
3,4,
|
||||
4,2,
|
||||
5,2,
|
||||
6,4,
|
||||
7,2,
|
||||
8,2,
|
||||
9,2,
|
||||
10,2,
|
||||
11,2,
|
||||
12,4,
|
||||
13,4,
|
||||
14,3,
|
||||
15,2,
|
||||
16,3,
|
||||
17,2,
|
||||
18,4,
|
||||
19,2,
|
||||
20,2,
|
||||
21,2,
|
||||
22,2,
|
||||
23,2,
|
||||
24,2,
|
||||
25,1,
|
||||
26,4,
|
||||
27,4,
|
||||
28,4,
|
||||
29,4,
|
||||
30,1,
|
||||
31,4,
|
||||
32,2,
|
||||
33,2,
|
||||
34,2,
|
||||
35,2,
|
||||
36,2,
|
||||
37,2,
|
||||
38,2,
|
||||
39,1,
|
||||
40,4,
|
||||
41,2,
|
||||
42,2,
|
||||
43,2,
|
||||
44,2,
|
||||
45,1,
|
||||
46,2,
|
||||
47,2,
|
||||
48,2,
|
||||
49,2,
|
||||
50,1,
|
||||
51,3,296
|
||||
52,2,
|
||||
53,2,
|
||||
54,2,
|
||||
55,2,
|
||||
56,1,
|
||||
57,2,291
|
||||
58,2,
|
||||
59,2,
|
||||
60,2,
|
||||
61,2,
|
||||
62,1,
|
||||
63,1,
|
||||
64,1,
|
||||
65,1,
|
||||
66,2,
|
||||
67,2,
|
||||
68,2,
|
||||
69,2,
|
||||
70,2,
|
||||
71,1,
|
||||
72,1,293
|
||||
73,1,
|
||||
74,1,
|
||||
75,1,
|
||||
76,1,
|
||||
77,1,
|
||||
78,4,
|
||||
79,4,
|
||||
80,4,
|
||||
81,4,
|
||||
82,2,
|
||||
83,2,
|
||||
84,3,
|
||||
85,3,
|
||||
86,1,
|
||||
87,3,
|
||||
88,2,
|
||||
89,4,
|
||||
90,3,231
|
||||
91,2,292
|
||||
92,4,
|
||||
93,3,
|
||||
94,4,
|
||||
95,2,
|
||||
96,2,
|
||||
97,4,
|
||||
98,3,
|
||||
99,2,
|
||||
100,2,232
|
||||
101,2,
|
||||
102,2,
|
||||
103,2,
|
||||
104,4,
|
||||
105,3,
|
||||
106,2,
|
||||
107,4,
|
||||
108,1,
|
||||
109,4,
|
||||
110,2,
|
||||
111,2,
|
||||
112,1,
|
||||
113,3,
|
||||
114,2,
|
||||
115,3,
|
||||
116,1,294
|
||||
117,1,
|
||||
118,1,
|
||||
119,2,
|
||||
120,1,
|
||||
121,3,
|
||||
122,1,
|
||||
123,1,
|
||||
124,1,
|
||||
125,1,
|
||||
126,1,
|
||||
127,1,
|
||||
128,1,
|
||||
129,4,
|
||||
130,4,
|
||||
131,4,
|
||||
132,4,
|
||||
133,2,
|
||||
134,2,
|
||||
135,2,
|
||||
136,4,
|
||||
137,4,
|
||||
138,4,
|
||||
139,2,
|
||||
140,1,
|
||||
141,2,
|
||||
142,6,
|
||||
143,1,
|
||||
144,5,
|
||||
145,4,
|
||||
146,6,
|
||||
147,2,
|
||||
148,3,
|
||||
149,4,
|
||||
150,3,
|
||||
151,1,
|
||||
152,2,
|
||||
153,1,
|
||||
154,2,
|
||||
155,2,
|
||||
156,5,
|
||||
157,6,
|
||||
158,4,295
|
||||
159,6,
|
||||
160,1,
|
||||
161,6,
|
||||
162,2,
|
||||
163,2,
|
||||
164,3,
|
||||
165,3,
|
||||
166,4,
|
||||
167,4,
|
||||
168,5,
|
||||
169,5,
|
||||
170,6,
|
||||
171,3,
|
||||
172,3,
|
||||
173,2,
|
||||
174,6,
|
||||
175,2,
|
||||
176,5,
|
||||
177,5,
|
||||
178,5,
|
||||
179,2,
|
||||
180,4,
|
||||
181,3,
|
||||
182,3,
|
||||
183,1,
|
||||
184,3,297
|
||||
185,4,
|
||||
186,2,
|
||||
187,4,
|
||||
188,5,
|
||||
189,1,
|
||||
190,3,
|
||||
191,1,
|
||||
192,1,
|
||||
193,1,
|
||||
194,1,
|
||||
195,1,
|
||||
196,1,
|
||||
197,1,
|
||||
198,1,
|
||||
199,1,
|
||||
200,1,
|
||||
201,1,
|
||||
202,1,
|
||||
203,4,
|
||||
204,4,
|
||||
205,4,
|
||||
206,4,
|
||||
207,2,
|
||||
208,4,
|
||||
209,4,
|
||||
211,5,
|
||||
212,5,
|
||||
213,2,
|
||||
214,4,
|
||||
215,2,
|
||||
216,2,
|
||||
217,2,
|
||||
218,2,
|
||||
219,6,
|
||||
220,2,
|
||||
221,3,
|
||||
223,2,
|
||||
224,2,
|
||||
228,4,
|
||||
229,2,
|
||||
230,1,
|
||||
232,4,
|
||||
233,1,
|
||||
234,1,
|
||||
235,2,
|
||||
236,1,
|
||||
237,5,
|
||||
239,1,
|
||||
240,2,
|
||||
241,1,
|
||||
242,1,
|
||||
243,1,
|
||||
244,1,
|
||||
245,1,
|
||||
246,1,
|
||||
247,1,
|
||||
248,1,
|
||||
249,1,
|
||||
250,1,
|
||||
251,1,
|
||||
252,1,
|
||||
253,4,
|
||||
254,1,
|
||||
255,1,
|
||||
256,4,
|
||||
257,4,
|
||||
258,4,
|
||||
259,2,
|
||||
260,4,
|
||||
261,2,
|
||||
262,2,
|
||||
263,2,
|
||||
264,2,
|
||||
265,3,
|
||||
266,4,
|
||||
267,2,
|
||||
268,4,
|
||||
269,2,
|
||||
270,2,
|
||||
271,3,
|
||||
272,4,
|
||||
273,4,
|
||||
274,2,
|
||||
275,2,
|
||||
276,4,
|
||||
277,4,
|
||||
278,2,
|
||||
279,2,
|
||||
280,2,
|
||||
281,4,
|
||||
282,4,
|
||||
283,2,
|
||||
284,2,
|
||||
285,2,
|
||||
286,2,
|
||||
287,2,
|
||||
288,2,
|
||||
289,2,
|
||||
290,2,
|
||||
291,4,
|
||||
292,3,
|
||||
293,4,
|
||||
294,4,
|
||||
295,2,
|
||||
296,1,
|
||||
297,2,
|
||||
298,2,
|
||||
299,2,
|
||||
300,2,
|
||||
301,2,
|
||||
302,3,
|
||||
303,2,
|
||||
304,2,
|
||||
305,4,
|
||||
306,1,
|
||||
307,2,
|
||||
308,4,
|
||||
309,1,
|
||||
310,2,
|
||||
311,2,
|
||||
312,2,
|
||||
313,2,
|
||||
314,4,
|
||||
315,2,
|
||||
316,2,
|
||||
317,2,
|
||||
318,2,
|
||||
319,1,
|
||||
320,1,
|
||||
321,2,
|
||||
322,2,
|
||||
323,1,
|
||||
324,1,
|
||||
325,1,
|
||||
326,1,
|
||||
327,1,
|
||||
328,1,
|
||||
329,1,
|
||||
330,1,
|
||||
331,1,
|
||||
332,1,
|
||||
333,1,
|
||||
334,1,
|
||||
335,1,
|
||||
336,1,
|
||||
id,baby_trigger_item_id
|
||||
1,
|
||||
2,
|
||||
3,
|
||||
4,
|
||||
5,
|
||||
6,
|
||||
7,
|
||||
8,
|
||||
9,
|
||||
10,
|
||||
11,
|
||||
12,
|
||||
13,
|
||||
14,
|
||||
15,
|
||||
16,
|
||||
17,
|
||||
18,
|
||||
19,
|
||||
20,
|
||||
21,
|
||||
22,
|
||||
23,
|
||||
24,
|
||||
25,
|
||||
26,
|
||||
27,
|
||||
28,
|
||||
29,
|
||||
30,
|
||||
31,
|
||||
32,
|
||||
33,
|
||||
34,
|
||||
35,
|
||||
36,
|
||||
37,
|
||||
38,
|
||||
39,
|
||||
40,
|
||||
41,
|
||||
42,
|
||||
43,
|
||||
44,
|
||||
45,
|
||||
46,
|
||||
47,
|
||||
48,
|
||||
49,
|
||||
50,
|
||||
51,296
|
||||
52,
|
||||
53,
|
||||
54,
|
||||
55,
|
||||
56,
|
||||
57,291
|
||||
58,
|
||||
59,
|
||||
60,
|
||||
61,
|
||||
62,
|
||||
63,
|
||||
64,
|
||||
65,
|
||||
66,
|
||||
67,
|
||||
68,
|
||||
69,
|
||||
70,
|
||||
71,
|
||||
72,293
|
||||
73,
|
||||
74,
|
||||
75,
|
||||
76,
|
||||
77,
|
||||
78,
|
||||
79,
|
||||
80,
|
||||
81,
|
||||
82,
|
||||
83,
|
||||
84,
|
||||
85,
|
||||
86,
|
||||
87,
|
||||
88,
|
||||
89,
|
||||
90,231
|
||||
91,292
|
||||
92,
|
||||
93,
|
||||
94,
|
||||
95,
|
||||
96,
|
||||
97,
|
||||
98,
|
||||
99,
|
||||
100,232
|
||||
101,
|
||||
102,
|
||||
103,
|
||||
104,
|
||||
105,
|
||||
106,
|
||||
107,
|
||||
108,
|
||||
109,
|
||||
110,
|
||||
111,
|
||||
112,
|
||||
113,
|
||||
114,
|
||||
115,
|
||||
116,294
|
||||
117,
|
||||
118,
|
||||
119,
|
||||
120,
|
||||
121,
|
||||
122,
|
||||
123,
|
||||
124,
|
||||
125,
|
||||
126,
|
||||
127,
|
||||
128,
|
||||
129,
|
||||
130,
|
||||
131,
|
||||
132,
|
||||
133,
|
||||
134,
|
||||
135,
|
||||
136,
|
||||
137,
|
||||
138,
|
||||
139,
|
||||
140,
|
||||
141,
|
||||
142,
|
||||
143,
|
||||
144,
|
||||
145,
|
||||
146,
|
||||
147,
|
||||
148,
|
||||
149,
|
||||
150,
|
||||
151,
|
||||
152,
|
||||
153,
|
||||
154,
|
||||
155,
|
||||
156,
|
||||
157,
|
||||
158,295
|
||||
159,
|
||||
160,
|
||||
161,
|
||||
162,
|
||||
163,
|
||||
164,
|
||||
165,
|
||||
166,
|
||||
167,
|
||||
168,
|
||||
169,
|
||||
170,
|
||||
171,
|
||||
172,
|
||||
173,
|
||||
174,
|
||||
175,
|
||||
176,
|
||||
177,
|
||||
178,
|
||||
179,
|
||||
180,
|
||||
181,
|
||||
182,
|
||||
183,
|
||||
184,297
|
||||
185,
|
||||
186,
|
||||
187,
|
||||
188,
|
||||
189,
|
||||
190,
|
||||
191,
|
||||
192,
|
||||
193,
|
||||
194,
|
||||
195,
|
||||
196,
|
||||
197,
|
||||
198,
|
||||
199,
|
||||
200,
|
||||
201,
|
||||
202,
|
||||
203,
|
||||
204,
|
||||
205,
|
||||
206,
|
||||
207,
|
||||
208,
|
||||
209,
|
||||
211,
|
||||
212,
|
||||
213,
|
||||
214,
|
||||
215,
|
||||
216,
|
||||
217,
|
||||
218,
|
||||
219,
|
||||
220,
|
||||
221,
|
||||
223,
|
||||
224,
|
||||
228,
|
||||
229,
|
||||
230,
|
||||
232,
|
||||
233,
|
||||
234,
|
||||
235,
|
||||
236,
|
||||
237,
|
||||
239,
|
||||
240,
|
||||
241,
|
||||
242,
|
||||
243,
|
||||
244,
|
||||
245,
|
||||
246,
|
||||
247,
|
||||
248,
|
||||
249,
|
||||
250,
|
||||
252,
|
||||
253,
|
||||
254,
|
||||
255,
|
||||
256,
|
||||
257,
|
||||
258,
|
||||
259,
|
||||
260,
|
||||
261,
|
||||
262,
|
||||
263,
|
||||
264,
|
||||
265,
|
||||
266,
|
||||
267,
|
||||
268,
|
||||
269,
|
||||
270,
|
||||
271,
|
||||
272,
|
||||
273,
|
||||
274,
|
||||
275,
|
||||
276,
|
||||
277,
|
||||
278,
|
||||
279,
|
||||
280,
|
||||
281,
|
||||
282,
|
||||
283,
|
||||
284,
|
||||
285,
|
||||
286,
|
||||
287,
|
||||
288,
|
||||
289,
|
||||
290,
|
||||
291,
|
||||
292,
|
||||
293,
|
||||
294,
|
||||
295,
|
||||
296,
|
||||
297,
|
||||
298,
|
||||
299,
|
||||
300,
|
||||
301,
|
||||
302,
|
||||
303,
|
||||
304,
|
||||
305,
|
||||
306,
|
||||
307,
|
||||
308,
|
||||
309,
|
||||
310,
|
||||
311,
|
||||
312,
|
||||
313,
|
||||
314,
|
||||
315,
|
||||
316,
|
||||
317,
|
||||
318,
|
||||
319,
|
||||
320,
|
||||
321,
|
||||
322,
|
||||
323,
|
||||
324,
|
||||
325,
|
||||
326,
|
||||
327,
|
||||
328,
|
||||
329,
|
||||
330,
|
||||
331,
|
||||
332,
|
||||
333,
|
||||
334,
|
||||
335,
|
||||
336,
|
||||
|
|
|
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
|
||||
648,32,0,1
|
||||
649,88,0,1
|
||||
10001,46,0,1
|
||||
10002,46,0,1
|
||||
10003,46,0,1
|
||||
10004,107,0,1
|
||||
10004,142,1,3
|
||||
10005,107,0,1
|
||||
10005,142,1,3
|
||||
10006,32,0,1
|
||||
10007,26,0,1
|
||||
10007,26,1,3
|
||||
10008,26,0,1
|
||||
10009,26,0,1
|
||||
10010,26,0,1
|
||||
10011,26,0,1
|
||||
10012,26,0,1
|
||||
10013,59,0,1
|
||||
10014,59,0,1
|
||||
10015,59,0,1
|
||||
10016,69,0,1
|
||||
10016,91,0,2
|
||||
10016,104,1,3
|
||||
10017,125,0,1
|
||||
10017,161,1,3
|
||||
10018,32,0,1
|
||||
650,46,0,1
|
||||
651,46,0,1
|
||||
652,46,0,1
|
||||
653,107,0,1
|
||||
653,142,1,3
|
||||
654,107,0,1
|
||||
654,142,1,3
|
||||
655,32,0,1
|
||||
656,26,0,1
|
||||
656,26,1,3
|
||||
657,26,0,1
|
||||
658,26,0,1
|
||||
659,26,0,1
|
||||
660,26,0,1
|
||||
661,26,0,1
|
||||
662,59,0,1
|
||||
663,59,0,1
|
||||
664,59,0,1
|
||||
665,69,0,1
|
||||
665,91,0,2
|
||||
665,104,1,3
|
||||
666,125,0,1
|
||||
666,161,1,3
|
||||
667,32,0,1
|
||||
|
|
|
|
@ -1,4 +1,4 @@
|
|||
pokemon_id,pokedex_id,pokedex_number
|
||||
species_id,pokedex_id,pokedex_number
|
||||
1,1,1
|
||||
1,2,1
|
||||
1,3,226
|
||||
|
|
|
|
@ -1,4 +1,4 @@
|
|||
pokemon_id,egg_group_id
|
||||
species_id,egg_group_id
|
||||
1,1
|
||||
1,7
|
||||
2,1
|
||||
|
@ -823,24 +823,3 @@ pokemon_id,egg_group_id
|
|||
647,15
|
||||
648,15
|
||||
649,15
|
||||
10001,15
|
||||
10002,15
|
||||
10003,15
|
||||
10004,3
|
||||
10005,3
|
||||
10006,15
|
||||
10007,15
|
||||
10008,11
|
||||
10009,11
|
||||
10010,11
|
||||
10011,11
|
||||
10012,11
|
||||
10013,6
|
||||
10013,11
|
||||
10014,6
|
||||
10014,11
|
||||
10015,6
|
||||
10015,11
|
||||
10016,12
|
||||
10017,5
|
||||
10018,15
|
||||
|
|
|
|
@ -1,4 +1,4 @@
|
|||
id,evolved_pokemon_id,evolution_trigger_id,trigger_item_id,minimum_level,gender,location_id,held_item_id,time_of_day,known_move_id,minimum_happiness,minimum_beauty,relative_physical_stats,party_pokemon_id,trade_pokemon_id
|
||||
id,evolved_species_id,evolution_trigger_id,trigger_item_id,minimum_level,gender,location_id,held_item_id,time_of_day,known_move_id,minimum_happiness,minimum_beauty,relative_physical_stats,party_species_id,trade_species_id
|
||||
1,2,1,,16,,,,,,,,,,
|
||||
2,3,1,,32,,,,,,,,,,
|
||||
3,5,1,,16,,,,,,,,,,
|
||||
|
|
|
|
@ -1 +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,4,1,5,5
|
||||
493,5,2,4,5
|
||||
10001,1,1,2,4
|
||||
10001,2,1,2,3
|
||||
10001,3,1,2,4
|
||||
10001,4,1,2,4
|
||||
10001,5,2,2,5
|
||||
10002,1,1,2,4
|
||||
10002,2,1,2,3
|
||||
10002,3,1,2,4
|
||||
10002,4,1,2,4
|
||||
10002,5,2,2,5
|
||||
10003,1,1,2,4
|
||||
10003,2,1,2,3
|
||||
10003,3,1,2,4
|
||||
10003,4,1,2,4
|
||||
10003,5,2,2,5
|
||||
10004,1,1,2,4
|
||||
10004,2,1,2,3
|
||||
10004,3,1,2,4
|
||||
10004,4,1,2,4
|
||||
10004,5,2,2,5
|
||||
10005,1,1,2,4
|
||||
10005,2,1,2,3
|
||||
10005,3,1,2,4
|
||||
10005,4,1,2,4
|
||||
10005,5,2,2,5
|
||||
10006,1,1,2,4
|
||||
10006,2,1,2,3
|
||||
10006,3,1,2,4
|
||||
10006,4,1,2,4
|
||||
10006,5,2,2,5
|
||||
10007,1,1,2,4
|
||||
10007,2,1,2,3
|
||||
10007,3,1,2,4
|
||||
10007,4,1,2,4
|
||||
10007,5,2,2,5
|
||||
10008,1,1,2,4
|
||||
10008,2,1,2,3
|
||||
10008,3,1,2,4
|
||||
10008,4,1,2,4
|
||||
10008,5,2,2,5
|
||||
10009,1,1,2,4
|
||||
10009,2,1,2,3
|
||||
10009,3,1,2,4
|
||||
10009,4,1,2,4
|
||||
10009,5,2,2,5
|
||||
10010,1,1,2,4
|
||||
10010,2,1,2,3
|
||||
10010,3,1,2,4
|
||||
10010,4,1,2,4
|
||||
10010,5,2,2,5
|
||||
10011,1,1,2,4
|
||||
10011,2,1,2,3
|
||||
10011,3,1,2,4
|
||||
10011,4,1,2,4
|
||||
10011,5,2,2,5
|
||||
10012,1,1,2,4
|
||||
10012,2,1,2,3
|
||||
10012,3,1,2,4
|
||||
10012,4,1,2,4
|
||||
10012,5,2,2,5
|
||||
10013,1,1,2,4
|
||||
10013,2,1,2,3
|
||||
10013,3,1,2,4
|
||||
10013,4,1,2,4
|
||||
10013,5,2,2,5
|
||||
10014,1,1,2,4
|
||||
10014,2,1,2,3
|
||||
10014,3,1,2,4
|
||||
10014,4,1,2,4
|
||||
10014,5,2,2,5
|
||||
10015,1,1,2,4
|
||||
10015,2,1,2,3
|
||||
10015,3,1,2,4
|
||||
10015,4,1,2,4
|
||||
10015,5,2,2,5
|
||||
10016,1,1,2,4
|
||||
10016,2,1,2,3
|
||||
10016,3,1,2,4
|
||||
10016,4,1,2,4
|
||||
10016,5,2,2,5
|
||||
10017,1,1,2,4
|
||||
10017,2,1,2,3
|
||||
10017,3,1,2,4
|
||||
10017,4,1,2,4
|
||||
10017,5,2,2,5
|
||||
10018,1,1,2,4
|
||||
10018,2,1,2,3
|
||||
10018,3,1,2,4
|
||||
10018,4,1,2,4
|
||||
10018,5,2,2,5
|
||||
10019,1,1,2,4
|
||||
10019,2,1,2,3
|
||||
10019,3,1,2,4
|
||||
10019,4,1,2,4
|
||||
10019,5,2,2,5
|
||||
10020,1,1,2,4
|
||||
10020,2,1,2,3
|
||||
10020,3,1,2,4
|
||||
10020,4,1,2,4
|
||||
10020,5,2,2,5
|
||||
10021,1,1,2,4
|
||||
10021,2,1,2,3
|
||||
10021,3,1,2,4
|
||||
10021,4,1,2,4
|
||||
10021,5,2,2,5
|
||||
10022,1,1,2,4
|
||||
10022,2,1,2,3
|
||||
10022,3,1,2,4
|
||||
10022,4,1,2,4
|
||||
10022,5,2,2,5
|
||||
10023,1,1,2,4
|
||||
10023,2,1,2,3
|
||||
10023,3,1,2,4
|
||||
10023,4,1,2,4
|
||||
10023,5,2,2,5
|
||||
10024,1,1,2,4
|
||||
10024,2,1,2,3
|
||||
10024,3,1,2,4
|
||||
10024,4,1,2,4
|
||||
10024,5,2,2,5
|
||||
10025,1,1,2,4
|
||||
10025,2,1,2,3
|
||||
10025,3,1,2,4
|
||||
10025,4,1,2,4
|
||||
10025,5,2,2,5
|
||||
10026,1,1,2,4
|
||||
10026,2,1,2,3
|
||||
10026,3,1,2,5
|
||||
10026,4,1,2,4
|
||||
10026,5,2,2,5
|
||||
10027,1,1,2,4
|
||||
10027,2,1,2,3
|
||||
10027,3,1,2,5
|
||||
10027,4,1,2,4
|
||||
10027,5,2,2,5
|
||||
10031,1,2,4,5
|
||||
10031,2,4,5,5
|
||||
10031,3,1,4,5
|
||||
10031,4,1,2,3
|
||||
10031,5,2,3,4
|
||||
10032,1,1,3,3
|
||||
10032,2,1,3,4
|
||||
10032,3,2,4,5
|
||||
10032,4,4,5,5
|
||||
10032,5,2,2,3
|
||||
10033,1,4,5,5
|
||||
10033,2,1,2,3
|
||||
10033,3,2,4,5
|
||||
10033,4,1,3,4
|
||||
10033,5,2,4,4
|
||||
10034,1,1,1,4
|
||||
10034,2,1,1,4
|
||||
10034,3,1,1,4
|
||||
10034,4,1,1,5
|
||||
10034,5,2,2,3
|
||||
10035,1,1,1,4
|
||||
10035,2,1,1,5
|
||||
10035,3,1,1,3
|
||||
10035,4,1,1,5
|
||||
10035,5,2,2,3
|
||||
10036,1,1,2,3
|
||||
10036,2,3,4,5
|
||||
10036,3,1,2,2
|
||||
10036,4,1,4,5
|
||||
10036,5,2,2,3
|
||||
10037,1,1,1,3
|
||||
10037,2,1,3,5
|
||||
10037,3,1,2,3
|
||||
10037,4,5,5,5
|
||||
10037,5,2,2,2
|
||||
10039,1,1,1,3
|
||||
10039,2,1,1,4
|
||||
10039,3,1,1,3
|
||||
10039,4,1,3,5
|
||||
10039,5,2,2,2
|
||||
10040,1,1,1,2
|
||||
10040,2,3,4,5
|
||||
10040,3,1,3,3
|
||||
10040,4,4,5,5
|
||||
10040,5,2,2,2
|
||||
10041,1,5,5,5
|
||||
10041,2,1,4,5
|
||||
10041,3,1,4,5
|
||||
10041,4,1,4,5
|
||||
10041,5,2,5,5
|
||||
10042,1,1,4,5
|
||||
10042,2,5,5,5
|
||||
10042,3,1,5,5
|
||||
10042,4,1,4,5
|
||||
10042,5,2,4,5
|
||||
10043,1,1,3,5
|
||||
10043,2,1,5,5
|
||||
10043,3,1,5,5
|
||||
10043,4,1,5,5
|
||||
10043,5,2,5,5
|
||||
10044,1,5,5,5
|
||||
10044,2,1,4,5
|
||||
10044,3,1,5,5
|
||||
10044,4,1,4,5
|
||||
10044,5,2,4,5
|
||||
10045,1,1,4,5
|
||||
10045,2,1,5,5
|
||||
10045,3,5,5,5
|
||||
10045,4,1,4,5
|
||||
10045,5,2,4,5
|
||||
10046,1,1,4,5
|
||||
10046,2,5,5,5
|
||||
10046,3,1,4,5
|
||||
10046,4,1,5,5
|
||||
10046,5,2,4,5
|
||||
10047,1,1,5,5
|
||||
10047,2,1,4,5
|
||||
10047,3,1,4,5
|
||||
10047,4,1,4,5
|
||||
10047,5,5,5,5
|
||||
10048,1,1,4,5
|
||||
10048,2,1,4,5
|
||||
10048,3,1,5,5
|
||||
10048,4,1,4,5
|
||||
10048,5,5,5,5
|
||||
10049,1,1,4,5
|
||||
10049,2,1,4,5
|
||||
10049,3,1,4,5
|
||||
10049,4,5,5,5
|
||||
10049,5,2,5,5
|
||||
10050,1,1,4,5
|
||||
10050,2,1,5,5
|
||||
10050,3,1,4,5
|
||||
10050,4,5,5,5
|
||||
10050,5,2,4,5
|
||||
10051,1,5,5,5
|
||||
10051,2,1,5,5
|
||||
10051,3,1,4,5
|
||||
10051,4,1,4,5
|
||||
10051,5,2,4,5
|
||||
10052,1,1,4,5
|
||||
10052,2,1,4,5
|
||||
10052,3,5,5,5
|
||||
10052,4,1,5,5
|
||||
10052,5,2,4,5
|
||||
10053,1,1,5,5
|
||||
10053,2,1,4,5
|
||||
10053,3,5,5,5
|
||||
10053,4,1,4,5
|
||||
10053,5,2,4,5
|
||||
10054,1,1,4,5
|
||||
10054,2,5,5,5
|
||||
10054,3,1,4,5
|
||||
10054,4,1,5,5
|
||||
10054,5,2,4,5
|
||||
10055,1,1,4,5
|
||||
10055,2,1,4,5
|
||||
10055,3,1,5,5
|
||||
10055,4,5,5,5
|
||||
10055,5,2,4,5
|
||||
10056,1,1,5,5
|
||||
10056,2,1,4,5
|
||||
10056,3,5,5,5
|
||||
10056,4,1,4,5
|
||||
10056,5,2,4,5
|
||||
10057,1,1,5,5
|
||||
10057,2,1,5,5
|
||||
10057,3,1,5,5
|
||||
10057,4,1,5,5
|
||||
10057,5,2,5,5
|
||||
10058,1,2,3,4
|
||||
10058,2,2,4,4
|
||||
10058,3,1,3,4
|
||||
10058,4,1,3,4
|
||||
10058,5,2,4,4
|
||||
10059,1,1,3,3
|
||||
10059,2,1,3,3
|
||||
10059,3,1,3,4
|
||||
10059,4,1,4,4
|
||||
10059,5,2,2,4
|
||||
10060,1,1,3,4
|
||||
10060,2,1,2,3
|
||||
10060,3,3,4,5
|
||||
10060,4,1,3,3
|
||||
10060,5,3,3,4
|
||||
10061,1,3,3,5
|
||||
10061,2,1,3,5
|
||||
10061,3,1,3,3
|
||||
10061,4,1,2,3
|
||||
10061,5,4,5,5
|
||||
10062,1,1,3,3
|
||||
10062,2,1,3,3
|
||||
10062,3,3,5,5
|
||||
10062,4,3,3,4
|
||||
10062,5,2,2,4
|
||||
10063,1,1,3,5
|
||||
10063,2,1,3,5
|
||||
10063,3,1,3,5
|
||||
10063,4,1,3,5
|
||||
10063,5,2,3,5
|
||||
10064,1,3,3,5
|
||||
10064,2,1,4,4
|
||||
10064,3,1,3,4
|
||||
10064,4,1,3,3
|
||||
10064,5,3,5,5
|
||||
10065,1,3,5,5
|
||||
10065,2,1,1,1
|
||||
10065,3,1,3,5
|
||||
10065,4,1,1,3
|
||||
10065,5,2,3,4
|
||||
650,1,1,2,4
|
||||
650,2,1,2,3
|
||||
650,3,1,2,4
|
||||
650,4,1,2,4
|
||||
650,5,2,2,5
|
||||
651,1,1,2,4
|
||||
651,2,1,2,3
|
||||
651,3,1,2,4
|
||||
651,4,1,2,4
|
||||
651,5,2,2,5
|
||||
652,1,1,2,4
|
||||
652,2,1,2,3
|
||||
652,3,1,2,4
|
||||
652,4,1,2,4
|
||||
652,5,2,2,5
|
||||
653,1,1,2,4
|
||||
653,2,1,2,3
|
||||
653,3,1,2,4
|
||||
653,4,1,2,4
|
||||
653,5,2,2,5
|
||||
654,1,1,2,4
|
||||
654,2,1,2,3
|
||||
654,3,1,2,4
|
||||
654,4,1,2,4
|
||||
654,5,2,2,5
|
||||
655,1,1,2,4
|
||||
655,2,1,2,3
|
||||
655,3,1,2,4
|
||||
655,4,1,2,4
|
||||
655,5,2,2,5
|
||||
656,1,1,2,4
|
||||
656,2,1,2,3
|
||||
656,3,1,2,4
|
||||
656,4,1,2,4
|
||||
656,5,2,2,5
|
||||
657,1,1,2,4
|
||||
657,2,1,2,3
|
||||
657,3,1,2,4
|
||||
657,4,1,2,4
|
||||
657,5,2,2,5
|
||||
658,1,1,2,4
|
||||
658,2,1,2,3
|
||||
658,3,1,2,4
|
||||
658,4,1,2,4
|
||||
658,5,2,2,5
|
||||
659,1,1,2,4
|
||||
659,2,1,2,3
|
||||
659,3,1,2,4
|
||||
659,4,1,2,4
|
||||
659,5,2,2,5
|
||||
660,1,1,2,4
|
||||
660,2,1,2,3
|
||||
660,3,1,2,4
|
||||
660,4,1,2,4
|
||||
660,5,2,2,5
|
||||
661,1,1,2,4
|
||||
661,2,1,2,3
|
||||
661,3,1,2,4
|
||||
661,4,1,2,4
|
||||
661,5,2,2,5
|
||||
662,1,1,2,4
|
||||
662,2,1,2,3
|
||||
662,3,1,2,4
|
||||
662,4,1,2,4
|
||||
662,5,2,2,5
|
||||
663,1,1,2,4
|
||||
663,2,1,2,3
|
||||
663,3,1,2,4
|
||||
663,4,1,2,4
|
||||
663,5,2,2,5
|
||||
664,1,1,2,4
|
||||
664,2,1,2,3
|
||||
664,3,1,2,4
|
||||
664,4,1,2,4
|
||||
664,5,2,2,5
|
||||
665,1,1,2,4
|
||||
665,2,1,2,3
|
||||
665,3,1,2,4
|
||||
665,4,1,2,4
|
||||
665,5,2,2,5
|
||||
666,1,1,2,4
|
||||
666,2,1,2,3
|
||||
666,3,1,2,4
|
||||
666,4,1,2,4
|
||||
666,5,2,2,5
|
||||
667,1,1,2,4
|
||||
667,2,1,2,3
|
||||
667,3,1,2,4
|
||||
667,4,1,2,4
|
||||
667,5,2,2,5
|
||||
668,1,1,2,4
|
||||
668,2,1,2,3
|
||||
668,3,1,2,4
|
||||
668,4,1,2,4
|
||||
668,5,2,2,5
|
||||
669,1,1,2,4
|
||||
669,2,1,2,3
|
||||
669,3,1,2,4
|
||||
669,4,1,2,4
|
||||
669,5,2,2,5
|
||||
670,1,1,2,4
|
||||
670,2,1,2,3
|
||||
670,3,1,2,4
|
||||
670,4,1,2,4
|
||||
670,5,2,2,5
|
||||
671,1,1,2,4
|
||||
671,2,1,2,3
|
||||
671,3,1,2,4
|
||||
671,4,1,2,4
|
||||
671,5,2,2,5
|
||||
672,1,1,2,4
|
||||
672,2,1,2,3
|
||||
672,3,1,2,4
|
||||
672,4,1,2,4
|
||||
672,5,2,2,5
|
||||
673,1,1,2,4
|
||||
673,2,1,2,3
|
||||
673,3,1,2,4
|
||||
673,4,1,2,4
|
||||
673,5,2,2,5
|
||||
674,1,1,2,4
|
||||
674,2,1,2,3
|
||||
674,3,1,2,4
|
||||
674,4,1,2,4
|
||||
674,5,2,2,5
|
||||
675,1,1,2,4
|
||||
675,2,1,2,3
|
||||
675,3,1,2,5
|
||||
675,4,1,2,4
|
||||
675,5,2,2,5
|
||||
676,1,1,2,4
|
||||
676,2,1,2,3
|
||||
676,3,1,2,5
|
||||
676,4,1,2,4
|
||||
676,5,2,2,5
|
||||
680,1,2,4,5
|
||||
680,2,4,5,5
|
||||
680,3,1,4,5
|
||||
680,4,1,2,3
|
||||
680,5,2,3,4
|
||||
681,1,1,3,3
|
||||
681,2,1,3,4
|
||||
681,3,2,4,5
|
||||
681,4,4,5,5
|
||||
681,5,2,2,3
|
||||
682,1,4,5,5
|
||||
682,2,1,2,3
|
||||
682,3,2,4,5
|
||||
682,4,1,3,4
|
||||
682,5,2,4,4
|
||||
683,1,1,1,4
|
||||
683,2,1,1,4
|
||||
683,3,1,1,4
|
||||
683,4,1,1,5
|
||||
683,5,2,2,3
|
||||
684,1,1,1,4
|
||||
684,2,1,1,5
|
||||
684,3,1,1,3
|
||||
684,4,1,1,5
|
||||
684,5,2,2,3
|
||||
685,1,1,2,3
|
||||
685,2,3,4,5
|
||||
685,3,1,2,2
|
||||
685,4,1,4,5
|
||||
685,5,2,2,3
|
||||
686,1,1,1,3
|
||||
686,2,1,3,5
|
||||
686,3,1,2,3
|
||||
686,4,5,5,5
|
||||
686,5,2,2,2
|
||||
688,1,1,1,3
|
||||
688,2,1,1,4
|
||||
688,3,1,1,3
|
||||
688,4,1,3,5
|
||||
688,5,2,2,2
|
||||
689,1,1,1,2
|
||||
689,2,3,4,5
|
||||
689,3,1,3,3
|
||||
689,4,4,5,5
|
||||
689,5,2,2,2
|
||||
690,1,5,5,5
|
||||
690,2,1,4,5
|
||||
690,3,1,4,5
|
||||
690,4,1,4,5
|
||||
690,5,2,5,5
|
||||
691,1,1,4,5
|
||||
691,2,5,5,5
|
||||
691,3,1,5,5
|
||||
691,4,1,4,5
|
||||
691,5,2,4,5
|
||||
692,1,1,3,5
|
||||
692,2,1,5,5
|
||||
692,3,1,5,5
|
||||
692,4,1,5,5
|
||||
692,5,2,5,5
|
||||
693,1,5,5,5
|
||||
693,2,1,4,5
|
||||
693,3,1,5,5
|
||||
693,4,1,4,5
|
||||
693,5,2,4,5
|
||||
694,1,1,4,5
|
||||
694,2,1,5,5
|
||||
694,3,5,5,5
|
||||
694,4,1,4,5
|
||||
694,5,2,4,5
|
||||
695,1,1,4,5
|
||||
695,2,5,5,5
|
||||
695,3,1,4,5
|
||||
695,4,1,5,5
|
||||
695,5,2,4,5
|
||||
696,1,1,5,5
|
||||
696,2,1,4,5
|
||||
696,3,1,4,5
|
||||
696,4,1,4,5
|
||||
696,5,5,5,5
|
||||
697,1,1,4,5
|
||||
697,2,1,4,5
|
||||
697,3,1,5,5
|
||||
697,4,1,4,5
|
||||
697,5,5,5,5
|
||||
698,1,1,4,5
|
||||
698,2,1,4,5
|
||||
698,3,1,4,5
|
||||
698,4,5,5,5
|
||||
698,5,2,5,5
|
||||
699,1,1,4,5
|
||||
699,2,1,5,5
|
||||
699,3,1,4,5
|
||||
699,4,5,5,5
|
||||
699,5,2,4,5
|
||||
700,1,5,5,5
|
||||
700,2,1,5,5
|
||||
700,3,1,4,5
|
||||
700,4,1,4,5
|
||||
700,5,2,4,5
|
||||
701,1,1,4,5
|
||||
701,2,1,4,5
|
||||
701,3,5,5,5
|
||||
701,4,1,5,5
|
||||
701,5,2,4,5
|
||||
702,1,1,5,5
|
||||
702,2,1,4,5
|
||||
702,3,5,5,5
|
||||
702,4,1,4,5
|
||||
702,5,2,4,5
|
||||
703,1,1,4,5
|
||||
703,2,5,5,5
|
||||
703,3,1,4,5
|
||||
703,4,1,5,5
|
||||
703,5,2,4,5
|
||||
704,1,1,4,5
|
||||
704,2,1,4,5
|
||||
704,3,1,5,5
|
||||
704,4,5,5,5
|
||||
704,5,2,4,5
|
||||
705,1,1,5,5
|
||||
705,2,1,4,5
|
||||
705,3,5,5,5
|
||||
705,4,1,4,5
|
||||
705,5,2,4,5
|
||||
706,1,1,5,5
|
||||
706,2,1,5,5
|
||||
706,3,1,5,5
|
||||
706,4,1,5,5
|
||||
706,5,2,5,5
|
||||
707,1,2,3,4
|
||||
707,2,2,4,4
|
||||
707,3,1,3,4
|
||||
707,4,1,3,4
|
||||
707,5,2,4,4
|
||||
708,1,1,3,3
|
||||
708,2,1,3,3
|
||||
708,3,1,3,4
|
||||
708,4,1,4,4
|
||||
708,5,2,2,4
|
||||
709,1,1,3,4
|
||||
709,2,1,2,3
|
||||
709,3,3,4,5
|
||||
709,4,1,3,3
|
||||
709,5,3,3,4
|
||||
710,1,3,3,5
|
||||
710,2,1,3,5
|
||||
710,3,1,3,3
|
||||
710,4,1,2,3
|
||||
710,5,4,5,5
|
||||
711,1,1,3,3
|
||||
711,2,1,3,3
|
||||
711,3,3,5,5
|
||||
711,4,3,3,4
|
||||
711,5,2,2,4
|
||||
712,1,1,3,5
|
||||
712,2,1,3,5
|
||||
712,3,1,3,5
|
||||
712,4,1,3,5
|
||||
712,5,2,3,5
|
||||
713,1,3,3,5
|
||||
713,2,1,4,4
|
||||
713,3,1,3,4
|
||||
713,4,1,3,3
|
||||
713,5,3,5,5
|
||||
714,1,3,5,5
|
||||
714,2,1,1,1
|
||||
714,3,1,3,5
|
||||
714,4,1,1,3
|
||||
714,5,2,3,4
|
||||
|
|
|
File diff suppressed because it is too large
Load diff
|
@ -1929,33 +1929,33 @@ pokemon_id,generation_id,game_index
|
|||
647,5,647
|
||||
648,5,648
|
||||
649,5,649
|
||||
10001,4,496
|
||||
10001,5,650
|
||||
10002,4,497
|
||||
10002,5,651
|
||||
10003,4,498
|
||||
10003,5,652
|
||||
10004,4,499
|
||||
10004,5,653
|
||||
10005,4,500
|
||||
10005,5,654
|
||||
10006,4,502
|
||||
10006,5,655
|
||||
10007,4,501
|
||||
10007,5,656
|
||||
10008,4,503
|
||||
10008,5,657
|
||||
10009,4,504
|
||||
10009,5,658
|
||||
10010,4,505
|
||||
10010,5,659
|
||||
10011,4,506
|
||||
10011,5,660
|
||||
10012,4,507
|
||||
10012,5,661
|
||||
10013,5,662
|
||||
10014,5,663
|
||||
10015,5,664
|
||||
10016,5,665
|
||||
10017,5,666
|
||||
10018,5,667
|
||||
650,4,496
|
||||
650,5,650
|
||||
651,4,497
|
||||
651,5,651
|
||||
652,4,498
|
||||
652,5,652
|
||||
653,4,499
|
||||
653,5,653
|
||||
654,4,500
|
||||
654,5,654
|
||||
655,4,502
|
||||
655,5,655
|
||||
656,4,501
|
||||
656,5,656
|
||||
657,4,503
|
||||
657,5,657
|
||||
658,4,504
|
||||
658,5,658
|
||||
659,4,505
|
||||
659,5,659
|
||||
660,4,506
|
||||
660,5,660
|
||||
661,4,507
|
||||
661,5,661
|
||||
662,5,662
|
||||
663,5,663
|
||||
664,5,664
|
||||
665,5,665
|
||||
666,5,666
|
||||
667,5,667
|
||||
|
|
|
|
@ -2343,34 +2343,34 @@ pokemon_id,version_id,item_id,rarity
|
|||
637,18,199,100
|
||||
648,17,91,100
|
||||
648,18,91,100
|
||||
10004,12,199,5
|
||||
10004,13,199,5
|
||||
10004,14,199,5
|
||||
10004,15,199,5
|
||||
10004,16,199,5
|
||||
10004,17,199,5
|
||||
10004,18,199,5
|
||||
10005,12,199,5
|
||||
10005,13,199,5
|
||||
10005,14,199,5
|
||||
10005,15,199,5
|
||||
10005,16,199,5
|
||||
10005,17,199,5
|
||||
10005,18,199,5
|
||||
10006,14,134,100
|
||||
10006,15,134,100
|
||||
10006,16,134,100
|
||||
10006,17,134,100
|
||||
10006,18,134,100
|
||||
10013,17,220,100
|
||||
10013,18,220,100
|
||||
10014,17,220,100
|
||||
10014,18,220,100
|
||||
10015,17,220,100
|
||||
10015,18,220,100
|
||||
10016,17,204,5
|
||||
10016,18,204,5
|
||||
10017,17,129,50
|
||||
10017,18,129,50
|
||||
10018,17,91,100
|
||||
10018,18,91,100
|
||||
653,12,199,5
|
||||
653,13,199,5
|
||||
653,14,199,5
|
||||
653,15,199,5
|
||||
653,16,199,5
|
||||
653,17,199,5
|
||||
653,18,199,5
|
||||
654,12,199,5
|
||||
654,13,199,5
|
||||
654,14,199,5
|
||||
654,15,199,5
|
||||
654,16,199,5
|
||||
654,17,199,5
|
||||
654,18,199,5
|
||||
655,14,134,100
|
||||
655,15,134,100
|
||||
655,16,134,100
|
||||
655,17,134,100
|
||||
655,18,134,100
|
||||
662,17,220,100
|
||||
662,18,220,100
|
||||
663,17,220,100
|
||||
663,18,220,100
|
||||
664,17,220,100
|
||||
664,18,220,100
|
||||
665,17,204,5
|
||||
665,18,204,5
|
||||
666,17,129,50
|
||||
666,18,129,50
|
||||
667,17,91,100
|
||||
667,18,91,100
|
||||
|
|
|
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
|
||||
planted on its
|
||||
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,2,Fushigidane,
|
||||
1,3,이상해씨,
|
||||
|
@ -4081,21 +4081,3 @@ pokemon_id,local_language_id,name,species
|
|||
649,5,Genesect,
|
||||
649,6,Genesect,
|
||||
649,9,Genesect,Paleozoic
|
||||
10001,9,Deoxys,DNA
|
||||
10002,9,Deoxys,DNA
|
||||
10003,9,Deoxys,DNA
|
||||
10004,9,Wormadam,Bagworm
|
||||
10005,9,Wormadam,Bagworm
|
||||
10006,9,Shaymin,Gratitude
|
||||
10007,9,Giratina,Renegade
|
||||
10008,9,Rotom,Plasma
|
||||
10009,9,Rotom,Plasma
|
||||
10010,9,Rotom,Plasma
|
||||
10011,9,Rotom,Plasma
|
||||
10012,9,Rotom,Plasma
|
||||
10013,9,Castform,Weather
|
||||
10014,9,Castform,Weather
|
||||
10015,9,Castform,Weather
|
||||
10016,9,Basculin,Hostile
|
||||
10017,9,Darmanitan,Blazing
|
||||
10018,9,Meloetta,Melody
|
|
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,5,95,0
|
||||
649,6,99,1
|
||||
10001,1,50,0
|
||||
10001,2,180,2
|
||||
10001,3,20,0
|
||||
10001,4,180,1
|
||||
10001,5,20,0
|
||||
10001,6,150,0
|
||||
10002,1,50,0
|
||||
10002,2,70,0
|
||||
10002,3,160,2
|
||||
10002,4,70,0
|
||||
10002,5,160,1
|
||||
10002,6,90,0
|
||||
10003,1,50,0
|
||||
10003,2,95,0
|
||||
10003,3,90,0
|
||||
10003,4,95,0
|
||||
10003,5,90,0
|
||||
10003,6,180,3
|
||||
10004,1,60,0
|
||||
10004,2,79,0
|
||||
10004,3,105,2
|
||||
10004,4,59,0
|
||||
10004,5,85,0
|
||||
10004,6,36,0
|
||||
10005,1,60,0
|
||||
10005,2,69,0
|
||||
10005,3,95,1
|
||||
10005,4,69,0
|
||||
10005,5,95,1
|
||||
10005,6,36,0
|
||||
10006,1,100,0
|
||||
10006,2,103,0
|
||||
10006,3,75,0
|
||||
10006,4,120,0
|
||||
10006,5,75,0
|
||||
10006,6,127,3
|
||||
10007,1,150,3
|
||||
10007,2,120,0
|
||||
10007,3,100,0
|
||||
10007,4,120,0
|
||||
10007,5,100,0
|
||||
10007,6,90,0
|
||||
10008,1,50,0
|
||||
10008,2,65,0
|
||||
10008,3,107,0
|
||||
10008,4,105,1
|
||||
10008,5,107,0
|
||||
10008,6,86,1
|
||||
10009,1,50,0
|
||||
10009,2,65,0
|
||||
10009,3,107,0
|
||||
10009,4,105,1
|
||||
10009,5,107,0
|
||||
10009,6,86,1
|
||||
10010,1,50,0
|
||||
10010,2,65,0
|
||||
10010,3,107,0
|
||||
10010,4,105,1
|
||||
10010,5,107,0
|
||||
10010,6,86,1
|
||||
10011,1,50,0
|
||||
10011,2,65,0
|
||||
10011,3,107,0
|
||||
10011,4,105,1
|
||||
10011,5,107,0
|
||||
10011,6,86,1
|
||||
10012,1,50,0
|
||||
10012,2,65,0
|
||||
10012,3,107,0
|
||||
10012,4,105,1
|
||||
10012,5,107,0
|
||||
10012,6,86,1
|
||||
10013,1,70,1
|
||||
10013,2,70,0
|
||||
10013,3,70,0
|
||||
10013,4,70,0
|
||||
10013,5,70,0
|
||||
10013,6,70,0
|
||||
10014,1,70,1
|
||||
10014,2,70,0
|
||||
10014,3,70,0
|
||||
10014,4,70,0
|
||||
10014,5,70,0
|
||||
10014,6,70,0
|
||||
10015,1,70,1
|
||||
10015,2,70,0
|
||||
10015,3,70,0
|
||||
10015,4,70,0
|
||||
10015,5,70,0
|
||||
10015,6,70,0
|
||||
10016,1,70,0
|
||||
10016,2,92,0
|
||||
10016,3,65,0
|
||||
10016,4,80,0
|
||||
10016,5,55,0
|
||||
10016,6,98,2
|
||||
10017,1,105,0
|
||||
10017,2,30,0
|
||||
10017,3,105,0
|
||||
10017,4,140,2
|
||||
10017,5,105,0
|
||||
10017,6,55,0
|
||||
10018,1,100,0
|
||||
10018,2,128,1
|
||||
10018,3,90,1
|
||||
10018,4,77,0
|
||||
10018,5,77,0
|
||||
10018,6,128,1
|
||||
650,1,50,0
|
||||
650,2,180,2
|
||||
650,3,20,0
|
||||
650,4,180,1
|
||||
650,5,20,0
|
||||
650,6,150,0
|
||||
651,1,50,0
|
||||
651,2,70,0
|
||||
651,3,160,2
|
||||
651,4,70,0
|
||||
651,5,160,1
|
||||
651,6,90,0
|
||||
652,1,50,0
|
||||
652,2,95,0
|
||||
652,3,90,0
|
||||
652,4,95,0
|
||||
652,5,90,0
|
||||
652,6,180,3
|
||||
653,1,60,0
|
||||
653,2,79,0
|
||||
653,3,105,2
|
||||
653,4,59,0
|
||||
653,5,85,0
|
||||
653,6,36,0
|
||||
654,1,60,0
|
||||
654,2,69,0
|
||||
654,3,95,1
|
||||
654,4,69,0
|
||||
654,5,95,1
|
||||
654,6,36,0
|
||||
655,1,100,0
|
||||
655,2,103,0
|
||||
655,3,75,0
|
||||
655,4,120,0
|
||||
655,5,75,0
|
||||
655,6,127,3
|
||||
656,1,150,3
|
||||
656,2,120,0
|
||||
656,3,100,0
|
||||
656,4,120,0
|
||||
656,5,100,0
|
||||
656,6,90,0
|
||||
657,1,50,0
|
||||
657,2,65,0
|
||||
657,3,107,0
|
||||
657,4,105,1
|
||||
657,5,107,0
|
||||
657,6,86,1
|
||||
658,1,50,0
|
||||
658,2,65,0
|
||||
658,3,107,0
|
||||
658,4,105,1
|
||||
658,5,107,0
|
||||
658,6,86,1
|
||||
659,1,50,0
|
||||
659,2,65,0
|
||||
659,3,107,0
|
||||
659,4,105,1
|
||||
659,5,107,0
|
||||
659,6,86,1
|
||||
660,1,50,0
|
||||
660,2,65,0
|
||||
660,3,107,0
|
||||
660,4,105,1
|
||||
660,5,107,0
|
||||
660,6,86,1
|
||||
661,1,50,0
|
||||
661,2,65,0
|
||||
661,3,107,0
|
||||
661,4,105,1
|
||||
661,5,107,0
|
||||
661,6,86,1
|
||||
662,1,70,1
|
||||
662,2,70,0
|
||||
662,3,70,0
|
||||
662,4,70,0
|
||||
662,5,70,0
|
||||
662,6,70,0
|
||||
663,1,70,1
|
||||
663,2,70,0
|
||||
663,3,70,0
|
||||
663,4,70,0
|
||||
663,5,70,0
|
||||
663,6,70,0
|
||||
664,1,70,1
|
||||
664,2,70,0
|
||||
664,3,70,0
|
||||
664,4,70,0
|
||||
664,5,70,0
|
||||
664,6,70,0
|
||||
665,1,70,0
|
||||
665,2,92,0
|
||||
665,3,65,0
|
||||
665,4,80,0
|
||||
665,5,55,0
|
||||
665,6,98,2
|
||||
666,1,105,0
|
||||
666,2,30,0
|
||||
666,3,105,0
|
||||
666,4,140,2
|
||||
666,5,105,0
|
||||
666,6,55,0
|
||||
667,1,100,0
|
||||
667,2,128,1
|
||||
667,3,90,1
|
||||
667,4,77,0
|
||||
667,5,77,0
|
||||
667,6,128,1
|
||||
|
|
|
|
@ -943,32 +943,32 @@ pokemon_id,type_id,slot
|
|||
648,14,2
|
||||
649,7,1
|
||||
649,9,2
|
||||
10001,14,1
|
||||
10002,14,1
|
||||
10003,14,1
|
||||
10004,7,1
|
||||
10004,5,2
|
||||
10005,7,1
|
||||
10005,9,2
|
||||
10006,12,1
|
||||
10006,3,2
|
||||
10007,8,1
|
||||
10007,16,2
|
||||
10008,13,1
|
||||
10008,10,2
|
||||
10009,13,1
|
||||
10009,11,2
|
||||
10010,13,1
|
||||
10010,15,2
|
||||
10011,13,1
|
||||
10011,3,2
|
||||
10012,13,1
|
||||
10012,12,2
|
||||
10013,10,1
|
||||
10014,11,1
|
||||
10015,15,1
|
||||
10016,11,1
|
||||
10017,10,1
|
||||
10017,14,2
|
||||
10018,1,1
|
||||
10018,2,2
|
||||
650,14,1
|
||||
651,14,1
|
||||
652,14,1
|
||||
653,7,1
|
||||
653,5,2
|
||||
654,7,1
|
||||
654,9,2
|
||||
655,12,1
|
||||
655,3,2
|
||||
656,8,1
|
||||
656,16,2
|
||||
657,13,1
|
||||
657,10,2
|
||||
658,13,1
|
||||
658,11,2
|
||||
659,13,1
|
||||
659,15,2
|
||||
660,13,1
|
||||
660,3,2
|
||||
661,13,1
|
||||
661,12,2
|
||||
662,10,1
|
||||
663,11,1
|
||||
664,15,1
|
||||
665,11,1
|
||||
666,10,1
|
||||
666,14,2
|
||||
667,1,1
|
||||
667,2,2
|
||||
|
|
|
|
@ -1030,84 +1030,64 @@ Působí na protivníky."
|
|||
10,Pokedex,6,description,f3d57c4c,Platinum Sinnohský dex—rozšířená verze dexu z Diamond a Pearl
|
||||
10,Pokedex,7,description,56afcca4,HeartGold/SoulSilver Johto dex – dex z Gold/Silver/Crystal rozšířený o nové vývoje
|
||||
10,Pokedex,8,description,79a9ade7,Black/White Unovský dex
|
||||
10,Pokemon,1,flavor_summary,fe4d8c9a,"Od narození má na zádech divné semínko, které roste a vyvíjí se společně s ním. Uvnitř má zásobu živin, kterou využívají zejména malí Bulbasauři. I později ale může celé dny nejíst.
|
||||
10,PokemonSpecies,1,flavor_summary,fe4d8c9a,"Od narození má na zádech divné semínko, které roste a vyvíjí se společně s ním. Uvnitř má zásobu živin, kterou využívají zejména malí Bulbasauři. I později ale může celé dny nejíst.
|
||||
|
||||
Bulbasauři rádi odpočívají na sluníčku. Semínko na zádech jim tak roste rychleji."
|
||||
10,Pokemon,1,species,e4b54c38,Semínkový
|
||||
10,Pokemon,2,species,e4b54c38,Semínkový
|
||||
10,Pokemon,3,species,e4b54c38,Semínkový
|
||||
10,Pokemon,4,species,473b2152,Ještěrkovitý
|
||||
10,Pokemon,5,species,c4ff3365,Plamenný
|
||||
10,Pokemon,6,species,c4ff3365,Plamenný
|
||||
10,Pokemon,7,species,a662e558,Malý želví
|
||||
10,Pokemon,8,species,71b19d1a,Želví
|
||||
10,Pokemon,9,species,4a927f13,Korýší
|
||||
10,Pokemon,10,species,1a1f628b,Červí
|
||||
10,Pokemon,11,species,011bd63a,Kuklový
|
||||
10,Pokemon,12,species,4666d1bf,Motýlí
|
||||
10,Pokemon,14,species,011bd63a,Kuklový
|
||||
10,Pokemon,35,species,e1dde8d1,diblíci
|
||||
10,Pokemon,36,species,e1dde8d1,diblíci
|
||||
10,Pokemon,66,species,55017b02,Supersilný
|
||||
10,Pokemon,67,species,55017b02,Supersilný
|
||||
10,Pokemon,68,species,55017b02,Supersilný
|
||||
10,Pokemon,88,species,63411a53,Kalový
|
||||
10,Pokemon,89,species,63411a53,Kalový
|
||||
10,Pokemon,96,species,834b9610,Hypnotický
|
||||
10,Pokemon,97,species,834b9610,Hypnotický
|
||||
10,Pokemon,111,species,11201819,Střepinový
|
||||
10,Pokemon,120,species,a62f8434,Hvězdicovitý
|
||||
10,Pokemon,121,species,abfc4744,Záhadný
|
||||
10,Pokemon,122,species,2ef3c334,Bariérový
|
||||
10,Pokemon,132,species,f543030e,Transformační
|
||||
10,Pokemon,133,species,c0fdaa30,Vývoj
|
||||
10,Pokemon,136,species,c4ff3365,Plamenný
|
||||
10,Pokemon,140,species,4a927f13,Korýší
|
||||
10,Pokemon,141,species,4a927f13,Korýší
|
||||
10,Pokemon,144,species,413df12c,Zmražení
|
||||
10,Pokemon,146,species,c4ff3365,Plamenný
|
||||
10,Pokemon,173,species,a62f8434,Hvězdicovitý
|
||||
10,Pokemon,191,species,e4b54c38,Semínkový
|
||||
10,Pokemon,197,species,2227bb25,Měsíční
|
||||
10,Pokemon,200,species,cd7e3dfb,Skřípavý
|
||||
10,Pokemon,209,species,e1dde8d1,diblíci
|
||||
10,Pokemon,210,species,e1dde8d1,diblíci
|
||||
10,Pokemon,243,species,adc59c6c,Bleskový
|
||||
10,Pokemon,261,species,21d49620,Kousavý
|
||||
10,Pokemon,262,species,21d49620,Kousavý
|
||||
10,Pokemon,265,species,1a1f628b,Červí
|
||||
10,Pokemon,266,species,011bd63a,Kuklový
|
||||
10,Pokemon,267,species,4666d1bf,Motýlí
|
||||
10,Pokemon,268,species,011bd63a,Kuklový
|
||||
10,Pokemon,277,species,211da6d8,Polykací
|
||||
10,Pokemon,307,species,d2b08c9e,Meditační
|
||||
10,Pokemon,308,species,d2b08c9e,Meditační
|
||||
10,Pokemon,323,species,36a1520c,Erupční
|
||||
10,Pokemon,325,species,8590f16f,Skákavý
|
||||
10,Pokemon,351,species,836deaf2,Počasí
|
||||
10,Pokemon,385,species,77e3dbf7,Přání
|
||||
10,Pokemon,392,species,c4ff3365,Plamenný
|
||||
10,Pokemon,403,species,6e0f7007,Jiskrový
|
||||
10,Pokemon,404,species,5cd2e029,Jiskrový
|
||||
10,Pokemon,466,species,f6d30876,Bleskový
|
||||
10,Pokemon,523,species,f6d30876,Bleskový
|
||||
10,Pokemon,613,species,eda9f31f,Studený
|
||||
10,Pokemon,614,species,93e0b150,Mrazící
|
||||
10,Pokemon,615,species,22733a94,Krystalizující
|
||||
10,Pokemon,618,species,1ebdd00d,Pasťový
|
||||
10,Pokemon,10013,species,836deaf2,Počasí
|
||||
10,Pokemon,10014,species,836deaf2,Počasí
|
||||
10,Pokemon,10015,species,836deaf2,Počasí
|
||||
10,PokemonSpecies,1,genus,e4b54c38,Semínkový
|
||||
10,PokemonSpecies,2,genus,e4b54c38,Semínkový
|
||||
10,PokemonSpecies,3,genus,e4b54c38,Semínkový
|
||||
10,PokemonSpecies,4,genus,473b2152,Ještěrkovitý
|
||||
10,PokemonSpecies,5,genus,c4ff3365,Plamenný
|
||||
10,PokemonSpecies,6,genus,c4ff3365,Plamenný
|
||||
10,PokemonSpecies,7,genus,a662e558,Malý želví
|
||||
10,PokemonSpecies,8,genus,71b19d1a,Želví
|
||||
10,PokemonSpecies,9,genus,4a927f13,Korýší
|
||||
10,PokemonSpecies,10,genus,1a1f628b,Červí
|
||||
10,PokemonSpecies,11,genus,011bd63a,Kuklový
|
||||
10,PokemonSpecies,12,genus,4666d1bf,Motýlí
|
||||
10,PokemonSpecies,14,genus,011bd63a,Kuklový
|
||||
10,PokemonSpecies,66,genus,55017b02,Supersilný
|
||||
10,PokemonSpecies,67,genus,55017b02,Supersilný
|
||||
10,PokemonSpecies,68,genus,55017b02,Supersilný
|
||||
10,PokemonSpecies,88,genus,63411a53,Kalový
|
||||
10,PokemonSpecies,89,genus,63411a53,Kalový
|
||||
10,PokemonSpecies,96,genus,834b9610,Hypnotický
|
||||
10,PokemonSpecies,97,genus,834b9610,Hypnotický
|
||||
10,PokemonSpecies,111,genus,11201819,Střepinový
|
||||
10,PokemonSpecies,120,genus,a62f8434,Hvězdicovitý
|
||||
10,PokemonSpecies,121,genus,abfc4744,Záhadný
|
||||
10,PokemonSpecies,122,genus,2ef3c334,Bariérový
|
||||
10,PokemonSpecies,132,genus,f543030e,Transformační
|
||||
10,PokemonSpecies,136,genus,c4ff3365,Plamenný
|
||||
10,PokemonSpecies,140,genus,4a927f13,Korýší
|
||||
10,PokemonSpecies,141,genus,4a927f13,Korýší
|
||||
10,PokemonSpecies,146,genus,c4ff3365,Plamenný
|
||||
10,PokemonSpecies,173,genus,a62f8434,Hvězdicovitý
|
||||
10,PokemonSpecies,191,genus,e4b54c38,Semínkový
|
||||
10,PokemonSpecies,197,genus,2227bb25,Měsíční
|
||||
10,PokemonSpecies,200,genus,cd7e3dfb,Skřípavý
|
||||
10,PokemonSpecies,243,genus,adc59c6c,Bleskový
|
||||
10,PokemonSpecies,261,genus,21d49620,Kousavý
|
||||
10,PokemonSpecies,262,genus,21d49620,Kousavý
|
||||
10,PokemonSpecies,265,genus,1a1f628b,Červí
|
||||
10,PokemonSpecies,266,genus,011bd63a,Kuklový
|
||||
10,PokemonSpecies,267,genus,4666d1bf,Motýlí
|
||||
10,PokemonSpecies,268,genus,011bd63a,Kuklový
|
||||
10,PokemonSpecies,277,genus,211da6d8,Polykací
|
||||
10,PokemonSpecies,307,genus,d2b08c9e,Meditační
|
||||
10,PokemonSpecies,308,genus,d2b08c9e,Meditační
|
||||
10,PokemonSpecies,323,genus,36a1520c,Erupční
|
||||
10,PokemonSpecies,325,genus,8590f16f,Skákavý
|
||||
10,PokemonSpecies,392,genus,c4ff3365,Plamenný
|
||||
10,PokemonSpecies,403,genus,6e0f7007,Jiskrový
|
||||
10,PokemonSpecies,404,genus,5cd2e029,Jiskrový
|
||||
10,PokemonSpecies,466,genus,f6d30876,Bleskový
|
||||
10,PokemonSpecies,523,genus,f6d30876,Bleskový
|
||||
10,PokemonSpecies,613,genus,eda9f31f,Studený
|
||||
10,PokemonSpecies,614,genus,93e0b150,Mrazící
|
||||
10,PokemonSpecies,615,genus,22733a94,Krystalizující
|
||||
10,PokemonSpecies,618,genus,1ebdd00d,Pasťový
|
||||
10,PokemonColor,4,name,25cd90d8,Šedá
|
||||
10,PokemonForm,412,name,6ac22276,rostliny
|
||||
10,PokemonForm,413,name,6ac22276,rostliny
|
||||
10,PokemonForm,10077,name,f560b23a,Popálení
|
||||
10,PokemonFormGroup,386,term,c82a81a2,Forma
|
||||
10,PokemonFormGroup,412,term,4d8cf314,Plášť
|
||||
10,PokemonFormGroup,413,term,4d8cf314,Plášť
|
||||
10,PokemonFormGroup,487,term,c82a81a2,Forma
|
||||
10,PokemonFormGroup,492,term,c82a81a2,Forma
|
||||
10,PokemonFormGroup,648,term,c82a81a2,Forma
|
||||
10,PokemonHabitat,1,name,057f6d41,jeskyně
|
||||
10,PokemonHabitat,2,name,a85d53b4,lesy
|
||||
10,PokemonHabitat,3,name,a73fc6cb,lučiny
|
||||
|
|
|
|
@ -154,7 +154,7 @@ class PokedexLinkPattern(markdown.inlinepatterns.Pattern):
|
|||
item=tables.Item,
|
||||
location=tables.Location,
|
||||
move=tables.Move,
|
||||
pokemon=tables.Pokemon,
|
||||
pokemon=tables.PokemonSpecies,
|
||||
type=tables.Type,
|
||||
)[category]
|
||||
except KeyError:
|
||||
|
|
|
@ -141,6 +141,8 @@ def create_translation_table(_table_name, foreign_class, relation_name,
|
|||
if string_getter:
|
||||
def getset_factory(underlying_type, instance):
|
||||
def getter(translations):
|
||||
if translations is None:
|
||||
return None
|
||||
text = getattr(translations, column.name)
|
||||
if text is None:
|
||||
return text
|
||||
|
|
|
@ -409,8 +409,6 @@ class EvolutionChain(TableBase):
|
|||
__tablename__ = 'evolution_chains'
|
||||
id = Column(Integer, primary_key=True, nullable=False,
|
||||
info=dict(description="A numeric ID"))
|
||||
growth_rate_id = Column(Integer, ForeignKey('growth_rates.id'), nullable=False,
|
||||
info=dict(description="ID of the growth rate for this family"))
|
||||
baby_trigger_item_id = Column(Integer, ForeignKey('items.id'), nullable=True,
|
||||
info=dict(description="Item that a parent must hold while breeding to produce a baby"))
|
||||
|
||||
|
@ -1058,88 +1056,28 @@ create_translation_table('pokedex_prose', Pokedex, 'prose',
|
|||
)
|
||||
|
||||
class Pokemon(TableBase):
|
||||
u"""A species of Pokémon. The core to this whole mess.
|
||||
u"""A Pokémon. The core to this whole mess.
|
||||
"""
|
||||
__tablename__ = 'pokemon'
|
||||
__singlename__ = 'pokemon'
|
||||
id = Column(Integer, primary_key=True, nullable=False,
|
||||
info=dict(description=u"A numeric ID"))
|
||||
identifier = Column(Unicode(20), nullable=False,
|
||||
info=dict(description=u"An identifier", format='identifier'))
|
||||
generation_id = Column(Integer, ForeignKey('generations.id'),
|
||||
info=dict(description=u"ID of the generation this species first appeared in"))
|
||||
evolution_chain_id = Column(Integer, ForeignKey('evolution_chains.id'),
|
||||
info=dict(description=u"ID of the species' evolution chain (a.k.a. family)"))
|
||||
evolves_from_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True,
|
||||
info=dict(description=u"The Pokémon species from which this one evolves"))
|
||||
species_id = Column(Integer, ForeignKey('pokemon_species.id'),
|
||||
info=dict(description=u"ID of the species this Pokémon belongs to"))
|
||||
height = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The height of the Pokémon, in decimeters (tenths of a meter)"))
|
||||
weight = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The weight of the Pokémon, in tenths of a kilogram (decigrams)"))
|
||||
color_id = Column(Integer, ForeignKey('pokemon_colors.id'), nullable=False,
|
||||
info=dict(description=u"ID of this Pokémon's Pokédex color, as used for a gimmick search function in the games."))
|
||||
pokemon_shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=False,
|
||||
info=dict(description=u"ID of this Pokémon's body shape, as used for a gimmick search function in the games."))
|
||||
habitat_id = Column(Integer, ForeignKey('pokemon_habitats.id'), nullable=True,
|
||||
info=dict(description=u"ID of this Pokémon's habitat, as used for a gimmick search function in the games."))
|
||||
gender_rate = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The chance of this Pokémon being female, in eighths; or -1 for genderless"))
|
||||
capture_rate = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The base capture rate; up to 255"))
|
||||
base_experience = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The base EXP gained when defeating this Pokémon")) # XXX: Is this correct?
|
||||
base_happiness = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The tameness when caught by a normal ball"))
|
||||
is_baby = Column(Boolean, nullable=False,
|
||||
info=dict(description=u"True iff the Pokémon is a baby, i.e. a lowest-stage Pokémon that cannot breed but whose evolved form can."))
|
||||
hatch_counter = Column(Integer, nullable=False,
|
||||
info=dict(description=u"Initial hatch counter: one must walk 255 × (hatch_counter + 1) steps before this Pokémon's egg hatches, unless utilizing bonuses like Flame Body's"))
|
||||
has_gender_differences = Column(Boolean, nullable=False,
|
||||
info=dict(description=u"Set iff the species exhibits enough sexual dimorphism to have separate sets of sprites in Gen IV and beyond."))
|
||||
order = Column(Integer, nullable=False, index=True,
|
||||
info=dict(description=u"Order for sorting. Almost national order, except families and forms are grouped together."))
|
||||
|
||||
### Stuff to handle alternate Pokémon forms
|
||||
info=dict(description=u"Order for sorting. Almost national order, except families are grouped together."))
|
||||
is_default = Column(Boolean, nullable=False, index=True,
|
||||
info=dict(description=u'Set for exactly one pokemon used as the default for each species.'))
|
||||
|
||||
@property
|
||||
def is_base_form(self):
|
||||
u"""Returns True iff the Pokémon is the base form for its species,
|
||||
e.g. Land Shaymin.
|
||||
"""
|
||||
|
||||
return self.unique_form is None or self.unique_form.is_default
|
||||
|
||||
@property
|
||||
def form_name(self):
|
||||
u"""Returns the Pokémon's form name if it represents a particular form
|
||||
and that form has a name, or None otherwise.
|
||||
"""
|
||||
|
||||
# If self.unique_form is None, the short-circuit "and" will go ahead
|
||||
# and return that. Otherwise, it'll return the form's name, which may
|
||||
# also be None.
|
||||
return self.unique_form and self.unique_form.name
|
||||
|
||||
@property
|
||||
def full_name(self):
|
||||
u"""Returns the Pokémon's name, including its form if applicable."""
|
||||
|
||||
if self.form_name:
|
||||
return u'%s %s' % (self.form_name, self.name)
|
||||
else:
|
||||
return self.name
|
||||
|
||||
@property
|
||||
def normal_form(self):
|
||||
u"""Returns the normal form for this Pokémon; i.e., this will return
|
||||
regular Deoxys when called on any Deoxys form.
|
||||
"""
|
||||
|
||||
if self.unique_form:
|
||||
return self.unique_form.form_base_pokemon
|
||||
return self
|
||||
|
||||
### Not forms!
|
||||
def name(self):
|
||||
return self.default_form.pokemon_name or self.species.name
|
||||
|
||||
def stat(self, stat_name):
|
||||
u"""Returns a PokemonStat record for the given stat name (or Stat row
|
||||
|
@ -1175,19 +1113,6 @@ class Pokemon(TableBase):
|
|||
else:
|
||||
return None
|
||||
|
||||
create_translation_table('pokemon_names', Pokemon, 'names',
|
||||
relation_lazy='joined',
|
||||
name = Column(Unicode(20), nullable=True, index=True,
|
||||
info=dict(description="The name", format='plaintext', official=True, ripped=True)),
|
||||
species = Column(Unicode(16), nullable=True,
|
||||
info=dict(description=u'The short flavor text, such as "Seed" or "Lizard"; usually affixed with the word "Pokémon"',
|
||||
official=True, format='plaintext')),
|
||||
)
|
||||
create_translation_table('pokemon_flavor_summaries', Pokemon, 'flavor_summaries',
|
||||
flavor_summary = Column(Unicode(512), nullable=True,
|
||||
info=dict(description=u"Text containing facts from all flavor texts, for languages without official game translations", official=False, format='plaintext', ripped=True)),
|
||||
)
|
||||
|
||||
class PokemonAbility(TableBase):
|
||||
u"""Maps an ability to a Pokémon that can have it
|
||||
"""
|
||||
|
@ -1221,22 +1146,22 @@ create_translation_table('pokemon_color_names', PokemonColor, 'names',
|
|||
)
|
||||
|
||||
class PokemonDexNumber(TableBase):
|
||||
u"""The number of a Pokémon in a particular Pokédex (e.g. Jigglypuff is #138 in Hoenn's 'dex)
|
||||
u"""The number of a species in a particular Pokédex (e.g. Jigglypuff is #138 in Hoenn's 'dex)
|
||||
"""
|
||||
__tablename__ = 'pokemon_dex_numbers'
|
||||
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the Pokémon"))
|
||||
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the species"))
|
||||
pokedex_id = Column(Integer, ForeignKey('pokedexes.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the Pokédex"))
|
||||
pokedex_number = Column(Integer, nullable=False,
|
||||
info=dict(description=u"Number of the Pokémon in that the Pokédex"))
|
||||
|
||||
class PokemonEggGroup(TableBase):
|
||||
u"""Maps an Egg group to a Pokémon; each Pokémon belongs to one or two egg groups
|
||||
u"""Maps an Egg group to a species; each species belongs to one or two egg groups
|
||||
"""
|
||||
__tablename__ = 'pokemon_egg_groups'
|
||||
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the Pokémon"))
|
||||
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the species"))
|
||||
egg_group_id = Column(Integer, ForeignKey('egg_groups.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the egg group"))
|
||||
|
||||
|
@ -1249,8 +1174,8 @@ class PokemonEvolution(TableBase):
|
|||
__tablename__ = 'pokemon_evolution'
|
||||
id = Column(Integer, primary_key=True, nullable=False,
|
||||
info=dict(description=u"A numeric ID"))
|
||||
evolved_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False,
|
||||
info=dict(description=u"The ID of the post-evolution Pokémon."))
|
||||
evolved_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=False,
|
||||
info=dict(description=u"The ID of the post-evolution species."))
|
||||
evolution_trigger_id = Column(Integer, ForeignKey('evolution_triggers.id'), nullable=False,
|
||||
info=dict(description=u"The ID of the evolution trigger."))
|
||||
trigger_item_id = Column(Integer, ForeignKey('items.id'), nullable=True,
|
||||
|
@ -1273,24 +1198,10 @@ class PokemonEvolution(TableBase):
|
|||
info=dict(description=u"The minimum Beauty value the Pokémon must have."))
|
||||
relative_physical_stats = Column(Integer, nullable=True,
|
||||
info=dict(description=u"The required relation between the Pokémon's Attack and Defense stats, as sgn(atk-def)."))
|
||||
party_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True,
|
||||
info=dict(description=u"The ID of the Pokémon that must be present in the party."))
|
||||
trade_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=True,
|
||||
info=dict(description=u"The ID of the Pokémon for which this Pokémon must be traded."))
|
||||
|
||||
class PokemonFlavorText(TableBase):
|
||||
u"""In-game Pokédex descrption of a Pokémon.
|
||||
"""
|
||||
__tablename__ = 'pokemon_flavor_text'
|
||||
summary_column = Pokemon.flavor_summaries_table, 'flavor_summary'
|
||||
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the Pokémon"))
|
||||
version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the version that has this flavor text"))
|
||||
language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False,
|
||||
info=dict(description="The language"))
|
||||
flavor_text = Column(Unicode(255), nullable=False,
|
||||
info=dict(description=u"The flavor text", official=True, format='gametext'))
|
||||
party_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
|
||||
info=dict(description=u"The ID of the species that must be present in the party."))
|
||||
trade_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
|
||||
info=dict(description=u"The ID of the species for which this one must be traded."))
|
||||
|
||||
class PokemonForm(TableBase):
|
||||
u"""An individual form of a Pokémon.
|
||||
|
@ -1302,63 +1213,29 @@ class PokemonForm(TableBase):
|
|||
__singlename__ = 'pokemon_form'
|
||||
id = Column(Integer, primary_key=True, nullable=False,
|
||||
info=dict(description=u'A unique ID for this form.'))
|
||||
identifier = Column(Unicode(16), nullable=True,
|
||||
info=dict(description=u"An identifier", format='identifier'))
|
||||
form_base_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, autoincrement=False,
|
||||
form_identifier = Column(Unicode(16), nullable=True,
|
||||
info=dict(description=u"An identifier of the form, uniue among a species. May be None for the default form of the species.", format='identifier'))
|
||||
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), nullable=False, autoincrement=False,
|
||||
info=dict(description=u'The ID of the base Pokémon for this form.'))
|
||||
unique_pokemon_id = Column(Integer, ForeignKey('pokemon.id'), autoincrement=False,
|
||||
info=dict(description=u'The ID of a Pokémon that represents specifically this form, for Pokémon with functionally-different forms like Wormadam.'))
|
||||
introduced_in_version_group_id = Column(Integer, ForeignKey('version_groups.id'), autoincrement=False,
|
||||
info=dict(description=u'The ID of the version group in which this form first appeared.'))
|
||||
is_default = Column(Boolean, nullable=False,
|
||||
info=dict(description=u'Set for exactly one form used as the default for each species.'))
|
||||
info=dict(description=u'Set for exactly one form used as the default for each pokemon (not necessarily species).'))
|
||||
is_battle_only = Column(Boolean, nullable=False,
|
||||
info=dict(description=u'Set iff the form can only appear in battle.'))
|
||||
order = Column(Integer, nullable=False, autoincrement=False,
|
||||
info=dict(description=u'The order in which forms should be sorted. Multiple forms may have equal order, in which case they should fall back on sorting by name.'))
|
||||
|
||||
@property
|
||||
def full_name(self):
|
||||
u"""Returns the full name of this form, e.g. "Plant Cloak"."""
|
||||
|
||||
if not self.name:
|
||||
return None
|
||||
elif self.form_group and self.form_group.term:
|
||||
return u'%s %s' % (self.name, self.form_group.term)
|
||||
else:
|
||||
return self.name
|
||||
|
||||
@property
|
||||
def pokemon_name(self):
|
||||
u"""Returns the name of this Pokémon with this form, e.g. "Plant
|
||||
Burmy".
|
||||
"""
|
||||
|
||||
if self.name:
|
||||
return u'%s %s' % (self.name, self.form_base_pokemon.name)
|
||||
else:
|
||||
return self.form_base_pokemon.name
|
||||
def name(self):
|
||||
return self.pokemon_name or self.species.name
|
||||
|
||||
create_translation_table('pokemon_form_names', PokemonForm, 'names',
|
||||
relation_lazy='joined',
|
||||
name = Column(Unicode(16), nullable=False, index=True,
|
||||
info=dict(description="The name", format='plaintext', official=True)),
|
||||
)
|
||||
|
||||
class PokemonFormGroup(TableBase):
|
||||
u"""Information about a Pokémon's forms as a group."""
|
||||
__tablename__ = 'pokemon_form_groups'
|
||||
__singlename__ = 'pokemon_form_group'
|
||||
pokemon_id = Column(Integer, ForeignKey('pokemon.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the base form Pokémon"))
|
||||
is_battle_only = Column(Boolean, nullable=False,
|
||||
info=dict(description=u"Set iff the forms only change in battle"))
|
||||
# FIXME remooove
|
||||
PokemonFormGroup.id = PokemonFormGroup.pokemon_id
|
||||
|
||||
create_translation_table('pokemon_form_group_prose', PokemonFormGroup, 'prose',
|
||||
term = Column(Unicode(16), nullable=True,
|
||||
info=dict(description=u"The term for this Pokémon's forms, e.g. \"Cloak\" for Burmy or \"Forme\" for Deoxys.", official=True, format='plaintext')),
|
||||
description = Column(Unicode(1024), nullable=True,
|
||||
info=dict(description=u"Description of how the forms work", format='markdown', string_getter=markdown.MarkdownString)),
|
||||
form_name = Column(Unicode(32), nullable=True, index=True,
|
||||
info=dict(description=u"The full form name, e.g. 'Sky Forme', for pokémon with different forms", format='plaintext', official=True)),
|
||||
pokemon_name = Column(Unicode(32), nullable=True, index=True,
|
||||
info=dict(description=u"The full pokémon name, e.g. 'Sky Shaymin', for pokémon with different forms", format='plaintext', official=True)),
|
||||
)
|
||||
|
||||
class PokemonFormPokeathlonStat(TableBase):
|
||||
|
@ -1473,6 +1350,75 @@ create_translation_table('pokemon_shape_prose', PokemonShape, 'prose',
|
|||
info=dict(description=u"A splendiferous name of the body shape", format='plaintext')),
|
||||
)
|
||||
|
||||
class PokemonSpecies(TableBase):
|
||||
u"""A Pokémon species: group of Pokémon with the same Pokédex number
|
||||
"""
|
||||
__tablename__ = 'pokemon_species'
|
||||
__singlename__ = 'pokemon_species'
|
||||
id = Column(Integer, primary_key=True, nullable=False,
|
||||
info=dict(description=u"A numeric ID"))
|
||||
identifier = Column(Unicode(20), nullable=False,
|
||||
info=dict(description=u"An identifier", format='identifier'))
|
||||
generation_id = Column(Integer, ForeignKey('generations.id'),
|
||||
info=dict(description=u"ID of the generation this species first appeared in"))
|
||||
evolves_from_species_id = Column(Integer, ForeignKey('pokemon_species.id'), nullable=True,
|
||||
info=dict(description=u"The species from which this one evolves"))
|
||||
evolution_chain_id = Column(Integer, ForeignKey('evolution_chains.id'),
|
||||
info=dict(description=u"ID of the species' evolution chain (a.k.a. family)"))
|
||||
color_id = Column(Integer, ForeignKey('pokemon_colors.id'), nullable=False,
|
||||
info=dict(description=u"ID of this Pokémon's Pokédex color, as used for a gimmick search function in the games."))
|
||||
shape_id = Column(Integer, ForeignKey('pokemon_shapes.id'), nullable=False,
|
||||
info=dict(description=u"ID of this Pokémon's body shape, as used for a gimmick search function in the games."))
|
||||
habitat_id = Column(Integer, ForeignKey('pokemon_habitats.id'), nullable=True,
|
||||
info=dict(description=u"ID of this Pokémon's habitat, as used for a gimmick search function in the games."))
|
||||
gender_rate = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The chance of this Pokémon being female, in eighths; or -1 for genderless"))
|
||||
capture_rate = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The base capture rate; up to 255"))
|
||||
base_happiness = Column(Integer, nullable=False,
|
||||
info=dict(description=u"The tameness when caught by a normal ball"))
|
||||
is_baby = Column(Boolean, nullable=False,
|
||||
info=dict(description=u"True iff the Pokémon is a baby, i.e. a lowest-stage Pokémon that cannot breed but whose evolved form can."))
|
||||
hatch_counter = Column(Integer, nullable=False,
|
||||
info=dict(description=u"Initial hatch counter: one must walk 255 × (hatch_counter + 1) steps before this Pokémon's egg hatches, unless utilizing bonuses like Flame Body's"))
|
||||
has_gender_differences = Column(Boolean, nullable=False,
|
||||
info=dict(description=u"Set iff the species exhibits enough sexual dimorphism to have separate sets of sprites in Gen IV and beyond."))
|
||||
growth_rate_id = Column(Integer, ForeignKey('growth_rates.id'), nullable=False,
|
||||
info=dict(description="ID of the growth rate for this family"))
|
||||
forms_switchable = Column(Boolean, nullable=False,
|
||||
info=dict(description=u"True iff a particular individual of this species can switch beween its different forms."))
|
||||
|
||||
create_translation_table('pokemon_species_names', PokemonSpecies, 'names',
|
||||
relation_lazy='joined',
|
||||
name = Column(Unicode(20), nullable=True, index=True,
|
||||
info=dict(description="The name", format='plaintext', official=True, ripped=True)),
|
||||
genus = Column(Unicode(16), nullable=True,
|
||||
info=dict(description=u'The short flavor text, such as "Seed" or "Lizard"; usually affixed with the word "Pokémon"',
|
||||
official=True, format='plaintext')),
|
||||
)
|
||||
create_translation_table('pokemon_species_flavor_summaries', PokemonSpecies, 'flavor_summaries',
|
||||
flavor_summary = Column(Unicode(512), nullable=True,
|
||||
info=dict(description=u"Text containing facts from all flavor texts, for languages without official game translations", official=False, format='plaintext', ripped=True)),
|
||||
)
|
||||
create_translation_table('pokemon_species_prose', PokemonSpecies, 'prose',
|
||||
form_description = Column(Unicode(1024), nullable=True,
|
||||
info=dict(description=u"Description of how the forms work", format='markdown', string_getter=markdown.MarkdownString)),
|
||||
)
|
||||
|
||||
class PokemonSpeciesFlavorText(TableBase):
|
||||
u"""In-game Pokédex descrption of a Pokémon.
|
||||
"""
|
||||
__tablename__ = 'pokemon_species_flavor_text'
|
||||
summary_column = PokemonSpecies.flavor_summaries_table, 'flavor_summary'
|
||||
species_id = Column(Integer, ForeignKey('pokemon_species.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the Pokémon"))
|
||||
version_id = Column(Integer, ForeignKey('versions.id'), primary_key=True, nullable=False, autoincrement=False,
|
||||
info=dict(description=u"ID of the version that has this flavor text"))
|
||||
language_id = Column(Integer, ForeignKey('languages.id'), primary_key=True, nullable=False,
|
||||
info=dict(description="The language"))
|
||||
flavor_text = Column(Unicode(255), nullable=False,
|
||||
info=dict(description=u"The flavor text", official=True, format='gametext'))
|
||||
|
||||
class PokemonStat(TableBase):
|
||||
u"""A stat value of a Pokémon
|
||||
"""
|
||||
|
@ -1718,9 +1664,6 @@ EncounterSlot.method = relationship(EncounterMethod,
|
|||
EncounterSlot.version_group = relationship(VersionGroup, innerjoin=True)
|
||||
|
||||
|
||||
EvolutionChain.growth_rate = relationship(GrowthRate,
|
||||
innerjoin=True,
|
||||
backref='evolution_chains')
|
||||
EvolutionChain.baby_trigger_item = relationship(Item,
|
||||
backref='evolution_chains')
|
||||
|
||||
|
@ -1963,68 +1906,28 @@ Pokemon.dream_ability = relationship(Ability,
|
|||
order_by=Pokemon.order,
|
||||
),
|
||||
)
|
||||
Pokemon.pokemon_color = relationship(PokemonColor,
|
||||
innerjoin=True,
|
||||
backref='pokemon')
|
||||
Pokemon.color = association_proxy('pokemon_color', 'name')
|
||||
Pokemon.dex_numbers = relationship(PokemonDexNumber,
|
||||
innerjoin=True,
|
||||
order_by=PokemonDexNumber.pokedex_id.asc(),
|
||||
backref='pokemon')
|
||||
Pokemon.egg_groups = relationship(EggGroup,
|
||||
secondary=PokemonEggGroup.__table__,
|
||||
innerjoin=True,
|
||||
order_by=PokemonEggGroup.egg_group_id.asc(),
|
||||
backref=backref('pokemon', order_by=Pokemon.order.asc()))
|
||||
Pokemon.evolution_chain = relationship(EvolutionChain,
|
||||
innerjoin=True,
|
||||
backref=backref('pokemon', order_by=Pokemon.order.asc()))
|
||||
Pokemon.parent_pokemon = relationship(Pokemon,
|
||||
primaryjoin=Pokemon.evolves_from_pokemon_id==Pokemon.id,
|
||||
remote_side=[Pokemon.id],
|
||||
backref='child_pokemon')
|
||||
Pokemon.evolutions = relationship(PokemonEvolution,
|
||||
primaryjoin=Pokemon.id==PokemonEvolution.evolved_pokemon_id,
|
||||
backref=backref('evolved_pokemon', innerjoin=True, lazy='joined'))
|
||||
Pokemon.flavor_text = relationship(PokemonFlavorText,
|
||||
order_by=PokemonFlavorText.version_id.asc(),
|
||||
backref='pokemon')
|
||||
Pokemon.forms = relationship(PokemonForm,
|
||||
primaryjoin=Pokemon.id==PokemonForm.form_base_pokemon_id,
|
||||
order_by=(PokemonForm.order.asc(), PokemonForm.identifier.asc()))
|
||||
primaryjoin=Pokemon.id==PokemonForm.pokemon_id,
|
||||
order_by=(PokemonForm.order.asc(), PokemonForm.form_identifier.asc()))
|
||||
Pokemon.default_form = relationship(PokemonForm,
|
||||
primaryjoin=and_(
|
||||
Pokemon.id==PokemonForm.form_base_pokemon_id,
|
||||
Pokemon.id==PokemonForm.pokemon_id,
|
||||
PokemonForm.is_default==True),
|
||||
uselist=False)
|
||||
Pokemon.pokemon_habitat = relationship(PokemonHabitat,
|
||||
backref='pokemon')
|
||||
Pokemon.habitat = association_proxy('pokemon_habitat', 'name')
|
||||
uselist=False, lazy='joined')
|
||||
Pokemon.items = relationship(PokemonItem,
|
||||
backref='pokemon')
|
||||
Pokemon.generation = relationship(Generation,
|
||||
innerjoin=True,
|
||||
backref='pokemon')
|
||||
Pokemon.shape = relationship(PokemonShape,
|
||||
innerjoin=True,
|
||||
backref='pokemon')
|
||||
Pokemon.stats = relationship(PokemonStat,
|
||||
innerjoin=True,
|
||||
order_by=PokemonStat.stat_id.asc(),
|
||||
backref='pokemon')
|
||||
Pokemon.species = relationship(PokemonSpecies,
|
||||
innerjoin=True,
|
||||
backref='pokemon')
|
||||
Pokemon.types = relationship(Type,
|
||||
secondary=PokemonType.__table__,
|
||||
innerjoin=True,
|
||||
innerjoin=True, lazy='joined',
|
||||
order_by=PokemonType.slot.asc(),
|
||||
backref=backref('pokemon', order_by=Pokemon.order))
|
||||
Pokemon.form = relationship(PokemonForm,
|
||||
primaryjoin=or_(
|
||||
PokemonForm.unique_pokemon_id==Pokemon.id,
|
||||
and_(PokemonForm.unique_pokemon_id==None,
|
||||
PokemonForm.form_base_pokemon_id==Pokemon.id,
|
||||
PokemonForm.is_default==True)
|
||||
),
|
||||
uselist=False)
|
||||
|
||||
PokemonDexNumber.pokedex = relationship(Pokedex,
|
||||
innerjoin=True, lazy='joined')
|
||||
|
@ -2042,38 +1945,22 @@ PokemonEvolution.location = relationship(Location,
|
|||
backref='triggered_evolutions')
|
||||
PokemonEvolution.known_move = relationship(Move,
|
||||
backref='triggered_evolutions')
|
||||
PokemonEvolution.party_pokemon = relationship(Pokemon,
|
||||
primaryjoin=PokemonEvolution.party_pokemon_id==Pokemon.id,
|
||||
PokemonEvolution.party_species = relationship(PokemonSpecies,
|
||||
primaryjoin=PokemonEvolution.party_species_id==PokemonSpecies.id,
|
||||
backref='triggered_evolutions')
|
||||
PokemonEvolution.trade_pokemon = relationship(Pokemon,
|
||||
primaryjoin=PokemonEvolution.trade_pokemon_id==Pokemon.id)
|
||||
PokemonEvolution.trade_species = relationship(PokemonSpecies,
|
||||
primaryjoin=PokemonEvolution.trade_species_id==PokemonSpecies.id)
|
||||
|
||||
PokemonFlavorText.version = relationship(Version, innerjoin=True, lazy='joined')
|
||||
PokemonFlavorText.language = relationship(Language, innerjoin=True, lazy='joined')
|
||||
|
||||
PokemonForm.form_base_pokemon = relationship(Pokemon,
|
||||
primaryjoin=PokemonForm.form_base_pokemon_id==Pokemon.id,
|
||||
innerjoin=True)
|
||||
PokemonForm.unique_pokemon = relationship(Pokemon,
|
||||
primaryjoin=PokemonForm.unique_pokemon_id==Pokemon.id,
|
||||
backref=backref('unique_form', uselist=False))
|
||||
PokemonForm.pokemon = relationship(Pokemon,
|
||||
primaryjoin=or_(
|
||||
PokemonForm.unique_pokemon_id==Pokemon.id,
|
||||
and_(PokemonForm.unique_pokemon_id==None,
|
||||
PokemonForm.form_base_pokemon_id==Pokemon.id)
|
||||
), uselist=False)
|
||||
primaryjoin=PokemonForm.pokemon_id==Pokemon.id,
|
||||
innerjoin=True, lazy='joined')
|
||||
PokemonForm.species = association_proxy('pokemon', 'species')
|
||||
PokemonForm.version_group = relationship(VersionGroup,
|
||||
innerjoin=True)
|
||||
PokemonForm.form_group = association_proxy('form_base_pokemon', 'form_group')
|
||||
PokemonForm.pokeathlon_stats = relationship(PokemonFormPokeathlonStat,
|
||||
order_by=PokemonFormPokeathlonStat.pokeathlon_stat_id,
|
||||
backref='pokemon_form')
|
||||
|
||||
PokemonFormGroup.pokemon = relationship(Pokemon,
|
||||
innerjoin=True,
|
||||
backref=backref('form_group', uselist=False))
|
||||
|
||||
PokemonFormPokeathlonStat.pokeathlon_stat = relationship(PokeathlonStat,
|
||||
innerjoin=True, lazy='joined')
|
||||
|
||||
|
@ -2104,6 +1991,62 @@ PokemonMove.method = relationship(PokemonMoveMethod,
|
|||
PokemonStat.stat = relationship(Stat,
|
||||
innerjoin=True, lazy='joined')
|
||||
|
||||
PokemonSpecies.parent_species = relationship(PokemonSpecies,
|
||||
primaryjoin=PokemonSpecies.evolves_from_species_id==PokemonSpecies.id,
|
||||
remote_side=[PokemonSpecies.id],
|
||||
backref='child_species')
|
||||
PokemonSpecies.evolutions = relationship(PokemonEvolution,
|
||||
primaryjoin=PokemonSpecies.id==PokemonEvolution.evolved_species_id,
|
||||
backref=backref('evolved_species', innerjoin=True, lazy='joined'))
|
||||
PokemonSpecies.flavor_text = relationship(PokemonSpeciesFlavorText,
|
||||
order_by=PokemonSpeciesFlavorText.version_id.asc(),
|
||||
backref='species')
|
||||
PokemonSpecies.growth_rate = relationship(GrowthRate,
|
||||
innerjoin=True,
|
||||
backref='evolution_chains')
|
||||
PokemonSpecies.habitat = relationship(PokemonHabitat,
|
||||
backref='species')
|
||||
PokemonSpecies.color = relationship(PokemonColor,
|
||||
innerjoin=True,
|
||||
backref='species')
|
||||
PokemonSpecies.egg_groups = relationship(EggGroup,
|
||||
secondary=PokemonEggGroup.__table__,
|
||||
innerjoin=True,
|
||||
order_by=PokemonEggGroup.egg_group_id.asc(),
|
||||
backref=backref('species', order_by=Pokemon.order.asc()))
|
||||
PokemonSpecies.forms = relationship(PokemonForm,
|
||||
secondary=Pokemon.__table__,
|
||||
primaryjoin=PokemonSpecies.id==Pokemon.species_id,
|
||||
secondaryjoin=Pokemon.id==PokemonForm.pokemon_id,
|
||||
order_by=(PokemonForm.order.asc(), PokemonForm.form_identifier.asc()))
|
||||
PokemonSpecies.default_form = relationship(PokemonForm,
|
||||
secondary=Pokemon.__table__,
|
||||
primaryjoin=and_(PokemonSpecies.id==Pokemon.species_id,
|
||||
Pokemon.is_default==True),
|
||||
secondaryjoin=and_(Pokemon.id==PokemonForm.pokemon_id,
|
||||
PokemonForm.is_default==True),
|
||||
uselist=False)
|
||||
PokemonSpecies.default_pokemon = relationship(Pokemon,
|
||||
primaryjoin=and_(
|
||||
PokemonSpecies.id==Pokemon.species_id,
|
||||
Pokemon.is_default==True),
|
||||
uselist=False, lazy='joined')
|
||||
PokemonSpecies.evolution_chain = relationship(EvolutionChain,
|
||||
innerjoin=True,
|
||||
backref=backref('species', order_by=PokemonSpecies.id.asc()))
|
||||
PokemonSpecies.dex_numbers = relationship(PokemonDexNumber,
|
||||
innerjoin=True,
|
||||
order_by=PokemonDexNumber.pokedex_id.asc(),
|
||||
backref='species')
|
||||
PokemonSpecies.generation = relationship(Generation,
|
||||
innerjoin=True,
|
||||
backref='species')
|
||||
PokemonSpecies.shape = relationship(PokemonShape,
|
||||
innerjoin=True,
|
||||
backref='species')
|
||||
|
||||
PokemonSpeciesFlavorText.version = relationship(Version, innerjoin=True, lazy='joined')
|
||||
PokemonSpeciesFlavorText.language = relationship(Language, innerjoin=True, lazy='joined')
|
||||
|
||||
Region.generation = relationship(Generation, uselist=False)
|
||||
Region.version_group_regions = relationship(VersionGroupRegion,
|
||||
|
|
|
@ -7,13 +7,13 @@ of pokemon, and filtering/ordering by name.
|
|||
from sqlalchemy.orm import aliased
|
||||
from sqlalchemy.sql.expression import func
|
||||
from sqlalchemy.sql.functions import coalesce
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
|
||||
from pokedex.db import tables
|
||||
|
||||
### Getter
|
||||
|
||||
def get(session, table, identifier=None, name=None, id=None,
|
||||
form_identifier=None, form_name=None, language=None, is_pokemon=None):
|
||||
def get(session, table, identifier=None, name=None, id=None, language=None):
|
||||
"""Get one object from the database.
|
||||
|
||||
session: The session to use (from pokedex.db.connect())
|
||||
|
@ -22,26 +22,16 @@ def get(session, table, identifier=None, name=None, id=None,
|
|||
identifier: Identifier of the object
|
||||
name: The name of the object
|
||||
id: The ID number of the object
|
||||
form_identifier: For pokemon, identifier of the form
|
||||
form_name: For pokemon, name of the form
|
||||
|
||||
language: A Language to use for name and form_name
|
||||
is_pokemon: If true, specifies that the table should be treated as a
|
||||
pokemon table (handling forms specially). If None and table is the
|
||||
(unaliased) Pokemon, it is set to True. Otherwise, the pokemon forms
|
||||
aren't handled.
|
||||
|
||||
All conditions must match, so it's not a good idea to specify more than one
|
||||
of identifier/name/id at once.
|
||||
|
||||
If zero or more than one objects matching the criteria are found, the
|
||||
appropriate SQLAlchemy exception is raised.
|
||||
Exception: for pokemon, selects the form base unless form_* is given.
|
||||
"""
|
||||
|
||||
if is_pokemon is None:
|
||||
is_pokemon = (table is tables.Pokemon)
|
||||
|
||||
query = session.query(table)
|
||||
|
||||
if identifier is not None:
|
||||
|
@ -51,54 +41,42 @@ def get(session, table, identifier=None, name=None, id=None,
|
|||
query = filter_name(query, table, name, language)
|
||||
|
||||
if id is not None:
|
||||
query = query.filter_by(id=id)
|
||||
|
||||
if form_identifier is not None or form_name is not None:
|
||||
if is_pokemon:
|
||||
query = query.join(table.unique_form)
|
||||
if form_identifier is not None:
|
||||
query = query.filter(tables.PokemonForm.identifier ==
|
||||
form_identifier)
|
||||
if form_name is not None:
|
||||
query = filter_name(query, table, form_name, language)
|
||||
# ASSUMPTION: id is the primary key of the table.
|
||||
result = query.get(id)
|
||||
if result is None:
|
||||
# Keep the API
|
||||
raise NoResultFound
|
||||
else:
|
||||
raise ValueError(
|
||||
"form_identifier and form_name only make sense for pokemon")
|
||||
elif is_pokemon:
|
||||
query = filter_base_forms(query)
|
||||
return result
|
||||
|
||||
return query.one()
|
||||
|
||||
### Helpers
|
||||
|
||||
def filter_name(query, table, name, language):
|
||||
def filter_name(query, table, name, language, name_attribute='name'):
|
||||
"""Filter a query by name, return the resulting query
|
||||
|
||||
query: The query to filter
|
||||
table: The table of named objects
|
||||
name: The name to look for. May be a tuple of alternatives.
|
||||
language: The language for "name", or None for the session default
|
||||
name_attribute: the attribute to use; defaults to 'name'
|
||||
"""
|
||||
if language is None:
|
||||
query = query.filter(table.name == name)
|
||||
query = query.filter(getattr(table, name_attribute) == name)
|
||||
else:
|
||||
names_table = table.names_table
|
||||
name_column = getattr(names_table, name_attribute)
|
||||
query = query.join(names_table)
|
||||
query = query.filter(names_table.foreign_id == table.id)
|
||||
query = query.filter(names_table.local_language_id == language.id)
|
||||
if isinstance(name, tuple):
|
||||
query = query.filter(names_table.name in name)
|
||||
query = query.filter(name_column in name)
|
||||
else:
|
||||
query = query.filter(names_table.name == name)
|
||||
query = query.filter(name_column == name)
|
||||
return query
|
||||
|
||||
def filter_base_forms(query):
|
||||
"""Filter only base forms of pokemon, and return the resulting query
|
||||
"""
|
||||
query = query.filter(tables.Pokemon.forms.any())
|
||||
return query
|
||||
|
||||
def order_by_name(query, table, language=None, *extra_languages):
|
||||
def order_by_name(query, table, language=None, *extra_languages, **kwargs):
|
||||
"""Order a query by name.
|
||||
|
||||
query: The query to order
|
||||
|
@ -108,12 +86,17 @@ def order_by_name(query, table, language=None, *extra_languages):
|
|||
extra_languages: Extra languages to order by, should the translations for
|
||||
`language` be incomplete (or ambiguous).
|
||||
|
||||
name_attribute (keyword argument): the attribute to use; defaults to 'name'
|
||||
|
||||
Uses the identifier as a fallback ordering.
|
||||
"""
|
||||
name_attribute = kwargs.pop('name', 'name')
|
||||
if kwargs:
|
||||
raise ValueError('Unexpected keyword arguments: %s' % kwargs.keys())
|
||||
order_columns = []
|
||||
if language is None:
|
||||
query = query.outerjoin(table.names_local)
|
||||
order_columns.append(func.lower(table.names_table.name))
|
||||
order_columns.append(func.lower(getattr(table.names_table, name_attribute)))
|
||||
else:
|
||||
extra_languages = (language, ) + extra_languages
|
||||
for language in extra_languages:
|
||||
|
@ -121,7 +104,7 @@ def order_by_name(query, table, language=None, *extra_languages):
|
|||
query = query.outerjoin(names_table)
|
||||
query = query.filter(names_table.foreign_id == table.id)
|
||||
query = query.filter(names_table.local_language_id == language.id)
|
||||
order_columns.append(func.lower(names_table.name))
|
||||
order_columns.append(func.lower(getattr(names_table, name_attribute)))
|
||||
order_columns.append(table.identifier)
|
||||
query = query.order_by(coalesce(*order_columns))
|
||||
return query
|
||||
|
|
|
@ -103,7 +103,7 @@ class PokedexLookup(object):
|
|||
tables.Location,
|
||||
tables.Move,
|
||||
tables.Nature,
|
||||
tables.Pokemon,
|
||||
tables.PokemonSpecies,
|
||||
tables.PokemonForm,
|
||||
tables.Type,
|
||||
)
|
||||
|
@ -193,7 +193,7 @@ class PokedexLookup(object):
|
|||
# Index every name in all our tables of interest
|
||||
speller_entries = set()
|
||||
for cls in self.indexed_tables.values():
|
||||
q = self.session.query(cls)
|
||||
q = self.session.query(cls).order_by(cls.id)
|
||||
|
||||
for row in q.yield_per(5):
|
||||
row_key = dict(table=unicode(cls.__tablename__),
|
||||
|
@ -211,21 +211,17 @@ class PokedexLookup(object):
|
|||
speller_entries.add(normalized_name)
|
||||
|
||||
|
||||
# Add the basic English name to the index
|
||||
if cls == tables.Pokemon:
|
||||
# Don't re-add alternate forms of the same Pokémon; they'll
|
||||
# be added as Pokémon forms instead
|
||||
if not row.is_base_form:
|
||||
continue
|
||||
elif cls == tables.PokemonForm:
|
||||
if row.name:
|
||||
add(row.pokemon_name, None, u'en', u'us')
|
||||
continue
|
||||
if cls == tables.PokemonForm:
|
||||
name_map = 'pokemon_name_map'
|
||||
else:
|
||||
name_map = 'name_map'
|
||||
|
||||
# Some things also have other languages' names
|
||||
# XXX other language form names..?
|
||||
seen = set()
|
||||
for language, name in getattr(row, 'name_map', {}).items():
|
||||
seen = set([None])
|
||||
for language, name in sorted(getattr(row, name_map, {}).items(),
|
||||
# Sort English first for now
|
||||
key=lambda (l, n): (l.identifier != 'en', not l.official)):
|
||||
if not name:
|
||||
continue
|
||||
if name in seen:
|
||||
# Don't add the name again as a different
|
||||
# language; no point and it makes spell results
|
||||
|
@ -301,6 +297,11 @@ class PokedexLookup(object):
|
|||
prefix = prefix.strip()
|
||||
if prefix:
|
||||
user_valid_types.append(prefix)
|
||||
if prefix == 'pokemon':
|
||||
# When the user says 'pokemon', they really meant both
|
||||
# species & form.
|
||||
user_valid_types.append('pokemon_species')
|
||||
user_valid_types.append('pokemon_form')
|
||||
|
||||
# Merge the valid types together. Only types that appear in BOTH lists
|
||||
# may be used.
|
||||
|
@ -413,9 +414,6 @@ class PokedexLookup(object):
|
|||
This function currently ONLY does fuzzy matching if there are no exact
|
||||
matches.
|
||||
|
||||
Formes are not returned unless requested; "Shaymin" will return only
|
||||
grass Shaymin.
|
||||
|
||||
Extraneous whitespace is removed with extreme prejudice.
|
||||
|
||||
Recognizes:
|
||||
|
@ -430,7 +428,6 @@ class PokedexLookup(object):
|
|||
- Language restrictions. "@fr:charge" will only return Tackle, which
|
||||
is called "Charge" in French. These can be combined with type
|
||||
restrictions, e.g., "@fr,move:charge".
|
||||
- Alternate formes can be specified merely like "wash rotom".
|
||||
|
||||
`input`
|
||||
Name of the thing to look for.
|
||||
|
@ -448,7 +445,6 @@ class PokedexLookup(object):
|
|||
|
||||
name = self.normalize_name(input)
|
||||
exact = True
|
||||
form = None
|
||||
|
||||
# Pop off any type prefix and merge with valid_types
|
||||
name, merged_valid_types, type_term = \
|
||||
|
|
|
@ -1,6 +1,45 @@
|
|||
def setup():
|
||||
# XXX This needs to recreate the database, someday. :(
|
||||
pass
|
||||
|
||||
def teardown():
|
||||
pass
|
||||
import inspect
|
||||
from functools import wraps
|
||||
|
||||
# test support code
|
||||
def params(funcarglist):
|
||||
"""Basic list-of-dicts test parametrization
|
||||
|
||||
From: http://pytest.org/funcargs.html
|
||||
|
||||
Example:
|
||||
@params([dict(a=1, b=2), dict(a=3, b=4)])
|
||||
def test_lt(a, b):
|
||||
assert a < b
|
||||
"""
|
||||
def decorator(function):
|
||||
function.funcarglist = funcarglist
|
||||
return function
|
||||
return decorator
|
||||
|
||||
def positional_params(*paramlist):
|
||||
"""Magic list-of-lists parametrization
|
||||
|
||||
Example:
|
||||
@params([(1, 2), (3, 4)])
|
||||
def test_lt(a, b):
|
||||
assert a < b
|
||||
"""
|
||||
def decorator(function):
|
||||
function.posarglist = paramlist
|
||||
return function
|
||||
return decorator
|
||||
|
||||
def single_params(*paramlist):
|
||||
"""Magic list-of-lists parametrization
|
||||
|
||||
Example:
|
||||
@params('1', '2', '3', '4'])
|
||||
def test_int(k):
|
||||
assert int(k)
|
||||
"""
|
||||
def decorator(function):
|
||||
function.posarglist = [[param] for param in paramlist]
|
||||
return function
|
||||
return decorator
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
from nose.tools import *
|
||||
import unittest
|
||||
|
||||
import pytest
|
||||
|
||||
from sqlalchemy.orm import aliased
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
|
||||
|
@ -21,8 +22,8 @@ def test_encounter_slots():
|
|||
.join((version_group_b, tables.Version.version_group)) \
|
||||
.filter(version_group_a.id != version_group_b.id)
|
||||
|
||||
assert_equal(sanity_q.count(), 0,
|
||||
"Encounter slots all match the encounters they belong to")
|
||||
# Encounter slots all match the encounters they belong to
|
||||
assert sanity_q.count() == 0
|
||||
|
||||
def test_nonzero_autoincrement_ids():
|
||||
"""Check that autoincrementing ids don't contain zeroes
|
||||
|
@ -34,8 +35,8 @@ def test_nonzero_autoincrement_ids():
|
|||
for cls in tables.mapped_classes:
|
||||
if 'id' in cls.__table__.c:
|
||||
if cls.__table__.c.id.autoincrement:
|
||||
@raises(NoResultFound)
|
||||
def nonzero_id(cls):
|
||||
util.get(session, cls, id=0)
|
||||
with pytest.raises(NoResultFound):
|
||||
util.get(session, cls, id=0)
|
||||
nonzero_id.description = "No zero id in %s" % cls.__name__
|
||||
yield nonzero_id, cls
|
||||
|
|
|
@ -1,104 +1,91 @@
|
|||
# encoding: utf8
|
||||
from nose.tools import *
|
||||
import unittest
|
||||
# Encoding: UTF-8
|
||||
|
||||
from pokedex.tests import *
|
||||
|
||||
from pokedex.lookup import PokedexLookup
|
||||
|
||||
lookup = None
|
||||
lookup = PokedexLookup()
|
||||
|
||||
def setup():
|
||||
# Recreate data
|
||||
global lookup
|
||||
lookup = PokedexLookup()
|
||||
|
||||
def test_exact_lookup():
|
||||
tests = [
|
||||
@positional_params(
|
||||
# Simple lookups
|
||||
(u'Eevee', 'pokemon', 133),
|
||||
(u'Eevee', 'pokemon_species',133),
|
||||
(u'Scratch', 'moves', 10),
|
||||
(u'Master Ball', 'items', 1),
|
||||
(u'normal', 'types', 1),
|
||||
(u'Run Away', 'abilities', 50),
|
||||
|
||||
# Funny characters
|
||||
(u'Mr. Mime', 'pokemon', 122),
|
||||
(u"Farfetch'd", 'pokemon', 83),
|
||||
(u'Poké Ball', 'items', 4),
|
||||
(u'Mr. Mime', 'pokemon_species', 122),
|
||||
(u"Farfetch'd", 'pokemon_species', 83),
|
||||
(u'Poké Ball', 'items', 4),
|
||||
|
||||
# Forms
|
||||
(u'Rotom', 'pokemon', 479),
|
||||
(u'Wash Rotom', 'pokemon_forms',10059),
|
||||
(u'East Shellos', 'pokemon_forms',10039),
|
||||
(u'Rotom', 'pokemon_species', 479),
|
||||
(u'Wash Rotom', 'pokemon_forms', 708),
|
||||
(u'East Shellos', 'pokemon_forms', 688),
|
||||
|
||||
# Other languages
|
||||
(u'イーブイ', 'pokemon', 133),
|
||||
(u'Iibui', 'pokemon', 133),
|
||||
(u'Eievui', 'pokemon', 133),
|
||||
(u'이브이', 'pokemon', 133),
|
||||
(u'伊布', 'pokemon', 133),
|
||||
(u'Evoli', 'pokemon', 133),
|
||||
]
|
||||
(u'イーブイ', 'pokemon_species', 133),
|
||||
(u'Iibui', 'pokemon_species', 133),
|
||||
(u'Eievui', 'pokemon_species', 133),
|
||||
(u'이브이', 'pokemon_species', 133),
|
||||
(u'伊布', 'pokemon_species', 133),
|
||||
(u'Evoli', 'pokemon_species', 133),
|
||||
)
|
||||
def test_exact_lookup(input, table, id):
|
||||
results = lookup.lookup(input)
|
||||
assert len(results) == 1
|
||||
assert results[0].exact == True
|
||||
|
||||
for input, table, id in tests:
|
||||
results = lookup.lookup(input)
|
||||
assert_equal(len(results), 1, u"'%s' returns one result" % input)
|
||||
assert_equal(results[0].exact, True, u"'%s' match exactly" % input)
|
||||
|
||||
row = results[0].object
|
||||
assert_equal(row.__tablename__, table, u"'%s' is in the right table" % input)
|
||||
assert_equal(row.id, id, u"'%s' returns the right id" % input)
|
||||
row = results[0].object
|
||||
assert row.__tablename__ == table
|
||||
assert row.id == id
|
||||
|
||||
|
||||
def test_id_lookup():
|
||||
results = lookup.lookup(u'1')
|
||||
assert_true(len(results) >= 5, u'At least five things have id 1')
|
||||
assert_true(all(_.object.id == 1 for _ in results),
|
||||
u'All results have id 1')
|
||||
assert len(results) >= 5
|
||||
assert all(result.object.id == 1 for result in results)
|
||||
|
||||
|
||||
def test_multi_lookup():
|
||||
results = lookup.lookup(u'Metronome')
|
||||
assert_equal(len(results), 2, u'Two things called "Metronome"')
|
||||
assert_true(results[0].exact, u'Metronome matches are exact')
|
||||
assert len(results) == 2
|
||||
assert results[0].exact
|
||||
|
||||
|
||||
def test_type_lookup():
|
||||
results = lookup.lookup(u'pokemon:1')
|
||||
assert_equal(results[0].object.__tablename__, 'pokemon',
|
||||
u'Type restriction works correctly')
|
||||
assert_equal(len(results), 1, u'Only one id result when type is specified')
|
||||
assert_equal(results[0].object.name, u'Bulbasaur',
|
||||
u'Type + id returns the right result')
|
||||
assert results[0].object.__tablename__ == 'pokemon_species'
|
||||
assert len(results) == 1
|
||||
assert results[0].object.name == u'Bulbasaur'
|
||||
|
||||
results = lookup.lookup(u'1', valid_types=['pokemon_species'])
|
||||
assert results[0].object.name == u'Bulbasaur'
|
||||
|
||||
results = lookup.lookup(u'1', valid_types=['pokemon'])
|
||||
assert_equal(results[0].object.name, u'Bulbasaur',
|
||||
u'valid_types works as well as type: prefix')
|
||||
|
||||
def test_language_lookup():
|
||||
# There are two objects named "charge": the move Charge, and the move
|
||||
# Tackle, which is called "Charge" in French.
|
||||
results = lookup.lookup(u'charge')
|
||||
assert_true(len(results) > 1, u'There are multiple "charge"s')
|
||||
assert len(results) > 1
|
||||
|
||||
results = lookup.lookup(u'@fr:charge')
|
||||
assert_equal(results[0].iso639, u'fr', u'Language restriction works correctly')
|
||||
assert_equal(len(results), 1, u'Only one "charge" result when language is specified')
|
||||
assert_equal(results[0].object.name, u'Tackle',
|
||||
u'Language + vague name returns the right result')
|
||||
assert results[0].iso639 == u'fr'
|
||||
assert len(results) == 1
|
||||
assert results[0].object.name == u'Tackle'
|
||||
|
||||
results = lookup.lookup(u'charge', valid_types=['@fr'])
|
||||
assert_equal(results[0].object.name, u'Tackle',
|
||||
u'valid_types works as well as @lang: prefix')
|
||||
assert results[0].object.name == u'Tackle'
|
||||
|
||||
results = lookup.lookup(u'@fr,move:charge')
|
||||
assert_equal(results[0].object.name, u'Tackle',
|
||||
u'Languages and types both work together')
|
||||
assert results[0].object.name == u'Tackle'
|
||||
|
||||
results = lookup.lookup(u'@fr:charge', valid_types=['move'])
|
||||
assert_equal(results[0].object.name, u'Tackle',
|
||||
u'valid_types and language prefixes get along')
|
||||
assert results[0].object.name, u'Tackle'
|
||||
|
||||
def test_fuzzy_lookup():
|
||||
tests = [
|
||||
|
||||
@positional_params(
|
||||
# Regular English names
|
||||
(u'chamander', u'Charmander'),
|
||||
(u'pokeball', u'Poké Ball'),
|
||||
|
@ -110,44 +97,51 @@ def test_fuzzy_lookup():
|
|||
# Sufficiently long foreign names
|
||||
(u'カクレオ', u'Kecleon'),
|
||||
(u'Yamikrasu', u'Murkrow'),
|
||||
]
|
||||
)
|
||||
def test_fuzzy_lookup(misspelling, name):
|
||||
results = lookup.lookup(misspelling)
|
||||
first_result = results[0]
|
||||
assert first_result.object.name == name
|
||||
|
||||
for misspelling, name in tests:
|
||||
results = lookup.lookup(misspelling)
|
||||
first_result = results[0]
|
||||
assert_equal(first_result.object.name, name,
|
||||
u'Simple misspellings are corrected')
|
||||
|
||||
def test_nidoran():
|
||||
results = lookup.lookup(u'Nidoran')
|
||||
top_names = [_.object.name for _ in results[0:2]]
|
||||
assert_true(u'Nidoran♂' in top_names, u'Nidoran♂ is a top result for "Nidoran"')
|
||||
assert_true(u'Nidoran♀' in top_names, u'Nidoran♀ is a top result for "Nidoran"')
|
||||
top_names = [result.object.name for result in results[0:2]]
|
||||
assert u'Nidoran♂' in top_names
|
||||
assert u'Nidoran♀' in top_names
|
||||
|
||||
def test_wildcard_lookup():
|
||||
tests = [
|
||||
|
||||
@positional_params(
|
||||
(u'pokemon:*meleon', u'Charmeleon'),
|
||||
(u'item:master*', u'Master Ball'),
|
||||
(u'ee?ee', u'Eevee'),
|
||||
]
|
||||
)
|
||||
def test_wildcard_lookup(wildcard, name):
|
||||
results = lookup.lookup(wildcard)
|
||||
first_result = results[0]
|
||||
assert first_result.object.name == name
|
||||
|
||||
for wildcard, name in tests:
|
||||
results = lookup.lookup(wildcard)
|
||||
first_result = results[0]
|
||||
assert_equal(first_result.object.name, name,
|
||||
u'Wildcards work correctly')
|
||||
|
||||
def test_random_lookup():
|
||||
for _ in xrange(5):
|
||||
def test_bare_random():
|
||||
for i in range(5):
|
||||
results = lookup.lookup(u'random')
|
||||
assert_equal(len(results), 1, u'Random returns one result')
|
||||
assert len(results) == 1
|
||||
|
||||
|
||||
@positional_params(
|
||||
[u'pokemon_species'],
|
||||
[u'moves'],
|
||||
[u'items'],
|
||||
[u'abilities'],
|
||||
[u'types'],
|
||||
)
|
||||
def test_qualified_random(table_name):
|
||||
results = lookup.lookup(u'random', valid_types=[table_name])
|
||||
assert len(results) == 1
|
||||
assert results[0].object.__tablename__ == table_name
|
||||
|
||||
for table_name in [u'pokemon', u'moves', u'items', u'abilities', u'types']:
|
||||
results = lookup.lookup(u'random', valid_types=[table_name])
|
||||
assert_equal(len(results), 1, u'Constrained random returns one result')
|
||||
assert_equal(results[0].object.__tablename__, table_name,
|
||||
u'Constrained random returns result from the right table')
|
||||
|
||||
def test_crash_empty_prefix():
|
||||
"""Searching for ':foo' used to crash, augh!"""
|
||||
results = lookup.lookup(u':Eevee')
|
||||
assert_equal(results[0].object.name, u'Eevee', u'Empty prefix dun crash')
|
||||
assert results[0].object.name == u'Eevee'
|
||||
|
|
|
@ -1,4 +1,3 @@
|
|||
|
||||
"""Test the media accessors.
|
||||
|
||||
If run directly from the command line, also tests the accessors and the names
|
||||
|
@ -6,73 +5,77 @@ of all the media by getting just about everything in a naive brute-force way.
|
|||
This, of course, takes a lot of time to run.
|
||||
"""
|
||||
|
||||
import pytest
|
||||
|
||||
import os
|
||||
import re
|
||||
|
||||
from nose.tools import *
|
||||
from nose.plugins.skip import SkipTest
|
||||
import nose
|
||||
import pkg_resources
|
||||
|
||||
from pokedex.db import tables, connect
|
||||
from pokedex.util import media
|
||||
|
||||
def pytest_funcarg__root(request):
|
||||
root = request.config.option.media_root
|
||||
if not root:
|
||||
root = os.path.join(os.path.dirname(__file__), *'../data/media'.split('/'))
|
||||
if not media.BaseMedia(root).available:
|
||||
raise pytest.skip("Media unavailable")
|
||||
return root
|
||||
|
||||
session = connect()
|
||||
basedir = pkg_resources.resource_filename('pokedex', 'data/media')
|
||||
|
||||
path_re = re.compile('^[-a-z0-9./]*$')
|
||||
|
||||
def test_totodile():
|
||||
def test_totodile(root):
|
||||
"""Totodile's female sprite -- same as male"""
|
||||
totodile = session.query(tables.Pokemon).filter_by(identifier=u'totodile').one()
|
||||
accessor = media.PokemonMedia(totodile)
|
||||
totodile = session.query(tables.PokemonSpecies).filter_by(identifier=u'totodile').one()
|
||||
accessor = media.PokemonSpeciesMedia(root, totodile)
|
||||
assert accessor.sprite() == accessor.sprite(female=True)
|
||||
|
||||
def test_chimecho():
|
||||
def test_chimecho(root):
|
||||
"""Chimecho's Platinum female backsprite -- diffeent from male"""
|
||||
chimecho = session.query(tables.Pokemon).filter_by(identifier=u'chimecho').one()
|
||||
accessor = media.PokemonMedia(chimecho)
|
||||
chimecho = session.query(tables.PokemonSpecies).filter_by(identifier=u'chimecho').one()
|
||||
accessor = media.PokemonSpeciesMedia(root, chimecho)
|
||||
male = accessor.sprite('platinum', back=True, frame=2)
|
||||
female = accessor.sprite('platinum', back=True, female=True, frame=2)
|
||||
assert male != female
|
||||
|
||||
def test_venonat():
|
||||
def test_venonat(root):
|
||||
"""Venonat's shiny Yellow sprite -- same as non-shiny"""
|
||||
venonat = session.query(tables.Pokemon).filter_by(identifier=u'venonat').one()
|
||||
accessor = media.PokemonMedia(venonat)
|
||||
venonat = session.query(tables.PokemonSpecies).filter_by(identifier=u'venonat').one()
|
||||
accessor = media.PokemonSpeciesMedia(root, venonat)
|
||||
assert accessor.sprite('yellow') == accessor.sprite('yellow', shiny=True)
|
||||
|
||||
def test_arceus_icon():
|
||||
def test_arceus_icon(root):
|
||||
"""Arceus fire-form icon -- same as base icon"""
|
||||
arceus = session.query(tables.Pokemon).filter_by(identifier=u'arceus').one()
|
||||
accessor = media.PokemonMedia(arceus)
|
||||
fire_arceus = [f for f in arceus.forms if f.identifier == 'fire'][0]
|
||||
fire_accessor = media.PokemonFormMedia(fire_arceus)
|
||||
arceus = session.query(tables.PokemonSpecies).filter_by(identifier=u'arceus').one()
|
||||
accessor = media.PokemonSpeciesMedia(root, arceus)
|
||||
fire_arceus = [f for f in arceus.forms if f.form_identifier == 'fire'][0]
|
||||
fire_accessor = media.PokemonFormMedia(root, fire_arceus)
|
||||
assert accessor.icon() == fire_accessor.icon()
|
||||
|
||||
@raises(ValueError)
|
||||
def test_strict_castform():
|
||||
def test_strict_castform(root):
|
||||
"""Castform rainy form overworld with strict -- unavailable"""
|
||||
castform = session.query(tables.Pokemon).filter_by(identifier=u'castform').first()
|
||||
rainy_castform = [f for f in castform.forms if f.identifier == 'rainy'][0]
|
||||
rainy_castform = media.PokemonFormMedia(rainy_castform)
|
||||
rainy_castform.overworld('up', strict=True)
|
||||
with pytest.raises(ValueError):
|
||||
castform = session.query(tables.PokemonSpecies).filter_by(identifier=u'castform').first()
|
||||
rainy_castform = [f for f in castform.forms if f.form_identifier == 'rainy'][0]
|
||||
print rainy_castform
|
||||
rainy_castform = media.PokemonFormMedia(root, rainy_castform)
|
||||
rainy_castform.overworld('up', strict=True)
|
||||
|
||||
@raises(ValueError)
|
||||
def test_strict_exeggcute():
|
||||
def test_strict_exeggcute(root):
|
||||
"""Exeggcutes's female backsprite, with strict -- unavailable"""
|
||||
exeggcute = session.query(tables.Pokemon).filter_by(identifier=u'exeggcute').one()
|
||||
accessor = media.PokemonMedia(exeggcute)
|
||||
accessor.sprite(female=True, strict=True)
|
||||
with pytest.raises(ValueError):
|
||||
exeggcute = session.query(tables.PokemonSpecies).filter_by(identifier=u'exeggcute').one()
|
||||
accessor = media.PokemonSpeciesMedia(root, exeggcute)
|
||||
accessor.sprite(female=True, strict=True)
|
||||
|
||||
|
||||
|
||||
def get_all_filenames():
|
||||
print 'Reading all filenames...'
|
||||
|
||||
def get_all_filenames(root):
|
||||
all_filenames = set()
|
||||
|
||||
for dirpath, dirnames, filenames in os.walk(basedir):
|
||||
for dirpath, dirnames, filenames in os.walk(root):
|
||||
dirnames[:] = [dirname for dirname in dirnames if dirname != '.git']
|
||||
for filename in filenames:
|
||||
path = os.path.join(dirpath, filename)
|
||||
assert path_re.match(path), path
|
||||
|
@ -101,7 +104,8 @@ def hit(filenames, method, *args, **kwargs):
|
|||
pass
|
||||
return True
|
||||
|
||||
def check_get_everything():
|
||||
@pytest.mark.skipif("not config.getvalue('all')", reason='`--all` not specified')
|
||||
def test_get_everything(root, pytestconfig):
|
||||
"""
|
||||
For every the accessor method, loop over the Cartesian products of all
|
||||
possible values for its arguments.
|
||||
|
@ -110,34 +114,35 @@ def check_get_everything():
|
|||
|
||||
Well, there are exceptions of course.
|
||||
"""
|
||||
assert pytestconfig.getvalue('all')
|
||||
|
||||
versions = list(session.query(tables.Version).all())
|
||||
versions.append('red-green')
|
||||
|
||||
black = session.query(tables.Version).filter_by(identifier=u'black').one()
|
||||
|
||||
filenames = get_all_filenames()
|
||||
filenames = get_all_filenames(root)
|
||||
|
||||
# Some small stuff first
|
||||
|
||||
for damage_class in session.query(tables.MoveDamageClass).all():
|
||||
assert hit(filenames, media.DamageClassMedia(damage_class).icon)
|
||||
assert hit(filenames, media.DamageClassMedia(root, damage_class).icon)
|
||||
|
||||
for habitat in session.query(tables.PokemonHabitat).all():
|
||||
assert hit(filenames, media.HabitatMedia(habitat).icon)
|
||||
assert hit(filenames, media.HabitatMedia(root, habitat).icon)
|
||||
|
||||
for shape in session.query(tables.PokemonShape).all():
|
||||
assert hit(filenames, media.ShapeMedia(shape).icon)
|
||||
assert hit(filenames, media.ShapeMedia(root, shape).icon)
|
||||
|
||||
for item_pocket in session.query(tables.ItemPocket).all():
|
||||
assert hit(filenames, media.ItemPocketMedia(item_pocket).icon)
|
||||
assert hit(filenames, media.ItemPocketMedia(item_pocket).icon, selected=True)
|
||||
assert hit(filenames, media.ItemPocketMedia(root, item_pocket).icon)
|
||||
assert hit(filenames, media.ItemPocketMedia(root, item_pocket).icon, selected=True)
|
||||
|
||||
for contest_type in session.query(tables.ContestType).all():
|
||||
assert hit(filenames, media.ContestTypeMedia(contest_type).icon)
|
||||
assert hit(filenames, media.ContestTypeMedia(root, contest_type).icon)
|
||||
|
||||
for elemental_type in session.query(tables.Type).all():
|
||||
assert hit(filenames, media.TypeMedia(elemental_type).icon)
|
||||
assert hit(filenames, media.TypeMedia(root, elemental_type).icon)
|
||||
|
||||
# Items
|
||||
versions_for_items = [
|
||||
|
@ -146,7 +151,7 @@ def check_get_everything():
|
|||
]
|
||||
|
||||
for item in session.query(tables.Item).all():
|
||||
accessor = media.ItemMedia(item)
|
||||
accessor = media.ItemMedia(root, item)
|
||||
assert hit(filenames, accessor.berry_image) or not item.berry
|
||||
for rotation in (0, 90, 180, 270):
|
||||
assert hit(filenames, accessor.underground, rotation=rotation) or (
|
||||
|
@ -158,11 +163,11 @@ def check_get_everything():
|
|||
|
||||
for color in 'red green blue pale prism'.split():
|
||||
for big in (True, False):
|
||||
accessor = media.UndergroundSphereMedia(color=color, big=big)
|
||||
accessor = media.UndergroundSphereMedia(root, color=color, big=big)
|
||||
assert hit(filenames, accessor.underground)
|
||||
|
||||
for rock_type in 'i ii o o-big s t z'.split():
|
||||
accessor = media.UndergroundRockMedia(rock_type)
|
||||
accessor = media.UndergroundRockMedia(root, rock_type)
|
||||
for rotation in (0, 90, 180, 270):
|
||||
success = hit(filenames, accessor.underground, rotation=rotation)
|
||||
assert success or rotation
|
||||
|
@ -170,30 +175,28 @@ def check_get_everything():
|
|||
# Pokemon!
|
||||
accessors = []
|
||||
|
||||
accessors.append(media.UnknownPokemonMedia())
|
||||
accessors.append(media.EggMedia())
|
||||
manaphy = session.query(tables.Pokemon).filter_by(identifier=u'manaphy').one()
|
||||
accessors.append(media.EggMedia(manaphy))
|
||||
accessors.append(media.SubstituteMedia())
|
||||
accessors.append(media.UnknownPokemonMedia(root))
|
||||
accessors.append(media.EggMedia(root))
|
||||
manaphy = session.query(tables.PokemonSpecies).filter_by(identifier=u'manaphy').one()
|
||||
accessors.append(media.EggMedia(root, manaphy))
|
||||
accessors.append(media.SubstituteMedia(root))
|
||||
|
||||
print 'Loading pokemon'
|
||||
for form in session.query(tables.PokemonForm).all():
|
||||
accessors.append(media.PokemonFormMedia(root, form))
|
||||
|
||||
for form in session.query(tables.PokemonForm).filter(tables.PokemonForm.identifier != '').all():
|
||||
accessors.append(media.PokemonFormMedia(form))
|
||||
|
||||
for pokemon in session.query(tables.Pokemon).all():
|
||||
accessors.append(media.PokemonMedia(pokemon))
|
||||
for pokemon in session.query(tables.PokemonSpecies).all():
|
||||
accessors.append(media.PokemonSpeciesMedia(root, pokemon))
|
||||
|
||||
for accessor in accessors:
|
||||
assert hit(filenames, accessor.footprint) or not accessor.form
|
||||
assert hit(filenames, accessor.trozei) or not accessor.form or (
|
||||
accessor.form.pokemon.generation.id > 3)
|
||||
assert hit(filenames, accessor.cry) or not accessor.form
|
||||
assert hit(filenames, accessor.cropped_sprite) or not accessor.form
|
||||
assert hit(filenames, accessor.footprint) or not accessor.is_proper
|
||||
assert hit(filenames, accessor.trozei) or not accessor.is_proper or (
|
||||
accessor.introduced_in > 3)
|
||||
assert hit(filenames, accessor.cry) or not accessor.is_proper
|
||||
assert hit(filenames, accessor.cropped_sprite) or not accessor.is_proper
|
||||
for female in (True, False):
|
||||
assert hit(filenames, accessor.icon, female=female) or not accessor.form
|
||||
assert hit(filenames, accessor.icon, female=female) or not accessor.is_proper
|
||||
assert hit(filenames, accessor.sugimori, female=female) or (
|
||||
not accessor.form or accessor.form.pokemon.id >= 647)
|
||||
not accessor.is_proper or int(accessor.species_id) >= 647)
|
||||
for shiny in (True, False):
|
||||
for frame in (1, 2):
|
||||
for direction in 'up down left right'.split():
|
||||
|
@ -202,8 +205,8 @@ def check_get_everything():
|
|||
shiny=shiny,
|
||||
female=female,
|
||||
frame=frame,
|
||||
) or not accessor.form or (
|
||||
accessor.form.pokemon.generation.id > 4)
|
||||
) or not accessor.is_proper or (
|
||||
accessor.introduced_in > 4)
|
||||
for version in versions:
|
||||
for animated in (True, False):
|
||||
for back in (True, False):
|
||||
|
@ -223,34 +226,29 @@ def check_get_everything():
|
|||
shiny and not female and
|
||||
frame == 1):
|
||||
# All pokemon are in Black
|
||||
assert success or not accessor.form
|
||||
if (str(accessor.pokemon_id) == '1'
|
||||
assert success or not accessor.is_proper
|
||||
if (str(accessor.species_id) == '1'
|
||||
and not animated and not color and
|
||||
frame == 1):
|
||||
# Bulbasaur is in all versions
|
||||
assert success
|
||||
|
||||
# Remove exceptions
|
||||
exceptions = [os.path.join(basedir, dirname) for dirname in
|
||||
exceptions = [os.path.join(root, dirname) for dirname in
|
||||
'chrome fonts ribbons'.split()]
|
||||
exceptions.append(os.path.join(basedir, 'items', 'hm-'))
|
||||
exceptions.append(os.path.join(root, 'items', 'hm-'))
|
||||
exceptions = tuple(exceptions)
|
||||
|
||||
for filename in tuple(filenames):
|
||||
unaccessed_filenames = set(filenames)
|
||||
for filename in filenames:
|
||||
if filename.startswith(exceptions):
|
||||
filenames.remove(filename)
|
||||
unaccessed_filenames.remove(filename)
|
||||
|
||||
if len(filenames):
|
||||
print
|
||||
print '-----------------'
|
||||
print 'Unaccessed stuff:'
|
||||
for filename in sorted(filenames):
|
||||
if unaccessed_filenames:
|
||||
print 'Unaccessed files:'
|
||||
for filename in unaccessed_filenames:
|
||||
print filename
|
||||
print len(filenames), 'unaccessed files :('
|
||||
|
||||
assert unaccessed_filenames == set()
|
||||
|
||||
return (not filenames)
|
||||
|
||||
if __name__ == '__main__':
|
||||
result = nose.run(defaultTest=__file__)
|
||||
result = result and check_get_everything()
|
||||
exit(not result)
|
||||
|
|
|
@ -1,12 +1,9 @@
|
|||
# encoding: utf8
|
||||
from nose.tools import *
|
||||
import unittest
|
||||
|
||||
import pokedex.roomaji
|
||||
from pokedex.tests import positional_params
|
||||
|
||||
|
||||
def test_roomaji():
|
||||
tests = [
|
||||
@positional_params(
|
||||
(u'ヤミカラス', 'yamikarasu'),
|
||||
|
||||
# Elongated vowel
|
||||
|
@ -24,14 +21,13 @@ def test_roomaji():
|
|||
(u'ラティアス', 'ratiasu'),
|
||||
(u'ウィー', 'wii'),
|
||||
(u'セレビィ', 'sereby'),
|
||||
]
|
||||
)
|
||||
def test_roomaji(kana, roomaji):
|
||||
result = pokedex.roomaji.romanize(kana)
|
||||
assert result == roomaji
|
||||
|
||||
for kana, roomaji in tests:
|
||||
result = pokedex.roomaji.romanize(kana)
|
||||
assert_equal(result, roomaji, u"'%s' romanizes correctly" % roomaji)
|
||||
|
||||
def test_roomaji_cs():
|
||||
tests = [
|
||||
@positional_params(
|
||||
(u'ヤミカラス', u'jamikarasu'),
|
||||
|
||||
# Elongated vowel
|
||||
|
@ -49,8 +45,7 @@ def test_roomaji_cs():
|
|||
(u'ラティアス', u'ratiasu'),
|
||||
(u'ウィー', u'wí'),
|
||||
(u'セレビィ', u'serebí'),
|
||||
]
|
||||
|
||||
for kana, roomaji in tests:
|
||||
result = pokedex.roomaji.romanize(kana, 'cs')
|
||||
assert_equal(result, roomaji, u"'%s' romanizes correctly for Czech" % roomaji)
|
||||
)
|
||||
def test_roomaji_cs(kana, roomaji):
|
||||
result = pokedex.roomaji.romanize(kana, 'cs')
|
||||
assert result == roomaji
|
||||
|
|
|
@ -1,6 +1,7 @@
|
|||
# encoding: utf8
|
||||
from nose.tools import *
|
||||
import unittest
|
||||
|
||||
from pokedex.tests import single_params
|
||||
|
||||
from sqlalchemy import Column, Integer, String, create_engine
|
||||
from sqlalchemy.orm import class_mapper, joinedload, sessionmaker
|
||||
from sqlalchemy.orm.session import Session
|
||||
|
@ -10,22 +11,23 @@ from pokedex.db import tables, markdown
|
|||
from pokedex.db.multilang import MultilangScopedSession, MultilangSession, \
|
||||
create_translation_table
|
||||
|
||||
def test_variable_names():
|
||||
@single_params(*dir(tables))
|
||||
def test_variable_names(varname):
|
||||
"""We want pokedex.db.tables to export tables using the class name"""
|
||||
for varname in dir(tables):
|
||||
if not varname[0].isupper():
|
||||
continue
|
||||
table = getattr(tables, varname)
|
||||
try:
|
||||
if not issubclass(table, tables.TableBase) or table is tables.TableBase:
|
||||
continue
|
||||
except TypeError:
|
||||
continue
|
||||
classname = table.__name__
|
||||
if classname and varname[0].isupper():
|
||||
assert varname == classname, '%s refers to %s' % (varname, classname)
|
||||
for table in tables.mapped_classes:
|
||||
assert getattr(tables, table.__name__) is table
|
||||
table = getattr(tables, varname)
|
||||
try:
|
||||
if not issubclass(table, tables.TableBase) or table is tables.TableBase:
|
||||
return
|
||||
except TypeError:
|
||||
return
|
||||
classname = table.__name__
|
||||
if classname and varname[0].isupper():
|
||||
assert varname == classname, '%s refers to %s' % (varname, classname)
|
||||
|
||||
@single_params(*tables.mapped_classes)
|
||||
def test_variable_names_2(table):
|
||||
"""We also want all of the tables exported"""
|
||||
assert getattr(tables, table.__name__) is table
|
||||
|
||||
def test_class_order():
|
||||
"""The declarative classes should be defined in alphabetical order.
|
||||
|
@ -156,51 +158,52 @@ def test_i18n_table_creation():
|
|||
assert foo.name_map[lang_en] == 'different english'
|
||||
assert foo.name_map[lang_ru] == 'new russian'
|
||||
|
||||
def test_texts():
|
||||
classes = []
|
||||
for cls in tables.mapped_classes:
|
||||
classes.append(cls)
|
||||
classes += cls.translation_classes
|
||||
@single_params(*classes)
|
||||
def test_texts(cls):
|
||||
"""Check DB schema for integrity of text columns & translations.
|
||||
|
||||
Mostly protects against copy/paste oversights and rebase hiccups.
|
||||
If there's a reason to relax the tests, do it
|
||||
"""
|
||||
classes = []
|
||||
for cls in tables.mapped_classes:
|
||||
classes.append(cls)
|
||||
classes += cls.translation_classes
|
||||
for cls in classes:
|
||||
if hasattr(cls, 'local_language') or hasattr(cls, 'language'):
|
||||
good_formats = 'markdown plaintext gametext'.split()
|
||||
assert_text = '%s is language-specific'
|
||||
if hasattr(cls, 'local_language') or hasattr(cls, 'language'):
|
||||
good_formats = 'markdown plaintext gametext'.split()
|
||||
assert_text = '%s is language-specific'
|
||||
else:
|
||||
good_formats = 'identifier latex'.split()
|
||||
assert_text = '%s is not language-specific'
|
||||
columns = sorted(cls.__table__.c, key=lambda c: c.name)
|
||||
text_columns = []
|
||||
for column in columns:
|
||||
format = column.info.get('format', None)
|
||||
if format is not None:
|
||||
if format not in good_formats:
|
||||
raise AssertionError(assert_text % column)
|
||||
if (format != 'identifier') and (column.name == 'identifier'):
|
||||
raise AssertionError('%s: identifier column name/type mismatch' % column)
|
||||
if column.info.get('official', None) and format not in 'gametext plaintext':
|
||||
raise AssertionError('%s: official text with bad format' % column)
|
||||
text_columns.append(column)
|
||||
else:
|
||||
good_formats = 'identifier latex'.split()
|
||||
assert_text = '%s is not language-specific'
|
||||
columns = sorted(cls.__table__.c, key=lambda c: c.name)
|
||||
text_columns = []
|
||||
for column in columns:
|
||||
format = column.info.get('format', None)
|
||||
if format is not None:
|
||||
if format not in good_formats:
|
||||
raise AssertionError(assert_text % column)
|
||||
if (format != 'identifier') and (column.name == 'identifier'):
|
||||
raise AssertionError('%s: identifier column name/type mismatch' % column)
|
||||
if column.info.get('official', None) and format not in 'gametext plaintext':
|
||||
raise AssertionError('%s: official text with bad format' % column)
|
||||
text_columns.append(column)
|
||||
else:
|
||||
if isinstance(column.type, tables.Unicode):
|
||||
raise AssertionError('%s: text column without format' % column)
|
||||
if column.name == 'name' and format != 'plaintext':
|
||||
raise AssertionError('%s: non-plaintext name' % column)
|
||||
# No mention of English in the description
|
||||
assert 'English' not in column.info['description'], column
|
||||
# If there's more than one text column in a translation table,
|
||||
# they have to be nullable, to support missing translations
|
||||
if hasattr(cls, 'local_language') and len(text_columns) > 1:
|
||||
for column in text_columns:
|
||||
assert column.nullable
|
||||
if isinstance(column.type, tables.Unicode):
|
||||
raise AssertionError('%s: text column without format' % column)
|
||||
if column.name == 'name' and format != 'plaintext':
|
||||
raise AssertionError('%s: non-plaintext name' % column)
|
||||
# No mention of English in the description
|
||||
assert 'English' not in column.info['description'], column
|
||||
# If there's more than one text column in a translation table,
|
||||
# they have to be nullable, to support missing translations
|
||||
if hasattr(cls, 'local_language') and len(text_columns) > 1:
|
||||
for column in text_columns:
|
||||
assert column.nullable
|
||||
|
||||
def test_identifiers_with_names():
|
||||
@single_params(*tables.mapped_classes)
|
||||
def test_identifiers_with_names(table):
|
||||
"""Test that named tables have identifiers
|
||||
"""
|
||||
for table in sorted(tables.mapped_classes, key=lambda t: t.__name__):
|
||||
if hasattr(table, 'name'):
|
||||
for translation_class in table.translation_classes:
|
||||
if hasattr(translation_class, 'name'):
|
||||
assert hasattr(table, 'identifier'), table
|
||||
|
|
|
@ -1,150 +1,147 @@
|
|||
# Encoding: UTF-8
|
||||
|
||||
from nose.tools import *
|
||||
from sqlalchemy.orm.exc import NoResultFound
|
||||
import pytest
|
||||
|
||||
from pokedex.tests import positional_params
|
||||
|
||||
from pokedex.db import tables, connect, util, markdown
|
||||
|
||||
class TestStrings(object):
|
||||
def setup(self):
|
||||
self.connection = connect()
|
||||
connection = connect()
|
||||
|
||||
def teardown(self):
|
||||
self.connection.rollback()
|
||||
def test_filter():
|
||||
q = connection.query(tables.PokemonSpecies).filter(
|
||||
tables.PokemonSpecies.name == u"Marowak")
|
||||
assert q.one().identifier == 'marowak'
|
||||
|
||||
def test_filter(self):
|
||||
q = self.connection.query(tables.Pokemon).filter(
|
||||
tables.Pokemon.name == u"Marowak")
|
||||
assert q.one().identifier == 'marowak'
|
||||
def test_languages():
|
||||
q = connection.query(tables.PokemonSpecies).filter(
|
||||
tables.PokemonSpecies.name == u"Mightyena")
|
||||
pkmn = q.one()
|
||||
for lang, name in (
|
||||
('en', u'Mightyena'),
|
||||
('ja', u'グラエナ'),
|
||||
('roomaji', u'Guraena'),
|
||||
('fr', u'Grahyèna'),
|
||||
):
|
||||
language = connection.query(tables.Language).filter_by(
|
||||
identifier=lang).one()
|
||||
assert pkmn.name_map[language] == name
|
||||
|
||||
def test_languages(self):
|
||||
q = self.connection.query(tables.Pokemon).filter(
|
||||
tables.Pokemon.name == u"Mightyena")
|
||||
pkmn = q.one()
|
||||
for lang, name in (
|
||||
('en', u'Mightyena'),
|
||||
('ja', u'グラエナ'),
|
||||
('roomaji', u'Guraena'),
|
||||
('fr', u'Grahyèna'),
|
||||
):
|
||||
language = self.connection.query(tables.Language).filter_by(
|
||||
identifier=lang).one()
|
||||
assert pkmn.name_map[language] == name
|
||||
|
||||
@raises(KeyError)
|
||||
def test_bad_lang(self):
|
||||
q = self.connection.query(tables.Pokemon).filter(
|
||||
tables.Pokemon.name == u"Mightyena")
|
||||
def test_bad_lang():
|
||||
with pytest.raises(KeyError):
|
||||
q = connection.query(tables.PokemonSpecies).filter(
|
||||
tables.PokemonSpecies.name == u"Mightyena")
|
||||
pkmn = q.one()
|
||||
pkmn.names["identifier of a language that doesn't exist"]
|
||||
|
||||
def test_mutating(self):
|
||||
item = self.connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
language = self.connection.query(tables.Language).filter_by(
|
||||
identifier=u"de").one()
|
||||
item.name_map[language] = u"foo"
|
||||
assert item.name_map[language] == "foo"
|
||||
item.name_map[language] = u"xyzzy"
|
||||
assert item.name_map[language] == "xyzzy"
|
||||
def test_mutating():
|
||||
item = connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
language = connection.query(tables.Language).filter_by(
|
||||
identifier=u"de").one()
|
||||
item.name_map[language] = u"foo"
|
||||
assert item.name_map[language] == "foo"
|
||||
item.name_map[language] = u"xyzzy"
|
||||
assert item.name_map[language] == "xyzzy"
|
||||
|
||||
def test_mutating_default(self):
|
||||
item = self.connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
item.name = u"foo"
|
||||
assert item.name == "foo"
|
||||
def test_mutating_default():
|
||||
item = connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
item.name = u"foo"
|
||||
assert item.name == "foo"
|
||||
|
||||
def test_string_mapping(self):
|
||||
item = self.connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
assert len(item.name_map) == len(item.names)
|
||||
for lang in item.names:
|
||||
assert item.name_map[lang] == item.names[lang].name
|
||||
assert lang in item.name_map
|
||||
assert "language that doesn't exist" not in item.name_map
|
||||
assert tables.Language() not in item.name_map
|
||||
def test_string_mapping():
|
||||
item = connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
assert len(item.name_map) == len(item.names)
|
||||
for lang in item.names:
|
||||
assert item.name_map[lang] == item.names[lang].name
|
||||
assert lang in item.name_map
|
||||
assert "language that doesn't exist" not in item.name_map
|
||||
assert tables.Language() not in item.name_map
|
||||
|
||||
def test_new_language(self):
|
||||
item = self.connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
language = tables.Language()
|
||||
language.id = -1
|
||||
language.identifier = u'test'
|
||||
language.iso639 = language.iso3166 = u'--'
|
||||
language.official = False
|
||||
self.connection.add(language)
|
||||
item.name_map[language] = u"foo"
|
||||
assert item.name_map[language] == "foo"
|
||||
assert language in item.name_map
|
||||
item.name_map[language] = u"xyzzy"
|
||||
assert item.name_map[language] == "xyzzy"
|
||||
def test_new_language():
|
||||
item = connection.query(tables.Item).filter_by(
|
||||
identifier=u"jade-orb").one()
|
||||
language = tables.Language()
|
||||
language.id = -1
|
||||
language.identifier = u'test'
|
||||
language.iso639 = language.iso3166 = u'--'
|
||||
language.official = False
|
||||
connection.add(language)
|
||||
item.name_map[language] = u"foo"
|
||||
assert item.name_map[language] == "foo"
|
||||
assert language in item.name_map
|
||||
item.name_map[language] = u"xyzzy"
|
||||
assert item.name_map[language] == "xyzzy"
|
||||
|
||||
def test_markdown(self):
|
||||
move = self.connection.query(tables.Move).filter_by(
|
||||
identifier=u"thunderbolt").one()
|
||||
language = self.connection.query(tables.Language).filter_by(
|
||||
identifier=u"en").one()
|
||||
assert '10%' in move.effect.as_text()
|
||||
assert '10%' in move.effect_map[language].as_text()
|
||||
assert '10%' in move.effect.as_html()
|
||||
assert '10%' in move.effect_map[language].as_html()
|
||||
assert '10%' in unicode(move.effect)
|
||||
assert '10%' in unicode(move.effect_map[language])
|
||||
assert '10%' in move.effect.__html__()
|
||||
assert '10%' in move.effect_map[language].__html__()
|
||||
def test_markdown():
|
||||
move = connection.query(tables.Move).filter_by(
|
||||
identifier=u"thunderbolt").one()
|
||||
language = connection.query(tables.Language).filter_by(
|
||||
identifier=u"en").one()
|
||||
assert '10%' in move.effect.as_text()
|
||||
assert '10%' in move.effect_map[language].as_text()
|
||||
assert '10%' in move.effect.as_html()
|
||||
assert '10%' in move.effect_map[language].as_html()
|
||||
assert '10%' in unicode(move.effect)
|
||||
assert '10%' in unicode(move.effect_map[language])
|
||||
assert '10%' in move.effect.__html__()
|
||||
assert '10%' in move.effect_map[language].__html__()
|
||||
|
||||
def test_markdown_string(self):
|
||||
en = util.get(self.connection, tables.Language, 'en')
|
||||
md = markdown.MarkdownString('[]{move:thunderbolt} [paralyzes]{mechanic:paralysis}', self.connection, en)
|
||||
assert unicode(md) == 'Thunderbolt paralyzes'
|
||||
assert md.as_html() == '<p><span>Thunderbolt</span> <span>paralyzes</span></p>'
|
||||
assert md.as_html(object_url=lambda category, obj: "%s/%s" % (category, obj.identifier)) == (
|
||||
'<p><a href="move/thunderbolt">Thunderbolt</a> <span>paralyzes</span></p>')
|
||||
print md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident))
|
||||
assert md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident)) == (
|
||||
'<p><a href="move/thunderbolt">Thunderbolt</a> <a href="mechanic/paralysis">paralyzes</a></p>')
|
||||
def test_markdown_string():
|
||||
en = util.get(connection, tables.Language, 'en')
|
||||
md = markdown.MarkdownString('[]{move:thunderbolt} [paralyzes]{mechanic:paralysis}', connection, en)
|
||||
assert unicode(md) == 'Thunderbolt paralyzes'
|
||||
assert md.as_html() == '<p><span>Thunderbolt</span> <span>paralyzes</span></p>'
|
||||
assert md.as_html(object_url=lambda category, obj: "%s/%s" % (category, obj.identifier)) == (
|
||||
'<p><a href="move/thunderbolt">Thunderbolt</a> <span>paralyzes</span></p>')
|
||||
print md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident))
|
||||
assert md.as_html(identifier_url=lambda category, ident: "%s/%s" % (category, ident)) == (
|
||||
'<p><a href="move/thunderbolt">Thunderbolt</a> <a href="mechanic/paralysis">paralyzes</a></p>')
|
||||
|
||||
def test_markdown_values(self):
|
||||
"""Check all markdown values
|
||||
def markdown_column_params():
|
||||
"""Check all markdown values
|
||||
|
||||
Scans the database schema for Markdown columns, runs through every value
|
||||
in each, and ensures that it's valid Markdown.
|
||||
"""
|
||||
Scans the database schema for Markdown columns, runs through every value
|
||||
in each, and ensures that it's valid Markdown.
|
||||
"""
|
||||
|
||||
# Move effects have their own special wrappers. Explicitly test them separately
|
||||
yield self.check_markdown_column, tables.Move, None, 'effect'
|
||||
yield self.check_markdown_column, tables.Move, None, 'short_effect'
|
||||
# Move effects have their own special wrappers. Explicitly test them separately
|
||||
yield tables.Move, None, 'effect'
|
||||
yield tables.Move, None, 'short_effect'
|
||||
|
||||
for cls in tables.mapped_classes:
|
||||
for translation_cls in cls.translation_classes:
|
||||
for column in translation_cls.__table__.c:
|
||||
if column.info.get('string_getter') == markdown.MarkdownString:
|
||||
yield self.check_markdown_column, cls, translation_cls, column.name
|
||||
for cls in tables.mapped_classes:
|
||||
for translation_cls in cls.translation_classes:
|
||||
for column in translation_cls.__table__.c:
|
||||
if column.info.get('string_getter') == markdown.MarkdownString:
|
||||
yield cls, translation_cls, column.name
|
||||
|
||||
def check_markdown_column(self, parent_class, translation_class, column_name):
|
||||
"""Implementation for the above"""
|
||||
query = self.connection.query(parent_class)
|
||||
if translation_class:
|
||||
query = query.join(translation_class)
|
||||
for item in query:
|
||||
for language, markdown in getattr(item, column_name + '_map').items():
|
||||
@positional_params(*markdown_column_params())
|
||||
def test_markdown_values(parent_class, translation_class, column_name):
|
||||
"""Implementation for the above"""
|
||||
query = connection.query(parent_class)
|
||||
if translation_class:
|
||||
query = query.join(translation_class)
|
||||
for item in query:
|
||||
for language, markdown in getattr(item, column_name + '_map').items():
|
||||
|
||||
if markdown is None:
|
||||
continue
|
||||
if markdown is None:
|
||||
continue
|
||||
|
||||
key = u"Markdown in {0} #{1}'s {2} (lang={3})".format(
|
||||
parent_class.__name__, item.id, column_name, language.identifier)
|
||||
key = u"Markdown in {0} #{1}'s {2} (lang={3})".format(
|
||||
parent_class.__name__, item.id, column_name, language.identifier)
|
||||
|
||||
try:
|
||||
text = markdown.as_text()
|
||||
except NoResultFound:
|
||||
assert False, u"{0} references something that doesn't exist:\n{1}".format(
|
||||
key, markdown.source_text)
|
||||
except AttributeError:
|
||||
print markdown
|
||||
raise
|
||||
try:
|
||||
text = markdown.as_text()
|
||||
except NoResultFound:
|
||||
assert False, u"{0} references something that doesn't exist:\n{1}".format(
|
||||
key, markdown.source_text)
|
||||
except AttributeError:
|
||||
print markdown
|
||||
raise
|
||||
|
||||
error_message = u"{0} leaves syntax cruft:\n{1}"
|
||||
error_message = error_message.format(key, text)
|
||||
error_message = u"{0} leaves syntax cruft:\n{1}"
|
||||
error_message = error_message.format(key, text)
|
||||
|
||||
ok_(not any(char in text for char in '[]{}'), error_message)
|
||||
assert not any(char in text for char in '[]{}'), error_message
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
import csv
|
||||
|
||||
from nose.tools import *
|
||||
import pytest
|
||||
|
||||
from pokedex.db import translations, tables
|
||||
|
||||
|
|
|
@ -1,9 +1,9 @@
|
|||
# encoding: utf8
|
||||
from nose.tools import *
|
||||
import unittest
|
||||
# Encoding: utf8
|
||||
|
||||
import pytest
|
||||
|
||||
from pokedex.tests import single_params
|
||||
from pokedex.db import connect, tables, util
|
||||
from pokedex.util import simple
|
||||
|
||||
session = connect()
|
||||
|
||||
|
@ -19,32 +19,21 @@ def test_get_english_by_identifier():
|
|||
language = util.get(session, tables.Language, 'en')
|
||||
assert language.name == 'English'
|
||||
|
||||
def test_get_pokemon_baseform_identifier():
|
||||
for identifier in 'burmy shaymin unown cresselia'.split():
|
||||
poke = util.get(session, tables.Pokemon, identifier=identifier)
|
||||
assert poke.identifier == identifier
|
||||
assert poke.is_base_form
|
||||
@single_params(*'burmy shaymin unown cresselia'.split())
|
||||
def test_get_pokemon_identifier(identifier):
|
||||
poke = util.get(session, tables.PokemonSpecies, identifier=identifier)
|
||||
assert poke.identifier == identifier
|
||||
|
||||
def test_get_pokemon_baseform_name():
|
||||
for name in 'Burmy Shaymin Unown Cresselia'.split():
|
||||
poke = util.get(session, tables.Pokemon, name=name)
|
||||
assert poke.name == name
|
||||
assert poke.is_base_form
|
||||
@single_params(*'Burmy Shaymin Unown Cresselia'.split())
|
||||
def test_get_pokemon_name(name):
|
||||
poke = util.get(session, tables.PokemonSpecies, name=name)
|
||||
assert poke.name == name
|
||||
|
||||
def test_get_pokemon_baseform_name_explicit_language():
|
||||
@single_params(*'Cheniti Shaymin Zarbi Cresselia'.split())
|
||||
def test_get_pokemon_name_explicit_language(name):
|
||||
french = util.get(session, tables.Language, 'fr')
|
||||
for name in 'Cheniti Shaymin Zarbi Cresselia'.split():
|
||||
poke = util.get(session, tables.Pokemon, name=name, language=french)
|
||||
assert poke.name_map[french] == name, poke.name_map[french]
|
||||
assert poke.is_base_form
|
||||
|
||||
def test_get_pokemon_other_form_identifier():
|
||||
for ii in 'wormadam/trash shaymin/sky shaymin/land'.split():
|
||||
pokemon_identifier, form_identifier = ii.split('/')
|
||||
poke = util.get(session, tables.Pokemon, identifier=pokemon_identifier, form_identifier=form_identifier)
|
||||
assert poke.identifier == pokemon_identifier
|
||||
if poke.form.unique_pokemon_id:
|
||||
assert poke.form.identifier == form_identifier
|
||||
poke = util.get(session, tables.PokemonSpecies, name=name, language=french)
|
||||
assert poke.name_map[french] == name, poke.name_map[french]
|
||||
|
||||
def test_types_french_order():
|
||||
french = util.get(session, tables.Language, 'fr')
|
||||
|
@ -53,23 +42,8 @@ def test_types_french_order():
|
|||
assert types[0].name_map[french] == 'Acier', types[0].name_map[french]
|
||||
assert types[-1].name_map[french] == 'Vol', types[-1].name_map[french]
|
||||
|
||||
def test_simple_pokemon():
|
||||
pokemon = simple.pokemon(session)
|
||||
assert pokemon[0].identifier == 'bulbasaur'
|
||||
assert pokemon[-1].identifier == 'genesect'
|
||||
|
||||
def test_simple_types():
|
||||
types = simple.types(session)
|
||||
assert types[0].identifier == 'bug'
|
||||
assert types[-1].identifier == 'water'
|
||||
|
||||
def test_simple_moves():
|
||||
moves = simple.moves(session)
|
||||
assert moves[0].identifier == 'absorb'
|
||||
assert moves[-1].identifier == 'zen-headbutt'
|
||||
|
||||
def test_simple_items():
|
||||
items = simple.items(session)
|
||||
assert items[0].identifier == 'ability-urge'
|
||||
assert items[-1].identifier == 'zoom-lens'
|
||||
|
||||
@single_params(*range(1, 10) * 2)
|
||||
def test_get_pokemon_id(id):
|
||||
result = util.get(session, tables.Pokemon, id=id)
|
||||
assert result.id == id
|
||||
assert result.__tablename__ == 'pokemon'
|
||||
|
|
|
@ -1,7 +1,12 @@
|
|||
|
||||
"""Media accessors
|
||||
|
||||
Most media accessor __init__s take an ORM object from the pokedex package.
|
||||
All media accessor __init__s take a `root` argument, which should be a path
|
||||
to the root of the media directory.
|
||||
Alternatively, `root` can be a custom MediaFile subclass.
|
||||
|
||||
Most __init__s take an ORM object as a second argument.
|
||||
|
||||
Their various methods take a number of arguments specifying exactly which
|
||||
file you want (such as the female sprite, backsprite, etc.).
|
||||
ValueError is raised when the specified file cannot be found.
|
||||
|
@ -26,22 +31,25 @@ All images are in the PNG format, except animations (GIF). All sounds are OGGs.
|
|||
"""
|
||||
|
||||
import os
|
||||
import pkg_resources
|
||||
from functools import partial
|
||||
|
||||
class MediaFile(object):
|
||||
"""Represents a file: picture, sound, etc.
|
||||
|
||||
Attributes:
|
||||
relative_path: Filesystem path relative to the media directory
|
||||
path_elements: List of directory/file names that make up relative_path
|
||||
relative_path: Filesystem path relative to the root
|
||||
path: Absolute path to the file
|
||||
|
||||
exists: True if the file exists
|
||||
|
||||
media_available: false if no media is available at the given root.
|
||||
|
||||
open(): Open the file
|
||||
"""
|
||||
def __init__(self, *path_elements):
|
||||
def __init__(self, root, *path_elements):
|
||||
self.path_elements = path_elements
|
||||
self._dexpath = '/'.join(('data', 'media') + path_elements)
|
||||
self.root = root
|
||||
|
||||
@property
|
||||
def relative_path(self):
|
||||
|
@ -49,7 +57,7 @@ class MediaFile(object):
|
|||
|
||||
@property
|
||||
def path(self):
|
||||
return pkg_resources.resource_filename('pokedex', self._dexpath)
|
||||
return os.path.join(self.root, *self.path_elements)
|
||||
|
||||
def open(self):
|
||||
"""Open this file for reading, in the appropriate mode (i.e. binary)
|
||||
|
@ -58,7 +66,11 @@ class MediaFile(object):
|
|||
|
||||
@property
|
||||
def exists(self):
|
||||
return pkg_resources.resource_exists('pokedex', self._dexpath)
|
||||
return os.path.exists(self.path)
|
||||
|
||||
@property
|
||||
def media_available(self):
|
||||
return os.path.isdir(self.root)
|
||||
|
||||
def __eq__(self, other):
|
||||
return self.path == other.path
|
||||
|
@ -70,20 +82,31 @@ class MediaFile(object):
|
|||
return '<Pokedex file %s>' % self.relative_path
|
||||
|
||||
class BaseMedia(object):
|
||||
def __init__(self, root):
|
||||
if isinstance(root, basestring):
|
||||
self.file_class = partial(MediaFile, root)
|
||||
else:
|
||||
self.file_class = root
|
||||
|
||||
@property
|
||||
def available(self):
|
||||
return self.file_class().media_available
|
||||
|
||||
def from_path_elements(self, path_elements, basename, extension,
|
||||
surely_exists=False):
|
||||
filename = basename + extension
|
||||
path_elements = [self.toplevel_dir] + path_elements + [filename]
|
||||
mfile = MediaFile(*path_elements)
|
||||
mfile = self.file_class(*path_elements)
|
||||
if surely_exists or mfile.exists:
|
||||
return mfile
|
||||
else:
|
||||
raise ValueError('File %s not found' % mfile.relative_path)
|
||||
raise ValueError('File %s not found' % mfile.path)
|
||||
|
||||
class _BasePokemonMedia(BaseMedia):
|
||||
toplevel_dir = 'pokemon'
|
||||
has_gender_differences = False
|
||||
form = None
|
||||
is_species = False
|
||||
is_proper = False
|
||||
introduced_in = 0
|
||||
|
||||
# Info about of what's inside the pokemon main sprite directories, so we
|
||||
|
@ -104,13 +127,13 @@ class _BasePokemonMedia(BaseMedia):
|
|||
'black-white': (5, set('back shiny female'.split())),
|
||||
}
|
||||
|
||||
def __init__(self, pokemon_id, form_postfix=None):
|
||||
BaseMedia.__init__(self)
|
||||
self.pokemon_id = str(pokemon_id)
|
||||
def __init__(self, root, species_id, form_postfix=None):
|
||||
BaseMedia.__init__(self, root)
|
||||
self.species_id = str(species_id)
|
||||
self.form_postfix = form_postfix
|
||||
|
||||
def _get_file(self, path_elements, extension, strict, surely_exists=False):
|
||||
basename = str(self.pokemon_id)
|
||||
basename = str(self.species_id)
|
||||
if self.form_postfix:
|
||||
fullname = basename + self.form_postfix
|
||||
try:
|
||||
|
@ -173,7 +196,7 @@ class _BasePokemonMedia(BaseMedia):
|
|||
generation, info = self._pokemon_sprite_info[version_dir]
|
||||
if generation < self.introduced_in:
|
||||
raise ValueError("Pokemon %s didn't exist in %s" % (
|
||||
self.pokemon_id, version_dir))
|
||||
self.species_id, version_dir))
|
||||
path_elements = ['main-sprites', version_dir]
|
||||
if animated:
|
||||
if 'animated' not in info:
|
||||
|
@ -213,7 +236,7 @@ class _BasePokemonMedia(BaseMedia):
|
|||
# Chimecho's female back frame 2 sprite has one hand in
|
||||
# a slightly different pose, in Platinum and HGSS
|
||||
# (we have duplicate sprites frame 1, for convenience)
|
||||
if self.pokemon_id == '358' and back and version_dir in (
|
||||
if self.species_id == '358' and back and version_dir in (
|
||||
'platinum', 'heartgold-soulsilver'):
|
||||
female_sprite = True
|
||||
female_sprite = female_sprite and 'female' in info
|
||||
|
@ -221,7 +244,7 @@ class _BasePokemonMedia(BaseMedia):
|
|||
path_elements.append('female')
|
||||
elif strict:
|
||||
raise ValueError(
|
||||
'Pokemon %s has no gender differences' % self.pokemon_id)
|
||||
'Pokemon %s has no gender differences' % self.species_id)
|
||||
if not frame or frame == 1:
|
||||
pass
|
||||
elif frame == 2:
|
||||
|
@ -233,9 +256,8 @@ class _BasePokemonMedia(BaseMedia):
|
|||
raise ValueError("Bad frame %s" % frame)
|
||||
return self._get_file(path_elements, extension, strict=strict,
|
||||
# Avoid a stat in the common case
|
||||
surely_exists=(self.form and version_dir == 'black-white'
|
||||
and not back and not female
|
||||
and not self.form_postfix))
|
||||
surely_exists=(self.is_species and version_dir == 'black-white'
|
||||
and not back and not female))
|
||||
|
||||
def _maybe_female(self, path_elements, female, strict):
|
||||
if female:
|
||||
|
@ -248,7 +270,7 @@ class _BasePokemonMedia(BaseMedia):
|
|||
raise
|
||||
elif strict:
|
||||
raise ValueError(
|
||||
'Pokemon %s has no gender differences' % self.pokemon_id)
|
||||
'Pokemon %s has no gender differences' % self.species_id)
|
||||
return self._get_file(path_elements, '.png', strict=strict)
|
||||
|
||||
def icon(self, female=False, strict=False):
|
||||
|
@ -314,58 +336,62 @@ class _BasePokemonMedia(BaseMedia):
|
|||
return self._get_file(['cropped'], '.png', strict=strict)
|
||||
|
||||
class PokemonFormMedia(_BasePokemonMedia):
|
||||
"""Media related to a Pokemon form
|
||||
"""Media related to a PokemonForm
|
||||
"""
|
||||
def __init__(self, pokemon_form):
|
||||
pokemon_id = pokemon_form.form_base_pokemon_id
|
||||
if pokemon_form.identifier:
|
||||
form_postfix = '-' + pokemon_form.identifier
|
||||
is_proper = True
|
||||
|
||||
def __init__(self, root, pokemon_form):
|
||||
species_id = pokemon_form.species.id
|
||||
if pokemon_form.form_identifier:
|
||||
form_postfix = '-' + pokemon_form.form_identifier
|
||||
else:
|
||||
form_postfix = None
|
||||
_BasePokemonMedia.__init__(self, pokemon_id, form_postfix)
|
||||
_BasePokemonMedia.__init__(self, root, species_id, form_postfix)
|
||||
self.form = pokemon_form
|
||||
pokemon = pokemon_form.form_base_pokemon
|
||||
self.has_gender_differences = pokemon.has_gender_differences
|
||||
self.introduced_in = pokemon.generation_id
|
||||
species = pokemon_form.species
|
||||
self.has_gender_differences = species.has_gender_differences
|
||||
self.introduced_in = pokemon_form.version_group.generation_id
|
||||
|
||||
class PokemonMedia(_BasePokemonMedia):
|
||||
"""Media related to a Pokemon
|
||||
class PokemonSpeciesMedia(_BasePokemonMedia):
|
||||
"""Media related to a PokemonSpecies
|
||||
"""
|
||||
def __init__(self, pokemon):
|
||||
_BasePokemonMedia.__init__(self, pokemon.id)
|
||||
self.form = pokemon.default_form
|
||||
self.has_gender_differences = (pokemon.has_gender_differences)
|
||||
self.introduced_in = pokemon.generation_id
|
||||
is_species = True
|
||||
is_proper = True
|
||||
|
||||
def __init__(self, root, species):
|
||||
_BasePokemonMedia.__init__(self, root, species.id)
|
||||
self.has_gender_differences = species.has_gender_differences
|
||||
self.introduced_in = species.generation_id
|
||||
|
||||
class UnknownPokemonMedia(_BasePokemonMedia):
|
||||
"""Media related to the unknown Pokemon ("?")
|
||||
|
||||
Note that not a lot of files are available for it.
|
||||
"""
|
||||
def __init__(self):
|
||||
_BasePokemonMedia.__init__(self, '0')
|
||||
def __init__(self, root):
|
||||
_BasePokemonMedia.__init__(self, root, '0')
|
||||
|
||||
class EggMedia(_BasePokemonMedia):
|
||||
"""Media related to a pokemon egg
|
||||
|
||||
Note that not a lot of files are available for these.
|
||||
|
||||
Give a Manaphy as `pokemon` to get the Manaphy egg.
|
||||
Give a Manaphy as `species` to get the Manaphy egg.
|
||||
"""
|
||||
def __init__(self, pokemon=None):
|
||||
if pokemon and pokemon.identifier == 'manaphy':
|
||||
def __init__(self, root, species=None):
|
||||
if species and species.identifier == 'manaphy':
|
||||
postfix = '-manaphy'
|
||||
else:
|
||||
postfix = None
|
||||
_BasePokemonMedia.__init__(self, 'egg', postfix)
|
||||
_BasePokemonMedia.__init__(self, root, 'egg', postfix)
|
||||
|
||||
class SubstituteMedia(_BasePokemonMedia):
|
||||
"""Media related to the Substitute sprite
|
||||
|
||||
Note that not a lot of files are available for Substitute.
|
||||
"""
|
||||
def __init__(self):
|
||||
_BasePokemonMedia.__init__(self, 'substitute')
|
||||
def __init__(self, root):
|
||||
_BasePokemonMedia.__init__(self, root, 'substitute')
|
||||
|
||||
class _BaseItemMedia(BaseMedia):
|
||||
toplevel_dir = 'items'
|
||||
|
@ -383,7 +409,8 @@ class _BaseItemMedia(BaseMedia):
|
|||
class ItemMedia(_BaseItemMedia):
|
||||
"""Media related to an item
|
||||
"""
|
||||
def __init__(self, item):
|
||||
def __init__(self, root, item):
|
||||
_BaseItemMedia.__init__(self, root)
|
||||
self.item = item
|
||||
self.identifier = item.identifier
|
||||
|
||||
|
@ -459,7 +486,8 @@ class UndergroundRockMedia(_BaseItemMedia):
|
|||
|
||||
rock_type can be one of: i, ii, o, o-big, s, t, z
|
||||
"""
|
||||
def __init__(self, rock_type):
|
||||
def __init__(self, root, rock_type):
|
||||
_BaseItemMedia.__init__(self, root)
|
||||
self.identifier = 'rock-%s' % rock_type
|
||||
|
||||
class UndergroundSphereMedia(_BaseItemMedia):
|
||||
|
@ -467,13 +495,15 @@ class UndergroundSphereMedia(_BaseItemMedia):
|
|||
|
||||
color can be one of: red, blue, green, pale, prism
|
||||
"""
|
||||
def __init__(self, color, big=False):
|
||||
def __init__(self, root, color, big=False):
|
||||
_BaseItemMedia.__init__(self, root)
|
||||
self.identifier = '%s-sphere' % color
|
||||
if big:
|
||||
self.identifier += '-big'
|
||||
|
||||
class _SimpleIconMedia(BaseMedia):
|
||||
def __init__(self, thing):
|
||||
def __init__(self, root, thing):
|
||||
BaseMedia.__init__(self, root)
|
||||
self.identifier = thing.identifier
|
||||
|
||||
def icon(self):
|
||||
|
|
|
@ -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