@pkmn/engine 0.1.0-dev.fb5bf955 → 0.1.0-dev.fb6653d6

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 (85) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +115 -76
  3. package/build/pkg/addon/browser.d.ts +3 -0
  4. package/build/pkg/addon/browser.js +44 -0
  5. package/build/pkg/addon/browser.js.map +1 -0
  6. package/build/pkg/addon/node.d.ts +3 -0
  7. package/build/pkg/addon/node.js +97 -0
  8. package/build/pkg/addon/node.js.map +1 -0
  9. package/build/pkg/addon/wasm.d.ts +2 -0
  10. package/build/pkg/addon/wasm.js +53 -0
  11. package/build/pkg/addon/wasm.js.map +1 -0
  12. package/build/pkg/addon.d.ts +27 -5
  13. package/build/pkg/addon.js +42 -73
  14. package/build/pkg/addon.js.map +1 -1
  15. package/build/pkg/data/ids.json +12 -12
  16. package/build/pkg/data/layout.json +40 -5
  17. package/build/pkg/data/protocol.json +84 -13
  18. package/build/pkg/data.d.ts +27 -5
  19. package/build/pkg/data.js.map +1 -1
  20. package/build/pkg/gen1.d.ts +16 -19
  21. package/build/pkg/gen1.js +54 -42
  22. package/build/pkg/gen1.js.map +1 -1
  23. package/build/pkg/index.d.ts +55 -103
  24. package/build/pkg/index.js +6 -63
  25. package/build/pkg/index.js.map +1 -1
  26. package/build/pkg/protocol.d.ts +24 -3
  27. package/build/pkg/protocol.js +127 -104
  28. package/build/pkg/protocol.js.map +1 -1
  29. package/build/tools/debug.js +36 -69
  30. package/build/tools/debug.js.map +1 -1
  31. package/build/tools/display/debug.jsx +141 -0
  32. package/build/tools/display/debug.jsx.map +1 -0
  33. package/build/tools/display/index.js +142 -0
  34. package/build/tools/display/index.js.map +1 -0
  35. package/build/tools/display/ui.jsx +349 -0
  36. package/build/tools/display/ui.jsx.map +1 -0
  37. package/build/tools/display/util.js +18 -0
  38. package/build/tools/display/util.js.map +1 -0
  39. package/build.zig +373 -152
  40. package/package.json +68 -120
  41. package/src/bin/install-pkmn-engine +41 -26
  42. package/src/bin/pkmn-debug +29 -6
  43. package/src/lib/bindings/node.zig +121 -0
  44. package/src/lib/bindings/wasm.zig +58 -0
  45. package/src/lib/common/array.zig +77 -0
  46. package/src/lib/common/battle.zig +17 -0
  47. package/src/lib/common/data.zig +19 -31
  48. package/src/lib/common/debug.zig +58 -17
  49. package/src/lib/common/js.zig +120 -0
  50. package/src/lib/common/optional.zig +71 -0
  51. package/src/lib/common/options.zig +18 -3
  52. package/src/lib/common/protocol.zig +947 -407
  53. package/src/lib/common/rational.zig +449 -0
  54. package/src/lib/common/rng.zig +31 -24
  55. package/src/lib/common/util.zig +61 -0
  56. package/src/lib/gen1/calc.zig +953 -0
  57. package/src/lib/gen1/chance.zig +1185 -0
  58. package/src/lib/gen1/data/moves.zig +203 -193
  59. package/src/lib/gen1/data/species.zig +6 -8
  60. package/src/lib/gen1/data/types.zig +11 -12
  61. package/src/lib/gen1/data.zig +100 -89
  62. package/src/lib/gen1/helpers.zig +139 -50
  63. package/src/lib/gen1/mechanics.zig +1344 -907
  64. package/src/lib/gen2/calc.zig +153 -0
  65. package/src/lib/gen2/chance.zig +902 -0
  66. package/src/lib/gen2/data/items.zig +15 -23
  67. package/src/lib/gen2/data/moves.zig +665 -573
  68. package/src/lib/gen2/data/species.zig +3 -5
  69. package/src/lib/gen2/data/types.zig +138 -36
  70. package/src/lib/gen2/data.zig +134 -99
  71. package/src/lib/gen2/generated.zig +801 -0
  72. package/src/lib/gen2/helpers.zig +59 -44
  73. package/src/lib/gen2/mechanics.zig +3582 -30
  74. package/src/lib/node.zig +18 -0
  75. package/src/lib/pkmn.zig +93 -12
  76. package/src/lib/wasm.zig +17 -0
  77. package/src/tools/display/dom.ts +96 -0
  78. package/src/tools/display/ui.css +354 -0
  79. package/build/test/display.js +0 -382
  80. package/build/test/display.js.map +0 -1
  81. package/src/lib/binding/node.zig +0 -229
  82. package/src/lib/binding/wasm.zig +0 -10
  83. package/src/lib/gen1/README.md +0 -784
  84. package/src/lib/gen2/README.md +0 -309
  85. package/src/test/display/pkmn.html.tmpl +0 -368
@@ -1,11 +1,11 @@
1
- //! Code generated by `tools/generate` - manual edits will be overwritten
2
-
3
- const std = @import("std");
1
+ //! Code generated by `tools/generate` - manual edits will be overwritten.
4
2
 
5
3
  const gen1 = @import("../../gen1/data.zig");
4
+ const rng = @import("../../common/rng.zig");
5
+ const std = @import("std");
6
6
 
7
7
  const assert = std.debug.assert;
8
-
8
+ const percent = rng.Gen12.percent;
9
9
  const Type = gen1.Type;
10
10
 
11
11
  /// Representation of a Generation I Pokémon move.
