@pkmn/engine 0.1.0-dev.00879b8b

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/LICENSE +18 -0
  2. package/README.md +368 -0
  3. package/build/pkg/addon.d.ts +7 -0
  4. package/build/pkg/addon.js +111 -0
  5. package/build/pkg/addon.js.map +1 -0
  6. package/build/pkg/data/ids.json +240 -0
  7. package/build/pkg/data/layout.json +108 -0
  8. package/build/pkg/data/protocol.json +230 -0
  9. package/build/pkg/data.d.ts +91 -0
  10. package/build/pkg/data.js +150 -0
  11. package/build/pkg/data.js.map +1 -0
  12. package/build/pkg/gen1.d.ts +110 -0
  13. package/build/pkg/gen1.js +684 -0
  14. package/build/pkg/gen1.js.map +1 -0
  15. package/build/pkg/index.d.ts +387 -0
  16. package/build/pkg/index.js +122 -0
  17. package/build/pkg/index.js.map +1 -0
  18. package/build/pkg/protocol.d.ts +73 -0
  19. package/build/pkg/protocol.js +473 -0
  20. package/build/pkg/protocol.js.map +1 -0
  21. package/build/test/display.js +400 -0
  22. package/build/test/display.js.map +1 -0
  23. package/build/tools/debug.js +134 -0
  24. package/build/tools/debug.js.map +1 -0
  25. package/build.zig +363 -0
  26. package/package.json +232 -0
  27. package/src/bin/install-pkmn-engine +404 -0
  28. package/src/bin/pkmn-debug +62 -0
  29. package/src/lib/common/battle.zig +17 -0
  30. package/src/lib/common/data.zig +117 -0
  31. package/src/lib/common/debug.zig +74 -0
  32. package/src/lib/common/js.zig +118 -0
  33. package/src/lib/common/optional.zig +67 -0
  34. package/src/lib/common/options.zig +51 -0
  35. package/src/lib/common/protocol.zig +1836 -0
  36. package/src/lib/common/rational.zig +357 -0
  37. package/src/lib/common/rng.zig +243 -0
  38. package/src/lib/common/util.zig +12 -0
  39. package/src/lib/gen1/calc.zig +507 -0
  40. package/src/lib/gen1/chance.zig +1063 -0
  41. package/src/lib/gen1/data/moves.zig +1866 -0
  42. package/src/lib/gen1/data/species.zig +1105 -0
  43. package/src/lib/gen1/data/types.zig +131 -0
  44. package/src/lib/gen1/data.zig +634 -0
  45. package/src/lib/gen1/helpers.zig +866 -0
  46. package/src/lib/gen1/mechanics.zig +3156 -0
  47. package/src/lib/gen2/calc.zig +143 -0
  48. package/src/lib/gen2/chance.zig +1315 -0
  49. package/src/lib/gen2/data/items.zig +230 -0
  50. package/src/lib/gen2/data/moves.zig +2878 -0
  51. package/src/lib/gen2/data/species.zig +1798 -0
  52. package/src/lib/gen2/data/types.zig +226 -0
  53. package/src/lib/gen2/data.zig +463 -0
  54. package/src/lib/gen2/generated.zig +806 -0
  55. package/src/lib/gen2/helpers.zig +249 -0
  56. package/src/lib/gen2/mechanics.zig +3632 -0
  57. package/src/lib/node.zig +131 -0
  58. package/src/lib/pkmn.zig +128 -0
  59. package/src/lib/wasm.zig +13 -0
  60. package/src/test/display/pkmn.html.tmpl +368 -0
