@pkmn/engine 0.1.0-dev.d97c6e03 → 0.1.0-dev.da4a0515

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 +1 -3
  2. package/README.md +102 -68
  3. package/build/pkg/addon.d.ts +1 -1
  4. package/build/pkg/addon.js +13 -13
  5. package/build/pkg/addon.js.map +1 -1
  6. package/build/pkg/data/ids.json +12 -12
  7. package/build/pkg/data/layout.json +27 -5
  8. package/build/pkg/data/protocol.json +69 -12
  9. package/build/pkg/data.d.ts +4 -4
  10. package/build/pkg/data.js.map +1 -1
  11. package/build/pkg/gen1.d.ts +5 -4
  12. package/build/pkg/gen1.js +48 -32
  13. package/build/pkg/gen1.js.map +1 -1
  14. package/build/pkg/index.d.ts +17 -13
  15. package/build/pkg/index.js.map +1 -1
  16. package/build/pkg/protocol.d.ts +4 -2
  17. package/build/pkg/protocol.js +65 -44
  18. package/build/pkg/protocol.js.map +1 -1
  19. package/build/test/display.js +31 -14
  20. package/build/test/display.js.map +1 -1
  21. package/build/tools/debug.js +5 -4
  22. package/build/tools/debug.js.map +1 -1
  23. package/build.zig +157 -119
  24. package/package.json +56 -26
  25. package/src/bin/install-pkmn-engine +36 -23
  26. package/src/lib/common/battle.zig +17 -0
  27. package/src/lib/common/data.zig +19 -31
  28. package/src/lib/common/debug.zig +21 -11
  29. package/src/lib/common/js.zig +118 -0
  30. package/src/lib/common/optional.zig +67 -0
  31. package/src/lib/common/options.zig +12 -3
  32. package/src/lib/common/protocol.zig +942 -403
  33. package/src/lib/common/rational.zig +357 -0
  34. package/src/lib/common/rng.zig +35 -26
  35. package/src/lib/common/util.zig +12 -0
  36. package/src/lib/gen1/calc.zig +426 -0
  37. package/src/lib/gen1/chance.zig +1061 -0
  38. package/src/lib/gen1/data/moves.zig +202 -190
  39. package/src/lib/gen1/data/species.zig +5 -5
  40. package/src/lib/gen1/data/types.zig +10 -10
  41. package/src/lib/gen1/data.zig +101 -87
  42. package/src/lib/gen1/helpers.zig +602 -37
  43. package/src/lib/gen1/mechanics.zig +1086 -740
  44. package/src/lib/gen2/calc.zig +143 -0
  45. package/src/lib/gen2/chance.zig +1315 -0
  46. package/src/lib/gen2/data/items.zig +14 -20
  47. package/src/lib/gen2/data/moves.zig +664 -570
  48. package/src/lib/gen2/data/species.zig +2 -2
  49. package/src/lib/gen2/data/types.zig +137 -34
  50. package/src/lib/gen2/data.zig +130 -92
  51. package/src/lib/gen2/generated.zig +806 -0
  52. package/src/lib/gen2/helpers.zig +16 -22
  53. package/src/lib/gen2/mechanics.zig +3591 -12
  54. package/src/lib/node.zig +131 -0
  55. package/src/lib/pkmn.zig +88 -6
  56. package/src/lib/wasm.zig +13 -0
  57. package/src/lib/binding/node.zig +0 -229
  58. package/src/lib/binding/wasm.zig +0 -10
  59. package/src/lib/gen1/README.md +0 -791
  60. package/src/lib/gen2/README.md +0 -309
@@ -1,11 +1,13 @@
1
- //! Code generated by `tools/generate` - manual edits will be overwritten
1
+ //! Code generated by `tools/generate` - manual edits will be overwritten.
2
2
 
3
3
  const std = @import("std");
4
4
 
5
+ const rng = @import("../../common/rng.zig");
5
6
  const gen2 = @import("../../gen2/data.zig");
6
7
 
7
8
  const assert = std.debug.assert;
8
9
 
10
+ const percent = rng.Gen12.percent;
9
11
  const Type = gen2.Type;
10
12
 
11
13
  /// Representation of a Generation II Pokémon move.
@@ -271,17 +273,35 @@ pub const Move = enum(u8) {
271
273
  bp: u8,
272
274
  /// The move's type.
273
275
  type: Type,
274
- /// The move's base PP.
275
- pp: u8,
276
276
  /// The move's accuracy percentage.
277
277
  accuracy: u8,
278
278
  /// The move's targeting behavior.
279
279
  target: Target,
280
280
  /// The chance of the move's secondary effect occurring.
281
281
  chance: u8 = 0,
282
+ /// The priority of the move.
283
+ priority: i8 = 0,
284
+ /// Miscellaneous extra data/flags.
285
+ extra: Extra = .{},
286
+
287
+ /// Miscellaneous extra move related data/flags.
288
+ const Extra = packed struct(u8) {
289
+ /// Whether this move can be called via Metronome.
290
+ metronome: bool = true,
291
+ /// Whether this move can be called via Sleep Talk.
292
+ sleep_talk: bool = true,
293
+ /// Whether this move is considered to be "continuous".
294
+ continuous: bool = false,
295
+ /// Whether this move can hit a flying target.
296
+ flying: bool = false,
297
+ /// Whether this move can hit an underground target.
298
+ underground: bool = false,
299
+ /// Protocol reason offset associated with this move.
300
+ protocol: u3 = 0,
301
+ };
282
302
 
283
303
  comptime {
284
- assert(@sizeOf(Data) == 7);
304
+ assert(@sizeOf(Data) == 8);
285
305
  }
286
306
  };
287
307
 
@@ -291,8 +311,7 @@ pub const Move = enum(u8) {
291
311
  .effect = .None,
292
312
  .bp = 40,
293
313
  .type = .Normal,
294
- .pp = 35,
295
- .accuracy = 100,
314
+ .accuracy = percent(100),
296
315
  .target = .Other,
297
316
  },
298
317
  // KarateChop
@@ -300,8 +319,7 @@ pub const Move = enum(u8) {
300
319
  .effect = .HighCritical,
301
320
  .bp = 50,
302
321
  .type = .Fighting,
303
- .pp = 25,
304
- .accuracy = 100,
322
+ .accuracy = percent(100),
305
323
  .target = .Other,
306
324
  },
307
325
  // DoubleSlap
@@ -309,8 +327,7 @@ pub const Move = enum(u8) {
309
327
  .effect = .MultiHit,
310
328
  .bp = 15,
311
329
  .type = .Normal,
312
- .pp = 10,
313
- .accuracy = 85,
330
+ .accuracy = percent(85),
314
331
  .target = .Other,
315
332
  },
316
333
  // CometPunch
@@ -318,8 +335,7 @@ pub const Move = enum(u8) {
318
335
  .effect = .MultiHit,
319
336
  .bp = 18,
320
337
  .type = .Normal,
321
- .pp = 15,
322
- .accuracy = 85,
338
+ .accuracy = percent(85),
323
339
  .target = .Other,
324
340
  },
325
341
  // MegaPunch
@@ -327,8 +343,7 @@ pub const Move = enum(u8) {
327
343
  .effect = .None,
328
344
  .bp = 80,
329
345
  .type = .Normal,
330
- .pp = 20,
331
- .accuracy = 85,
346
+ .accuracy = percent(85),
332
347
  .target = .Other,
333
348
  },
334
349
  // PayDay
@@ -336,8 +351,7 @@ pub const Move = enum(u8) {
336
351
  .effect = .PayDay,
337
352
  .bp = 40,
338
353
  .type = .Normal,
339
- .pp = 20,
340
- .accuracy = 100,
354
+ .accuracy = percent(100),
341
355
  .target = .Other,
342
356
  },
343
357
  // FirePunch
@@ -345,38 +359,34 @@ pub const Move = enum(u8) {
345
359
  .effect = .BurnChance,
346
360
  .bp = 75,
347
361
  .type = .Fire,
348
- .pp = 15,
349
- .accuracy = 100,
362
+ .accuracy = percent(100),
350
363
  .target = .Other,
351
- .chance = 1, // * 10 = 10
364
+ .chance = percent(10),
352
365
  },
353
366
  // IcePunch
354
367
  .{
355
368
  .effect = .FreezeChance,
356
369
  .bp = 75,
357
370
  .type = .Ice,
358
- .pp = 15,
359
- .accuracy = 100,
371
+ .accuracy = percent(100),
360
372
  .target = .Other,
361
- .chance = 1, // * 10 = 10
373
+ .chance = percent(10),
362
374
  },
363
375
  // ThunderPunch
364
376
  .{
365
377
  .effect = .ParalyzeChance,
366
378
  .bp = 75,
367
379
  .type = .Electric,
368
- .pp = 15,
369
- .accuracy = 100,
380
+ .accuracy = percent(100),
370
381
  .target = .Other,
371
- .chance = 1, // * 10 = 10
382
+ .chance = percent(10),
372
383
  },
373
384
  // Scratch
374
385
  .{
375
386
  .effect = .None,
376
387
  .bp = 40,
377
388
  .type = .Normal,
378
- .pp = 35,
379
- .accuracy = 100,
389
+ .accuracy = percent(100),
380
390
  .target = .Other,
381
391
  },
382
392
  // ViseGrip
@@ -384,8 +394,7 @@ pub const Move = enum(u8) {
384
394
  .effect = .None,
385
395
  .bp = 55,
386
396
  .type = .Normal,
387
- .pp = 30,
388
- .accuracy = 100,
397
+ .accuracy = percent(100),
389
398
  .target = .Other,
390
399
  },
391
400
  // Guillotine
@@ -393,8 +402,7 @@ pub const Move = enum(u8) {
393
402
  .effect = .OHKO,
394
403
  .bp = 0,
395
404
  .type = .Normal,
396
- .pp = 5,
397
- .accuracy = 30,
405
+ .accuracy = percent(30),
398
406
  .target = .Other,
399
407
  },
400
408
  // RazorWind
@@ -402,17 +410,16 @@ pub const Move = enum(u8) {
402
410
  .effect = .RazorWind,
403
411
  .bp = 80,
404
412
  .type = .Normal,
405
- .pp = 10,
406
- .accuracy = 75,
413
+ .accuracy = percent(75),
407
414
  .target = .Foes,
415
+ .extra = .{ .sleep_talk = false, .continuous = true },
408
416
  },
409
417
  // SwordsDance
410
418
  .{
411
419
  .effect = .AttackUp2,
412
420
  .bp = 0,
413
421
  .type = .Normal,
414
- .pp = 30,
415
- .accuracy = 100,
422
+ .accuracy = percent(100),
416
423
  .target = .Self,
417
424
  },
418
425
  // Cut
@@ -420,8 +427,7 @@ pub const Move = enum(u8) {
420
427
  .effect = .None,
421
428
  .bp = 50,
422
429
  .type = .Normal,
423
- .pp = 30,
424
- .accuracy = 95,
430
+ .accuracy = percent(95),
425
431
  .target = .Other,
426
432
  },
427
433
  // Gust
@@ -429,17 +435,16 @@ pub const Move = enum(u8) {
429
435
  .effect = .Gust,
430
436
  .bp = 40,
431
437
  .type = .Flying,
432
- .pp = 35,
433
- .accuracy = 100,
438
+ .accuracy = percent(100),
434
439
  .target = .Any,
440
+ .extra = .{ .flying = true },
435
441
  },
436
442
  // WingAttack
437
443
  .{
438
444
  .effect = .None,
439
445
  .bp = 60,
440
446
  .type = .Flying,
441
- .pp = 35,
442
- .accuracy = 100,
447
+ .accuracy = percent(100),
443
448
  .target = .Any,
444
449
  },
445
450
  // Whirlwind
@@ -447,35 +452,35 @@ pub const Move = enum(u8) {
447
452
  .effect = .ForceSwitch,
448
453
  .bp = 0,
449
454
  .type = .Normal,
450
- .pp = 20,
451
- .accuracy = 100,
455
+ .accuracy = percent(100),
452
456
  .target = .Other,
457
+ .priority = -1,
458
+ .extra = .{ .flying = true },
453
459
  },
454
460
  // Fly
455
461
  .{
456
- .effect = .Fly,
462
+ .effect = .FlyDig,
457
463
  .bp = 70,
458
464
  .type = .Flying,
459
- .pp = 15,
460
- .accuracy = 95,
465
+ .accuracy = percent(95),
461
466
  .target = .Any,
467
+ .extra = .{ .sleep_talk = false, .continuous = true },
462
468
  },
463
469
  // Bind
464
470
  .{
465
471
  .effect = .Binding,
466
472
  .bp = 15,
467
473
  .type = .Normal,
468
- .pp = 20,
469
- .accuracy = 75,
474
+ .accuracy = percent(75),
470
475
  .target = .Other,
476
+ .extra = .{ .protocol = 1 },
471
477
  },
472
478
  // Slam
473
479
  .{
474
480
  .effect = .None,
475
481
  .bp = 80,
476
482
  .type = .Normal,
477
- .pp = 20,
478
- .accuracy = 75,
483
+ .accuracy = percent(75),
479
484
  .target = .Other,
480
485
  },
481
486
  // VineWhip
@@ -483,8 +488,7 @@ pub const Move = enum(u8) {
483
488
  .effect = .None,
484
489
  .bp = 35,
485
490
  .type = .Grass,
486
- .pp = 10,
487
- .accuracy = 100,
491
+ .accuracy = percent(100),
488
492
  .target = .Other,
489
493
  },
490
494
  // Stomp
@@ -492,18 +496,16 @@ pub const Move = enum(u8) {
492
496
  .effect = .Stomp,
493
497
  .bp = 65,
494
498
  .type = .Normal,
495
- .pp = 20,
496
- .accuracy = 100,
499
+ .accuracy = percent(100),
497
500
  .target = .Other,
498
- .chance = 3, // * 10 = 30
501
+ .chance = percent(30),
499
502
  },
500
503
  // DoubleKick
501
504
  .{
502
505
  .effect = .DoubleHit,
503
506
  .bp = 30,
504
507
  .type = .Fighting,
505
- .pp = 30,
506
- .accuracy = 100,
508
+ .accuracy = percent(100),
507
509
  .target = .Other,
508
510
  },
509
511
  // MegaKick
@@ -511,8 +513,7 @@ pub const Move = enum(u8) {
511
513
  .effect = .None,
512
514
  .bp = 120,
513
515
  .type = .Normal,
514
- .pp = 5,
515
- .accuracy = 75,
516
+ .accuracy = percent(75),
516
517
  .target = .Other,
517
518
  },
