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

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