@pkmn/engine 0.1.0-dev.f3aaee39 → 0.1.0-dev.f6c1a379

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