518
519
  // JumpKick
@@ -520,8 +521,7 @@ pub const Move = enum(u8) {
520
521
  .effect = .JumpKick,
521
522
  .bp = 70,
522
523
  .type = .Fighting,
523
- .pp = 25,
524
- .accuracy = 95,
524
+ .accuracy = percent(95),
525
525
  .target = .Other,
526
526
  },
527
527
  // RollingKick
@@ -529,18 +529,16 @@ pub const Move = enum(u8) {
529
529
  .effect = .FlinchChance,
530
530
  .bp = 60,
531
531
  .type = .Fighting,
532
- .pp = 15,
533
- .accuracy = 85,
532
+ .accuracy = percent(85),
534
533
  .target = .Other,
535
- .chance = 3, // * 10 = 30
534
+ .chance = percent(30),
536
535
  },
537
536
  // SandAttack
538
537
  .{
539
538
  .effect = .AccuracyDown1,
540
539
  .bp = 0,
541
540
  .type = .Ground,
542
- .pp = 15,
543
- .accuracy = 100,
541
+ .accuracy = percent(100),
544
542
  .target = .Other,
545
543
  },
546
544
  // Headbutt
@@ -548,18 +546,16 @@ pub const Move = enum(u8) {
548
546
  .effect = .FlinchChance,
549
547
  .bp = 70,
550
548
  .type = .Normal,
551
- .pp = 15,
552
- .accuracy = 100,
549
+ .accuracy = percent(100),
553
550
  .target = .Other,
554
- .chance = 3, // * 10 = 30
551
+ .chance = percent(30),
555
552
  },
556
553
  // HornAttack
557
554
  .{
558
555
  .effect = .None,
559
556
  .bp = 65,
560
557
  .type = .Normal,
561
- .pp = 25,
562
- .accuracy = 100,
558
+ .accuracy = percent(100),
563
559
  .target = .Other,
564
560
  },
565
561
  // FuryAttack
@@ -567,8 +563,7 @@ pub const Move = enum(u8) {
567
563
  .effect = .MultiHit,
568
564
  .bp = 15,
569
565
  .type = .Normal,
570
- .pp = 20,
571
- .accuracy = 85,
566
+ .accuracy = percent(85),
572
567
  .target = .Other,
573
568
  },
574
569
  // HornDrill
@@ -576,8 +571,7 @@ pub const Move = enum(u8) {
576
571
  .effect = .OHKO,
577
572
  .bp = 0,
578
573
  .type = .Normal,
579
- .pp = 5,
580
- .accuracy = 30,
574
+ .accuracy = percent(30),
581
575
  .target = .Other,
582
576
  },
583
577
  // Tackle
@@ -585,8 +579,7 @@ pub const Move = enum(u8) {
585
579
  .effect = .None,
586
580
  .bp = 35,
587
581
  .type = .Normal,
588
- .pp = 35,
589
- .accuracy = 95,
582
+ .accuracy = percent(95),
590
583
  .target = .Other,
591
584
  },
592
585
  // BodySlam
@@ -594,27 +587,25 @@ pub const Move = enum(u8) {
594
587
  .effect = .ParalyzeChance,
595
588
  .bp = 85,
596
589
  .type = .Normal,
597
- .pp = 15,
598
- .accuracy = 100,
590
+ .accuracy = percent(100),
599
591
  .target = .Other,
600
- .chance = 3, // * 10 = 30
592
+ .chance = percent(30),
601
593
  },
602
594
  // Wrap
603
595
  .{
604
596
  .effect = .Binding,
605
597
  .bp = 15,
606
598
  .type = .Normal,
607
- .pp = 20,
608
- .accuracy = 85,
599
+ .accuracy = percent(85),
609
600
  .target = .Other,
601
+ .extra = .{ .protocol = 2 },
610
602
  },
611
603
  // TakeDown
612
604
  .{
613
605
  .effect = .Recoil,
614
606
  .bp = 90,
615
607
  .type = .Normal,
616
- .pp = 20,
617
- .accuracy = 85,
608
+ .accuracy = percent(85),
618
609
  .target = .Other,
619
610
  },
620
611
  // Thrash
@@ -622,17 +613,16 @@ pub const Move = enum(u8) {
622
613
  .effect = .Thrashing,
623
614
  .bp = 90,
624
615
  .type = .Normal,
625
- .pp = 20,
626
- .accuracy = 100,
616
+ .accuracy = percent(100),
627
617
  .target = .RandomFoe,
618
+ .extra = .{ .continuous = true },
628
619
  },
629
620
  // DoubleEdge
630
621
  .{
631
622
  .effect = .Recoil,
632
623
  .bp = 120,
633
624
  .type = .Normal,
634
- .pp = 15,
635
- .accuracy = 100,
625
+ .accuracy = percent(100),
636
626
  .target = .Other,
637
627
  },
638
628
  // TailWhip
@@ -640,8 +630,7 @@ pub const Move = enum(u8) {
640
630
  .effect = .DefenseDown1,
641
631
  .bp = 0,
642
632
  .type = .Normal,
643
- .pp = 30,
644
- .accuracy = 100,
633
+ .accuracy = percent(100),
645
634
  .target = .Foes,
646
635
  },
647
636
  // PoisonSting
@@ -649,28 +638,25 @@ pub const Move = enum(u8) {
649
638
  .effect = .PoisonChance,
650
639
  .bp = 15,
651
640
  .type = .Poison,
652
- .pp = 35,
653
- .accuracy = 100,
641
+ .accuracy = percent(100),
654
642
  .target = .Other,
655
- .chance = 3, // * 10 = 30
643
+ .chance = percent(30),
656
644
  },
657
645
  // Twineedle
658
646
  .{
659
647
  .effect = .Twineedle,
660
648
  .bp = 25,
661
649
  .type = .Bug,
662
- .pp = 20,
663
- .accuracy = 100,
650
+ .accuracy = percent(100),
664
651
  .target = .Other,
665
- .chance = 2, // * 10 = 20
652
+ .chance = percent(20),
666
653
  },
667
654
  // PinMissile
668
655
  .{
669
656
  .effect = .MultiHit,
670
657
  .bp = 14,
671
658
  .type = .Bug,
672
- .pp = 20,
673
- .accuracy = 85,
659
+ .accuracy = percent(85),
674
660
  .target = .Other,
675
661
  },
676
662
  // Leer
@@ -678,8 +664,7 @@ pub const Move = enum(u8) {
678
664
  .effect = .DefenseDown1,
679
665
  .bp = 0,
680
666
  .type = .Normal,
681
- .pp = 30,
682
- .accuracy = 100,
667
+ .accuracy = percent(100),
683
668
  .target = .Foes,
684
669
  },
685
670
  // Bite
@@ -687,18 +672,16 @@ pub const Move = enum(u8) {
687
672
  .effect = .FlinchChance,
688
673
  .bp = 60,
689
674
  .type = .Dark,
690
- .pp = 25,
691
- .accuracy = 100,
675
+ .accuracy = percent(100),
692
676
  .target = .Other,
693
- .chance = 3, // * 10 = 30
677
+ .chance = percent(30),
694
678
  },
695
679
  // Growl
696
680
  .{
697
681
  .effect = .AttackDown1,
698
682
  .bp = 0,
699
683
  .type = .Normal,
700
- .pp = 40,
701
- .accuracy = 100,
684
+ .accuracy = percent(100),
702
685
  .target = .Foes,
703
686
  },
704
687
  // Roar
@@ -706,17 +689,16 @@ pub const Move = enum(u8) {
706
689
  .effect = .ForceSwitch,
707
690
  .bp = 0,
708
691
  .type = .Normal,
709
- .pp = 20,
710
- .accuracy = 100,
692
+ .accuracy = percent(100),
711
693
  .target = .Other,
694
+ .priority = -1,
712
695
  },
713
696
  // Sing
714
697
  .{
715
698
  .effect = .Sleep,
716
699
  .bp = 0,
717
700
  .type = .Normal,
718
- .pp = 15,
719
- .accuracy = 55,
701
+ .accuracy = percent(55),
720
702
  .target = .Other,
721
703
  },
722
704
  // Supersonic
@@ -724,8 +706,7 @@ pub const Move = enum(u8) {
724
706
  .effect = .Confusion,
725
707
  .bp = 0,
726
708
  .type = .Normal,
727
- .pp = 20,
728
- .accuracy = 55,
709
+ .accuracy = percent(55),
729
710
  .target = .Other,
730
711
  },
731
712
  // SonicBoom
@@ -733,8 +714,7 @@ pub const Move = enum(u8) {
733
714
  .effect = .FixedDamage,
734
715
  .bp = 0,
735
716
  .type = .Normal,
736
- .pp = 20,
737
- .accuracy = 90,
717
+ .accuracy = percent(90),
738
718
  .target = .Other,
739
719
  },
740
720
  // Disable
@@ -742,8 +722,7 @@ pub const Move = enum(u8) {
742
722
  .effect = .Disable,
743
723
  .bp = 0,
744
724
  .type = .Normal,
745
- .pp = 20,
746
- .accuracy = 55,
725
+ .accuracy = percent(55),
747
726
  .target = .Other,
748
727
  },
749
728
  // Acid
@@ -751,38 +730,34 @@ pub const Move = enum(u8) {
751
730
  .effect = .DefenseDownChance,
752
731
  .bp = 40,
753
732
  .type = .Poison,
754
- .pp = 30,
755
- .accuracy = 100,
733
+ .accuracy = percent(100),
756
734
  .target = .Foes,
757
- .chance = 1, // * 10 = 10
735
+ .chance = percent(10),
758
736
  },
759
737
  // Ember
760
738
  .{
761
739
  .effect = .BurnChance,
762
740
  .bp = 40,
763
741
  .type = .Fire,
764
- .pp = 25,
765
- .accuracy = 100,
742
+ .accuracy = percent(100),
766
743
  .target = .Other,
767
- .chance = 1, // * 10 = 10
744
+ .chance = percent(10),
768
745
  },
769
746
  // Flamethrower
770
747
  .{
771
748
  .effect = .BurnChance,
772
749
  .bp = 95,
773
750
  .type = .Fire,
774
- .pp = 15,
775
- .accuracy = 100,
751
+ .accuracy = percent(100),
776
752
  .target = .Other,
777
- .chance = 1, // * 10 = 10
753
+ .chance = percent(10),
778
754
  },
779
755
  // Mist
780
756
  .{
781
757
  .effect = .Mist,
782
758
  .bp = 0,
783
759
  .type = .Ice,
784
- .pp = 30,
785
- .accuracy = 100,
760
+ .accuracy = percent(100),
786
761
  .target = .Self,
787
762
  },
788
763
  // WaterGun
@@ -790,8 +765,7 @@ pub const Move = enum(u8) {
790
765
  .effect = .None,
791
766
  .bp = 40,
792
767
  .type = .Water,
793
- .pp = 25,
794
- .accuracy = 100,
768
+ .accuracy = percent(100),
795
769
  .target = .Other,
796
770
  },
797
771
  // HydroPump
@@ -799,8 +773,7 @@ pub const Move = enum(u8) {
799
773
  .effect = .None,
800
774
  .bp = 120,
801
775
  .type = .Water,
802
- .pp = 5,
803
- .accuracy = 80,
776
+ .accuracy = percent(80),
804
777
  .target = .Other,
805
778
  },
806
779
  // Surf
@@ -808,8 +781,7 @@ pub const Move = enum(u8) {
808
781
  .effect = .None,
809
782
  .bp = 95,
810
783
  .type = .Water,
811
- .pp = 15,
812
- .accuracy = 100,
784
+ .accuracy = percent(100),
813
785
  .target = .Foes,
814
786
  },
815
787
  // IceBeam
@@ -817,58 +789,52 @@ pub const Move = enum(u8) {
817
789
  .effect = .FreezeChance,
818
790
  .bp = 95,
819
791
  .type = .Ice,
820
- .pp = 10,
821
- .accuracy = 100,
792
+ .accuracy = percent(100),
822
793
  .target = .Other,
823
- .chance = 1, // * 10 = 10
794
+ .chance = percent(10),
824
795
  },
825
796
  // Blizzard
826
797
  .{
827
798
  .effect = .FreezeChance,
828
799
  .bp = 120,
829
800
  .type = .Ice,
830
- .pp = 5,
831
- .accuracy = 70,
801
+ .accuracy = percent(70),
832
802
  .target = .Foes,
833
- .chance = 1, // * 10 = 10
803
+ .chance = percent(10),
834
804
  },
835
805
  // Psybeam
836
806
  .{
837
807
  .effect = .ConfusionChance,
838
808
  .bp = 65,
839
809
  .type = .Psychic,
840
- .pp = 20,
841
- .accuracy = 100,
810
+ .accuracy = percent(100),
842
811
  .target = .Other,
843
- .chance = 1, // * 10 = 10
812
+ .chance = percent(10),
844
813
  },
845
814
  // BubbleBeam
846
815
  .{
847
816
  .effect = .SpeedDownChance,
848
817
  .bp = 65,
849
818
  .type = .Water,
850
- .pp = 20,
851
- .accuracy = 100,
819
+ .accuracy = percent(100),
852
820
  .target = .Other,
853
- .chance = 1, // * 10 = 10
821
+ .chance = percent(10),
854
822
  },
855
823
  // AuroraBeam
856
824
  .{
857
825
  .effect = .AttackDownChance,
858
826
  .bp = 65,
859
827
  .type = .Ice,
860
- .pp = 20,
861
- .accuracy = 100,
828
+ .accuracy = percent(100),
862
829
  .target = .Other,
863
- .chance = 1, // * 10 = 10
830
+ .chance = percent(10),
864
831
  },
865
832
  // HyperBeam
866
833
  .{
867
834
  .effect = .HyperBeam,
868
835
  .bp = 150,
869
836
  .type = .Normal,
870
- .pp = 5,
871
- .accuracy = 90,
837
+ .accuracy = percent(90),
872
838
  .target = .Other,
873
839
  },
874
840
  // Peck
@@ -876,8 +842,7 @@ pub const Move = enum(u8) {
876
842
  .effect = .None,
877
843
  .bp = 35,
878
844
  .type = .Flying,
879
- .pp = 35,
880
- .accuracy = 100,
845
+ .accuracy = percent(100),
881
846
  .target = .Any,
882
847
  },
883
848
  // DrillPeck
@@ -885,8 +850,7 @@ pub const Move = enum(u8) {
885
850
  .effect = .None,
886
851
  .bp = 80,
887
852
  .type = .Flying,
888
- .pp = 20,
889
- .accuracy = 100,
853
+ .accuracy = percent(100),
890
854
  .target = .Any,
891
855
  },