@@ -181,7 +181,7 @@ pub const Move = enum(u8) {
181
181
  SKIP_TURN = 0xFF,
182
182
 
183
183
  /// Data associated with a Pokémon move.
184
- pub const Data = packed struct {
184
+ pub const Data = packed struct(u32) {
185
185
  effect: Effect,
186
186
  /// The move's base PP.
187
187
  bp: u8,
@@ -191,10 +191,6 @@ pub const Move = enum(u8) {
191
191
  type: Type,
192
192
  /// The move's targeting behavior.
193
193
  target: Target,
194
-
195
- comptime {
196
- assert(@sizeOf(Data) == 4);
197
- }
198
194
  };
199
195
 
200
196
  const DATA = [_]Data{
@@ -203,7 +199,7 @@ pub const Move = enum(u8) {
203
199
  .effect = .None,
204
200
  .bp = 40,
205
201
  .type = .Normal,
206
- .accuracy = 100,
202
+ .accuracy = percent(100),
207
203
  .target = .Other,
208
204
  },
209
205
  // KarateChop
@@ -211,7 +207,7 @@ pub const Move = enum(u8) {
211
207
  .effect = .HighCritical,
212
208
  .bp = 50,
213
209
  .type = .Normal,
214
- .accuracy = 100,
210
+ .accuracy = percent(100),
215
211
  .target = .Other,
216
212
  },
217
213
  // DoubleSlap
@@ -219,7 +215,7 @@ pub const Move = enum(u8) {
219
215
  .effect = .MultiHit,
220
216
  .bp = 15,
221
217
  .type = .Normal,
222
- .accuracy = 85,
218
+ .accuracy = percent(85),
223
219
  .target = .Other,
224
220
  },
225
221
  // CometPunch
@@ -227,7 +223,7 @@ pub const Move = enum(u8) {
227
223
  .effect = .MultiHit,
228
224
  .bp = 18,
229
225
  .type = .Normal,
230
- .accuracy = 85,
226
+ .accuracy = percent(85),
231
227
  .target = .Other,
232
228
  },
233
229
  // MegaPunch
@@ -235,7 +231,7 @@ pub const Move = enum(u8) {
235
231
  .effect = .None,
236
232
  .bp = 80,
237
233
  .type = .Normal,
238
- .accuracy = 85,
234
+ .accuracy = percent(85),
239
235
  .target = .Other,
240
236
  },
241
237
  // PayDay
@@ -243,7 +239,7 @@ pub const Move = enum(u8) {
243
239
  .effect = .PayDay,
244
240
  .bp = 40,
245
241
  .type = .Normal,
246
- .accuracy = 100,
242
+ .accuracy = percent(100),
247
243
  .target = .Other,
248
244
  },
249
245
  // FirePunch
@@ -251,7 +247,7 @@ pub const Move = enum(u8) {
251
247
  .effect = .BurnChance1,
252
248
  .bp = 75,
253
249
  .type = .Fire,
254
- .accuracy = 100,
250
+ .accuracy = percent(100),
255
251
  .target = .Other,
256
252
  },
257
253
  // IcePunch
@@ -259,7 +255,7 @@ pub const Move = enum(u8) {
259
255
  .effect = .FreezeChance,
260
256
  .bp = 75,
261
257
  .type = .Ice,
262
- .accuracy = 100,
258
+ .accuracy = percent(100),
263
259
  .target = .Other,
264
260
  },
265
261
  // ThunderPunch
@@ -267,7 +263,7 @@ pub const Move = enum(u8) {
267
263
  .effect = .ParalyzeChance1,
268
264
  .bp = 75,
269
265
  .type = .Electric,
270
- .accuracy = 100,
266
+ .accuracy = percent(100),
271
267
  .target = .Other,
272
268
  },
273
269
  // Scratch
@@ -275,7 +271,7 @@ pub const Move = enum(u8) {
275
271
  .effect = .None,
276
272
  .bp = 40,
277
273
  .type = .Normal,
278
- .accuracy = 100,
274
+ .accuracy = percent(100),
279
275
  .target = .Other,
280
276
  },
281
277
  // ViseGrip
@@ -283,7 +279,7 @@ pub const Move = enum(u8) {
283
279
  .effect = .None,
284
280
  .bp = 55,
285
281
  .type = .Normal,
286
- .accuracy = 100,
282
+ .accuracy = percent(100),
287
283
  .target = .Other,
288
284
  },
289
285
  // Guillotine
@@ -291,7 +287,7 @@ pub const Move = enum(u8) {
291
287
  .effect = .OHKO,
292
288
  .bp = 0,
293
289
  .type = .Normal,
294
- .accuracy = 30,
290
+ .accuracy = percent(30),
295
291
  .target = .Other,
296
292
  },
297
293
  // RazorWind
@@ -299,7 +295,7 @@ pub const Move = enum(u8) {
299
295
  .effect = .Charge,
300
296
  .bp = 80,
301
297
  .type = .Normal,
302
- .accuracy = 75,
298
+ .accuracy = percent(75),
303
299
  .target = .Other,
304
300
  },
305
301
  // SwordsDance
@@ -307,7 +303,7 @@ pub const Move = enum(u8) {
307
303
  .effect = .AttackUp2,
308
304
  .bp = 0,
309
305
  .type = .Normal,
310
- .accuracy = 100,
306
+ .accuracy = percent(100),
311
307
  .target = .Self,
312
308
  },
313
309
  // Cut
@@ -315,7 +311,7 @@ pub const Move = enum(u8) {
315
311
  .effect = .None,
316
312
  .bp = 50,
317
313
  .type = .Normal,
318
- .accuracy = 95,
314
+ .accuracy = percent(95),
319
315
  .target = .Other,
320
316
  },
321
317
  // Gust
@@ -323,7 +319,7 @@ pub const Move = enum(u8) {
323
319
  .effect = .None,
324
320
  .bp = 40,
325
321
  .type = .Normal,
326
- .accuracy = 100,
322
+ .accuracy = percent(100),
327
323
  .target = .Any,
328
324
  },
329
325
  // WingAttack
@@ -331,7 +327,7 @@ pub const Move = enum(u8) {
331
327
  .effect = .None,
332
328
  .bp = 35,
333
329
  .type = .Flying,
334
- .accuracy = 100,
330
+ .accuracy = percent(100),
335
331
  .target = .Any,
336
332
  },
337
333
  // Whirlwind
@@ -339,7 +335,7 @@ pub const Move = enum(u8) {
339
335
  .effect = .SwitchAndTeleport,
340
336
  .bp = 0,
341
337
  .type = .Normal,
342
- .accuracy = 85,
338
+ .accuracy = percent(85),
343
339
  .target = .Other,
344
340
  },
345
341
  // Fly
@@ -347,7 +343,7 @@ pub const Move = enum(u8) {
347
343
  .effect = .Charge,
348
344
  .bp = 70,
349
345
  .type = .Flying,
350
- .accuracy = 95,
346
+ .accuracy = percent(95),
351
347
  .target = .Any,
352
348
  },
353
349
  // Bind
@@ -355,7 +351,7 @@ pub const Move = enum(u8) {
355
351
  .effect = .Binding,
356
352
  .bp = 15,
357
353
  .type = .Normal,
358
- .accuracy = 75,
354
+ .accuracy = percent(75),
359
355
  .target = .Other,
360
356
  },
361
357
  // Slam
@@ -363,7 +359,7 @@ pub const Move = enum(u8) {
363
359
  .effect = .None,
364
360
  .bp = 80,
365
361
  .type = .Normal,
366
- .accuracy = 75,
362
+ .accuracy = percent(75),
367
363
  .target = .Other,
368
364
  },
369
365
  // VineWhip
@@ -371,7 +367,7 @@ pub const Move = enum(u8) {
371
367
  .effect = .None,
372
368
  .bp = 35,
373
369
  .type = .Grass,
374
- .accuracy = 100,
370
+ .accuracy = percent(100),
375
371
  .target = .Other,
376
372
  },
377
373
  // Stomp
@@ -379,7 +375,7 @@ pub const Move = enum(u8) {
379
375
  .effect = .FlinchChance2,
380
376
  .bp = 65,
381
377
  .type = .Normal,
382
- .accuracy = 100,
378
+ .accuracy = percent(100),
383
379
  .target = .Other,
384
380
  },
385
381
  // DoubleKick
@@ -387,7 +383,7 @@ pub const Move = enum(u8) {
387
383
  .effect = .DoubleHit,
388
384
  .bp = 30,
389
385
  .type = .Fighting,
390
- .accuracy = 100,
386
+ .accuracy = percent(100),
391
387
  .target = .Other,
392
388
  },
393
389
  // MegaKick
@@ -395,7 +391,7 @@ pub const Move = enum(u8) {
395
391
  .effect = .None,
396
392
  .bp = 120,
397
393
  .type = .Normal,
398
- .accuracy = 75,
394
+ .accuracy = percent(75),
399
395
  .target = .Other,
400
396
  },
401
397
  // JumpKick
@@ -403,7 +399,7 @@ pub const Move = enum(u8) {
403
399
  .effect = .JumpKick,
404
400
  .bp = 70,
405
401
  .type = .Fighting,
406
- .accuracy = 95,
402
+ .accuracy = percent(95),
407
403
  .target = .Other,
408
404
  },
409
405
  // RollingKick
@@ -411,7 +407,7 @@ pub const Move = enum(u8) {
411
407
  .effect = .FlinchChance2,
412
408
  .bp = 60,
413
409
  .type = .Fighting,
414
- .accuracy = 85,
410
+ .accuracy = percent(85),
415
411
  .target = .Other,
416
412
  },
417
413
  // SandAttack
@@ -419,7 +415,7 @@ pub const Move = enum(u8) {
419
415
  .effect = .AccuracyDown1,
420
416
  .bp = 0,
421
417
  .type = .Normal,
422
- .accuracy = 100,
418
+ .accuracy = percent(100),
423
419
  .target = .Other,
424
420
  },
425
421
  // Headbutt
@@ -427,7 +423,7 @@ pub const Move = enum(u8) {
427
423
  .effect = .FlinchChance2,
428
424
  .bp = 70,
429
425
  .type = .Normal,
430
- .accuracy = 100,
426
+ .accuracy = percent(100),
431
427
  .target = .Other,
432
428
  },
433
429
  // HornAttack
@@ -435,7 +431,7 @@ pub const Move = enum(u8) {
435
431
  .effect = .None,
436
432
  .bp = 65,
437
433
  .type = .Normal,
438
- .accuracy = 100,
434
+ .accuracy = percent(100),
439
435
  .target = .Other,
440
436
  },
441
437
  // FuryAttack
@@ -443,7 +439,7 @@ pub const Move = enum(u8) {
443
439
  .effect = .MultiHit,
444
440
  .bp = 15,
445
441
  .type = .Normal,
446
- .accuracy = 85,
442
+ .accuracy = percent(85),
447
443
  .target = .Other,
448
444
  },
449
445
  // HornDrill
@@ -451,7 +447,7 @@ pub const Move = enum(u8) {
451
447
  .effect = .OHKO,
452
448
  .bp = 0,
453
449
  .type = .Normal,
454
- .accuracy = 30,
450
+ .accuracy = percent(30),
455
451
  .target = .Other,
456
452
  },
457
453
  // Tackle
@@ -459,7 +455,7 @@ pub const Move = enum(u8) {
459
455
  .effect = .None,
460
456
  .bp = 35,
461
457
  .type = .Normal,
462
- .accuracy = 95,
458
+ .accuracy = percent(95),
463
459
  .target = .Other,
464
460
  },
465
461
  // BodySlam
@@ -467,7 +463,7 @@ pub const Move = enum(u8) {
467
463
  .effect = .ParalyzeChance2,
468
464
  .bp = 85,
469
465
  .type = .Normal,
470
- .accuracy = 100,
466
+ .accuracy = percent(100),
471
467
  .target = .Other,
472
468
  },
473
469
  // Wrap
@@ -475,7 +471,7 @@ pub const Move = enum(u8) {
475
471
  .effect = .Binding,
476
472
  .bp = 15,
477
473
  .type = .Normal,
478
- .accuracy = 85,
474
+ .accuracy = percent(85),
479
475
  .target = .Other,
480
476
  },
481
477
  // TakeDown
@@ -483,7 +479,7 @@ pub const Move = enum(u8) {
483
479
  .effect = .Recoil,
484
480
  .bp = 90,
485
481
  .type = .Normal,
486
- .accuracy = 85,
482
+ .accuracy = percent(85),
487
483
  .target = .Other,
488
484
  },
489
485
  // Thrash
@@ -491,7 +487,7 @@ pub const Move = enum(u8) {
491
487
  .effect = .Thrashing,
492
488
  .bp = 90,
493
489
  .type = .Normal,
494
- .accuracy = 100,
490
+ .accuracy = percent(100),
495
491
  .target = .RandomFoe,
496
492
  },
497
493
  // DoubleEdge
@@ -499,7 +495,7 @@ pub const Move = enum(u8) {
499
495
  .effect = .Recoil,
500
496
  .bp = 100,
501
497
  .type = .Normal,
502
- .accuracy = 100,
498
+ .accuracy = percent(100),
503
499
  .target = .Other,
504
500
  },
505
501
  // TailWhip
@@ -507,7 +503,7 @@ pub const Move = enum(u8) {
507
503
  .effect = .DefenseDown1,
508
504
  .bp = 0,
509
505
  .type = .Normal,
510
- .accuracy = 100,
506
+ .accuracy = percent(100),
511
507
  .target = .Foes,
512
508
  },
513
509
  // PoisonSting
@@ -515,7 +511,7 @@ pub const Move = enum(u8) {
515
511
  .effect = .PoisonChance1,
516
512
  .bp = 15,
517
513
  .type = .Poison,
518
- .accuracy = 100,
514
+ .accuracy = percent(100),
519
515
  .target = .Other,
520
516
  },
521
517
  // Twineedle
@@ -523,7 +519,7 @@ pub const Move = enum(u8) {
523
519
  .effect = .Twineedle,
524
520
  .bp = 25,
525
521
  .type = .Bug,
526
- .accuracy = 100,
522
+ .accuracy = percent(100),
527
523
  .target = .Other,
528
524
  },
529
525
  // PinMissile
@@ -531,7 +527,7 @@ pub const Move = enum(u8) {
531
527
  .effect = .MultiHit,
532
528
  .bp = 14,
533
529
  .type = .Bug,
534
- .accuracy = 85,
530
+ .accuracy = percent(85),
535
531
  .target = .Other,
536
532
  },
537
533
  // Leer
@@ -539,7 +535,7 @@ pub const Move = enum(u8) {
539
535
  .effect = .DefenseDown1,
540
536
  .bp = 0,
541
537
  .type = .Normal,
542
- .accuracy = 100,
538
+ .accuracy = percent(100),
543
539
  .target = .Foes,
544
540
  },
545
541
  // Bite
@@ -547,7 +543,7 @@ pub const Move = enum(u8) {
547
543
  .effect = .FlinchChance1,
548
544
  .bp = 60,
549
545
  .type = .Normal,
550
- .accuracy = 100,
546
+ .accuracy = percent(100),
551
547
  .target = .Other,
552
548
  },
553
549
  // Growl
@@ -555,7 +551,7 @@ pub const Move = enum(u8) {
555
551
  .effect = .AttackDown1,
556
552
  .bp = 0,
557
553
  .type = .Normal,
558
- .accuracy = 100,
554
+ .accuracy = percent(100),
559
555
  .target = .Foes,
560
556
  },
561
557
  // Roar
@@ -563,7 +559,7 @@ pub const Move = enum(u8) {
563
559
  .effect = .SwitchAndTeleport,
564
560
  .bp = 0,
565
561
  .type = .Normal,
566
- .accuracy = 100,
562
+ .accuracy = percent(100),
567
563
  .target = .Other,
568
564
  },
569
565
  // Sing
@@ -571,7 +567,7 @@ pub const Move = enum(u8) {
571
567
  .effect = .Sleep,
572
568
  .bp = 0,
573
569
  .type = .Normal,
574
- .accuracy = 55,
570
+ .accuracy = percent(55),
575
571
  .target = .Other,
576
572
  },
577
573
  // Supersonic
@@ -579,7 +575,7 @@ pub const Move = enum(u8) {
579
575
  .effect = .Confusion,
580
576
  .bp = 0,
581
577
  .type = .Normal,
582
- .accuracy = 55,
578
+ .accuracy = percent(55),
583
579
  .target = .Other,
584
580
  },
585
581
  // SonicBoom
@@ -587,7 +583,7 @@ pub const Move = enum(u8) {
587
583
  .effect = .SpecialDamage,
588
584
  .bp = 1,
589
585
  .type = .Normal,
590
- .accuracy = 90,
586
+ .accuracy = percent(90),
591
587
  .target = .Other,
592
588
  },
593
589
  // Disable
@@ -595,7 +591,7 @@ pub const Move = enum(u8) {
595
591
  .effect = .Disable,
596
592
  .bp = 0,
597
593
  .type = .Normal,
598
- .accuracy = 55,
594
+ .accuracy = percent(55),
599
595
  .target = .Other,
600
596
  },
601
597
  // Acid
@@ -603,7 +599,7 @@ pub const Move = enum(u8) {
603
599
  .effect = .DefenseDownChance,
604
600
  .bp = 40,
605
601
  .type = .Poison,
606
- .accuracy = 100,
602
+ .accuracy = percent(100),
607
603
  .target = .Other,
608
604
  },
609
605
  // Ember
@@ -611,7 +607,7 @@ pub const Move = enum(u8) {
611
607
  .effect = .BurnChance1,
612
608
  .bp = 40,
613
609
  .type = .Fire,
614
- .accuracy = 100,
610
+ .accuracy = percent(100),
615
611
  .target = .Other,
616
612
  },
617
613
  // Flamethrower
@@ -619,7 +615,7 @@ pub const Move = enum(u8) {
619
615
  .effect = .BurnChance1,
620
616
  .bp = 95,
621
617
  .type = .Fire,
622
- .accuracy = 100,
618
+ .accuracy = percent(100),
623
619
  .target = .Other,
624
620
  },
625
621
  // Mist
@@ -627,7 +623,7 @@ pub const Move = enum(u8) {
627
623
  .effect = .Mist,
628
624
  .bp = 0,
629
625
  .type = .Ice,
630
- .accuracy = 100,
626
+ .accuracy = percent(100),
631
627
  .target = .Self,
632
628
  },
633
629
  // WaterGun
@@ -635,7 +631,7 @@ pub const Move = enum(u8) {
635
631
  .effect = .None,
636
632
  .bp = 40,
637
633
  .type = .Water,
638
- .accuracy = 100,
634
+ .accuracy = percent(100),
639
635
  .target = .Other,
640
636
  },
641
637
  // HydroPump
@@ -643,7 +639,7 @@ pub const Move = enum(u8) {
643
639
  .effect = .None,
644
640
  .bp = 120,
645
641
  .type = .Water,
646
- .accuracy = 80,
642
+ .accuracy = percent(80),
647
643
  .target = .Other,
648
644
  },
649
645
  // Surf
@@ -651,7 +647,7 @@ pub const Move = enum(u8) {
651
647
  .effect = .None,
652
648
  .bp = 95,
653
649
  .type = .Water,
654
- .accuracy = 100,
650
+ .accuracy = percent(100),
655
651
  .target = .Foes,
656
652
  },
657
653
  // IceBeam
@@ -659,7 +655,7 @@ pub const Move = enum(u8) {
659
655
  .effect = .FreezeChance,
660
656
  .bp = 95,
661
657
  .type = .Ice,
662
- .accuracy = 100,
658
+ .accuracy = percent(100),
663
659
  .target = .Other,
664
660
  },
665
661
  // Blizzard
@@ -667,7 +663,7 @@ pub const Move = enum(u8) {
667
663
  .effect = .FreezeChance,
668
664
  .bp = 120,
669
665
  .type = .Ice,
670
- .accuracy = 90,
666
+ .accuracy = percent(90),
671
667
  .target = .Other,
672
668
  },
673
669
  // Psybeam
@@ -675,7 +671,7 @@ pub const Move = enum(u8) {
675
671
  .effect = .ConfusionChance,
676
672
  .bp = 65,
677
673
  .type = .Psychic,
678
- .accuracy = 100,
674
+ .accuracy = percent(100),
679
675
  .target = .Other,
680
676
  },
681
677
  // BubbleBeam
@@ -683,7 +679,7 @@ pub const Move = enum(u8) {
683
679
  .effect = .SpeedDownChance,
684
680
  .bp = 65,
685
681
  .type = .Water,
686
- .accuracy = 100,
682
+ .accuracy = percent(100),
687
683
  .target = .Other,
688
684
  },
689
685
  // AuroraBeam
@@ -691,7 +687,7 @@ pub const Move = enum(u8) {
691
687
  .effect = .AttackDownChance,
692
688
  .bp = 65,
693
689
  .type = .Ice,
694
- .accuracy = 100,
690
+ .accuracy = percent(100),
695
691
  .target = .Other,
696
692
  },
697
693
  // HyperBeam
@@ -699,7 +695,7 @@ pub const Move = enum(u8) {
699
695
  .effect = .HyperBeam,
700
696
  .bp = 150,
701
697
  .type = .Normal,
702
- .accuracy = 90,
698
+ .accuracy = percent(90),
703
699
  .target = .Other,
704
700
  },
705
701
  // Peck
@@ -707,7 +703,7 @@ pub const Move = enum(u8) {
707
703
  .effect = .None,
708
704
  .bp = 35,
709
705
  .type = .Flying,
710
- .accuracy = 100,
706
+ .accuracy = percent(100),
711
707
  .target = .Any,
712
708
  },
713
709
  // DrillPeck
@@ -715,7 +711,7 @@ pub const Move = enum(u8) {
715
711
  .effect = .None,
716
712
  .bp = 80,
717
713
  .type = .Flying,
718
- .accuracy = 100,
714
+ .accuracy = percent(100),
719
715
  .target = .Any,
720
716
  },
721
717
  // Submission
@@ -723,7 +719,7 @@ pub const Move = enum(u8) {
723
719
  .effect = .Recoil,
724
720
  .bp = 80,
725
721
  .type = .Fighting,
726
- .accuracy = 80,
722
+ .accuracy = percent(80),
727
723
  .target = .Other,
728
724
  },
729
725
  // LowKick
@@ -731,7 +727,7 @@ pub const Move = enum(u8) {
731
727
  .effect = .FlinchChance2,
732
728
  .bp = 50,
733
729
  .type = .Fighting,
734
- .accuracy = 90,
730
+ .accuracy = percent(90),
735
731
  .target = .Other,
736
732
  },
737
733
  // Counter
@@ -739,7 +735,7 @@ pub const Move = enum(u8) {
739
735
  .effect = .None,
740
736
  .bp = 1,
741
737
  .type = .Fighting,
742
- .accuracy = 100,
738
+ .accuracy = percent(100),
743
739
  .target = .Depends,
744
740
  },
745
741
  // SeismicToss
@@ -747,7 +743,7 @@ pub const Move = enum(u8) {
747
743
  .effect = .SpecialDamage,
748
744
  .bp = 1,
749
745
  .type = .Fighting,
750
- .accuracy = 100,
746
+ .accuracy = percent(100),
751
747
  .target = .Other,
752
748
  },
753
749
  // Strength
@@ -755,7 +751,7 @@ pub const Move = enum(u8) {
755
751
  .effect = .None,
756
752
  .bp = 80,
757
753
  .type = .Normal,
758
- .accuracy = 100,
754
+ .accuracy = percent(100),
759
755
  .target = .Other,
760
756
  },
761
757
  // Absorb
@@ -763,7 +759,7 @@ pub const Move = enum(u8) {
763
759
  .effect = .DrainHP,
764
760
  .bp = 20,
765
761
  .type = .Grass,
766
- .accuracy = 100,
762
+ .accuracy = percent(100),
767
763
  .target = .Other,
768
764
  },
769
765
  // MegaDrain
@@ -771,7 +767,7 @@ pub const Move = enum(u8) {
771
767
  .effect = .DrainHP,
772
768
  .bp = 40,
773
769
  .type = .Grass,
774
- .accuracy = 100,
770
+ .accuracy = percent(100),
775
771
  .target = .Other,
776
772
  },
777
773
  // LeechSeed
@@ -779,7 +775,7 @@ pub const Move = enum(u8) {
779
775
  .effect = .LeechSeed,
780
776
  .bp = 0,
781
777
  .type = .Grass,
782
- .accuracy = 90,
778
+ .accuracy = percent(90),
783
779
  .target = .Other,
784
780
  },
785
781
  // Growth
@@ -787,7 +783,7 @@ pub const Move = enum(u8) {
787
783
  .effect = .SpecialUp1,
788
784
  .bp = 0,
789
785
  .type = .Normal,
790
- .accuracy = 100,
786
+ .accuracy = percent(100),
791
787
  .target = .Self,
792
788
  },
793
789
  // RazorLeaf
@@ -795,7 +791,7 @@ pub const Move = enum(u8) {
795
791
  .effect = .HighCritical,
796
792
  .bp = 55,
797
793
  .type = .Grass,
798
- .accuracy = 95,
794
+ .accuracy = percent(95),
799
795
  .target = .Other,
800
796
  },
801
797
  // SolarBeam
@@ -803,7 +799,7 @@ pub const Move = enum(u8) {
803
799
  .effect = .Charge,
804
800
  .bp = 120,
805
801
  .type = .Grass,
806
- .accuracy = 100,
802
+ .accuracy = percent(100),
807
803
  .target = .Other,
808
804
  },
809
805
  // PoisonPowder
@@ -811,7 +807,7 @@ pub const Move = enum(u8) {
811
807
  .effect = .Poison,
812
808
  .bp = 0,
813
809
  .type = .Poison,
814
- .accuracy = 75,
810
+ .accuracy = percent(75),
815
811
  .target = .Other,
816
812
  },
817
813
  // StunSpore
@@ -819,7 +815,7 @@ pub const Move = enum(u8) {
819
815
  .effect = .Paralyze,
820
816
  .bp = 0,
821
817
  .type = .Grass,
822
- .accuracy = 75,
818
+ .accuracy = percent(75),
823
819
  .target = .Other,
824
820
  },
825
821
  // SleepPowder
@@ -827,7 +823,7 @@ pub const Move = enum(u8) {
827
823
  .effect = .Sleep,
828
824
  .bp = 0,
829
825
  .type = .Grass,
830
- .accuracy = 75,
826
+ .accuracy = percent(75),
831
827
  .target = .Other,
832
828
  },
833
829
  // PetalDance
@@ -835,7 +831,7 @@ pub const Move = enum(u8) {
835
831
  .effect = .Thrashing,
836
832
  .bp = 70,
837
833
  .type = .Grass,
838
- .accuracy = 100,
834
+ .accuracy = percent(100),
839
835
  .target = .RandomFoe,
840
836
  },
841
837
  // StringShot
@@ -843,7 +839,7 @@ pub const Move = enum(u8) {
843
839
  .effect = .SpeedDown1,
844
840
  .bp = 0,
845
841
  .type = .Bug,
846
- .accuracy = 95,
842
+ .accuracy = percent(95),
847
843
  .target = .Foes,
848
844
  },
849
845
  // DragonRage
@@ -851,7 +847,7 @@ pub const Move = enum(u8) {
851
847
  .effect = .SpecialDamage,
852
848
  .bp = 1,
853
849
  .type = .Dragon,
854
- .accuracy = 100,
850
+ .accuracy = percent(100),
855
851
  .target = .Other,
856
852
  },
857
853
  // FireSpin
@@ -859,7 +855,7 @@ pub const Move = enum(u8) {
859
855
  .effect = .Binding,
860
856
  .bp = 15,
861
857
  .type = .Fire,
862
- .accuracy = 70,
858
+ .accuracy = percent(70),
863
859
  .target = .Other,
864
860
  },
865
861
  // ThunderShock
@@ -867,7 +863,7 @@ pub const Move = enum(u8) {
867
863
  .effect = .ParalyzeChance1,
868
864
  .bp = 40,
869
865
  .type = .Electric,
870
- .accuracy = 100,
866
+ .accuracy = percent(100),
871
867
  .target = .Other,
872
868
  },
873
869
  // Thunderbolt
@@ -875,7 +871,7 @@ pub const Move = enum(u8) {
875
871
  .effect = .ParalyzeChance1,
876
872
  .bp = 95,
877
873
  .type = .Electric,
878
- .accuracy = 100,
874
+ .accuracy = percent(100),
879
875
  .target = .Other,
880
876
  },
881
877
  // ThunderWave
@@ -883,7 +879,7 @@ pub const Move = enum(u8) {
883
879
  .effect = .Paralyze,
884
880
  .bp = 0,
885
881
  .type = .Electric,
886
- .accuracy = 100,
882
+ .accuracy = percent(100),
887
883
  .target = .Other,
888
884
  },
889
885
  // Thunder
@@ -891,7 +887,7 @@ pub const Move = enum(u8) {
891
887
  .effect = .ParalyzeChance1,
892
888
  .bp = 120,
893
889
  .type = .Electric,
894
- .accuracy = 70,
890
+ .accuracy = percent(70),
895
891
  .target = .Other,
896
892
  },
897
893
  // RockThrow
@@ -899,7 +895,7 @@ pub const Move = enum(u8) {
899
895
  .effect = .None,
900
896
  .bp = 50,
901
897
  .type = .Rock,
902
- .accuracy = 65,
898
+ .accuracy = percent(65),
903
899
  .target = .Other,
904
900
  },
905
901
  // Earthquake
@@ -907,7 +903,7 @@ pub const Move = enum(u8) {
907
903
  .effect = .None,
908
904
  .bp = 100,
909
905
  .type = .Ground,
910
- .accuracy = 100,
906
+ .accuracy = percent(100),
911
907
  .target = .AllOthers,
912
908
  },
913
909
  // Fissure
@@ -915,7 +911,7 @@ pub const Move = enum(u8) {
915
911
  .effect = .OHKO,
916
912
  .bp = 0,
917
913
  .type = .Ground,
918
- .accuracy = 30,
914
+ .accuracy = percent(30),
919
915
  .target = .Other,
920
916
  },
921
917
  // Dig
@@ -923,7 +919,7 @@ pub const Move = enum(u8) {
923
919
  .effect = .Charge,
924
920
  .bp = 100,
925
921
  .type = .Ground,
926
- .accuracy = 100,
922
+ .accuracy = percent(100),
927
923
  .target = .Other,
928
924
  },
929
925
  // Toxic
@@ -931,7 +927,7 @@ pub const Move = enum(u8) {
931
927
  .effect = .Poison,
932
928
  .bp = 0,
933
929
  .type = .Poison,
934
- .accuracy = 85,
930
+ .accuracy = percent(85),
935
931
  .target = .Other,
936
932
  },
937
933
  // Confusion
@@ -939,7 +935,7 @@ pub const Move = enum(u8) {
939
935
  .effect = .ConfusionChance,
940
936
  .bp = 50,
941
937
  .type = .Psychic,
942
- .accuracy = 100,
938
+ .accuracy = percent(100),
943
939
  .target = .Other,
944
940
  },
945
941
  // Psychic
@@ -947,7 +943,7 @@ pub const Move = enum(u8) {
947
943
  .effect = .SpecialDownChance,
948
944
  .bp = 90,
949
945
  .type = .Psychic,
950
- .accuracy = 100,
946
+ .accuracy = percent(100),
951
947
  .target = .Other,
952
948
  },
953
949
  // Hypnosis
@@ -955,7 +951,7 @@ pub const Move = enum(u8) {
955
951
  .effect = .Sleep,
956
952
  .bp = 0,
957
953
  .type = .Psychic,
958
- .accuracy = 60,
954
+ .accuracy = percent(60),
959
955
  .target = .Other,
960
956
  },
961
957
  // Meditate
@@ -963,7 +959,7 @@ pub const Move = enum(u8) {
963
959
  .effect = .AttackUp1,
964
960
  .bp = 0,
965
961
  .type = .Psychic,
966
- .accuracy = 100,
962
+ .accuracy = percent(100),
967
963
  .target = .Self,
968
964
  },
969
965
  // Agility
@@ -971,7 +967,7 @@ pub const Move = enum(u8) {
971
967
  .effect = .SpeedUp2,
972
968
  .bp = 0,
973
969
  .type = .Psychic,
974
- .accuracy = 100,
970
+ .accuracy = percent(100),
975
971
  .target = .Self,
976
972
  },
977
973
  // QuickAttack
@@ -979,7 +975,7 @@ pub const Move = enum(u8) {
979
975
  .effect = .None,
980
976
  .bp = 40,
981
977
  .type = .Normal,
982
- .accuracy = 100,
978
+ .accuracy = percent(100),
983
979
  .target = .Other,
984
980
  },
985
981
  // Rage
@@ -987,7 +983,7 @@ pub const Move = enum(u8) {
987
983
  .effect = .Rage,
988
984
  .bp = 20,
989
985
  .type = .Normal,
990
- .accuracy = 100,
986
+ .accuracy = percent(100),
991
987
  .target = .Other,
992
988
  },
993
989
  // Teleport
@@ -995,7 +991,7 @@ pub const Move = enum(u8) {
995
991
  .effect = .SwitchAndTeleport,
996
992
  .bp = 0,
997
993
  .type = .Psychic,
998
- .accuracy = 100,
994
+ .accuracy = percent(100),
999
995
  .target = .Self,
1000
996
  },
1001
997
  // NightShade
@@ -1003,7 +999,7 @@ pub const Move = enum(u8) {
1003
999
  .effect = .SpecialDamage,
1004
1000
  .bp = 1,
1005
1001
  .type = .Ghost,
1006
- .accuracy = 100,
1002
+ .accuracy = percent(100),
1007
1003
  .target = .Other,
1008
1004
  },
1009
1005
  // Mimic
@@ -1011,7 +1007,7 @@ pub const Move = enum(u8) {
1011
1007
  .effect = .Mimic,
1012
1008
  .bp = 0,
1013
1009
  .type = .Normal,
1014
- .accuracy = 100,
1010
+ .accuracy = percent(100),
1015
1011
  .target = .Other,
1016
1012
  },
1017
1013
  // Screech
@@ -1019,7 +1015,7 @@ pub const Move = enum(u8) {
1019
1015
  .effect = .DefenseDown2,
1020
1016
  .bp = 0,
1021
1017
  .type = .Normal,
1022
- .accuracy = 85,
1018
+ .accuracy = percent(85),
1023
1019
  .target = .Other,
1024
1020
  },
1025
1021
  // DoubleTeam
@@ -1027,7 +1023,7 @@ pub const Move = enum(u8) {
1027
1023
  .effect = .EvasionUp1,
1028
1024
  .bp = 0,
1029
1025
  .type = .Normal,
1030
- .accuracy = 100,
1026
+ .accuracy = percent(100),
1031
1027
  .target = .Self,
1032
1028
  },
1033
1029
  // Recover
@@ -1035,7 +1031,7 @@ pub const Move = enum(u8) {
1035
1031
  .effect = .Heal,
1036
1032
  .bp = 0,
1037
1033
  .type = .Normal,
1038
- .accuracy = 100,
1034
+ .accuracy = percent(100),
1039
1035
  .target = .Self,
1040
1036
  },
1041
1037
  // Harden
@@ -1043,7 +1039,7 @@ pub const Move = enum(u8) {
1043
1039
  .effect = .DefenseUp1,
1044
1040
  .bp = 0,
1045
1041
  .type = .Normal,
1046
- .accuracy = 100,
1042
+ .accuracy = percent(100),
1047
1043
  .target = .Self,
1048
1044
  },
1049
1045
  // Minimize
@@ -1051,7 +1047,7 @@ pub const Move = enum(u8) {
1051
1047
  .effect = .EvasionUp1,
1052
1048
  .bp = 0,
1053
1049
  .type = .Normal,
1054
- .accuracy = 100,
1050
+ .accuracy = percent(100),
1055
1051
  .target = .Self,
1056
1052
  },
1057
1053
  // Smokescreen
@@ -1059,7 +1055,7 @@ pub const Move = enum(u8) {
1059
1055
  .effect = .AccuracyDown1,
1060
1056
  .bp = 0,
1061
1057
  .type = .Normal,
1062
- .accuracy = 100,
1058
+ .accuracy = percent(100),
1063
1059
  .target = .Other,
1064
1060
  },
1065
1061
  // ConfuseRay
@@ -1067,7 +1063,7 @@ pub const Move = enum(u8) {
1067
1063
  .effect = .Confusion,
1068
1064
  .bp = 0,
1069
1065
  .type = .Ghost,
1070
- .accuracy = 100,
1066
+ .accuracy = percent(100),
1071
1067
  .target = .Other,
1072
1068
  },
1073
1069
  // Withdraw
@@ -1075,7 +1071,7 @@ pub const Move = enum(u8) {
1075
1071
  .effect = .DefenseUp1,
1076
1072
  .bp = 0,
1077
1073
  .type = .Water,
1078
- .accuracy = 100,
1074
+ .accuracy = percent(100),
1079
1075
  .target = .Self,
1080
1076
  },
1081
1077
  // DefenseCurl
@@ -1083,7 +1079,7 @@ pub const Move = enum(u8) {
1083
1079
  .effect = .DefenseUp1,
1084
1080
  .bp = 0,
1085
1081
  .type = .Normal,
1086
- .accuracy = 100,
1082
+ .accuracy = percent(100),
1087
1083
  .target = .Self,
1088
1084
  },
1089
1085
  // Barrier
@@ -1091,7 +1087,7 @@ pub const Move = enum(u8) {
1091
1087
  .effect = .DefenseUp2,
1092
1088
  .bp = 0,
1093
1089
  .type = .Psychic,
1094
- .accuracy = 100,
1090
+ .accuracy = percent(100),
1095
1091
  .target = .Self,
1096
1092
  },
1097
1093
  // LightScreen
@@ -1099,7 +1095,7 @@ pub const Move = enum(u8) {
1099
1095
  .effect = .LightScreen,
1100
1096
  .bp = 0,
1101
1097
  .type = .Psychic,
1102
- .accuracy = 100,
1098
+ .accuracy = percent(100),
1103
1099
  .target = .Self,
1104
1100
  },
1105
1101
  // Haze
@@ -1107,7 +1103,7 @@ pub const Move = enum(u8) {
1107
1103
  .effect = .Haze,
1108
1104
  .bp = 0,
1109
1105
  .type = .Ice,
1110
- .accuracy = 100,
1106
+ .accuracy = percent(100),
1111
1107
  .target = .Self,
1112
1108
  },
1113
1109
  // Reflect
@@ -1115,7 +1111,7 @@ pub const Move = enum(u8) {
1115
1111
  .effect = .Reflect,
1116
1112
  .bp = 0,
1117
1113
  .type = .Psychic,
1118
- .accuracy = 100,
1114
+ .accuracy = percent(100),
1119
1115
  .target = .Self,
1120
1116
  },
1121
1117
  // FocusEnergy
@@ -1123,7 +1119,7 @@ pub const Move = enum(u8) {
1123
1119
  .effect = .FocusEnergy,
1124
1120
  .bp = 0,
1125
1121
  .type = .Normal,
1126
- .accuracy = 100,
1122
+ .accuracy = percent(100),
1127
1123
  .target = .Self,
1128
1124
  },
1129
1125
  // Bide
@@ -1131,7 +1127,7 @@ pub const Move = enum(u8) {
1131
1127
  .effect = .Bide,
1132
1128
  .bp = 0,
1133
1129
  .type = .Normal,
1134
- .accuracy = 100,
1130
+ .accuracy = percent(100),
1135
1131
  .target = .Self,
1136
1132
  },
1137
1133
  // Metronome
@@ -1139,7 +1135,7 @@ pub const Move = enum(u8) {
1139
1135
  .effect = .Metronome,
1140
1136
  .bp = 0,
1141
1137
  .type = .Normal,
1142
- .accuracy = 100,
1138
+ .accuracy = percent(100),
1143
1139
  .target = .Self,
1144
1140
  },
1145
1141
  // MirrorMove
@@ -1147,7 +1143,7 @@ pub const Move = enum(u8) {
1147
1143
  .effect = .MirrorMove,
1148
1144
  .bp = 0,
1149
1145
  .type = .Flying,
1150
- .accuracy = 100,
1146
+ .accuracy = percent(100),
1151
1147
  .target = .Self,
1152
1148
  },
1153
1149
  // SelfDestruct
@@ -1155,7 +1151,7 @@ pub const Move = enum(u8) {
1155
1151
  .effect = .Explode,
1156
1152
  .bp = 130,
1157
1153
  .type = .Normal,
1158
- .accuracy = 100,
1154
+ .accuracy = percent(100),
1159
1155
  .target = .Other,
1160
1156
  },
1161
1157
  // EggBomb
@@ -1163,7 +1159,7 @@ pub const Move = enum(u8) {
1163
1159
  .effect = .None,
1164
1160
  .bp = 100,
1165
1161
  .type = .Normal,
1166
- .accuracy = 75,
1162
+ .accuracy = percent(75),
1167
1163
  .target = .Other,
1168
1164
  },
1169
1165
  // Lick
@@ -1171,7 +1167,7 @@ pub const Move = enum(u8) {
1171
1167
  .effect = .ParalyzeChance2,
1172
1168
  .bp = 20,
1173
1169
  .type = .Ghost,
1174
- .accuracy = 100,
1170
+ .accuracy = percent(100),
1175
1171
  .target = .Other,
1176
1172
  },
1177
1173
  // Smog
@@ -1179,7 +1175,7 @@ pub const Move = enum(u8) {
1179
1175
  .effect = .PoisonChance2,
1180
1176
  .bp = 20,
1181
1177
  .type = .Poison,
1182
- .accuracy = 70,
1178
+ .accuracy = percent(70),
1183
1179
  .target = .Other,
1184
1180
  },
1185
1181
  // Sludge
@@ -1187,7 +1183,7 @@ pub const Move = enum(u8) {
1187
1183
  .effect = .PoisonChance2,
1188
1184
  .bp = 65,
1189
1185
  .type = .Poison,
1190
- .accuracy = 100,
1186
+ .accuracy = percent(100),
1191
1187
  .target = .Other,
1192
1188
  },
1193
1189
  // BoneClub
@@ -1195,7 +1191,7 @@ pub const Move = enum(u8) {
1195
1191
  .effect = .FlinchChance1,
1196
1192
  .bp = 65,
1197
1193
  .type = .Ground,
1198
- .accuracy = 85,
1194
+ .accuracy = percent(85),
1199
1195
  .target = .Other,
1200
1196
  },
1201
1197
  // FireBlast
@@ -1203,7 +1199,7 @@ pub const Move = enum(u8) {
1203
1199
  .effect = .BurnChance2,
1204
1200
  .bp = 120,
1205
1201
  .type = .Fire,
1206
- .accuracy = 85,
1202
+ .accuracy = percent(85),
1207
1203
  .target = .Other,
1208
1204
  },
1209
1205
  // Waterfall
@@ -1211,7 +1207,7 @@ pub const Move = enum(u8) {
1211
1207
  .effect = .None,
1212
1208
  .bp = 80,
1213
1209
  .type = .Water,
1214
- .accuracy = 100,
1210
+ .accuracy = percent(100),
1215
1211
  .target = .Other,
1216
1212
  },
1217
1213
  // Clamp
@@ -1219,7 +1215,7 @@ pub const Move = enum(u8) {
1219
1215
  .effect = .Binding,
1220
1216
  .bp = 35,
1221
1217
  .type = .Water,
1222
- .accuracy = 75,
1218
+ .accuracy = percent(75),
1223
1219
  .target = .Other,
1224
1220
  },
1225
1221
  // Swift
@@ -1227,7 +1223,7 @@ pub const Move = enum(u8) {
1227
1223
  .effect = .Swift,
1228
1224
  .bp = 60,
1229
1225
  .type = .Normal,
1230
- .accuracy = 100,
1226
+ .accuracy = percent(100),
1231
1227
  .target = .Foes,
1232
1228
  },
1233
1229
  // SkullBash
@@ -1235,7 +1231,7 @@ pub const Move = enum(u8) {
1235
1231
  .effect = .Charge,
1236
1232
  .bp = 100,
1237
1233
  .type = .Normal,
1238
- .accuracy = 100,
1234
+ .accuracy = percent(100),
1239
1235
  .target = .Other,
1240
1236
  },
1241
1237
  // SpikeCannon
@@ -1243,7 +1239,7 @@ pub const Move = enum(u8) {
1243
1239
  .effect = .MultiHit,
1244
1240
  .bp = 20,
1245
1241
  .type = .Normal,
1246
- .accuracy = 100,
1242
+ .accuracy = percent(100),
1247
1243
  .target = .Other,
1248
1244
  },
1249
1245
  // Constrict
@@ -1251,7 +1247,7 @@ pub const Move = enum(u8) {
1251
1247
  .effect = .SpeedDownChance,
1252
1248
  .bp = 10,
1253
1249
  .type = .Normal,
1254
- .accuracy = 100,
1250
+ .accuracy = percent(100),
1255
1251
  .target = .Other,
1256
1252
  },
1257
1253
  // Amnesia
@@ -1259,7 +1255,7 @@ pub const Move = enum(u8) {
1259
1255
  .effect = .SpecialUp2,
1260
1256
  .bp = 0,
1261
1257
  .type = .Psychic,
1262
- .accuracy = 100,
1258
+ .accuracy = percent(100),
1263
1259
  .target = .Self,
1264
1260
  },
1265
1261
  // Kinesis
@@ -1267,7 +1263,7 @@ pub const Move = enum(u8) {
1267
1263
  .effect = .AccuracyDown1,
1268
1264
  .bp = 0,
1269
1265
  .type = .Psychic,
1270
- .accuracy = 80,
1266
+ .accuracy = percent(80),
1271
1267
  .target = .Other,
1272
1268
  },
1273
1269
  // SoftBoiled
@@ -1275,7 +1271,7 @@ pub const Move = enum(u8) {
1275
1271
  .effect = .Heal,
1276
1272
  .bp = 0,
1277
1273
  .type = .Normal,
1278
- .accuracy = 100,
1274
+ .accuracy = percent(100),
1279
1275
  .target = .Self,
1280
1276
  },
1281
1277
  // HighJumpKick
@@ -1283,7 +1279,7 @@ pub const Move = enum(u8) {
1283
1279
  .effect = .JumpKick,
1284
1280
  .bp = 85,
1285
1281
  .type = .Fighting,
1286
- .accuracy = 90,
1282
+ .accuracy = percent(90),
1287
1283
  .target = .Other,
1288
1284
  },
1289
1285
  // Glare
@@ -1291,7 +1287,7 @@ pub const Move = enum(u8) {
1291
1287
  .effect = .Paralyze,
1292
1288
  .bp = 0,
1293
1289
  .type = .Normal,
1294
- .accuracy = 75,
1290
+ .accuracy = percent(75),
1295
1291
  .target = .Other,
1296
1292
  },
1297
1293
  // DreamEater
@@ -1299,7 +1295,7 @@ pub const Move = enum(u8) {
1299
1295
  .effect = .DreamEater,
1300
1296
  .bp = 100,
1301
1297
  .type = .Psychic,
1302
- .accuracy = 100,
1298
+ .accuracy = percent(100),
1303
1299
  .target = .Other,
1304
1300
  },
1305
1301
  // PoisonGas
@@ -1307,7 +1303,7 @@ pub const Move = enum(u8) {
1307
1303
  .effect = .Poison,
1308
1304
  .bp = 0,
1309
1305
  .type = .Poison,
1310
- .accuracy = 55,
1306
+ .accuracy = percent(55),
1311
1307
  .target = .Other,
1312
1308
  },
1313
1309
  // Barrage
@@ -1315,7 +1311,7 @@ pub const Move = enum(u8) {
1315
1311
  .effect = .MultiHit,
1316
1312
  .bp = 15,
1317
1313
  .type = .Normal,
1318
- .accuracy = 85,
1314
+ .accuracy = percent(85),
1319
1315
  .target = .Other,
1320
1316
  },
1321
1317
  // LeechLife
@@ -1323,7 +1319,7 @@ pub const Move = enum(u8) {
1323
1319
  .effect = .DrainHP,
1324
1320
  .bp = 20,
1325
1321
  .type = .Bug,
1326
- .accuracy = 100,
1322
+ .accuracy = percent(100),
1327
1323
  .target = .Other,
1328
1324
  },
1329
1325
  // LovelyKiss
@@ -1331,7 +1327,7 @@ pub const Move = enum(u8) {
1331
1327
  .effect = .Sleep,
1332
1328
  .bp = 0,
1333
1329
  .type = .Normal,
1334
- .accuracy = 75,
1330
+ .accuracy = percent(75),
1335
1331
  .target = .Other,
1336
1332
  },
1337
1333
  // SkyAttack
@@ -1339,7 +1335,7 @@ pub const Move = enum(u8) {
1339
1335
  .effect = .Charge,
1340
1336
  .bp = 140,
1341
1337
  .type = .Flying,
1342
- .accuracy = 90,
1338
+ .accuracy = percent(90),
1343
1339
  .target = .Any,
1344
1340
  },
1345
1341
  // Transform
@@ -1347,7 +1343,7 @@ pub const Move = enum(u8) {
1347
1343
  .effect = .Transform,
1348
1344
  .bp = 0,
1349
1345
  .type = .Normal,
1350
- .accuracy = 100,
1346
+ .accuracy = percent(100),
1351
1347
  .target = .Other,
1352
1348
  },
1353
1349
  // Bubble
@@ -1355,7 +1351,7 @@ pub const Move = enum(u8) {
1355
1351
  .effect = .SpeedDownChance,
1356
1352
  .bp = 20,
1357
1353
  .type = .Water,
1358
- .accuracy = 100,
1354
+ .accuracy = percent(100),
1359
1355
  .target = .Other,
1360
1356
  },
1361
1357
  // DizzyPunch
@@ -1363,7 +1359,7 @@ pub const Move = enum(u8) {
1363
1359
  .effect = .None,
1364
1360
  .bp = 70,
1365
1361
  .type = .Normal,
1366
- .accuracy = 100,
1362
+ .accuracy = percent(100),
1367
1363
  .target = .Other,
1368
1364
  },
1369
1365
  // Spore
@@ -1371,7 +1367,7 @@ pub const Move = enum(u8) {
1371
1367
  .effect = .Sleep,
1372
1368
  .bp = 0,
1373
1369
  .type = .Grass,
1374
- .accuracy = 100,
1370
+ .accuracy = percent(100),
1375
1371
  .target = .Other,
1376
1372
  },
1377
1373
  // Flash
@@ -1379,7 +1375,7 @@ pub const Move = enum(u8) {
1379
1375
  .effect = .AccuracyDown1,
1380
1376
  .bp = 0,
1381
1377
  .type = .Normal,
1382
- .accuracy = 70,
1378
+ .accuracy = percent(70),
1383
1379
  .target = .Other,
1384
1380
  },
1385
1381
  // Psywave
@@ -1387,7 +1383,7 @@ pub const Move = enum(u8) {
1387
1383
  .effect = .SpecialDamage,
1388
1384
  .bp = 1,
1389
1385
  .type = .Psychic,
1390
- .accuracy = 80,
1386
+ .accuracy = percent(80),
1391
1387
  .target = .Other,
1392
1388
  },
1393
1389
  // Splash
@@ -1395,7 +1391,7 @@ pub const Move = enum(u8) {
1395
1391
  .effect = .Splash,
1396
1392
  .bp = 0,
1397
1393
  .type = .Normal,
1398
- .accuracy = 100,
1394
+ .accuracy = percent(100),
1399
1395
  .target = .Self,
1400
1396
  },
1401
1397
  // AcidArmor
@@ -1403,7 +1399,7 @@ pub const Move = enum(u8) {
1403
1399
  .effect = .DefenseUp2,
1404
1400
  .bp = 0,
1405
1401
  .type = .Poison,
1406
- .accuracy = 100,
1402
+ .accuracy = percent(100),
1407
1403
  .target = .Self,
1408
1404
  },
1409
1405
  // Crabhammer
@@ -1411,7 +1407,7 @@ pub const Move = enum(u8) {
1411
1407
  .effect = .HighCritical,
1412
1408
  .bp = 90,
1413
1409
  .type = .Water,
1414
- .accuracy = 85,
1410
+ .accuracy = percent(85),
1415
1411
  .target = .Other,
1416
1412
  },
1417
1413
  // Explosion
@@ -1419,7 +1415,7 @@ pub const Move = enum(u8) {
1419
1415
  .effect = .Explode,
1420
1416
  .bp = 170,
1421
1417
  .type = .Normal,
1422
- .accuracy = 100,
1418
+ .accuracy = percent(100),
1423
1419
  .target = .Other,
1424
1420
  },
1425
1421
  // FurySwipes
@@ -1427,7 +1423,7 @@ pub const Move = enum(u8) {
1427
1423
  .effect = .MultiHit,
1428
1424
  .bp = 18,
1429
1425
  .type = .Normal,
1430
- .accuracy = 80,
1426
+ .accuracy = percent(80),
1431
1427
  .target = .Other,
1432
1428
  },
1433
1429
  // Bonemerang
@@ -1435,7 +1431,7 @@ pub const Move = enum(u8) {
1435
1431
  .effect = .DoubleHit,
1436
1432
  .bp = 50,
1437
1433
  .type = .Ground,
1438
- .accuracy = 90,
1434
+ .accuracy = percent(90),
1439
1435
  .target = .Other,
1440
1436
  },
1441
1437
  // Rest
@@ -1443,7 +1439,7 @@ pub const Move = enum(u8) {
1443
1439
  .effect = .Heal,
1444
1440
  .bp = 0,
1445
1441
  .type = .Psychic,
1446
- .accuracy = 100,
1442
+ .accuracy = percent(100),
1447
1443
  .target = .Self,
1448
1444
  },
1449
1445
  // RockSlide
@@ -1451,7 +1447,7 @@ pub const Move = enum(u8) {
1451
1447
  .effect = .None,
1452
1448
  .bp = 75,
1453
1449
  .type = .Rock,
1454
- .accuracy = 90,
1450
+ .accuracy = percent(90),
1455
1451
  .target = .Other,
1456
1452
  },
1457
1453
  // HyperFang
@@ -1459,7 +1455,7 @@ pub const Move = enum(u8) {
1459
1455
  .effect = .FlinchChance1,
1460
1456
  .bp = 80,
1461
1457
  .type = .Normal,
1462
- .accuracy = 90,
1458
+ .accuracy = percent(90),
1463
1459
  .target = .Other,
1464
1460
  },
1465
1461
  // Sharpen
@@ -1467,7 +1463,7 @@ pub const Move = enum(u8) {
1467
1463
  .effect = .AttackUp1,
1468
1464
  .bp = 0,
1469
1465
  .type = .Normal,
1470
- .accuracy = 100,
1466
+ .accuracy = percent(100),
1471
1467
  .target = .Self,
1472
1468
  },
1473
1469
  // Conversion
@@ -1475,7 +1471,7 @@ pub const Move = enum(u8) {
1475
1471
  .effect = .Conversion,
1476
1472
  .bp = 0,
1477
1473
  .type = .Normal,
1478
- .accuracy = 100,
1474
+ .accuracy = percent(100),
1479
1475
  .target = .Other,
1480
1476
  },
1481
1477
  // TriAttack
@@ -1483,7 +1479,7 @@ pub const Move = enum(u8) {
1483
1479
  .effect = .None,
1484
1480
  .bp = 80,
1485
1481
  .type = .Normal,
1486
- .accuracy = 100,
1482
+ .accuracy = percent(100),
1487
1483
  .target = .Other,
1488
1484
  },
1489
1485
  // SuperFang
@@ -1491,7 +1487,7 @@ pub const Move = enum(u8) {
1491
1487
  .effect = .SuperFang,
1492
1488
  .bp = 1,
1493
1489
  .type = .Normal,
1494
- .accuracy = 90,
1490
+ .accuracy = percent(90),
1495
1491
  .target = .Other,
1496
1492
  },
1497
1493
  // Slash
@@ -1499,7 +1495,7 @@ pub const Move = enum(u8) {
1499
1495
  .effect = .HighCritical,
1500
1496
  .bp = 70,
1501
1497
  .type = .Normal,
1502
- .accuracy = 100,
1498
+ .accuracy = percent(100),
1503
1499
  .target = .Other,
1504
1500
  },
1505
1501
  // Substitute
@@ -1507,7 +1503,7 @@ pub const Move = enum(u8) {
1507
1503
  .effect = .Substitute,
1508
1504
  .bp = 0,
1509
1505
  .type = .Normal,
1510
- .accuracy = 100,
1506
+ .accuracy = percent(100),
1511
1507
  .target = .Self,
1512
1508
  },
1513
1509
  // Struggle
@@ -1515,7 +1511,7 @@ pub const Move = enum(u8) {
1515
1511
  .effect = .Recoil,
1516
1512
  .bp = 50,
1517
1513
  .type = .Normal,
1518
- .accuracy = 100,
1514
+ .accuracy = percent(100),
1519
1515
  .target = .RandomFoe,
1520
1516
  },
1521
1517
  };
@@ -1601,45 +1597,45 @@ pub const Move = enum(u8) {
1601
1597
  }
1602
1598
 
1603
1599
  /// Whether this effect activates during the "begin" step of move execution.
1604
- pub inline fn onBegin(effect: Effect) bool {
1605
- return @enumToInt(effect) > 0 and @enumToInt(effect) <= 16;
1600
+ pub fn onBegin(effect: Effect) bool {
1601
+ return @intFromEnum(effect) > 0 and @intFromEnum(effect) <= 16;
1606
1602
  }
1607
1603
 
1608
1604
  /// Whether this effect lowers stats.
1609
- pub inline fn isStatDown(effect: Effect) bool {
1610
- return @enumToInt(effect) > 16 and @enumToInt(effect) <= 21;
1605
+ pub fn isStatDown(effect: Effect) bool {
1606
+ return @intFromEnum(effect) > 16 and @intFromEnum(effect) <= 21;
1611
1607
  }
1612
1608
 
1613
1609
  /// Whether this effect activates during the "end" step of move execution.
1614
- pub inline fn onEnd(effect: Effect) bool {
1615
- return @enumToInt(effect) > 16 and @enumToInt(effect) <= 31;
1610
+ pub fn onEnd(effect: Effect) bool {
1611
+ return @intFromEnum(effect) > 16 and @intFromEnum(effect) <= 31;
1616
1612
  }
1617
1613
 
1618
1614
  /// Whether this effect is considered to "always happen".
1619
- pub inline fn alwaysHappens(effect: Effect) bool {
1620
- return @enumToInt(effect) > 31 and @enumToInt(effect) <= 38;
1615
+ pub fn alwaysHappens(effect: Effect) bool {
1616
+ return @intFromEnum(effect) > 31 and @intFromEnum(effect) <= 38;
1621
1617
  }
1622
1618
 
1623
1619
  /// Whether this effect is handled specially by the engine.
1624
- pub inline fn isSpecial(effect: Effect) bool {
1620
+ pub fn isSpecial(effect: Effect) bool {
1625
1621
  // NB: isSpecial includes isMulti up to Twineedle
1626
- return @enumToInt(effect) > 31 and @enumToInt(effect) <= 46;
1622
+ return @intFromEnum(effect) > 31 and @intFromEnum(effect) <= 46;
1627
1623
  }
1628
1624
 
1629
1625
  /// Whether this effect is a multi-hit effect.
1630
- pub inline fn isMulti(effect: Effect) bool {
1631
- return @enumToInt(effect) > 44 and @enumToInt(effect) <= 47;
1626
+ pub fn isMulti(effect: Effect) bool {
1627
+ return @intFromEnum(effect) > 44 and @intFromEnum(effect) <= 47;
1632
1628
  }
1633
1629
 
1634
1630
  /// Whether this effect is has chance of lowering stats.
1635
- pub inline fn isStatDownChance(effect: Effect) bool {
1636
- return @enumToInt(effect) > 47 and @enumToInt(effect) <= 51;
1631
+ pub fn isStatDownChance(effect: Effect) bool {
1632
+ return @intFromEnum(effect) > 47 and @intFromEnum(effect) <= 51;
1637
1633
  }
1638
1634
 
1639
1635
  /// Whether this effect has a secondary chance.
1640
- pub inline fn isSecondaryChance(effect: Effect) bool {
1636
+ pub fn isSecondaryChance(effect: Effect) bool {
1641
1637
  // NB: isSecondaryChance includes isStatDownChance as well as Twineedle
1642
- return (@enumToInt(effect) > 46 and @enumToInt(effect) <= 61);
1638
+ return (@intFromEnum(effect) > 46 and @intFromEnum(effect) <= 61);
1643
1639
  }
1644
1640
  };
1645
1641
 
@@ -1840,15 +1836,29 @@ pub const Move = enum(u8) {
1840
1836
  /// The number of Pokémon moves in this generation.
1841
1837
  pub const size = 165;
1842
1838
 
1839
+ /// Pokémon moves that can be called by Metronome in this generation.
1840
+ pub const METRONOME = init: {
1841
+ var num = 0;
1842
+ var moves: [163]Move = undefined;
1843
+ for (1..Move.size) |i| {
1844
+ if (i != @intFromEnum(Move.Metronome)) {
1845
+ moves[num] = @enumFromInt(i);
1846
+ num += 1;
1847
+ }
1848
+ }
1849
+ assert(num == moves.len);
1850
+ break :init moves;
1851
+ };
1852
+
1843
1853
  /// Returns the `Data` corresponding to the move.
1844
- pub inline fn get(id: Move) Data {
1854
+ pub fn get(id: Move) Data {
1845
1855
  assert(id != .None and id != .SKIP_TURN);
1846
- return DATA[@enumToInt(id) - 1];
1856
+ return DATA[@intFromEnum(id) - 1];
1847
1857
  }
1848
1858
 
1849
1859
  /// Returns the base PP of the move.
1850
1860
  pub fn pp(id: Move) u8 {
1851
1861
  assert(id != .None);
1852
- return PP[@enumToInt(id) - 1];
1862
+ return PP[@intFromEnum(id) - 1];
1853
1863
  }
1854
1864
  };