@@ -0,0 +1,1105 @@
1
+ //! Code generated by `tools/generate` - manual edits will be overwritten.
2
+
3
+ const std = @import("std");
4
+
5
+ const gen1 = @import("../../gen1/data.zig");
6
+
7
+ const assert = std.debug.assert;
8
+
9
+ const Stats = gen1.Stats;
10
+ const Types = gen1.Types;
11
+
12
+ /// Representation of a Generation I Pokémon species.
13
+ pub const Species = enum(u8) {
14
+ None,
15
+ Bulbasaur,
16
+ Ivysaur,
17
+ Venusaur,
18
+ Charmander,
19
+ Charmeleon,
20
+ Charizard,
21
+ Squirtle,
22
+ Wartortle,
23
+ Blastoise,
24
+ Caterpie,
25
+ Metapod,
26
+ Butterfree,
27
+ Weedle,
28
+ Kakuna,
29
+ Beedrill,
30
+ Pidgey,
31
+ Pidgeotto,
32
+ Pidgeot,
33
+ Rattata,
34
+ Raticate,
35
+ Spearow,
36
+ Fearow,
37
+ Ekans,
38
+ Arbok,
39
+ Pikachu,
40
+ Raichu,
41
+ Sandshrew,
42
+ Sandslash,
43
+ NidoranF,
44
+ Nidorina,
45
+ Nidoqueen,
46
+ NidoranM,
47
+ Nidorino,
48
+ Nidoking,
49
+ Clefairy,
50
+ Clefable,
51
+ Vulpix,
52
+ Ninetales,
53
+ Jigglypuff,
54
+ Wigglytuff,
55
+ Zubat,
56
+ Golbat,
57
+ Oddish,
58
+ Gloom,
59
+ Vileplume,
60
+ Paras,
61
+ Parasect,
62
+ Venonat,
63
+ Venomoth,
64
+ Diglett,
65
+ Dugtrio,
66
+ Meowth,
67
+ Persian,
68
+ Psyduck,
69
+ Golduck,
70
+ Mankey,
71
+ Primeape,
72
+ Growlithe,
73
+ Arcanine,
74
+ Poliwag,
75
+ Poliwhirl,
76
+ Poliwrath,
77
+ Abra,
78
+ Kadabra,
79
+ Alakazam,
80
+ Machop,
81
+ Machoke,
82
+ Machamp,
83
+ Bellsprout,
84
+ Weepinbell,
85
+ Victreebel,
86
+ Tentacool,
87
+ Tentacruel,
88
+ Geodude,
89
+ Graveler,
90
+ Golem,
91
+ Ponyta,
92
+ Rapidash,
93
+ Slowpoke,
94
+ Slowbro,
95
+ Magnemite,
96
+ Magneton,
97
+ Farfetchd,
98
+ Doduo,
99
+ Dodrio,
100
+ Seel,
101
+ Dewgong,
102
+ Grimer,
103
+ Muk,
104
+ Shellder,
105
+ Cloyster,
106
+ Gastly,
107
+ Haunter,
108
+ Gengar,
109
+ Onix,
110
+ Drowzee,
111
+ Hypno,
112
+ Krabby,
113
+ Kingler,
114
+ Voltorb,
115
+ Electrode,
116
+ Exeggcute,
117
+ Exeggutor,
118
+ Cubone,
119
+ Marowak,
120
+ Hitmonlee,
121
+ Hitmonchan,
122
+ Lickitung,
123
+ Koffing,
124
+ Weezing,
125
+ Rhyhorn,
126
+ Rhydon,
127
+ Chansey,
128
+ Tangela,
129
+ Kangaskhan,
130
+ Horsea,
131
+ Seadra,
132
+ Goldeen,
133
+ Seaking,
134
+ Staryu,
135
+ Starmie,
136
+ MrMime,
137
+ Scyther,
138
+ Jynx,
139
+ Electabuzz,
140
+ Magmar,
141
+ Pinsir,
142
+ Tauros,
143
+ Magikarp,
144
+ Gyarados,
145
+ Lapras,
146
+ Ditto,
147
+ Eevee,
148
+ Vaporeon,
149
+ Jolteon,
150
+ Flareon,
151
+ Porygon,
152
+ Omanyte,
153
+ Omastar,
154
+ Kabuto,
155
+ Kabutops,
156
+ Aerodactyl,
157
+ Snorlax,
158
+ Articuno,
159
+ Zapdos,
160
+ Moltres,
161
+ Dratini,
162
+ Dragonair,
163
+ Dragonite,
164
+ Mewtwo,
165
+ Mew,
166
+
167
+ const CHANCES = [_]u8{
168
+ 22, // Bulbasaur
169
+ 30, // Ivysaur
170
+ 40, // Venusaur
171
+ 32, // Charmander
172
+ 40, // Charmeleon
173
+ 50, // Charizard
174
+ 21, // Squirtle
175
+ 29, // Wartortle
176
+ 39, // Blastoise
177
+ 22, // Caterpie
178
+ 15, // Metapod
179
+ 35, // Butterfree
180
+ 25, // Weedle
181
+ 17, // Kakuna
182
+ 37, // Beedrill
183
+ 28, // Pidgey
184
+ 35, // Pidgeotto
185
+ 45, // Pidgeot
186
+ 36, // Rattata
187
+ 48, // Raticate
188
+ 35, // Spearow
189
+ 50, // Fearow
190
+ 27, // Ekans
191
+ 40, // Arbok
192
+ 45, // Pikachu
193
+ 50, // Raichu
194
+ 20, // Sandshrew
195
+ 32, // Sandslash
196
+ 20, // NidoranF
197
+ 28, // Nidorina
198
+ 38, // Nidoqueen
199
+ 25, // NidoranM
200
+ 32, // Nidorino
201
+ 42, // Nidoking
202
+ 17, // Clefairy
203
+ 30, // Clefable
204
+ 32, // Vulpix
205
+ 50, // Ninetales
206
+ 10, // Jigglypuff
207
+ 22, // Wigglytuff
208
+ 27, // Zubat
209
+ 45, // Golbat
210
+ 15, // Oddish
211
+ 20, // Gloom
212
+ 25, // Vileplume
213
+ 12, // Paras
214
+ 15, // Parasect
215
+ 22, // Venonat
216
+ 45, // Venomoth
217
+ 47, // Diglett
218
+ 60, // Dugtrio
219
+ 45, // Meowth
220
+ 57, // Persian
221
+ 27, // Psyduck
222
+ 42, // Golduck
223
+ 35, // Mankey
224
+ 47, // Primeape
225
+ 30, // Growlithe
226
+ 47, // Arcanine
227
+ 45, // Poliwag
228
+ 45, // Poliwhirl
229
+ 35, // Poliwrath
230
+ 45, // Abra
231
+ 52, // Kadabra
232
+ 60, // Alakazam
233
+ 17, // Machop
234
+ 22, // Machoke
235
+ 27, // Machamp
236
+ 20, // Bellsprout
237
+ 27, // Weepinbell
238
+ 35, // Victreebel
239
+ 35, // Tentacool
240
+ 50, // Tentacruel
241
+ 10, // Geodude
242
+ 17, // Graveler
243
+ 22, // Golem
244
+ 45, // Ponyta
245
+ 52, // Rapidash
246
+ 7, // Slowpoke
247
+ 15, // Slowbro
248
+ 22, // Magnemite
249
+ 35, // Magneton
250
+ 30, // Farfetchd
251
+ 37, // Doduo
252
+ 50, // Dodrio
253
+ 22, // Seel
254
+ 35, // Dewgong
255
+ 12, // Grimer
256
+ 25, // Muk
257
+ 20, // Shellder
258
+ 35, // Cloyster
259
+ 40, // Gastly
260
+ 47, // Haunter
261
+ 55, // Gengar
262
+ 35, // Onix
263
+ 21, // Drowzee
264
+ 33, // Hypno
265
+ 25, // Krabby
266
+ 37, // Kingler
267
+ 50, // Voltorb
268
+ 70, // Electrode
269
+ 20, // Exeggcute
270
+ 27, // Exeggutor
271
+ 17, // Cubone
272
+ 22, // Marowak
273
+ 43, // Hitmonlee
274
+ 38, // Hitmonchan
275
+ 15, // Lickitung
276
+ 17, // Koffing
277
+ 30, // Weezing
278
+ 12, // Rhyhorn
279
+ 20, // Rhydon
280
+ 25, // Chansey
281
+ 30, // Tangela
282
+ 45, // Kangaskhan
283
+ 30, // Horsea
284
+ 42, // Seadra
285
+ 31, // Goldeen
286
+ 34, // Seaking
287
+ 42, // Staryu
288
+ 57, // Starmie
289
+ 45, // MrMime
290
+ 52, // Scyther
291
+ 47, // Jynx
292
+ 52, // Electabuzz
293
+ 46, // Magmar
294
+ 42, // Pinsir
295
+ 55, // Tauros
296
+ 40, // Magikarp
297
+ 40, // Gyarados
298
+ 30, // Lapras
299
+ 24, // Ditto
300
+ 27, // Eevee
301
+ 32, // Vaporeon
302
+ 65, // Jolteon
303
+ 32, // Flareon
304
+ 20, // Porygon
305
+ 17, // Omanyte
306
+ 27, // Omastar
307
+ 27, // Kabuto
308
+ 40, // Kabutops
309
+ 65, // Aerodactyl
310
+ 15, // Snorlax
311
+ 42, // Articuno
312
+ 50, // Zapdos
313
+ 45, // Moltres
314
+ 25, // Dratini
315
+ 35, // Dragonair
316
+ 40, // Dragonite
317
+ 65, // Mewtwo
318
+ 50, // Mew
319
+ };
320
+
321
+ /// Data associated with a Pokémon species.
322
+ pub const Data = struct {
323
+ /// The base stats of the Pokémon species.
324
+ stats: Stats(u8),
325
+ /// The typing of the Pokémon species.
326
+ types: Types,
327
+ };
328
+
329
+ const DATA = [_]Data{
330
+ // Bulbasaur
331
+ .{
332
+ .stats = .{ .hp = 45, .atk = 49, .def = 49, .spe = 45, .spc = 65 },
333
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
334
+ },
335
+ // Ivysaur
336
+ .{
337
+ .stats = .{ .hp = 60, .atk = 62, .def = 63, .spe = 60, .spc = 80 },
338
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
339
+ },
340
+ // Venusaur
341
+ .{
342
+ .stats = .{ .hp = 80, .atk = 82, .def = 83, .spe = 80, .spc = 100 },
343
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
344
+ },
345
+ // Charmander
346
+ .{
347
+ .stats = .{ .hp = 39, .atk = 52, .def = 43, .spe = 65, .spc = 50 },
348
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
349
+ },
350
+ // Charmeleon
351
+ .{
352
+ .stats = .{ .hp = 58, .atk = 64, .def = 58, .spe = 80, .spc = 65 },
353
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
354
+ },
355
+ // Charizard
356
+ .{
357
+ .stats = .{ .hp = 78, .atk = 84, .def = 78, .spe = 100, .spc = 85 },
358
+ .types = .{ .type1 = .Fire, .type2 = .Flying },
359
+ },
360
+ // Squirtle
361
+ .{
362
+ .stats = .{ .hp = 44, .atk = 48, .def = 65, .spe = 43, .spc = 50 },
363
+ .types = .{ .type1 = .Water, .type2 = .Water },
364
+ },
365
+ // Wartortle
366
+ .{
367
+ .stats = .{ .hp = 59, .atk = 63, .def = 80, .spe = 58, .spc = 65 },
368
+ .types = .{ .type1 = .Water, .type2 = .Water },
369
+ },
370
+ // Blastoise
371
+ .{
372
+ .stats = .{ .hp = 79, .atk = 83, .def = 100, .spe = 78, .spc = 85 },
373
+ .types = .{ .type1 = .Water, .type2 = .Water },
374
+ },
375
+ // Caterpie
376
+ .{
377
+ .stats = .{ .hp = 45, .atk = 30, .def = 35, .spe = 45, .spc = 20 },
378
+ .types = .{ .type1 = .Bug, .type2 = .Bug },
379
+ },
380
+ // Metapod
381
+ .{
382
+ .stats = .{ .hp = 50, .atk = 20, .def = 55, .spe = 30, .spc = 25 },
383
+ .types = .{ .type1 = .Bug, .type2 = .Bug },
384
+ },
385
+ // Butterfree
386
+ .{
387
+ .stats = .{ .hp = 60, .atk = 45, .def = 50, .spe = 70, .spc = 80 },
388
+ .types = .{ .type1 = .Bug, .type2 = .Flying },
389
+ },
390
+ // Weedle
391
+ .{
392
+ .stats = .{ .hp = 40, .atk = 35, .def = 30, .spe = 50, .spc = 20 },
393
+ .types = .{ .type1 = .Bug, .type2 = .Poison },
394
+ },
395
+ // Kakuna
396
+ .{
397
+ .stats = .{ .hp = 45, .atk = 25, .def = 50, .spe = 35, .spc = 25 },
398
+ .types = .{ .type1 = .Bug, .type2 = .Poison },
399
+ },
400
+ // Beedrill
401
+ .{
402
+ .stats = .{ .hp = 65, .atk = 80, .def = 40, .spe = 75, .spc = 45 },
403
+ .types = .{ .type1 = .Bug, .type2 = .Poison },
404
+ },
405
+ // Pidgey
406
+ .{
407
+ .stats = .{ .hp = 40, .atk = 45, .def = 40, .spe = 56, .spc = 35 },
408
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
409
+ },
410
+ // Pidgeotto
411
+ .{
412
+ .stats = .{ .hp = 63, .atk = 60, .def = 55, .spe = 71, .spc = 50 },
413
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
414
+ },
415
+ // Pidgeot
416
+ .{
417
+ .stats = .{ .hp = 83, .atk = 80, .def = 75, .spe = 91, .spc = 70 },
418
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
419
+ },
420
+ // Rattata
421
+ .{
422
+ .stats = .{ .hp = 30, .atk = 56, .def = 35, .spe = 72, .spc = 25 },
423
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
424
+ },
425
+ // Raticate
426
+ .{
427
+ .stats = .{ .hp = 55, .atk = 81, .def = 60, .spe = 97, .spc = 50 },
428
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
429
+ },
430
+ // Spearow
431
+ .{
432
+ .stats = .{ .hp = 40, .atk = 60, .def = 30, .spe = 70, .spc = 31 },
433
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
434
+ },
435
+ // Fearow
436
+ .{
437
+ .stats = .{ .hp = 65, .atk = 90, .def = 65, .spe = 100, .spc = 61 },
438
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
439
+ },
440
+ // Ekans
441
+ .{
442
+ .stats = .{ .hp = 35, .atk = 60, .def = 44, .spe = 55, .spc = 40 },
443
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
444
+ },
445
+ // Arbok
446
+ .{
447
+ .stats = .{ .hp = 60, .atk = 85, .def = 69, .spe = 80, .spc = 65 },
448
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
449
+ },
450
+ // Pikachu
451
+ .{
452
+ .stats = .{ .hp = 35, .atk = 55, .def = 30, .spe = 90, .spc = 50 },
453
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
454
+ },
455
+ // Raichu
456
+ .{
457
+ .stats = .{ .hp = 60, .atk = 90, .def = 55, .spe = 100, .spc = 90 },
458
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
459
+ },
460
+ // Sandshrew
461
+ .{
462
+ .stats = .{ .hp = 50, .atk = 75, .def = 85, .spe = 40, .spc = 30 },
463
+ .types = .{ .type1 = .Ground, .type2 = .Ground },
464
+ },
465
+ // Sandslash
466
+ .{
467
+ .stats = .{ .hp = 75, .atk = 100, .def = 110, .spe = 65, .spc = 55 },
468
+ .types = .{ .type1 = .Ground, .type2 = .Ground },
469
+ },
470
+ // NidoranF
471
+ .{
472
+ .stats = .{ .hp = 55, .atk = 47, .def = 52, .spe = 41, .spc = 40 },
473
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
474
+ },
475
+ // Nidorina
476
+ .{
477
+ .stats = .{ .hp = 70, .atk = 62, .def = 67, .spe = 56, .spc = 55 },
478
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
479
+ },
480
+ // Nidoqueen
481
+ .{
482
+ .stats = .{ .hp = 90, .atk = 82, .def = 87, .spe = 76, .spc = 75 },
483
+ .types = .{ .type1 = .Poison, .type2 = .Ground },
484
+ },
485
+ // NidoranM
486
+ .{
487
+ .stats = .{ .hp = 46, .atk = 57, .def = 40, .spe = 50, .spc = 40 },
488
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
489
+ },
490
+ // Nidorino
491
+ .{
492
+ .stats = .{ .hp = 61, .atk = 72, .def = 57, .spe = 65, .spc = 55 },
493
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
494
+ },
495
+ // Nidoking
496
+ .{
497
+ .stats = .{ .hp = 81, .atk = 92, .def = 77, .spe = 85, .spc = 75 },
498
+ .types = .{ .type1 = .Poison, .type2 = .Ground },
499
+ },
500
+ // Clefairy
501
+ .{
502
+ .stats = .{ .hp = 70, .atk = 45, .def = 48, .spe = 35, .spc = 60 },
503
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
504
+ },
505
+ // Clefable
506
+ .{
507
+ .stats = .{ .hp = 95, .atk = 70, .def = 73, .spe = 60, .spc = 85 },
508
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
509
+ },
510
+ // Vulpix
511
+ .{
512
+ .stats = .{ .hp = 38, .atk = 41, .def = 40, .spe = 65, .spc = 65 },
513
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
514
+ },
515
+ // Ninetales
516
+ .{
517
+ .stats = .{ .hp = 73, .atk = 76, .def = 75, .spe = 100, .spc = 100 },
518
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
519
+ },
520
+ // Jigglypuff
521
+ .{
522
+ .stats = .{ .hp = 115, .atk = 45, .def = 20, .spe = 20, .spc = 25 },
523
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
524
+ },
525
+ // Wigglytuff
526
+ .{
527
+ .stats = .{ .hp = 140, .atk = 70, .def = 45, .spe = 45, .spc = 50 },
528
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
529
+ },
530
+ // Zubat
531
+ .{
532
+ .stats = .{ .hp = 40, .atk = 45, .def = 35, .spe = 55, .spc = 40 },
533
+ .types = .{ .type1 = .Poison, .type2 = .Flying },
534
+ },
535
+ // Golbat
536
+ .{
537
+ .stats = .{ .hp = 75, .atk = 80, .def = 70, .spe = 90, .spc = 75 },
538
+ .types = .{ .type1 = .Poison, .type2 = .Flying },
539
+ },
540
+ // Oddish
541
+ .{
542
+ .stats = .{ .hp = 45, .atk = 50, .def = 55, .spe = 30, .spc = 75 },
543
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
544
+ },
545
+ // Gloom
546
+ .{
547
+ .stats = .{ .hp = 60, .atk = 65, .def = 70, .spe = 40, .spc = 85 },
548
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
549
+ },
550
+ // Vileplume
551
+ .{
552
+ .stats = .{ .hp = 75, .atk = 80, .def = 85, .spe = 50, .spc = 100 },
553
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
554
+ },
555
+ // Paras
556
+ .{
557
+ .stats = .{ .hp = 35, .atk = 70, .def = 55, .spe = 25, .spc = 55 },
558
+ .types = .{ .type1 = .Bug, .type2 = .Grass },
559
+ },
560
+ // Parasect
561
+ .{
562
+ .stats = .{ .hp = 60, .atk = 95, .def = 80, .spe = 30, .spc = 80 },
563
+ .types = .{ .type1 = .Bug, .type2 = .Grass },
564
+ },
565
+ // Venonat
566
+ .{
567
+ .stats = .{ .hp = 60, .atk = 55, .def = 50, .spe = 45, .spc = 40 },
568
+ .types = .{ .type1 = .Bug, .type2 = .Poison },
569
+ },
570
+ // Venomoth
571
+ .{
572
+ .stats = .{ .hp = 70, .atk = 65, .def = 60, .spe = 90, .spc = 90 },
573
+ .types = .{ .type1 = .Bug, .type2 = .Poison },
574
+ },
575
+ // Diglett
576
+ .{
577
+ .stats = .{ .hp = 10, .atk = 55, .def = 25, .spe = 95, .spc = 45 },
578
+ .types = .{ .type1 = .Ground, .type2 = .Ground },
579
+ },
580
+ // Dugtrio
581
+ .{
582
+ .stats = .{ .hp = 35, .atk = 80, .def = 50, .spe = 120, .spc = 70 },
583
+ .types = .{ .type1 = .Ground, .type2 = .Ground },
584
+ },
585
+ // Meowth
586
+ .{
587
+ .stats = .{ .hp = 40, .atk = 45, .def = 35, .spe = 90, .spc = 40 },
588
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
589
+ },
590
+ // Persian
591
+ .{
592
+ .stats = .{ .hp = 65, .atk = 70, .def = 60, .spe = 115, .spc = 65 },
593
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
594
+ },
595
+ // Psyduck
596
+ .{
597
+ .stats = .{ .hp = 50, .atk = 52, .def = 48, .spe = 55, .spc = 50 },
598
+ .types = .{ .type1 = .Water, .type2 = .Water },
599
+ },
600
+ // Golduck
601
+ .{
602
+ .stats = .{ .hp = 80, .atk = 82, .def = 78, .spe = 85, .spc = 80 },
603
+ .types = .{ .type1 = .Water, .type2 = .Water },
604
+ },
605
+ // Mankey
606
+ .{
607
+ .stats = .{ .hp = 40, .atk = 80, .def = 35, .spe = 70, .spc = 35 },
608
+ .types = .{ .type1 = .Fighting, .type2 = .Fighting },
609
+ },
610
+ // Primeape
611
+ .{
612
+ .stats = .{ .hp = 65, .atk = 105, .def = 60, .spe = 95, .spc = 60 },
613
+ .types = .{ .type1 = .Fighting, .type2 = .Fighting },
614
+ },
615
+ // Growlithe
616
+ .{
617
+ .stats = .{ .hp = 55, .atk = 70, .def = 45, .spe = 60, .spc = 50 },
618
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
619
+ },
620
+ // Arcanine
621
+ .{
622
+ .stats = .{ .hp = 90, .atk = 110, .def = 80, .spe = 95, .spc = 80 },
623
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
624
+ },
625
+ // Poliwag
626
+ .{
627
+ .stats = .{ .hp = 40, .atk = 50, .def = 40, .spe = 90, .spc = 40 },
628
+ .types = .{ .type1 = .Water, .type2 = .Water },
629
+ },
630
+ // Poliwhirl
631
+ .{
632
+ .stats = .{ .hp = 65, .atk = 65, .def = 65, .spe = 90, .spc = 50 },
633
+ .types = .{ .type1 = .Water, .type2 = .Water },
634
+ },
635
+ // Poliwrath
636
+ .{
637
+ .stats = .{ .hp = 90, .atk = 85, .def = 95, .spe = 70, .spc = 70 },
638
+ .types = .{ .type1 = .Water, .type2 = .Fighting },
639
+ },
640
+ // Abra
641
+ .{
642
+ .stats = .{ .hp = 25, .atk = 20, .def = 15, .spe = 90, .spc = 105 },
643
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
644
+ },
645
+ // Kadabra
646
+ .{
647
+ .stats = .{ .hp = 40, .atk = 35, .def = 30, .spe = 105, .spc = 120 },
648
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
649
+ },
650
+ // Alakazam
651
+ .{
652
+ .stats = .{ .hp = 55, .atk = 50, .def = 45, .spe = 120, .spc = 135 },
653
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
654
+ },
655
+ // Machop
656
+ .{
657
+ .stats = .{ .hp = 70, .atk = 80, .def = 50, .spe = 35, .spc = 35 },
658
+ .types = .{ .type1 = .Fighting, .type2 = .Fighting },
659
+ },
660
+ // Machoke
661
+ .{
662
+ .stats = .{ .hp = 80, .atk = 100, .def = 70, .spe = 45, .spc = 50 },
663
+ .types = .{ .type1 = .Fighting, .type2 = .Fighting },
664
+ },
665
+ // Machamp
666
+ .{
667
+ .stats = .{ .hp = 90, .atk = 130, .def = 80, .spe = 55, .spc = 65 },
668
+ .types = .{ .type1 = .Fighting, .type2 = .Fighting },
669
+ },
670
+ // Bellsprout
671
+ .{
672
+ .stats = .{ .hp = 50, .atk = 75, .def = 35, .spe = 40, .spc = 70 },
673
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
674
+ },
675
+ // Weepinbell
676
+ .{
677
+ .stats = .{ .hp = 65, .atk = 90, .def = 50, .spe = 55, .spc = 85 },
678
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
679
+ },
680
+ // Victreebel
681
+ .{
682
+ .stats = .{ .hp = 80, .atk = 105, .def = 65, .spe = 70, .spc = 100 },
683
+ .types = .{ .type1 = .Grass, .type2 = .Poison },
684
+ },
685
+ // Tentacool
686
+ .{
687
+ .stats = .{ .hp = 40, .atk = 40, .def = 35, .spe = 70, .spc = 100 },
688
+ .types = .{ .type1 = .Water, .type2 = .Poison },
689
+ },
690
+ // Tentacruel
691
+ .{
692
+ .stats = .{ .hp = 80, .atk = 70, .def = 65, .spe = 100, .spc = 120 },
693
+ .types = .{ .type1 = .Water, .type2 = .Poison },
694
+ },
695
+ // Geodude
696
+ .{
697
+ .stats = .{ .hp = 40, .atk = 80, .def = 100, .spe = 20, .spc = 30 },
698
+ .types = .{ .type1 = .Rock, .type2 = .Ground },
699
+ },
700
+ // Graveler
701
+ .{
702
+ .stats = .{ .hp = 55, .atk = 95, .def = 115, .spe = 35, .spc = 45 },
703
+ .types = .{ .type1 = .Rock, .type2 = .Ground },
704
+ },
705
+ // Golem
706
+ .{
707
+ .stats = .{ .hp = 80, .atk = 110, .def = 130, .spe = 45, .spc = 55 },
708
+ .types = .{ .type1 = .Rock, .type2 = .Ground },
709
+ },
710
+ // Ponyta
711
+ .{
712
+ .stats = .{ .hp = 50, .atk = 85, .def = 55, .spe = 90, .spc = 65 },
713
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
714
+ },
715
+ // Rapidash
716
+ .{
717
+ .stats = .{ .hp = 65, .atk = 100, .def = 70, .spe = 105, .spc = 80 },
718
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
719
+ },
720
+ // Slowpoke
721
+ .{
722
+ .stats = .{ .hp = 90, .atk = 65, .def = 65, .spe = 15, .spc = 40 },
723
+ .types = .{ .type1 = .Water, .type2 = .Psychic },
724
+ },
725
+ // Slowbro
726
+ .{
727
+ .stats = .{ .hp = 95, .atk = 75, .def = 110, .spe = 30, .spc = 80 },
728
+ .types = .{ .type1 = .Water, .type2 = .Psychic },
729
+ },
730
+ // Magnemite
731
+ .{
732
+ .stats = .{ .hp = 25, .atk = 35, .def = 70, .spe = 45, .spc = 95 },
733
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
734
+ },
735
+ // Magneton
736
+ .{
737
+ .stats = .{ .hp = 50, .atk = 60, .def = 95, .spe = 70, .spc = 120 },
738
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
739
+ },
740
+ // Farfetchd
741
+ .{
742
+ .stats = .{ .hp = 52, .atk = 65, .def = 55, .spe = 60, .spc = 58 },
743
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
744
+ },
745
+ // Doduo
746
+ .{
747
+ .stats = .{ .hp = 35, .atk = 85, .def = 45, .spe = 75, .spc = 35 },
748
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
749
+ },
750
+ // Dodrio
751
+ .{
752
+ .stats = .{ .hp = 60, .atk = 110, .def = 70, .spe = 100, .spc = 60 },
753
+ .types = .{ .type1 = .Normal, .type2 = .Flying },
754
+ },
755
+ // Seel
756
+ .{
757
+ .stats = .{ .hp = 65, .atk = 45, .def = 55, .spe = 45, .spc = 70 },
758
+ .types = .{ .type1 = .Water, .type2 = .Water },
759
+ },
760
+ // Dewgong
761
+ .{
762
+ .stats = .{ .hp = 90, .atk = 70, .def = 80, .spe = 70, .spc = 95 },
763
+ .types = .{ .type1 = .Water, .type2 = .Ice },
764
+ },
765
+ // Grimer
766
+ .{
767
+ .stats = .{ .hp = 80, .atk = 80, .def = 50, .spe = 25, .spc = 40 },
768
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
769
+ },
770
+ // Muk
771
+ .{
772
+ .stats = .{ .hp = 105, .atk = 105, .def = 75, .spe = 50, .spc = 65 },
773
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
774
+ },
775
+ // Shellder
776
+ .{
777
+ .stats = .{ .hp = 30, .atk = 65, .def = 100, .spe = 40, .spc = 45 },
778
+ .types = .{ .type1 = .Water, .type2 = .Water },
779
+ },
780
+ // Cloyster
781
+ .{
782
+ .stats = .{ .hp = 50, .atk = 95, .def = 180, .spe = 70, .spc = 85 },
783
+ .types = .{ .type1 = .Water, .type2 = .Ice },
784
+ },
785
+ // Gastly
786
+ .{
787
+ .stats = .{ .hp = 30, .atk = 35, .def = 30, .spe = 80, .spc = 100 },
788
+ .types = .{ .type1 = .Ghost, .type2 = .Poison },
789
+ },
790
+ // Haunter
791
+ .{
792
+ .stats = .{ .hp = 45, .atk = 50, .def = 45, .spe = 95, .spc = 115 },
793
+ .types = .{ .type1 = .Ghost, .type2 = .Poison },
794
+ },
795
+ // Gengar
796
+ .{
797
+ .stats = .{ .hp = 60, .atk = 65, .def = 60, .spe = 110, .spc = 130 },
798
+ .types = .{ .type1 = .Ghost, .type2 = .Poison },
799
+ },
800
+ // Onix
801
+ .{
802
+ .stats = .{ .hp = 35, .atk = 45, .def = 160, .spe = 70, .spc = 30 },
803
+ .types = .{ .type1 = .Rock, .type2 = .Ground },
804
+ },
805
+ // Drowzee
806
+ .{
807
+ .stats = .{ .hp = 60, .atk = 48, .def = 45, .spe = 42, .spc = 90 },
808
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
809
+ },
810
+ // Hypno
811
+ .{
812
+ .stats = .{ .hp = 85, .atk = 73, .def = 70, .spe = 67, .spc = 115 },
813
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
814
+ },
815
+ // Krabby
816
+ .{
817
+ .stats = .{ .hp = 30, .atk = 105, .def = 90, .spe = 50, .spc = 25 },
818
+ .types = .{ .type1 = .Water, .type2 = .Water },
819
+ },
820
+ // Kingler
821
+ .{
822
+ .stats = .{ .hp = 55, .atk = 130, .def = 115, .spe = 75, .spc = 50 },
823
+ .types = .{ .type1 = .Water, .type2 = .Water },
824
+ },
825
+ // Voltorb
826
+ .{
827
+ .stats = .{ .hp = 40, .atk = 30, .def = 50, .spe = 100, .spc = 55 },
828
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
829
+ },
830
+ // Electrode
831
+ .{
832
+ .stats = .{ .hp = 60, .atk = 50, .def = 70, .spe = 140, .spc = 80 },
833
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
834
+ },
835
+ // Exeggcute
836
+ .{
837
+ .stats = .{ .hp = 60, .atk = 40, .def = 80, .spe = 40, .spc = 60 },
838
+ .types = .{ .type1 = .Grass, .type2 = .Psychic },
839
+ },
840
+ // Exeggutor
841
+ .{
842
+ .stats = .{ .hp = 95, .atk = 95, .def = 85, .spe = 55, .spc = 125 },
843
+ .types = .{ .type1 = .Grass, .type2 = .Psychic },
844
+ },
845
+ // Cubone
846
+ .{
847
+ .stats = .{ .hp = 50, .atk = 50, .def = 95, .spe = 35, .spc = 40 },
848
+ .types = .{ .type1 = .Ground, .type2 = .Ground },
849
+ },
850
+ // Marowak
851
+ .{
852
+ .stats = .{ .hp = 60, .atk = 80, .def = 110, .spe = 45, .spc = 50 },
853
+ .types = .{ .type1 = .Ground, .type2 = .Ground },
854
+ },
855
+ // Hitmonlee
856
+ .{
857
+ .stats = .{ .hp = 50, .atk = 120, .def = 53, .spe = 87, .spc = 35 },
858
+ .types = .{ .type1 = .Fighting, .type2 = .Fighting },
859
+ },
860
+ // Hitmonchan
861
+ .{
862
+ .stats = .{ .hp = 50, .atk = 105, .def = 79, .spe = 76, .spc = 35 },
863
+ .types = .{ .type1 = .Fighting, .type2 = .Fighting },
864
+ },
865
+ // Lickitung
866
+ .{
867
+ .stats = .{ .hp = 90, .atk = 55, .def = 75, .spe = 30, .spc = 60 },
868
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
869
+ },
870
+ // Koffing
871
+ .{
872
+ .stats = .{ .hp = 40, .atk = 65, .def = 95, .spe = 35, .spc = 60 },
873
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
874
+ },
875
+ // Weezing
876
+ .{
877
+ .stats = .{ .hp = 65, .atk = 90, .def = 120, .spe = 60, .spc = 85 },
878
+ .types = .{ .type1 = .Poison, .type2 = .Poison },
879
+ },
880
+ // Rhyhorn
881
+ .{
882
+ .stats = .{ .hp = 80, .atk = 85, .def = 95, .spe = 25, .spc = 30 },
883
+ .types = .{ .type1 = .Ground, .type2 = .Rock },
884
+ },
885
+ // Rhydon
886
+ .{
887
+ .stats = .{ .hp = 105, .atk = 130, .def = 120, .spe = 40, .spc = 45 },
888
+ .types = .{ .type1 = .Ground, .type2 = .Rock },
889
+ },
890
+ // Chansey
891
+ .{
892
+ .stats = .{ .hp = 250, .atk = 5, .def = 5, .spe = 50, .spc = 105 },
893
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
894
+ },
895
+ // Tangela
896
+ .{
897
+ .stats = .{ .hp = 65, .atk = 55, .def = 115, .spe = 60, .spc = 100 },
898
+ .types = .{ .type1 = .Grass, .type2 = .Grass },
899
+ },
900
+ // Kangaskhan
901
+ .{
902
+ .stats = .{ .hp = 105, .atk = 95, .def = 80, .spe = 90, .spc = 40 },
903
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
904
+ },
905
+ // Horsea
906
+ .{
907
+ .stats = .{ .hp = 30, .atk = 40, .def = 70, .spe = 60, .spc = 70 },
908
+ .types = .{ .type1 = .Water, .type2 = .Water },
909
+ },
910
+ // Seadra
911
+ .{
912
+ .stats = .{ .hp = 55, .atk = 65, .def = 95, .spe = 85, .spc = 95 },
913
+ .types = .{ .type1 = .Water, .type2 = .Water },
914
+ },
915
+ // Goldeen
916
+ .{
917
+ .stats = .{ .hp = 45, .atk = 67, .def = 60, .spe = 63, .spc = 50 },
918
+ .types = .{ .type1 = .Water, .type2 = .Water },
919
+ },
920
+ // Seaking
921
+ .{
922
+ .stats = .{ .hp = 80, .atk = 92, .def = 65, .spe = 68, .spc = 80 },
923
+ .types = .{ .type1 = .Water, .type2 = .Water },
924
+ },
925
+ // Staryu
926
+ .{
927
+ .stats = .{ .hp = 30, .atk = 45, .def = 55, .spe = 85, .spc = 70 },
928
+ .types = .{ .type1 = .Water, .type2 = .Water },
929
+ },
930
+ // Starmie
931
+ .{
932
+ .stats = .{ .hp = 60, .atk = 75, .def = 85, .spe = 115, .spc = 100 },
933
+ .types = .{ .type1 = .Water, .type2 = .Psychic },
934
+ },
935
+ // MrMime
936
+ .{
937
+ .stats = .{ .hp = 40, .atk = 45, .def = 65, .spe = 90, .spc = 100 },
938
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
939
+ },
940
+ // Scyther
941
+ .{
942
+ .stats = .{ .hp = 70, .atk = 110, .def = 80, .spe = 105, .spc = 55 },
943
+ .types = .{ .type1 = .Bug, .type2 = .Flying },
944
+ },
945
+ // Jynx
946
+ .{
947
+ .stats = .{ .hp = 65, .atk = 50, .def = 35, .spe = 95, .spc = 95 },
948
+ .types = .{ .type1 = .Ice, .type2 = .Psychic },
949
+ },
950
+ // Electabuzz
951
+ .{
952
+ .stats = .{ .hp = 65, .atk = 83, .def = 57, .spe = 105, .spc = 85 },
953
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
954
+ },
955
+ // Magmar
956
+ .{
957
+ .stats = .{ .hp = 65, .atk = 95, .def = 57, .spe = 93, .spc = 85 },
958
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
959
+ },
960
+ // Pinsir
961
+ .{
962
+ .stats = .{ .hp = 65, .atk = 125, .def = 100, .spe = 85, .spc = 55 },
963
+ .types = .{ .type1 = .Bug, .type2 = .Bug },
964
+ },
965
+ // Tauros
966
+ .{
967
+ .stats = .{ .hp = 75, .atk = 100, .def = 95, .spe = 110, .spc = 70 },
968
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
969
+ },
970
+ // Magikarp
971
+ .{
972
+ .stats = .{ .hp = 20, .atk = 10, .def = 55, .spe = 80, .spc = 20 },
973
+ .types = .{ .type1 = .Water, .type2 = .Water },
974
+ },
975
+ // Gyarados
976
+ .{
977
+ .stats = .{ .hp = 95, .atk = 125, .def = 79, .spe = 81, .spc = 100 },
978
+ .types = .{ .type1 = .Water, .type2 = .Flying },
979
+ },
980
+ // Lapras
981
+ .{
982
+ .stats = .{ .hp = 130, .atk = 85, .def = 80, .spe = 60, .spc = 95 },
983
+ .types = .{ .type1 = .Water, .type2 = .Ice },
984
+ },
985
+ // Ditto
986
+ .{
987
+ .stats = .{ .hp = 48, .atk = 48, .def = 48, .spe = 48, .spc = 48 },
988
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
989
+ },
990
+ // Eevee
991
+ .{
992
+ .stats = .{ .hp = 55, .atk = 55, .def = 50, .spe = 55, .spc = 65 },
993
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
994
+ },
995
+ // Vaporeon
996
+ .{
997
+ .stats = .{ .hp = 130, .atk = 65, .def = 60, .spe = 65, .spc = 110 },
998
+ .types = .{ .type1 = .Water, .type2 = .Water },
999
+ },
1000
+ // Jolteon
1001
+ .{
1002
+ .stats = .{ .hp = 65, .atk = 65, .def = 60, .spe = 130, .spc = 110 },
1003
+ .types = .{ .type1 = .Electric, .type2 = .Electric },
1004
+ },
1005
+ // Flareon
1006
+ .{
1007
+ .stats = .{ .hp = 65, .atk = 130, .def = 60, .spe = 65, .spc = 110 },
1008
+ .types = .{ .type1 = .Fire, .type2 = .Fire },
1009
+ },
1010
+ // Porygon
1011
+ .{
1012
+ .stats = .{ .hp = 65, .atk = 60, .def = 70, .spe = 40, .spc = 75 },
1013
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
1014
+ },
1015
+ // Omanyte
1016
+ .{
1017
+ .stats = .{ .hp = 35, .atk = 40, .def = 100, .spe = 35, .spc = 90 },
1018
+ .types = .{ .type1 = .Rock, .type2 = .Water },
1019
+ },
1020
+ // Omastar
1021
+ .{
1022
+ .stats = .{ .hp = 70, .atk = 60, .def = 125, .spe = 55, .spc = 115 },
1023
+ .types = .{ .type1 = .Rock, .type2 = .Water },
1024
+ },
1025
+ // Kabuto
1026
+ .{
1027
+ .stats = .{ .hp = 30, .atk = 80, .def = 90, .spe = 55, .spc = 45 },
1028
+ .types = .{ .type1 = .Rock, .type2 = .Water },
1029
+ },
1030
+ // Kabutops
1031
+ .{
1032
+ .stats = .{ .hp = 60, .atk = 115, .def = 105, .spe = 80, .spc = 70 },
1033
+ .types = .{ .type1 = .Rock, .type2 = .Water },
1034
+ },
1035
+ // Aerodactyl
1036
+ .{
1037
+ .stats = .{ .hp = 80, .atk = 105, .def = 65, .spe = 130, .spc = 60 },
1038
+ .types = .{ .type1 = .Rock, .type2 = .Flying },
1039
+ },
1040
+ // Snorlax
1041
+ .{
1042
+ .stats = .{ .hp = 160, .atk = 110, .def = 65, .spe = 30, .spc = 65 },
1043
+ .types = .{ .type1 = .Normal, .type2 = .Normal },
1044
+ },
1045
+ // Articuno
1046
+ .{
1047
+ .stats = .{ .hp = 90, .atk = 85, .def = 100, .spe = 85, .spc = 125 },
1048
+ .types = .{ .type1 = .Ice, .type2 = .Flying },
1049
+ },
1050
+ // Zapdos
1051
+ .{
1052
+ .stats = .{ .hp = 90, .atk = 90, .def = 85, .spe = 100, .spc = 125 },
1053
+ .types = .{ .type1 = .Electric, .type2 = .Flying },
1054
+ },
1055
+ // Moltres
1056
+ .{
1057
+ .stats = .{ .hp = 90, .atk = 100, .def = 90, .spe = 90, .spc = 125 },
1058
+ .types = .{ .type1 = .Fire, .type2 = .Flying },
1059
+ },
1060
+ // Dratini
1061
+ .{
1062
+ .stats = .{ .hp = 41, .atk = 64, .def = 45, .spe = 50, .spc = 50 },
1063
+ .types = .{ .type1 = .Dragon, .type2 = .Dragon },
1064
+ },
1065
+ // Dragonair
1066
+ .{
1067
+ .stats = .{ .hp = 61, .atk = 84, .def = 65, .spe = 70, .spc = 70 },
1068
+ .types = .{ .type1 = .Dragon, .type2 = .Dragon },
1069
+ },
1070
+ // Dragonite
1071
+ .{
1072
+ .stats = .{ .hp = 91, .atk = 134, .def = 95, .spe = 80, .spc = 100 },
1073
+ .types = .{ .type1 = .Dragon, .type2 = .Flying },
1074
+ },
1075
+ // Mewtwo
1076
+ .{
1077
+ .stats = .{ .hp = 106, .atk = 110, .def = 90, .spe = 130, .spc = 154 },
1078
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
1079
+ },
1080
+ // Mew
1081
+ .{
1082
+ .stats = .{ .hp = 100, .atk = 100, .def = 100, .spe = 100, .spc = 100 },
1083
+ .types = .{ .type1 = .Psychic, .type2 = .Psychic },
1084
+ },
1085
+ };
1086
+
1087
+ comptime {
1088
+ assert(@sizeOf(Species) == 1);
1089
+ }
1090
+
1091
+ /// The number of Pokémon species in this generation.
1092
+ pub const size = 151;
1093
+
1094
+ /// The Pokémon's critical hit ratio out of 256.
1095
+ pub fn chance(id: Species) u8 {
1096
+ assert(id != .None);
1097
+ return CHANCES[@intFromEnum(id) - 1];
1098
+ }
1099
+
1100
+ /// Returns the `Data` corresponding to the species.
1101
+ pub fn get(id: Species) Data {
1102
+ assert(id != .None);
1103
+ return DATA[@intFromEnum(id) - 1];
1104
+ }
1105
+ };