892
856
  // Submission
@@ -894,8 +858,7 @@ pub const Move = enum(u8) {
894
858
  .effect = .Recoil,
895
859
  .bp = 80,
896
860
  .type = .Fighting,
897
- .pp = 25,
898
- .accuracy = 80,
861
+ .accuracy = percent(80),
899
862
  .target = .Other,
900
863
  },
901
864
  // LowKick
@@ -903,27 +866,26 @@ pub const Move = enum(u8) {
903
866
  .effect = .FlinchChance,
904
867
  .bp = 50,
905
868
  .type = .Fighting,
906
- .pp = 20,
907
- .accuracy = 90,
869
+ .accuracy = percent(90),
908
870
  .target = .Other,
909
- .chance = 3, // * 10 = 30
871
+ .chance = percent(30),
910
872
  },
911
873
  // Counter
912
874
  .{
913
875
  .effect = .Counter,
914
876
  .bp = 0,
915
877
  .type = .Fighting,
916
- .pp = 20,
917
- .accuracy = 100,
878
+ .accuracy = percent(100),
918
879
  .target = .Depends,
880
+ .priority = -1,
881
+ .extra = .{ .metronome = false },
919
882
  },
920
883
  // SeismicToss
921
884
  .{
922
885
  .effect = .LevelDamage,
923
886
  .bp = 0,
924
887
  .type = .Fighting,
925
- .pp = 20,
926
- .accuracy = 100,
888
+ .accuracy = percent(100),
927
889
  .target = .Other,
928
890
  },
929
891
  // Strength
@@ -931,8 +893,7 @@ pub const Move = enum(u8) {
931
893
  .effect = .None,
932
894
  .bp = 80,
933
895
  .type = .Normal,
934
- .pp = 15,
935
- .accuracy = 100,
896
+ .accuracy = percent(100),
936
897
  .target = .Other,
937
898
  },
938
899
  // Absorb
@@ -940,8 +901,7 @@ pub const Move = enum(u8) {
940
901
  .effect = .DrainHP,
941
902
  .bp = 20,
942
903
  .type = .Grass,
943
- .pp = 20,
944
- .accuracy = 100,
904
+ .accuracy = percent(100),
945
905
  .target = .Other,
946
906
  },
947
907
  // MegaDrain
@@ -949,8 +909,7 @@ pub const Move = enum(u8) {
949
909
  .effect = .DrainHP,
950
910
  .bp = 40,
951
911
  .type = .Grass,
952
- .pp = 10,
953
- .accuracy = 100,
912
+ .accuracy = percent(100),
954
913
  .target = .Other,
955
914
  },
956
915
  // LeechSeed
@@ -958,8 +917,7 @@ pub const Move = enum(u8) {
958
917
  .effect = .LeechSeed,
959
918
  .bp = 0,
960
919
  .type = .Grass,
961
- .pp = 10,
962
- .accuracy = 90,
920
+ .accuracy = percent(90),
963
921
  .target = .Other,
964
922
  },
965
923
  // Growth
@@ -967,8 +925,7 @@ pub const Move = enum(u8) {
967
925
  .effect = .SpAtkUp1,
968
926
  .bp = 0,
969
927
  .type = .Normal,
970
- .pp = 40,
971
- .accuracy = 100,
928
+ .accuracy = percent(100),
972
929
  .target = .Self,
973
930
  },
974
931
  // RazorLeaf
@@ -976,26 +933,24 @@ pub const Move = enum(u8) {
976
933
  .effect = .HighCritical,
977
934
  .bp = 55,
978
935
  .type = .Grass,
979
- .pp = 25,
980
- .accuracy = 95,
936
+ .accuracy = percent(95),
981
937
  .target = .Foes,
982
938
  },
983
939
  // SolarBeam
984
940
  .{
985
- .effect = .Solarbeam,
941
+ .effect = .SolarBeam,
986
942
  .bp = 120,
987
943
  .type = .Grass,
988
- .pp = 10,
989
- .accuracy = 100,
944
+ .accuracy = percent(100),
990
945
  .target = .Other,
946
+ .extra = .{ .sleep_talk = false, .continuous = true },
991
947
  },
992
948
  // PoisonPowder
993
949
  .{
994
950
  .effect = .Poison,
995
951
  .bp = 0,
996
952
  .type = .Poison,
997
- .pp = 35,
998
- .accuracy = 75,
953
+ .accuracy = percent(75),
999
954
  .target = .Other,
1000
955
  },
1001
956
  // StunSpore
@@ -1003,8 +958,7 @@ pub const Move = enum(u8) {
1003
958
  .effect = .Paralyze,
1004
959
  .bp = 0,
1005
960
  .type = .Grass,
1006
- .pp = 30,
1007
- .accuracy = 75,
961
+ .accuracy = percent(75),
1008
962
  .target = .Other,
1009
963
  },
1010
964
  // SleepPowder
@@ -1012,8 +966,7 @@ pub const Move = enum(u8) {
1012
966
  .effect = .Sleep,
1013
967
  .bp = 0,
1014
968
  .type = .Grass,
1015
- .pp = 15,
1016
- .accuracy = 75,
969
+ .accuracy = percent(75),
1017
970
  .target = .Other,
1018
971
  },
1019
972
  // PetalDance
@@ -1021,17 +974,16 @@ pub const Move = enum(u8) {
1021
974
  .effect = .Thrashing,
1022
975
  .bp = 70,
1023
976
  .type = .Grass,
1024
- .pp = 20,
1025
- .accuracy = 100,
977
+ .accuracy = percent(100),
1026
978
  .target = .RandomFoe,
979
+ .extra = .{ .continuous = true },
1027
980
  },
1028
981
  // StringShot
1029
982
  .{
1030
983
  .effect = .SpeedDown1,
1031
984
  .bp = 0,
1032
985
  .type = .Bug,
1033
- .pp = 40,
1034
- .accuracy = 95,
986
+ .accuracy = percent(95),
1035
987
  .target = .Foes,
1036
988
  },
1037
989
  // DragonRage
@@ -1039,8 +991,7 @@ pub const Move = enum(u8) {
1039
991
  .effect = .FixedDamage,
1040
992
  .bp = 0,
1041
993
  .type = .Dragon,
1042
- .pp = 10,
1043
- .accuracy = 100,
994
+ .accuracy = percent(100),
1044
995
  .target = .Other,
1045
996
  },
1046
997
  // FireSpin
@@ -1048,37 +999,34 @@ pub const Move = enum(u8) {
1048
999
  .effect = .Binding,
1049
1000
  .bp = 15,
1050
1001
  .type = .Fire,
1051
- .pp = 15,
1052
- .accuracy = 70,
1002
+ .accuracy = percent(70),
1053
1003
  .target = .Other,
1004
+ .extra = .{ .protocol = 3 },
1054
1005
  },
1055
1006
  // ThunderShock
1056
1007
  .{
1057
1008
  .effect = .ParalyzeChance,
1058
1009
  .bp = 40,
1059
1010
  .type = .Electric,
1060
- .pp = 30,
1061
- .accuracy = 100,
1011
+ .accuracy = percent(100),
1062
1012
  .target = .Other,
1063
- .chance = 1, // * 10 = 10
1013
+ .chance = percent(10),
1064
1014
  },
1065
1015
  // Thunderbolt
1066
1016
  .{
1067
1017
  .effect = .ParalyzeChance,
1068
1018
  .bp = 95,
1069
1019
  .type = .Electric,
1070
- .pp = 15,
1071
- .accuracy = 100,
1020
+ .accuracy = percent(100),
1072
1021
  .target = .Other,
1073
- .chance = 1, // * 10 = 10
1022
+ .chance = percent(10),
1074
1023
  },
1075
1024
  // ThunderWave
1076
1025
  .{
1077
1026
  .effect = .Paralyze,
1078
1027
  .bp = 0,
1079
1028
  .type = .Electric,
1080
- .pp = 20,
1081
- .accuracy = 100,
1029
+ .accuracy = percent(100),
1082
1030
  .target = .Other,
1083
1031
  },
1084
1032
  // Thunder
@@ -1086,18 +1034,17 @@ pub const Move = enum(u8) {
1086
1034
  .effect = .Thunder,
1087
1035
  .bp = 120,
1088
1036
  .type = .Electric,
1089
- .pp = 10,
1090
- .accuracy = 70,
1037
+ .accuracy = percent(70),
1091
1038
  .target = .Other,
1092
- .chance = 3, // * 10 = 30
1039
+ .chance = percent(30),
1040
+ .extra = .{ .flying = true },
1093
1041
  },
1094
1042
  // RockThrow
1095
1043
  .{
1096
1044
  .effect = .None,
1097
1045
  .bp = 50,
1098
1046
  .type = .Rock,
1099
- .pp = 15,
1100
- .accuracy = 90,
1047
+ .accuracy = percent(90),
1101
1048
  .target = .Other,
1102
1049
  },
1103
1050
  // Earthquake
@@ -1105,35 +1052,34 @@ pub const Move = enum(u8) {
1105
1052
  .effect = .Earthquake,
1106
1053
  .bp = 100,
1107
1054
  .type = .Ground,
1108
- .pp = 10,
1109
- .accuracy = 100,
1055
+ .accuracy = percent(100),
1110
1056
  .target = .AllOthers,
1057
+ .extra = .{ .underground = true },
1111
1058
  },
1112
1059
  // Fissure
1113
1060
  .{
1114
1061
  .effect = .OHKO,
1115
1062
  .bp = 0,
1116
1063
  .type = .Ground,
1117
- .pp = 5,
1118
- .accuracy = 30,
1064
+ .accuracy = percent(30),
1119
1065
  .target = .Other,
1066
+ .extra = .{ .underground = true },
1120
1067
  },
1121
1068
  // Dig
1122
1069
  .{
1123
- .effect = .Fly,
1070
+ .effect = .FlyDig,
1124
1071
  .bp = 60,
1125
1072
  .type = .Ground,
1126
- .pp = 10,
1127
- .accuracy = 100,
1073
+ .accuracy = percent(100),
1128
1074
  .target = .Other,
1075
+ .extra = .{ .sleep_talk = false },
1129
1076
  },
1130
1077
  // Toxic
1131
1078
  .{
1132
1079
  .effect = .Toxic,
1133
1080
  .bp = 0,
1134
1081
  .type = .Poison,
1135
- .pp = 10,
1136
- .accuracy = 85,
1082
+ .accuracy = percent(85),
1137
1083
  .target = .Other,
1138
1084
  },
1139
1085
  // Confusion
@@ -1141,28 +1087,25 @@ pub const Move = enum(u8) {
1141
1087
  .effect = .ConfusionChance,
1142
1088
  .bp = 50,
1143
1089
  .type = .Psychic,
1144
- .pp = 25,
1145
- .accuracy = 100,
1090
+ .accuracy = percent(100),
1146
1091
  .target = .Other,
1147
- .chance = 1, // * 10 = 10
1092
+ .chance = percent(10),
1148
1093
  },
1149
1094
  // Psychic
1150
1095
  .{
1151
1096
  .effect = .SpDefDownChance,
1152
1097
  .bp = 90,
1153
1098
  .type = .Psychic,
1154
- .pp = 10,
1155
- .accuracy = 100,
1099
+ .accuracy = percent(100),
1156
1100
  .target = .Other,
1157
- .chance = 1, // * 10 = 10
1101
+ .chance = percent(10),
1158
1102
  },
1159
1103
  // Hypnosis
1160
1104
  .{
1161
1105
  .effect = .Sleep,
1162
1106
  .bp = 0,
1163
1107
  .type = .Psychic,
1164
- .pp = 20,
1165
- .accuracy = 60,
1108
+ .accuracy = percent(60),
1166
1109
  .target = .Other,
1167
1110
  },
1168
1111
  // Meditate
@@ -1170,8 +1113,7 @@ pub const Move = enum(u8) {
1170
1113
  .effect = .AttackUp1,
1171
1114
  .bp = 0,
1172
1115
  .type = .Psychic,
1173
- .pp = 40,
1174
- .accuracy = 100,
1116
+ .accuracy = percent(100),
1175
1117
  .target = .Self,
1176
1118
  },
1177
1119
  // Agility
@@ -1179,8 +1121,7 @@ pub const Move = enum(u8) {
1179
1121
  .effect = .SpeedUp2,
1180
1122
  .bp = 0,
1181
1123
  .type = .Psychic,
1182
- .pp = 30,
1183
- .accuracy = 100,
1124
+ .accuracy = percent(100),
1184
1125
  .target = .Self,
1185
1126
  },
1186
1127
  // QuickAttack
@@ -1188,17 +1129,16 @@ pub const Move = enum(u8) {
1188
1129
  .effect = .Priority,
1189
1130
  .bp = 40,
1190
1131
  .type = .Normal,
1191
- .pp = 30,
1192
- .accuracy = 100,
1132
+ .accuracy = percent(100),
1193
1133
  .target = .Other,
1134
+ .priority = 1,
1194
1135
  },
1195
1136
  // Rage
1196
1137
  .{
1197
1138
  .effect = .Rage,
1198
1139
  .bp = 20,
1199
1140
  .type = .Normal,
1200
- .pp = 20,
1201
- .accuracy = 100,
1141
+ .accuracy = percent(100),
1202
1142
  .target = .Other,
1203
1143
  },
1204
1144
  // Teleport
@@ -1206,8 +1146,7 @@ pub const Move = enum(u8) {
1206
1146
  .effect = .Teleport,
1207
1147
  .bp = 0,
1208
1148
  .type = .Psychic,
1209
- .pp = 20,
1210
- .accuracy = 100,
1149
+ .accuracy = percent(100),
1211
1150
  .target = .Self,
1212
1151
  },
1213
1152
  // NightShade
@@ -1215,8 +1154,7 @@ pub const Move = enum(u8) {
1215
1154
  .effect = .LevelDamage,
1216
1155
  .bp = 0,
1217
1156
  .type = .Ghost,
1218
- .pp = 15,
1219
- .accuracy = 100,
1157
+ .accuracy = percent(100),
1220
1158
  .target = .Other,
1221
1159
  },
1222
1160
  // Mimic
@@ -1224,17 +1162,16 @@ pub const Move = enum(u8) {
1224
1162
  .effect = .Mimic,
1225
1163
  .bp = 0,
1226
1164
  .type = .Normal,
1227
- .pp = 10,
1228
- .accuracy = 100,
1165
+ .accuracy = percent(100),
1229
1166
  .target = .Other,
1167
+ .extra = .{ .metronome = false },
1230
1168
  },
1231
1169
  // Screech
