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

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