1232
1170
  .{
1233
1171
  .effect = .DefenseDown2,
1234
1172
  .bp = 0,
1235
1173
  .type = .Normal,
1236
- .pp = 40,
1237
- .accuracy = 85,
1174
+ .accuracy = percent(85),
1238
1175
  .target = .Other,
1239
1176
  },
1240
1177
  // DoubleTeam
@@ -1242,8 +1179,7 @@ pub const Move = enum(u8) {
1242
1179
  .effect = .EvasionUp1,
1243
1180
  .bp = 0,
1244
1181
  .type = .Normal,
1245
- .pp = 15,
1246
- .accuracy = 100,
1182
+ .accuracy = percent(100),
1247
1183
  .target = .Self,
1248
1184
  },
1249
1185
  // Recover
@@ -1251,8 +1187,7 @@ pub const Move = enum(u8) {
1251
1187
  .effect = .Heal,
1252
1188
  .bp = 0,
1253
1189
  .type = .Normal,
1254
- .pp = 20,
1255
- .accuracy = 100,
1190
+ .accuracy = percent(100),
1256
1191
  .target = .Self,
1257
1192
  },
1258
1193
  // Harden
@@ -1260,8 +1195,7 @@ pub const Move = enum(u8) {
1260
1195
  .effect = .DefenseUp1,
1261
1196
  .bp = 0,
1262
1197
  .type = .Normal,
1263
- .pp = 30,
1264
- .accuracy = 100,
1198
+ .accuracy = percent(100),
1265
1199
  .target = .Self,
1266
1200
  },
1267
1201
  // Minimize
@@ -1269,8 +1203,7 @@ pub const Move = enum(u8) {
1269
1203
  .effect = .EvasionUp1,
1270
1204
  .bp = 0,
1271
1205
  .type = .Normal,
1272
- .pp = 20,
1273
- .accuracy = 100,
1206
+ .accuracy = percent(100),
1274
1207
  .target = .Self,
1275
1208
  },
1276
1209
  // Smokescreen
@@ -1278,8 +1211,7 @@ pub const Move = enum(u8) {
1278
1211
  .effect = .AccuracyDown1,
1279
1212
  .bp = 0,
1280
1213
  .type = .Normal,
1281
- .pp = 20,
1282
- .accuracy = 100,
1214
+ .accuracy = percent(100),
1283
1215
  .target = .Other,
1284
1216
  },
1285
1217
  // ConfuseRay
@@ -1287,8 +1219,7 @@ pub const Move = enum(u8) {
1287
1219
  .effect = .Confusion,
1288
1220
  .bp = 0,
1289
1221
  .type = .Ghost,
1290
- .pp = 10,
1291
- .accuracy = 100,
1222
+ .accuracy = percent(100),
1292
1223
  .target = .Other,
1293
1224
  },
1294
1225
  // Withdraw
@@ -1296,8 +1227,7 @@ pub const Move = enum(u8) {
1296
1227
  .effect = .DefenseUp1,
1297
1228
  .bp = 0,
1298
1229
  .type = .Water,
1299
- .pp = 40,
1300
- .accuracy = 100,
1230
+ .accuracy = percent(100),
1301
1231
  .target = .Self,
1302
1232
  },
1303
1233
  // DefenseCurl
@@ -1305,8 +1235,7 @@ pub const Move = enum(u8) {
1305
1235
  .effect = .DefenseCurl,
1306
1236
  .bp = 0,
1307
1237
  .type = .Normal,
1308
- .pp = 40,
1309
- .accuracy = 100,
1238
+ .accuracy = percent(100),
1310
1239
  .target = .Self,
1311
1240
  },
1312
1241
  // Barrier
@@ -1314,8 +1243,7 @@ pub const Move = enum(u8) {
1314
1243
  .effect = .DefenseUp2,
1315
1244
  .bp = 0,
1316
1245
  .type = .Psychic,
1317
- .pp = 30,
1318
- .accuracy = 100,
1246
+ .accuracy = percent(100),
1319
1247
  .target = .Self,
1320
1248
  },
1321
1249
  // LightScreen
@@ -1323,8 +1251,7 @@ pub const Move = enum(u8) {
1323
1251
  .effect = .LightScreen,
1324
1252
  .bp = 0,
1325
1253
  .type = .Psychic,
1326
- .pp = 30,
1327
- .accuracy = 100,
1254
+ .accuracy = percent(100),
1328
1255
  .target = .AllySide,
1329
1256
  },
1330
1257
  // Haze
@@ -1332,8 +1259,7 @@ pub const Move = enum(u8) {
1332
1259
  .effect = .Haze,
1333
1260
  .bp = 0,
1334
1261
  .type = .Ice,
1335
- .pp = 30,
1336
- .accuracy = 100,
1262
+ .accuracy = percent(100),
1337
1263
  .target = .All,
1338
1264
  },
1339
1265
  // Reflect
@@ -1341,8 +1267,7 @@ pub const Move = enum(u8) {
1341
1267
  .effect = .Reflect,
1342
1268
  .bp = 0,
1343
1269
  .type = .Psychic,
1344
- .pp = 20,
1345
- .accuracy = 100,
1270
+ .accuracy = percent(100),
1346
1271
  .target = .AllySide,
1347
1272
  },
1348
1273
  // FocusEnergy
@@ -1350,8 +1275,7 @@ pub const Move = enum(u8) {
1350
1275
  .effect = .FocusEnergy,
1351
1276
  .bp = 0,
1352
1277
  .type = .Normal,
1353
- .pp = 30,
1354
- .accuracy = 100,
1278
+ .accuracy = percent(100),
1355
1279
  .target = .Self,
1356
1280
  },
1357
1281
  // Bide
@@ -1359,26 +1283,25 @@ pub const Move = enum(u8) {
1359
1283
  .effect = .Bide,
1360
1284
  .bp = 0,
1361
1285
  .type = .Normal,
1362
- .pp = 10,
1363
- .accuracy = 100,
1286
+ .accuracy = percent(100),
1364
1287
  .target = .Self,
1288
+ .extra = .{ .sleep_talk = false, .continuous = true },
1365
1289
  },
1366
1290
  // Metronome
1367
1291
  .{
1368
1292
  .effect = .Metronome,
1369
1293
  .bp = 0,
1370
1294
  .type = .Normal,
1371
- .pp = 10,
1372
- .accuracy = 100,
1295
+ .accuracy = percent(100),
1373
1296
  .target = .Self,
1297
+ .extra = .{ .metronome = false },
1374
1298
  },
1375
1299
  // MirrorMove
1376
1300
  .{
1377
1301
  .effect = .MirrorMove,
1378
1302
  .bp = 0,
1379
1303
  .type = .Flying,
1380
- .pp = 20,
1381
- .accuracy = 100,
1304
+ .accuracy = percent(100),
1382
1305
  .target = .Self,
1383
1306
  },
1384
1307
  // SelfDestruct
@@ -1386,8 +1309,7 @@ pub const Move = enum(u8) {
1386
1309
  .effect = .Explode,
1387
1310
  .bp = 200,
1388
1311
  .type = .Normal,
1389
- .pp = 5,
1390
- .accuracy = 100,
1312
+ .accuracy = percent(100),
1391
1313
  .target = .AllOthers,
1392
1314
  },
1393
1315
  // EggBomb
@@ -1395,8 +1317,7 @@ pub const Move = enum(u8) {
1395
1317
  .effect = .None,
1396
1318
  .bp = 100,
1397
1319
  .type = .Normal,
1398
- .pp = 10,
1399
- .accuracy = 75,
1320
+ .accuracy = percent(75),
1400
1321
  .target = .Other,
1401
1322
  },
1402
1323
  // Lick
@@ -1404,58 +1325,52 @@ pub const Move = enum(u8) {
1404
1325
  .effect = .ParalyzeChance,
1405
1326
  .bp = 20,
1406
1327
  .type = .Ghost,
1407
- .pp = 30,
1408
- .accuracy = 100,
1328
+ .accuracy = percent(100),
1409
1329
  .target = .Other,
1410
- .chance = 3, // * 10 = 30
1330
+ .chance = percent(30),
1411
1331
  },
1412
1332
  // Smog
1413
1333
  .{
1414
1334
  .effect = .PoisonChance,
1415
1335
  .bp = 20,
1416
1336
  .type = .Poison,
1417
- .pp = 20,
1418
- .accuracy = 70,
1337
+ .accuracy = percent(70),
1419
1338
  .target = .Other,
1420
- .chance = 4, // * 10 = 40
1339
+ .chance = percent(40),
1421
1340
  },
1422
1341
  // Sludge
1423
1342
  .{
1424
1343
  .effect = .PoisonChance,
1425
1344
  .bp = 65,
1426
1345
  .type = .Poison,
1427
- .pp = 20,
1428
- .accuracy = 100,
1346
+ .accuracy = percent(100),
1429
1347
  .target = .Other,
1430
- .chance = 3, // * 10 = 30
1348
+ .chance = percent(30),
1431
1349
  },
1432
1350
  // BoneClub
1433
1351
  .{
1434
1352
  .effect = .FlinchChance,
1435
1353
  .bp = 65,
1436
1354
  .type = .Ground,
1437
- .pp = 20,
1438
- .accuracy = 85,
1355
+ .accuracy = percent(85),
1439
1356
  .target = .Other,
1440
- .chance = 1, // * 10 = 10
1357
+ .chance = percent(10),
1441
1358
  },
1442
1359
  // FireBlast
1443
1360
  .{
1444
1361
  .effect = .BurnChance,
1445
1362
  .bp = 120,
1446
1363
  .type = .Fire,
1447
- .pp = 5,
1448
- .accuracy = 85,
1364
+ .accuracy = percent(85),
1449
1365
  .target = .Other,
1450
- .chance = 1, // * 10 = 10
1366
+ .chance = percent(10),
1451
1367
  },
1452
1368
  // Waterfall
1453
1369
  .{
1454
1370
  .effect = .None,
1455
1371
  .bp = 80,
1456
1372
  .type = .Water,
1457
- .pp = 15,
1458
- .accuracy = 100,
1373
+ .accuracy = percent(100),
1459
1374
  .target = .Other,
1460
1375
  },
1461
1376
  // Clamp
@@ -1463,17 +1378,16 @@ pub const Move = enum(u8) {
1463
1378
  .effect = .Binding,
1464
1379
  .bp = 35,
1465
1380
  .type = .Water,
1466
- .pp = 10,
1467
- .accuracy = 75,
1381
+ .accuracy = percent(75),
1468
1382
  .target = .Other,
1383
+ .extra = .{ .protocol = 4 },
1469
1384
  },
1470
1385
  // Swift
1471
1386
  .{
1472
1387
  .effect = .AlwaysHit,
1473
1388
  .bp = 60,
1474
1389
  .type = .Normal,
1475
- .pp = 20,
1476
- .accuracy = 100,
1390
+ .accuracy = percent(100),
1477
1391
  .target = .Foes,
1478
1392
  },
1479
1393
  // SkullBash
@@ -1481,17 +1395,16 @@ pub const Move = enum(u8) {
1481
1395
  .effect = .SkullBash,
1482
1396
  .bp = 100,
1483
1397
  .type = .Normal,
1484
- .pp = 15,
1485
- .accuracy = 100,
1398
+ .accuracy = percent(100),
1486
1399
  .target = .Other,
1400
+ .extra = .{ .sleep_talk = false, .continuous = true },
1487
1401
  },
1488
1402
  // SpikeCannon
1489
1403
  .{
1490
1404
  .effect = .MultiHit,
1491
1405
  .bp = 20,
1492
1406
  .type = .Normal,
1493
- .pp = 15,
1494
- .accuracy = 100,
1407
+ .accuracy = percent(100),
1495
1408
  .target = .Other,
1496
1409
  },
1497
1410
  // Constrict
@@ -1499,18 +1412,16 @@ pub const Move = enum(u8) {
1499
1412
  .effect = .SpeedDownChance,
1500
1413
  .bp = 10,
1501
1414
  .type = .Normal,
1502
- .pp = 35,
1503
- .accuracy = 100,
1415
+ .accuracy = percent(100),
1504
1416
  .target = .Other,
1505
- .chance = 1, // * 10 = 10
1417
+ .chance = percent(10),
1506
1418
  },
1507
1419
  // Amnesia
1508
1420
  .{
1509
1421
  .effect = .SpDefUp2,
1510
1422
  .bp = 0,
1511
1423
  .type = .Psychic,
1512
- .pp = 20,
1513
- .accuracy = 100,
1424
+ .accuracy = percent(100),
1514
1425
  .target = .Self,
1515
1426
  },
1516
1427
  // Kinesis
@@ -1518,8 +1429,7 @@ pub const Move = enum(u8) {
1518
1429
  .effect = .AccuracyDown1,
1519
1430
  .bp = 0,
1520
1431
  .type = .Psychic,
1521
- .pp = 15,
1522
- .accuracy = 80,
1432
+ .accuracy = percent(80),
1523
1433
  .target = .Other,
1524
1434
  },
1525
1435
  // SoftBoiled
@@ -1527,8 +1437,7 @@ pub const Move = enum(u8) {
1527
1437
  .effect = .Heal,
1528
1438
  .bp = 0,
1529
1439
  .type = .Normal,
1530
- .pp = 10,
1531
- .accuracy = 100,
1440
+ .accuracy = percent(100),
1532
1441
  .target = .Self,
1533
1442
  },
1534
1443
  // HighJumpKick
@@ -1536,8 +1445,7 @@ pub const Move = enum(u8) {
1536
1445
  .effect = .JumpKick,
1537
1446
  .bp = 85,
1538
1447
  .type = .Fighting,
1539
- .pp = 20,
1540
- .accuracy = 90,
1448
+ .accuracy = percent(90),
1541
1449
  .target = .Other,
1542
1450
  },
1543
1451
  // Glare
@@ -1545,8 +1453,7 @@ pub const Move = enum(u8) {
1545
1453
  .effect = .Paralyze,
1546
1454
  .bp = 0,
1547
1455
  .type = .Normal,
1548
- .pp = 30,
1549
- .accuracy = 75,
1456
+ .accuracy = percent(75),
1550
1457
  .target = .Other,
1551
1458
  },
1552
1459
  // DreamEater
@@ -1554,8 +1461,7 @@ pub const Move = enum(u8) {
1554
1461
  .effect = .DreamEater,
1555
1462
  .bp = 100,
1556
1463
  .type = .Psychic,
1557
- .pp = 15,
1558
- .accuracy = 100,
1464
+ .accuracy = percent(100),
1559
1465
  .target = .Other,
1560
1466
  },
1561
1467
  // PoisonGas
@@ -1563,8 +1469,7 @@ pub const Move = enum(u8) {
1563
1469
  .effect = .Poison,
1564
1470
  .bp = 0,
1565
1471
  .type = .Poison,
1566
- .pp = 40,
1567
- .accuracy = 55,
1472
+ .accuracy = percent(55),
1568
1473
  .target = .Other,
1569
1474
  },
1570
1475
  // Barrage
@@ -1572,8 +1477,7 @@ pub const Move = enum(u8) {
1572
1477
  .effect = .MultiHit,
1573
1478
  .bp = 15,
1574
1479
  .type = .Normal,
1575
- .pp = 20,
1576
- .accuracy = 85,
1480
+ .accuracy = percent(85),
1577
1481
  .target = .Other,
1578
1482
  },
1579
1483
  // LeechLife
@@ -1581,8 +1485,7 @@ pub const Move = enum(u8) {
1581
1485
  .effect = .DrainHP,
1582
1486
  .bp = 20,
1583
1487
  .type = .Bug,
1584
- .pp = 15,
1585
- .accuracy = 100,
1488
+ .accuracy = percent(100),
1586
1489
  .target = .Other,
1587
1490
  },
1588
1491
  // LovelyKiss
@@ -1590,8 +1493,7 @@ pub const Move = enum(u8) {
1590
1493
  .effect = .Sleep,
1591
1494
  .bp = 0,
1592
1495
  .type = .Normal,
1593
- .pp = 10,
1594
- .accuracy = 75,
1496
+ .accuracy = percent(75),
1595
1497
  .target = .Other,
1596
1498
  },
1597
1499
  // SkyAttack
@@ -1599,17 +1501,16 @@ pub const Move = enum(u8) {
1599
1501
  .effect = .SkyAttack,
1600
1502
  .bp = 140,
1601
1503
  .type = .Flying,
1602
- .pp = 5,
1603
- .accuracy = 90,
1504
+ .accuracy = percent(90),
1604
1505
  .target = .Any,
1506
+ .extra = .{ .sleep_talk = false, .continuous = true },
1605
1507
  },
1606
1508
  // Transform
1607
1509
  .{
1608
1510
  .effect = .Transform,
1609
1511
  .bp = 0,
1610
1512
  .type = .Normal,
1611
- .pp = 10,
1612
- .accuracy = 100,
1513
+ .accuracy = percent(100),
1613
1514
  .target = .Other,
1614
1515
  },
1615
1516
  // Bubble
@@ -1617,28 +1518,25 @@ pub const Move = enum(u8) {
1617
1518
  .effect = .SpeedDownChance,
1618
1519
  .bp = 20,
1619
1520
  .type = .Water,
1620
- .pp = 30,
1621
- .accuracy = 100,
1521
+ .accuracy = percent(100),
1622
1522
  .target = .Foes,
1623
- .chance = 1, // * 10 = 10
1523
+ .chance = percent(10),
1624
1524
  },
1625
1525
  // DizzyPunch
1626
1526
  .{
1627
1527
  .effect = .ConfusionChance,
1628
1528
  .bp = 70,
1629
1529
  .type = .Normal,
1630
- .pp = 10,
1631
- .accuracy = 100,
1530
+ .accuracy = percent(100),
1632
1531
  .target = .Other,
1633
- .chance = 2, // * 10 = 20
1532
+ .chance = percent(20),
1634
1533
  },
1635
1534
  // Spore
1636
1535
  .{
1637
1536
  .effect = .Sleep,
1638
1537
  .bp = 0,
1639
1538
  .type = .Grass,
1640
- .pp = 15,
1641
- .accuracy = 100,
1539
+ .accuracy = percent(100),
1642
1540
  .target = .Other,
1643
1541
  },
1644
1542
  // Flash
@@ -1646,8 +1544,7 @@ pub const Move = enum(u8) {
1646
1544
  .effect = .AccuracyDown1,
1647
1545
  .bp = 0,
1648
1546
  .type = .Normal,
1649
- .pp = 20,
1650
- .accuracy = 70,
1547
+ .accuracy = percent(70),
1651
1548
  .target = .Other,
1652
1549
  },
1653
1550
  // Psywave
@@ -1655,8 +1552,7 @@ pub const Move = enum(u8) {
1655
1552
  .effect = .Psywave,
1656
1553
  .bp = 0,
1657
1554
  .type = .Psychic,
1658
- .pp = 15,
1659
- .accuracy = 80,
1555
+ .accuracy = percent(80),
1660
1556
  .target = .Other,
1661
1557
  },
1662
1558
  // Splash
@@ -1664,8 +1560,7 @@ pub const Move = enum(u8) {
1664
1560
  .effect = .Splash,
1665
1561
  .bp = 0,
1666
1562
  .type = .Normal,
1667
- .pp = 40,
1668
- .accuracy = 100,
1563
+ .accuracy = percent(100),
1669
1564
  .target = .Self,
1670
1565
  },
1671
1566
  // AcidArmor
@@ -1673,8 +1568,7 @@ pub const Move = enum(u8) {
1673
1568
  .effect = .DefenseUp2,
1674
1569
  .bp = 0,
1675
1570
  .type = .Poison,
1676
- .pp = 40,
1677
- .accuracy = 100,
1571
+ .accuracy = percent(100),
1678
1572
  .target = .Self,
1679
1573
  },
1680
1574
  // Crabhammer
@@ -1682,8 +1576,7 @@ pub const Move = enum(u8) {
1682
1576
  .effect = .HighCritical,
1683
1577
  .bp = 90,
1684
1578
  .type = .Water,
1685
- .pp = 10,
1686
- .accuracy = 85,
1579
+ .accuracy = percent(85),
1687
1580
  .target = .Other,
1688
1581
  },
1689
1582
  // Explosion
@@ -1691,8 +1584,7 @@ pub const Move = enum(u8) {
1691
1584
  .effect = .Explode,
1692
1585
  .bp = 250,
1693
1586
  .type = .Normal,
1694
- .pp = 5,
1695
- .accuracy = 100,
1587
+ .accuracy = percent(100),
1696
1588
  .target = .AllOthers,
1697
1589
  },
1698
1590
  // FurySwipes
@@ -1700,8 +1592,7 @@ pub const Move = enum(u8) {
1700
1592
  .effect = .MultiHit,
1701
1593
  .bp = 18,
1702
1594
  .type = .Normal,
1703
- .pp = 15,
1704
- .accuracy = 80,
1595
+ .accuracy = percent(80),
1705
1596
  .target = .Other,
1706
1597
  },
1707
1598
  // Bonemerang
@@ -1709,8 +1600,7 @@ pub const Move = enum(u8) {
1709
1600
  .effect = .DoubleHit,
1710
1601
  .bp = 50,
1711
1602
  .type = .Ground,
1712
- .pp = 10,
1713
- .accuracy = 90,
1603
+ .accuracy = percent(90),
1714
1604
  .target = .Other,
1715
1605
  },
1716
1606
  // Rest
@@ -1718,8 +1608,7 @@ pub const Move = enum(u8) {
1718
1608
  .effect = .Heal,
1719
1609
  .bp = 0,
1720
1610
  .type = .Psychic,
1721
- .pp = 10,
1722
- .accuracy = 100,
1611
+ .accuracy = percent(100),
1723
1612
  .target = .Self,
1724
1613
  },
1725
1614
  // RockSlide
@@ -1727,28 +1616,25 @@ pub const Move = enum(u8) {
1727
1616
  .effect = .FlinchChance,
1728
1617
  .bp = 75,
1729
1618
  .type = .Rock,
1730
- .pp = 10,
1731
- .accuracy = 90,
1619
+ .accuracy = percent(90),
1732
1620
  .target = .Foes,
1733
- .chance = 3, // * 10 = 30
1621
+ .chance = percent(30),
1734
1622
  },
1735
1623
  // HyperFang
1736
1624
  .{
1737
1625
  .effect = .FlinchChance,
1738
1626
  .bp = 80,
1739
1627
  .type = .Normal,
1740
- .pp = 15,
1741
- .accuracy = 90,
1628
+ .accuracy = percent(90),
1742
1629
  .target = .Other,
1743
- .chance = 1, // * 10 = 10
1630
+ .chance = percent(10),
1744
1631
  },
1745
1632
  // Sharpen
1746
1633
  .{
1747
1634
  .effect = .AttackUp1,
1748
1635
  .bp = 0,
1749
1636
  .type = .Normal,
1750
- .pp = 30,
1751
- .accuracy = 100,
1637
+ .accuracy = percent(100),
1752
1638
  .target = .Self,
1753
1639
  },
1754
1640
  // Conversion
@@ -1756,8 +1642,7 @@ pub const Move = enum(u8) {
1756
1642
  .effect = .Conversion,
1757
1643
  .bp = 0,
1758
1644
  .type = .Normal,
1759
- .pp = 30,
1760
- .accuracy = 100,
1645
+ .accuracy = percent(100),
1761
1646
  .target = .Self,
1762
1647
  },
1763
1648
  // TriAttack
@@ -1765,18 +1650,16 @@ pub const Move = enum(u8) {
1765
1650
  .effect = .TriAttack,
1766
1651
  .bp = 80,
1767
1652
  .type = .Normal,
1768
- .pp = 10,
1769
- .accuracy = 100,
1653
+ .accuracy = percent(100),
1770
1654
  .target = .Other,
1771
- .chance = 2, // * 10 = 20
1655
+ .chance = percent(20),
1772
1656
  },
1773
1657
  // SuperFang
1774
1658
  .{
1775
1659
  .effect = .SuperFang,
1776
1660
  .bp = 0,
1777
1661
  .type = .Normal,
1778
- .pp = 10,
1779
- .accuracy = 90,
1662
+ .accuracy = percent(90),
1780
1663
  .target = .Other,
1781
1664
  },
1782
1665
  // Slash
@@ -1784,8 +1667,7 @@ pub const Move = enum(u8) {
1784
1667
  .effect = .HighCritical,
1785
1668
  .bp = 70,
1786
1669
  .type = .Normal,
1787
- .pp = 20,
1788
- .accuracy = 100,
1670
+ .accuracy = percent(100),
1789
1671
  .target = .Other,
1790
1672
  },
1791
1673
  // Substitute
@@ -1793,8 +1675,7 @@ pub const Move = enum(u8) {
1793
1675
  .effect = .Substitute,
1794
1676
  .bp = 0,
1795
1677
  .type = .Normal,
1796
- .pp = 10,
1797
- .accuracy = 100,
1678
+ .accuracy = percent(100),
1798
1679
  .target = .Self,
1799
1680
  },
1800
1681
  // Struggle
@@ -1802,26 +1683,25 @@ pub const Move = enum(u8) {
1802
1683
  .effect = .Recoil,
1803
1684
  .bp = 50,
1804
1685
  .type = .Normal,
1805
- .pp = 1,
1806
- .accuracy = 100,
1686
+ .accuracy = percent(100),
1807
1687
  .target = .RandomFoe,
1688
+ .extra = .{ .metronome = false },
1808
1689
  },
1809
1690
  // Sketch
1810
1691
  .{
1811
1692
  .effect = .Sketch,
1812
1693
  .bp = 0,
1813
1694
  .type = .Normal,
1814
- .pp = 1,
1815
- .accuracy = 100,
1695
+ .accuracy = percent(100),
1816
1696
  .target = .Other,
1697
+ .extra = .{ .metronome = false },
1817
1698
  },
1818
1699
  // TripleKick
1819
1700
  .{
1820
1701
  .effect = .TripleKick,
1821
1702
  .bp = 10,
1822
1703
  .type = .Fighting,
1823
- .pp = 10,
1824
- .accuracy = 90,
1704
+ .accuracy = percent(90),
1825
1705
  .target = .Other,
1826
1706
  },
1827
1707
  // Thief
@@ -1829,18 +1709,17 @@ pub const Move = enum(u8) {
1829
1709
  .effect = .Thief,
1830
1710
  .bp = 40,
1831
1711
  .type = .Dark,
1832
- .pp = 10,
1833
- .accuracy = 100,
1712
+ .accuracy = percent(100),
1834
1713
  .target = .Other,
1835
- .chance = 10, // * 10 = 100
1714
+ .chance = percent(100),
1715
+ .extra = .{ .metronome = false },
1836
1716
  },
1837
1717
  // SpiderWeb
1838
1718
  .{
1839
1719
  .effect = .MeanLook,
1840
1720
  .bp = 0,
1841
1721
  .type = .Bug,
1842
- .pp = 10,
1843
- .accuracy = 100,
1722
+ .accuracy = percent(100),
1844
1723
  .target = .Other,
1845
1724
  },
1846
1725
  // MindReader
@@ -1848,8 +1727,7 @@ pub const Move = enum(u8) {
1848
1727
  .effect = .LockOn,
1849
1728
  .bp = 0,
1850
1729
  .type = .Normal,
1851
- .pp = 5,
1852
- .accuracy = 100,
1730
+ .accuracy = percent(100),
1853
1731
  .target = .Other,
1854
1732
  },
1855
1733
  // Nightmare
@@ -1857,8 +1735,7 @@ pub const Move = enum(u8) {
1857
1735
  .effect = .Nightmare,
1858
1736
  .bp = 0,
1859
1737
  .type = .Ghost,
1860
- .pp = 15,
1861
- .accuracy = 100,
1738
+ .accuracy = percent(100),
1862
1739
  .target = .Other,
1863
1740
  },
1864
1741
  // FlameWheel
@@ -1866,28 +1743,25 @@ pub const Move = enum(u8) {
1866
1743
  .effect = .FlameWheel,
1867
1744
  .bp = 60,
1868
1745
  .type = .Fire,
1869
- .pp = 25,
1870
- .accuracy = 100,
1746
+ .accuracy = percent(100),
1871
1747
  .target = .Other,
1872
- .chance = 1, // * 10 = 10
1748
+ .chance = percent(10),
1873
1749
  },
1874
1750
  // Snore
1875
1751
  .{
1876
1752
  .effect = .Snore,
1877
1753
  .bp = 40,
1878
1754
  .type = .Normal,
1879
- .pp = 15,
1880
- .accuracy = 100,
1755
+ .accuracy = percent(100),
1881
1756
  .target = .Other,
1882
- .chance = 3, // * 10 = 30
1757
+ .chance = percent(30),
1883
1758
  },
1884
1759
  // Curse
1885
1760
  .{
1886
1761
  .effect = .Curse,
1887
1762
  .bp = 0,
1888
1763
  .type = .@"???",
1889
- .pp = 10,
1890
- .accuracy = 100,
1764
+ .accuracy = percent(100),
1891
1765
  .target = .Other,
1892
1766
  },
1893
1767
  // Flail
@@ -1895,8 +1769,7 @@ pub const Move = enum(u8) {
1895
1769
  .effect = .Reversal,
1896
1770
  .bp = 0,
1897
1771
  .type = .Normal,
1898
- .pp = 15,
1899
- .accuracy = 100,
1772
+ .accuracy = percent(100),
1900
1773
  .target = .Other,
1901
1774
  },
1902
1775
  // Conversion2
@@ -1904,8 +1777,7 @@ pub const Move = enum(u8) {
1904
1777
  .effect = .Conversion2,
1905
1778
  .bp = 0,
1906
1779
  .type = .Normal,
1907
- .pp = 30,
1908
- .accuracy = 100,
1780
+ .accuracy = percent(100),
1909
1781
  .target = .Other,
1910
1782
  },
1911
1783
  // Aeroblast
@@ -1913,8 +1785,7 @@ pub const Move = enum(u8) {
1913
1785
  .effect = .HighCritical,
1914
1786
  .bp = 100,
1915
1787
  .type = .Flying,
1916
- .pp = 5,
1917
- .accuracy = 95,
1788
+ .accuracy = percent(95),
1918
1789
  .target = .Any,
1919
1790
  },
1920
1791
  // CottonSpore
@@ -1922,8 +1793,7 @@ pub const Move = enum(u8) {
1922
1793
  .effect = .SpeedDown2,
1923
1794
  .bp = 0,
1924
1795
  .type = .Grass,
1925
- .pp = 40,
1926
- .accuracy = 85,
1796
+ .accuracy = percent(85),
1927
1797
  .target = .Other,
1928
1798
  },
1929
1799
  // Reversal
@@ -1931,8 +1801,7 @@ pub const Move = enum(u8) {
1931
1801
  .effect = .Reversal,
1932
1802
  .bp = 0,
1933
1803
  .type = .Fighting,
1934
- .pp = 15,
1935
- .accuracy = 100,
1804
+ .accuracy = percent(100),
1936
1805
  .target = .Other,
1937
1806
  },
1938
1807
  // Spite
@@ -1940,8 +1809,7 @@ pub const Move = enum(u8) {
1940
1809
  .effect = .Spite,
1941
1810
  .bp = 0,
1942
1811
  .type = .Ghost,
1943
- .pp = 10,
1944
- .accuracy = 100,
1812
+ .accuracy = percent(100),
1945
1813
  .target = .Other,
1946
1814
  },
1947
1815
  // PowderSnow
@@ -1949,36 +1817,35 @@ pub const Move = enum(u8) {
1949
1817
  .effect = .FreezeChance,
1950
1818
  .bp = 40,
1951
1819
  .type = .Ice,
1952
- .pp = 25,
1953
- .accuracy = 100,
1820
+ .accuracy = percent(100),
1954
1821
  .target = .Foes,
1955
- .chance = 1, // * 10 = 10
1822
+ .chance = percent(10),
1956
1823
  },
1957
1824
  // Protect
1958
1825
  .{
1959
1826
  .effect = .Protect,
1960
1827
  .bp = 0,
1961
1828
  .type = .Normal,
1962
- .pp = 10,
1963
- .accuracy = 100,
1829
+ .accuracy = percent(100),
1964
1830
  .target = .Self,
1831
+ .priority = 2,
1832
+ .extra = .{ .metronome = false },
1965
1833
  },
1966
1834
  // MachPunch
1967
1835
  .{
1968
1836
  .effect = .Priority,
1969
1837
  .bp = 40,
1970
1838
  .type = .Fighting,
1971
- .pp = 30,
1972
- .accuracy = 100,
1839
+ .accuracy = percent(100),
1973
1840
  .target = .Other,
1841
+ .priority = 1,
1974
1842
  },
1975
1843
  // ScaryFace
1976
1844
  .{
1977
1845
  .effect = .SpeedDown2,
1978
1846
  .bp = 0,
1979
1847
  .type = .Normal,
1980
- .pp = 10,
1981
- .accuracy = 90,
1848
+ .accuracy = percent(90),
1982
1849
  .target = .Other,
1983
1850
  },
1984
1851
  // FeintAttack
@@ -1986,8 +1853,7 @@ pub const Move = enum(u8) {
1986
1853
  .effect = .AlwaysHit,
1987
1854
  .bp = 60,
1988
1855
  .type = .Dark,
1989
- .pp = 20,
1990
- .accuracy = 100,
1856
+ .accuracy = percent(100),
1991
1857
  .target = .Other,
1992
1858
  },
1993
1859
  // SweetKiss
@@ -1995,8 +1861,7 @@ pub const Move = enum(u8) {
1995
1861
  .effect = .Confusion,
1996
1862
  .bp = 0,
1997
1863
  .type = .Normal,
1998
- .pp = 10,
1999
- .accuracy = 75,
1864
+ .accuracy = percent(75),
2000
1865
  .target = .Other,
2001
1866
  },
2002
1867
  // BellyDrum
@@ -2004,8 +1869,7 @@ pub const Move = enum(u8) {
2004
1869
  .effect = .BellyDrum,
2005
1870
  .bp = 0,
2006
1871
  .type = .Normal,
2007
- .pp = 10,
2008
- .accuracy = 100,
1872
+ .accuracy = percent(100),
2009
1873
  .target = .Self,
2010
1874
  },
2011
1875
  // SludgeBomb
@@ -2013,38 +1877,34 @@ pub const Move = enum(u8) {
2013
1877
  .effect = .PoisonChance,
2014
1878
  .bp = 90,
2015
1879
  .type = .Poison,
2016
- .pp = 10,
2017
- .accuracy = 100,
1880
+ .accuracy = percent(100),
2018
1881
  .target = .Other,
2019
- .chance = 3, // * 10 = 30
1882
+ .chance = percent(30),
2020
1883
  },
2021
1884
  // MudSlap
2022
1885
  .{
2023
1886
  .effect = .AccuracyDownChance,
2024
1887
  .bp = 20,
2025
1888
  .type = .Ground,
2026
- .pp = 10,
2027
- .accuracy = 100,
1889
+ .accuracy = percent(100),
2028
1890
  .target = .Other,
2029
- .chance = 10, // * 10 = 100
1891
+ .chance = percent(100),
2030
1892
  },
2031
1893
  // Octazooka
2032
1894
  .{
2033
1895
  .effect = .AccuracyDownChance,
2034
1896
  .bp = 65,
2035
1897
  .type = .Water,
2036
- .pp = 10,
2037
- .accuracy = 85,
1898
+ .accuracy = percent(85),
2038
1899
  .target = .Other,
2039
- .chance = 5, // * 10 = 50
1900
+ .chance = percent(50),
2040
1901
  },
2041
1902
  // Spikes
2042
1903
  .{
2043
1904
  .effect = .Spikes,
2044
1905
  .bp = 0,
2045
1906
  .type = .Ground,
2046
- .pp = 20,
2047
- .accuracy = 100,
1907
+ .accuracy = percent(100),
2048
1908
  .target = .FoeSide,
2049
1909
  },
2050
1910
  // ZapCannon
@@ -2052,18 +1912,16 @@ pub const Move = enum(u8) {
2052
1912
  .effect = .ParalyzeChance,
2053
1913
  .bp = 100,
2054
1914
  .type = .Electric,
2055
- .pp = 5,
2056
- .accuracy = 50,
1915
+ .accuracy = percent(50),
2057
1916
  .target = .Other,
2058
- .chance = 10, // * 10 = 100
1917
+ .chance = percent(100),
2059
1918
  },
2060
1919
  // Foresight
2061
1920
  .{
2062
1921
  .effect = .Foresight,
2063
1922
  .bp = 0,
2064
1923
  .type = .Normal,
2065
- .pp = 40,
2066
- .accuracy = 100,
1924
+ .accuracy = percent(100),
2067
1925
  .target = .Other,
2068
1926
  },
2069
1927
  // DestinyBond
@@ -2071,17 +1929,16 @@ pub const Move = enum(u8) {
2071
1929
  .effect = .DestinyBond,
2072
1930
  .bp = 0,
2073
1931
  .type = .Ghost,
2074
- .pp = 5,
2075
- .accuracy = 100,
1932
+ .accuracy = percent(100),
2076
1933
  .target = .Self,
1934
+ .extra = .{ .metronome = false },
2077
1935
  },
2078
1936
  // PerishSong
2079
1937
  .{
2080
1938
  .effect = .PerishSong,
2081
1939
  .bp = 0,
2082
1940
  .type = .Normal,
2083
- .pp = 5,
2084
- .accuracy = 100,
1941
+ .accuracy = percent(100),
2085
1942
  .target = .All,
2086
1943
  },
2087
1944
  // IcyWind
@@ -2089,27 +1946,26 @@ pub const Move = enum(u8) {
2089
1946
  .effect = .SpeedDownChance,
2090
1947
  .bp = 55,
2091
1948
  .type = .Ice,
2092
- .pp = 15,
2093
- .accuracy = 95,
1949
+ .accuracy = percent(95),
2094
1950
  .target = .Foes,
2095
- .chance = 10, // * 10 = 100
1951
+ .chance = percent(100),
2096
1952
  },
2097
1953
  // Detect
2098
1954
  .{
2099
1955
  .effect = .Protect,
2100
1956
  .bp = 0,
2101
1957
  .type = .Fighting,
2102
- .pp = 5,
2103
- .accuracy = 100,
1958
+ .accuracy = percent(100),
2104
1959
  .target = .Self,
1960
+ .priority = 2,
1961
+ .extra = .{ .metronome = false },
2105
1962
  },
2106
1963
  // BoneRush
2107
1964
  .{
2108
1965
  .effect = .MultiHit,
2109
1966
  .bp = 25,
2110
1967
  .type = .Ground,
2111
- .pp = 10,
2112
- .accuracy = 80,
1968
+ .accuracy = percent(80),
2113
1969
  .target = .Other,
2114
1970
  },
2115
1971
  // LockOn
@@ -2117,8 +1973,7 @@ pub const Move = enum(u8) {
2117
1973
  .effect = .LockOn,
2118
1974
  .bp = 0,
2119
1975
  .type = .Normal,
2120
- .pp = 5,
2121
- .accuracy = 100,
1976
+ .accuracy = percent(100),
2122
1977
  .target = .Other,
2123
1978
  },
2124
1979
  // Outrage
@@ -2126,17 +1981,16 @@ pub const Move = enum(u8) {
2126
1981
  .effect = .Thrashing,
2127
1982
  .bp = 90,
2128
1983
  .type = .Dragon,
2129
- .pp = 15,
2130
- .accuracy = 100,
1984
+ .accuracy = percent(100),
2131
1985
  .target = .RandomFoe,
1986
+ .extra = .{ .continuous = true },
2132
1987
  },
2133
1988
  // Sandstorm
2134
1989
  .{
2135
1990
  .effect = .Sandstorm,
2136
1991
  .bp = 0,
2137
1992
  .type = .Rock,
2138
- .pp = 10,
2139
- .accuracy = 100,
1993
+ .accuracy = percent(100),
2140
1994
  .target = .All,
2141
1995
  },
2142
1996
  // GigaDrain
@@ -2144,8 +1998,7 @@ pub const Move = enum(u8) {
2144
1998
  .effect = .DrainHP,
2145
1999
  .bp = 60,
2146
2000
  .type = .Grass,
2147
- .pp = 5,
2148
- .accuracy = 100,
2001
+ .accuracy = percent(100),
2149
2002
  .target = .Other,
2150
2003
  },
2151
2004
  // Endure
@@ -2153,17 +2006,17 @@ pub const Move = enum(u8) {
2153
2006
  .effect = .Endure,
2154
2007
  .bp = 0,
2155
2008
  .type = .Normal,
2156
- .pp = 10,
2157
- .accuracy = 100,
2009
+ .accuracy = percent(100),
2158
2010
  .target = .Self,
2011
+ .priority = 2,
2012
+ .extra = .{ .metronome = false },
2159
2013
  },
2160
2014
  // Charm
2161
2015
  .{
2162
2016
  .effect = .AttackDown2,
2163
2017
  .bp = 0,
2164
2018
  .type = .Normal,
2165
- .pp = 20,
2166
- .accuracy = 100,
2019
+ .accuracy = percent(100),
2167
2020
  .target = .Other,
2168
2021
  },
2169
2022
  // Rollout
@@ -2171,17 +2024,16 @@ pub const Move = enum(u8) {
2171
2024
  .effect = .Rollout,
2172
2025
  .bp = 30,
2173
2026
  .type = .Rock,
2174
- .pp = 20,
2175
- .accuracy = 90,
2027
+ .accuracy = percent(90),
2176
2028
  .target = .Other,
2029
+ .extra = .{ .continuous = true },
2177
2030
  },
2178
2031
  // FalseSwipe
2179
2032
  .{
2180
2033
  .effect = .FalseSwipe,
2181
2034
  .bp = 40,
2182
2035
  .type = .Normal,
2183
- .pp = 40,
2184
- .accuracy = 100,
2036
+ .accuracy = percent(100),
2185
2037
  .target = .Other,
2186
2038
  },
2187
2039
  // Swagger
@@ -2189,8 +2041,7 @@ pub const Move = enum(u8) {
2189
2041
  .effect = .Swagger,
2190
2042
  .bp = 0,
2191
2043
  .type = .Normal,
2192
- .pp = 15,
2193
- .accuracy = 90,
2044
+ .accuracy = percent(90),
2194
2045
  .target = .Other,
2195
2046
  },
2196
2047
  // MilkDrink
@@ -2198,8 +2049,7 @@ pub const Move = enum(u8) {
2198
2049
  .effect = .Heal,
2199
2050
  .bp = 0,
2200
2051
  .type = .Normal,
2201
- .pp = 10,
2202
- .accuracy = 100,
2052
+ .accuracy = percent(100),
2203
2053
  .target = .Self,
2204
2054
  },
2205
2055
  // Spark
@@ -2207,18 +2057,16 @@ pub const Move = enum(u8) {
2207
2057
  .effect = .ParalyzeChance,
2208
2058
  .bp = 65,
2209
2059
  .type = .Electric,
2210
- .pp = 20,
2211
- .accuracy = 100,
2060
+ .accuracy = percent(100),
2212
2061
  .target = .Other,
2213
- .chance = 3, // * 10 = 30
2062
+ .chance = percent(30),
2214
2063
  },
2215
2064
  // FuryCutter
2216
2065
  .{
2217
2066
  .effect = .FuryCutter,
2218
2067
  .bp = 10,
2219
2068
  .type = .Bug,
2220
- .pp = 20,
2221
- .accuracy = 95,
2069
+ .accuracy = percent(95),
2222
2070
  .target = .Other,
2223
2071
  },
2224
2072
  // SteelWing
@@ -2226,18 +2074,16 @@ pub const Move = enum(u8) {
2226
2074
  .effect = .DefenseUpChance,
2227
2075
  .bp = 70,
2228
2076
  .type = .Steel,
2229
- .pp = 25,
2230
- .accuracy = 90,
2077
+ .accuracy = percent(90),
2231
2078
  .target = .Other,
2232
- .chance = 1, // * 10 = 10
2079
+ .chance = percent(10),
2233
2080
  },
2234
2081
  // MeanLook
2235
2082
  .{
2236
2083
  .effect = .MeanLook,
2237
2084
  .bp = 0,
2238
2085
  .type = .Normal,
2239
- .pp = 5,
2240
- .accuracy = 100,
2086
+ .accuracy = percent(100),
2241
2087
  .target = .Other,
2242
2088
  },
2243
2089
  // Attract
@@ -2245,8 +2091,7 @@ pub const Move = enum(u8) {
2245
2091
  .effect = .Attract,
2246
2092
  .bp = 0,
2247
2093
  .type = .Normal,
2248
- .pp = 15,
2249
- .accuracy = 100,
2094
+ .accuracy = percent(100),
2250
2095
  .target = .Other,
2251
2096
  },
2252
2097
  // SleepTalk
@@ -2254,17 +2099,16 @@ pub const Move = enum(u8) {
2254
2099
  .effect = .SleepTalk,
2255
2100
  .bp = 0,
2256
2101
  .type = .Normal,
2257
- .pp = 10,
2258
- .accuracy = 100,
2102
+ .accuracy = percent(100),
2259
2103
  .target = .Self,
2104
+ .extra = .{ .metronome = false },
2260
2105
  },
2261
2106
  // HealBell
2262
2107
  .{
2263
2108
  .effect = .HealBell,
2264
2109
  .bp = 0,
2265
2110
  .type = .Normal,
2266
- .pp = 5,
2267
- .accuracy = 100,
2111
+ .accuracy = percent(100),
2268
2112
  .target = .Self,
2269
2113
  },
2270
2114
  // Return
@@ -2272,8 +2116,7 @@ pub const Move = enum(u8) {
2272
2116
  .effect = .Return,
2273
2117
  .bp = 0,
2274
2118
  .type = .Normal,
2275
- .pp = 20,
2276
- .accuracy = 100,
2119
+ .accuracy = percent(100),
2277
2120
  .target = .Other,
2278
2121
  },
2279
2122
  // Present
@@ -2281,8 +2124,7 @@ pub const Move = enum(u8) {
2281
2124
  .effect = .Present,
2282
2125
  .bp = 0,
2283
2126
  .type = .Normal,
2284
- .pp = 15,
2285
- .accuracy = 90,
2127
+ .accuracy = percent(90),
2286
2128
  .target = .Other,
2287
2129
  },
2288
2130
  // Frustration
@@ -2290,8 +2132,7 @@ pub const Move = enum(u8) {
2290
2132
  .effect = .Frustration,
2291
2133
  .bp = 0,
2292
2134
  .type = .Normal,
2293
- .pp = 20,
2294
- .accuracy = 100,
2135
+ .accuracy = percent(100),
2295
2136
  .target = .Other,
2296
2137
  },
2297
2138
  // Safeguard
@@ -2299,8 +2140,7 @@ pub const Move = enum(u8) {
2299
2140
  .effect = .Safeguard,
2300
2141
  .bp = 0,
2301
2142
  .type = .Normal,
2302
- .pp = 25,
2303
- .accuracy = 100,
2143
+ .accuracy = percent(100),
2304
2144
  .target = .AllySide,
2305
2145
  },
2306
2146
  // PainSplit
@@ -2308,8 +2148,7 @@ pub const Move = enum(u8) {
2308
2148
  .effect = .PainSplit,
2309
2149
  .bp = 0,
2310
2150
  .type = .Normal,
2311
- .pp = 20,
2312
- .accuracy = 100,
2151
+ .accuracy = percent(100),
2313
2152
  .target = .Other,
2314
2153
  },
2315
2154
  // SacredFire
@@ -2317,37 +2156,34 @@ pub const Move = enum(u8) {
2317
2156
  .effect = .SacredFire,
2318
2157
  .bp = 100,
2319
2158
  .type = .Fire,
2320
- .pp = 5,
2321
- .accuracy = 95,
2159
+ .accuracy = percent(95),
2322
2160
  .target = .Other,
2323
- .chance = 5, // * 10 = 50
2161
+ .chance = percent(50),
2324
2162
  },
2325
2163
  // Magnitude
2326
2164
  .{
2327
2165
  .effect = .Magnitude,
2328
2166
  .bp = 0,
2329
2167
  .type = .Ground,
2330
- .pp = 30,
2331
- .accuracy = 100,
2168
+ .accuracy = percent(100),
2332
2169
  .target = .AllOthers,
2170
+ .extra = .{ .underground = true },
2333
2171
  },
2334
2172
  // DynamicPunch
2335
2173
  .{
2336
2174
  .effect = .ConfusionChance,
2337
2175
  .bp = 100,
2338
2176
  .type = .Fighting,
2339
- .pp = 5,
2340
- .accuracy = 50,
2177
+ .accuracy = percent(50),
2341
2178
  .target = .Other,
2342
- .chance = 10, // * 10 = 100
2179
+ .chance = percent(100),
2343
2180
  },
2344
2181
  // Megahorn
2345
2182
  .{
2346
2183
  .effect = .None,
2347
2184
  .bp = 120,
2348
2185
  .type = .Bug,
2349
- .pp = 10,
2350
- .accuracy = 85,
2186
+ .accuracy = percent(85),
2351
2187
  .target = .Other,
2352
2188
  },
2353
2189
  // DragonBreath
@@ -2355,18 +2191,16 @@ pub const Move = enum(u8) {
2355
2191
  .effect = .ParalyzeChance,
2356
2192
  .bp = 60,
2357
2193
  .type = .Dragon,
2358
- .pp = 20,
2359
- .accuracy = 100,
2194
+ .accuracy = percent(100),
2360
2195
  .target = .Other,
2361
- .chance = 3, // * 10 = 30
2196
+ .chance = percent(30),
2362
2197
  },
2363
2198
  // BatonPass
2364
2199
  .{
2365
2200
  .effect = .BatonPass,
2366
2201
  .bp = 0,
2367
2202
  .type = .Normal,
2368
- .pp = 40,
2369
- .accuracy = 100,
2203
+ .accuracy = percent(100),
2370
2204
  .target = .Self,
2371
2205
  },
2372
2206
  // Encore
@@ -2374,8 +2208,7 @@ pub const Move = enum(u8) {
2374
2208
  .effect = .Encore,
2375
2209
  .bp = 0,
2376
2210
  .type = .Normal,
2377
- .pp = 5,
2378
- .accuracy = 100,
2211
+ .accuracy = percent(100),
2379
2212
  .target = .Other,
2380
2213
  },
2381
2214
  // Pursuit
@@ -2383,8 +2216,7 @@ pub const Move = enum(u8) {
2383
2216
  .effect = .Pursuit,
2384
2217
  .bp = 40,
2385
2218
  .type = .Dark,
2386
- .pp = 20,
2387
- .accuracy = 100,
2219
+ .accuracy = percent(100),
2388
2220
  .target = .Other,
2389
2221
  },
2390
2222
  // RapidSpin
@@ -2392,8 +2224,7 @@ pub const Move = enum(u8) {
2392
2224
  .effect = .RapidSpin,
2393
2225
  .bp = 20,
2394
2226
  .type = .Normal,
2395
- .pp = 40,
2396
- .accuracy = 100,
2227
+ .accuracy = percent(100),
2397
2228
  .target = .Other,
2398
2229
  },
2399
2230
  // SweetScent
@@ -2401,8 +2232,7 @@ pub const Move = enum(u8) {
2401
2232
  .effect = .EvasionDown1,
2402
2233
  .bp = 0,
2403
2234
  .type = .Normal,
2404
- .pp = 20,
2405
- .accuracy = 100,
2235
+ .accuracy = percent(100),
2406
2236
  .target = .Foes,
2407
2237
  },
2408
2238
  // IronTail
@@ -2410,37 +2240,34 @@ pub const Move = enum(u8) {
2410
2240
  .effect = .DefenseDownChance,
2411
2241
  .bp = 100,
2412
2242
  .type = .Steel,
2413
- .pp = 15,
2414
- .accuracy = 75,
2243
+ .accuracy = percent(75),
2415
2244
  .target = .Other,
2416
- .chance = 3, // * 10 = 30
2245
+ .chance = percent(30),
2417
2246
  },
2418
2247
  // MetalClaw
2419
2248
  .{
2420
2249
  .effect = .AttackUpChance,
2421
2250
  .bp = 50,
2422
2251
  .type = .Steel,
2423
- .pp = 35,
2424
- .accuracy = 95,
2252
+ .accuracy = percent(95),
2425
2253
  .target = .Other,
2426
- .chance = 1, // * 10 = 10
2254
+ .chance = percent(10),
2427
2255
  },
2428
2256
  // VitalThrow
2429
2257
  .{
2430
2258
  .effect = .AlwaysHit,
2431
2259
  .bp = 70,
2432
2260
  .type = .Fighting,
2433
- .pp = 10,
2434
- .accuracy = 100,
2261
+ .accuracy = percent(100),
2435
2262
  .target = .Other,
2263
+ .priority = -1,
2436
2264
  },
2437
2265
  // MorningSun
2438
2266
  .{
2439
2267
  .effect = .MorningSun,
2440
2268
  .bp = 0,
2441
2269
  .type = .Normal,
2442
- .pp = 5,
2443
- .accuracy = 100,
2270
+ .accuracy = percent(100),
2444
2271
  .target = .Self,
2445
2272
  },
2446
2273
  // Synthesis
@@ -2448,8 +2275,7 @@ pub const Move = enum(u8) {
2448
2275
  .effect = .Synthesis,
2449
2276
  .bp = 0,
2450
2277
  .type = .Grass,
2451
- .pp = 5,
2452
- .accuracy = 100,
2278
+ .accuracy = percent(100),
2453
2279
  .target = .Self,
2454
2280
  },
2455
2281
  // Moonlight
@@ -2457,8 +2283,7 @@ pub const Move = enum(u8) {
2457
2283
  .effect = .Moonlight,
2458
2284
  .bp = 0,
2459
2285
  .type = .Normal,
2460
- .pp = 5,
2461
- .accuracy = 100,
2286
+ .accuracy = percent(100),
2462
2287
  .target = .Self,
2463
2288
  },
2464
2289
  // HiddenPower
@@ -2466,8 +2291,7 @@ pub const Move = enum(u8) {
2466
2291
  .effect = .HiddenPower,
2467
2292
  .bp = 0,
2468
2293
  .type = .Normal,
2469
- .pp = 15,
2470
- .accuracy = 100,
2294
+ .accuracy = percent(100),
2471
2295
  .target = .Other,
2472
2296
  },
2473
2297
  // CrossChop
@@ -2475,8 +2299,7 @@ pub const Move = enum(u8) {
2475
2299
  .effect = .HighCritical,
2476
2300
  .bp = 100,
2477
2301
  .type = .Fighting,
2478
- .pp = 5,
2479
- .accuracy = 80,
2302
+ .accuracy = percent(80),
2480
2303
  .target = .Other,
2481
2304
  },
2482
2305
  // Twister
@@ -2484,18 +2307,17 @@ pub const Move = enum(u8) {
2484
2307
  .effect = .Twister,
2485
2308
  .bp = 40,
2486
2309
  .type = .Dragon,
2487
- .pp = 20,
2488
- .accuracy = 100,
2310
+ .accuracy = percent(100),
2489
2311
  .target = .Foes,
2490
- .chance = 2, // * 10 = 20
2312
+ .chance = percent(20),
2313
+ .extra = .{ .flying = true },
2491
2314
  },
2492
2315
  // RainDance
2493
2316
  .{
2494
2317
  .effect = .RainDance,
2495
2318
  .bp = 0,
2496
2319
  .type = .Water,
2497
- .pp = 5,
2498
- .accuracy = 100,
2320
+ .accuracy = percent(100),
2499
2321
  .target = .All,
2500
2322
  },
2501
2323
  // SunnyDay
@@ -2503,8 +2325,7 @@ pub const Move = enum(u8) {
2503
2325
  .effect = .SunnyDay,
2504
2326
  .bp = 0,
2505
2327
  .type = .Fire,
2506
- .pp = 5,
2507
- .accuracy = 100,
2328
+ .accuracy = percent(100),
2508
2329
  .target = .All,
2509
2330
  },
2510
2331
  // Crunch
@@ -2512,27 +2333,26 @@ pub const Move = enum(u8) {
2512
2333
  .effect = .SpDefDownChance,
2513
2334
  .bp = 80,
2514
2335
  .type = .Dark,
2515
- .pp = 15,
2516
- .accuracy = 100,
2336
+ .accuracy = percent(100),
2517
2337
  .target = .Other,
2518
- .chance = 2, // * 10 = 20
2338
+ .chance = percent(20),
2519
2339
  },
2520
2340
  // MirrorCoat
2521
2341
  .{
2522
2342
  .effect = .MirrorCoat,
2523
2343
  .bp = 0,
2524
2344
  .type = .Psychic,
2525
- .pp = 20,
2526
- .accuracy = 100,
2345
+ .accuracy = percent(100),
2527
2346
  .target = .Depends,
2347
+ .priority = -1,
2348
+ .extra = .{ .metronome = false },
2528
2349
  },
2529
2350
  // PsychUp
2530
2351
  .{
2531
2352
  .effect = .PsychUp,
2532
2353
  .bp = 0,
2533
2354
  .type = .Normal,
2534
- .pp = 10,
2535
- .accuracy = 100,
2355
+ .accuracy = percent(100),
2536
2356
  .target = .Other,
2537
2357
  },
2538
2358
  // ExtremeSpeed
@@ -2540,37 +2360,34 @@ pub const Move = enum(u8) {
2540
2360
  .effect = .Priority,
2541
2361
  .bp = 80,
2542
2362
  .type = .Normal,
2543
- .pp = 5,
2544
- .accuracy = 100,
2363
+ .accuracy = percent(100),
2545
2364
  .target = .Other,
2365
+ .priority = 1,
2546
2366
  },
2547
2367
  // AncientPower
2548
2368
  .{
2549
2369
  .effect = .AllStatUpChance,
2550
2370
  .bp = 60,
2551
2371
  .type = .Rock,
2552
- .pp = 5,
2553
- .accuracy = 100,
2372
+ .accuracy = percent(100),
2554
2373
  .target = .Other,
2555
- .chance = 1, // * 10 = 10
2374
+ .chance = percent(10),
2556
2375
  },
2557
2376
  // ShadowBall
2558
2377
  .{
2559
2378
  .effect = .SpDefDownChance,
2560
2379
  .bp = 80,
2561
2380
  .type = .Ghost,
2562
- .pp = 15,
2563
- .accuracy = 100,
2381
+ .accuracy = percent(100),
2564
2382
  .target = .Other,
2565
- .chance = 2, // * 10 = 20
2383
+ .chance = percent(20),
2566
2384
  },
2567
2385
  // FutureSight
2568
2386
  .{
2569
2387
  .effect = .FutureSight,
2570
2388
  .bp = 80,
2571
2389
  .type = .Psychic,
2572
- .pp = 15,
2573
- .accuracy = 90,
2390
+ .accuracy = percent(90),
2574
2391
  .target = .Other,
2575
2392
  },
2576
2393
  // RockSmash
@@ -2578,27 +2395,25 @@ pub const Move = enum(u8) {
2578
2395
  .effect = .DefenseDownChance,
2579
2396
  .bp = 20,
2580
2397
  .type = .Fighting,
2581
- .pp = 15,
2582
- .accuracy = 100,
2398
+ .accuracy = percent(100),
2583
2399
  .target = .Other,
2584
- .chance = 5, // * 10 = 50
2400
+ .chance = percent(50),
2585
2401
  },
2586
2402
  // Whirlpool
2587
2403
  .{
2588
2404
  .effect = .Binding,
2589
2405
  .bp = 15,
2590
2406
  .type = .Water,
2591
- .pp = 15,
2592
- .accuracy = 70,
2407
+ .accuracy = percent(70),
2593
2408
  .target = .Other,
2409
+ .extra = .{ .protocol = 5 },
2594
2410
  },
2595
2411
  // BeatUp
2596
2412
  .{
2597
2413
  .effect = .BeatUp,
2598
2414
  .bp = 10,
2599
2415
  .type = .Dark,
2600
- .pp = 10,
2601
- .accuracy = 100,
2416
+ .accuracy = percent(100),
2602
2417
  .target = .Other,
2603
2418
  },
2604
2419
  };
@@ -2651,7 +2466,7 @@ pub const Move = enum(u8) {
2651
2466
  FixedDamage,
2652
2467
  FlameWheel,
2653
2468
  FlinchChance,
2654
- Fly,
2469
+ FlyDig,
2655
2470
  FocusEnergy,
2656
2471
  ForceSwitch,
2657
2472
  Foresight,
@@ -2714,7 +2529,7 @@ pub const Move = enum(u8) {
2714
2529
  Sleep,
2715
2530
  SleepTalk,
2716
2531
  Snore,
2717
- Solarbeam,
2532
+ SolarBeam,
2718
2533
  SpAtkUp1,
2719
2534
  SpDefDownChance,
2720
2535
  SpDefUp2,
@@ -2745,6 +2560,11 @@ pub const Move = enum(u8) {
2745
2560
  comptime {
2746
2561
  assert(@sizeOf(Effect) == 1);
2747
2562
  }
2563
+
2564
+ /// Whether this effect has a high critical rate.
2565
+ pub fn isHighCritical(effect: Effect) bool {
2566
+ return effect == .HighCritical or effect == .RazorWind;
2567
+ }
2748
2568
  };
2749
2569
 
2750
2570
  const Target = enum(u8) {
@@ -2768,17 +2588,291 @@ pub const Move = enum(u8) {
2768
2588
  RandomFoe,
2769
2589
  };
2770
2590
 
2591
+ const PP = [_]u8{
2592
+ 35, // Pound
2593
+ 25, // KarateChop
2594
+ 10, // DoubleSlap
2595
+ 15, // CometPunch
2596
+ 20, // MegaPunch
2597
+ 20, // PayDay
2598
+ 15, // FirePunch
2599
+ 15, // IcePunch
2600
+ 15, // ThunderPunch
2601
+ 35, // Scratch
2602
+ 30, // ViseGrip
2603
+ 5, // Guillotine
2604
+ 10, // RazorWind
2605
+ 30, // SwordsDance
2606
+ 30, // Cut
2607
+ 35, // Gust
2608
+ 35, // WingAttack
2609
+ 20, // Whirlwind
2610
+ 15, // Fly
2611
+ 20, // Bind
2612
+ 20, // Slam
2613
+ 10, // VineWhip
2614
+ 20, // Stomp
2615
+ 30, // DoubleKick
2616
+ 5, // MegaKick
2617
+ 25, // JumpKick
2618
+ 15, // RollingKick
2619
+ 15, // SandAttack
2620
+ 15, // Headbutt
2621
+ 25, // HornAttack
2622
+ 20, // FuryAttack
2623
+ 5, // HornDrill
2624
+ 35, // Tackle
2625
+ 15, // BodySlam
2626
+ 20, // Wrap
2627
+ 20, // TakeDown
2628
+ 20, // Thrash
2629
+ 15, // DoubleEdge
2630
+ 30, // TailWhip
2631
+ 35, // PoisonSting
2632
+ 20, // Twineedle
2633
+ 20, // PinMissile
2634
+ 30, // Leer
2635
+ 25, // Bite
2636
+ 40, // Growl
2637
+ 20, // Roar
2638
+ 15, // Sing
2639
+ 20, // Supersonic
2640
+ 20, // SonicBoom
2641
+ 20, // Disable
2642
+ 30, // Acid
2643
+ 25, // Ember
2644
+ 15, // Flamethrower
2645
+ 30, // Mist
2646
+ 25, // WaterGun
2647
+ 5, // HydroPump
2648
+ 15, // Surf
2649
+ 10, // IceBeam
2650
+ 5, // Blizzard
2651
+ 20, // Psybeam
2652
+ 20, // BubbleBeam
2653
+ 20, // AuroraBeam
2654
+ 5, // HyperBeam
2655
+ 35, // Peck
2656
+ 20, // DrillPeck
2657
+ 25, // Submission
2658
+ 20, // LowKick
2659
+ 20, // Counter
2660
+ 20, // SeismicToss
2661
+ 15, // Strength
2662
+ 20, // Absorb
2663
+ 10, // MegaDrain
2664
+ 10, // LeechSeed
2665
+ 40, // Growth
2666
+ 25, // RazorLeaf
2667
+ 10, // SolarBeam
2668
+ 35, // PoisonPowder
2669
+ 30, // StunSpore
2670
+ 15, // SleepPowder
2671
+ 20, // PetalDance
2672
+ 40, // StringShot
2673
+ 10, // DragonRage
2674
+ 15, // FireSpin
2675
+ 30, // ThunderShock
2676
+ 15, // Thunderbolt
2677
+ 20, // ThunderWave
2678
+ 10, // Thunder
2679
+ 15, // RockThrow
2680
+ 10, // Earthquake
2681
+ 5, // Fissure
2682
+ 10, // Dig
2683
+ 10, // Toxic
2684
+ 25, // Confusion
2685
+ 10, // Psychic
2686
+ 20, // Hypnosis
2687
+ 40, // Meditate
2688
+ 30, // Agility
2689
+ 30, // QuickAttack
2690
+ 20, // Rage
2691
+ 20, // Teleport
2692
+ 15, // NightShade
2693
+ 10, // Mimic
2694
+ 40, // Screech
2695
+ 15, // DoubleTeam
2696
+ 20, // Recover
2697
+ 30, // Harden
2698
+ 20, // Minimize
2699
+ 20, // Smokescreen
2700
+ 10, // ConfuseRay
2701
+ 40, // Withdraw
2702
+ 40, // DefenseCurl
2703
+ 30, // Barrier
2704
+ 30, // LightScreen
2705
+ 30, // Haze
2706
+ 20, // Reflect
2707
+ 30, // FocusEnergy
2708
+ 10, // Bide
2709
+ 10, // Metronome
2710
+ 20, // MirrorMove
2711
+ 5, // SelfDestruct
2712
+ 10, // EggBomb
2713
+ 30, // Lick
2714
+ 20, // Smog
2715
+ 20, // Sludge
2716
+ 20, // BoneClub
2717
+ 5, // FireBlast
2718
+ 15, // Waterfall
2719
+ 10, // Clamp
2720
+ 20, // Swift
2721
+ 15, // SkullBash
2722
+ 15, // SpikeCannon
2723
+ 35, // Constrict
2724
+ 20, // Amnesia
2725
+ 15, // Kinesis
2726
+ 10, // SoftBoiled
2727
+ 20, // HighJumpKick
2728
+ 30, // Glare
2729
+ 15, // DreamEater
2730
+ 40, // PoisonGas
2731
+ 20, // Barrage
2732
+ 15, // LeechLife
2733
+ 10, // LovelyKiss
2734
+ 5, // SkyAttack
2735
+ 10, // Transform
2736
+ 30, // Bubble
2737
+ 10, // DizzyPunch
2738
+ 15, // Spore
2739
+ 20, // Flash
2740
+ 15, // Psywave
2741
+ 40, // Splash
2742
+ 40, // AcidArmor
2743
+ 10, // Crabhammer
2744
+ 5, // Explosion
2745
+ 15, // FurySwipes
2746
+ 10, // Bonemerang
2747
+ 10, // Rest
2748
+ 10, // RockSlide
2749
+ 15, // HyperFang
2750
+ 30, // Sharpen
2751
+ 30, // Conversion
2752
+ 10, // TriAttack
2753
+ 10, // SuperFang
2754
+ 20, // Slash
2755
+ 10, // Substitute
2756
+ 1, // Struggle
2757
+ 1, // Sketch
2758
+ 10, // TripleKick
2759
+ 10, // Thief
2760
+ 10, // SpiderWeb
2761
+ 5, // MindReader
2762
+ 15, // Nightmare
2763
+ 25, // FlameWheel
2764
+ 15, // Snore
2765
+ 10, // Curse
2766
+ 15, // Flail
2767
+ 30, // Conversion2
2768
+ 5, // Aeroblast
2769
+ 40, // CottonSpore
2770
+ 15, // Reversal
2771
+ 10, // Spite
2772
+ 25, // PowderSnow
2773
+ 10, // Protect
2774
+ 30, // MachPunch
2775
+ 10, // ScaryFace
2776
+ 20, // FeintAttack
2777
+ 10, // SweetKiss
2778
+ 10, // BellyDrum
2779
+ 10, // SludgeBomb
2780
+ 10, // MudSlap
2781
+ 10, // Octazooka
2782
+ 20, // Spikes
2783
+ 5, // ZapCannon
2784
+ 40, // Foresight
2785
+ 5, // DestinyBond
2786
+ 5, // PerishSong
2787
+ 15, // IcyWind
2788
+ 5, // Detect
2789
+ 10, // BoneRush
2790
+ 5, // LockOn
2791
+ 15, // Outrage
2792
+ 10, // Sandstorm
2793
+ 5, // GigaDrain
2794
+ 10, // Endure
2795
+ 20, // Charm
2796
+ 20, // Rollout
2797
+ 40, // FalseSwipe
2798
+ 15, // Swagger
2799
+ 10, // MilkDrink
2800
+ 20, // Spark
2801
+ 20, // FuryCutter
2802
+ 25, // SteelWing
2803
+ 5, // MeanLook
2804
+ 15, // Attract
2805
+ 10, // SleepTalk
2806
+ 5, // HealBell
2807
+ 20, // Return
2808
+ 15, // Present
2809
+ 20, // Frustration
2810
+ 25, // Safeguard
2811
+ 20, // PainSplit
2812
+ 5, // SacredFire
2813
+ 30, // Magnitude
2814
+ 5, // DynamicPunch
2815
+ 10, // Megahorn
2816
+ 20, // DragonBreath
2817
+ 40, // BatonPass
2818
+ 5, // Encore
2819
+ 20, // Pursuit
2820
+ 40, // RapidSpin
2821
+ 20, // SweetScent
2822
+ 15, // IronTail
2823
+ 35, // MetalClaw
2824
+ 10, // VitalThrow
2825
+ 5, // MorningSun
2826
+ 5, // Synthesis
2827
+ 5, // Moonlight
2828
+ 15, // HiddenPower
2829
+ 5, // CrossChop
2830
+ 20, // Twister
2831
+ 5, // RainDance
2832
+ 5, // SunnyDay
2833
+ 15, // Crunch
2834
+ 20, // MirrorCoat
2835
+ 10, // PsychUp
2836
+ 5, // ExtremeSpeed
2837
+ 5, // AncientPower
2838
+ 15, // ShadowBall
2839
+ 15, // FutureSight
2840
+ 15, // RockSmash
2841
+ 15, // Whirlpool
2842
+ 10, // BeatUp,
2843
+ };
2844
+
2771
2845
  comptime {
2772
2846
  assert(@sizeOf(Move) == 1);
2773
- assert(@sizeOf(@TypeOf(DATA)) == 1757);
2847
+ assert(@sizeOf(@TypeOf(DATA)) == 2008);
2774
2848
  }
2775
2849
 
2776
2850
  /// The number of Pokémon moves in this generation.
2777
2851
  pub const size = 251;
2778
2852
 
2853
+ /// Pokémon moves that can be called by Metronome in this generation.
2854
+ pub const METRONOME = init: {
2855
+ var num = 0;
2856
+ var moves: [239]Move = undefined;
2857
+ for (1..Move.size + 1) |i| {
2858
+ if (Move.get(@enumFromInt(i)).extra.metronome) {
2859
+ moves[num] = @enumFromInt(i);
2860
+ num += 1;
2861
+ }
2862
+ }
2863
+ assert(num == moves.len);
2864
+ break :init moves;
2865
+ };
2866
+
2779
2867
  /// Returns the `Data` corresponding to the move.
2780
- pub inline fn get(id: Move) Data {
2868
+ pub fn get(id: Move) Data {
2869
+ assert(id != .None);
2870
+ return DATA[@intFromEnum(id) - 1];
2871
+ }
2872
+
2873
+ /// Returns the base PP of the move.
2874
+ pub fn pp(id: Move) u8 {
2781
2875
  assert(id != .None);
2782
- return DATA[@enumToInt(id) - 1];
2876
+ return PP[@intFromEnum(id) - 1];
2783
2877
  }
2784
2878
  };