@pkmn/engine 0.1.0-dev.02b7f810 → 0.1.0-dev.0eb29f53

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.
package/README.md CHANGED
@@ -50,7 +50,7 @@ $ zig build --prefix /usr/local -Doptimize=ReleaseFast
50
50
 
51
51
  The Zig website has [installation instructions](https://ziglang.org/learn/getting-started/) which
52
52
  walk through how to install Zig on each platform - the engine code should work on Zig v0.11.0 dev
53
- build 2168 or greater, though tracks Zig's master branch so this may change in the future if
53
+ build 2560 or greater, though tracks Zig's master branch so this may change in the future if
54
54
  breaking language changes are introduced:
55
55
 
56
56
  `libpkmn` can be built with `-Dshowdown` to instead produce the Pokémon Showdown compatible
@@ -121,7 +121,7 @@ for each player.
121
121
  Unlike [Pokémon Showdown's
122
122
  SIM-PROTOCOL](https://github.com/smogon/pokemon-showdown/blob/master/sim/SIM-PROTOCOL.md#choice-requests)
123
123
  which provides a rich request object at each decision point, the pkmn engine computes the possible
124
- choices on demand based on the result of the previous `update` and the battle state (`OPTIONS_SIZE`
124
+ choices on demand based on the result of the previous `update` and the battle state (`CHOICES_SIZE`
125
125
  is a good size to initialize the buffer passed to `choices`). **Attempting to update the battle with
126
126
  a choice not present in the options returned by `choices` is undefined behavior and may corrupt
127
127
  state or cause the engine to crash.**
@@ -216,7 +216,7 @@ const std = @import("std");
216
216
  const pkmn = @import("pkmn");
217
217
 
218
218
  var random = std.rand.DefaultPrng.init(seed).random();
219
- var options: [pkmn.OPTIONS_SIZE]pkmn.Choice = undefined;
219
+ var choices: [pkmn.CHOICES_SIZE]pkmn.Choice = undefined;
220
220
 
221
221
  var battle = ...
222
222
  var log = ...
@@ -226,8 +226,8 @@ var c2 = pkmn.Choice{};
226
226
 
227
227
  var result = try battle.update(c1, c2, log);
228
228
  while (result.type == .None) : (result = try battle.update(c1, c2, log)) {
229
- c1 = options[random.uintLessThan(u8, battle.choices(.P1, result.p1, &options))];
230
- c2 = options[random.uintLessThan(u8, battle.choices(.P2, result.p2, &options))];
229
+ c1 = choices[random.uintLessThan(u8, battle.choices(.P1, result.p1, &choices))];
230
+ c2 = choices[random.uintLessThan(u8, battle.choices(.P2, result.p2, &choices))];
231
231
  }
232
232
 
233
233
  std.debug.print("{}\n", .{result.type});
@@ -4,4 +4,4 @@ export declare function supports(showdown: boolean, trace?: boolean): boolean;
4
4
  export declare function update(index: number, showdown: boolean, battle: ArrayBuffer, c1?: Choice, c2?: Choice, log?: ArrayBuffer): Result;
5
5
  export declare function choices(index: number, showdown: boolean, battle: ArrayBuffer, player: Player, choice: Choice['type'], buf: ArrayBuffer): Choice[];
6
6
  export declare function choose(index: number, showdown: boolean, battle: ArrayBuffer, player: Player, choice: Choice['type'], buf: ArrayBuffer, fn: (n: number) => number): Choice;
7
- export declare function size(index: number, type: 'options' | 'log'): number;
7
+ export declare function size(index: number, type: 'choices' | 'log'): number;
@@ -105,7 +105,7 @@ function choose(index, showdown, battle, player, choice, buf, fn) {
105
105
  exports.choose = choose;
106
106
  function size(index, type) {
107
107
  const bindings = (ADDON[1] ?? ADDON[0]).bindings[index];
108
- return type[0] === 'o' ? bindings.OPTIONS_SIZE : bindings.LOGS_SIZE;
108
+ return type[0] === 'c' ? bindings.CHOICES_SIZE : bindings.LOGS_SIZE;
109
109
  }
110
110
  exports.size = size;
111
111
  //# sourceMappingURL=addon.js.map
package/build/pkg/gen1.js CHANGED
@@ -50,7 +50,7 @@ class Battle {
50
50
  this.config = config;
51
51
  this.lookup = lookup;
52
52
  this.data = data;
53
- this.options = new ArrayBuffer(addon.size(0, 'options'));
53
+ this.options = new ArrayBuffer(addon.size(0, 'choices'));
54
54
  this.buf = config.log ? new ArrayBuffer(addon.size(0, 'log')) : undefined;
55
55
  this.log = config.log ? new DataView(this.buf) : undefined;
56
56
  this.cache = [undefined, undefined];
@@ -88,7 +88,8 @@ function render(gen, showdown, error, seed, frames, partial = {}) {
88
88
  buf.push(`<pre class="error"><code>${escapeHTML(err)}</pre></code>`);
89
89
  }
90
90
  const type = Array.isArray(last) ? 'showdown' : 'pkmn';
91
- return (0, html_minifier_1.minify)(mustache.render(fs.readFileSync(template(type), 'utf8'), type === 'pkmn'
91
+ const render = ('render' in mustache ? mustache : mustache.default).render;
92
+ return (0, html_minifier_1.minify)(render(fs.readFileSync(template(type), 'utf8'), type === 'pkmn'
92
93
  ? { content: buf.join('') }
93
94
  : {
94
95
  seed: buf.shift(),
@@ -1 +1 @@
1
- {"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/test/display.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/test/display.ts"],"names":[],"mappings":"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"}
package/build.zig CHANGED
@@ -27,6 +27,7 @@ pub fn build(b: *std.Build) !void {
27
27
  const dynamic = b.option(bool, "dynamic", "Build a dynamic library") orelse false;
28
28
  const strip = b.option(bool, "strip", "Strip debugging symbols from binary") orelse false;
29
29
  const pic = b.option(bool, "pic", "Force position independent code") orelse false;
30
+ const emit_asm = b.option(bool, "emit-asm", "Output .s (assembly code)") orelse false;
30
31
 
31
32
  const cmd = b.findProgram(&.{"strip"}, &.{}) catch null;
32
33
 
@@ -79,7 +80,7 @@ pub fn build(b: *std.Build) !void {
79
80
  //
80
81
  // But ziglang/zig#14647 broke this so we now need to do an install() and then manually
81
82
  // rename the file ourself in install-pkmn-engine
82
- lib.install();
83
+ b.installArtifact(lib);
83
84
  } else if (wasm) {
84
85
  const lib = b.addSharedLibrary(.{
85
86
  .name = name,
@@ -105,7 +106,7 @@ pub fn build(b: *std.Build) !void {
105
106
  sh.addFileSourceArg(.{ .path = out });
106
107
  b.getInstallStep().dependOn(&sh.step);
107
108
  }
108
- lib.install();
109
+ b.installArtifact(lib);
109
110
  } else if (dynamic) {
110
111
  const lib = b.addSharedLibrary(.{
111
112
  .name = name,
@@ -119,7 +120,7 @@ pub fn build(b: *std.Build) !void {
119
120
  lib.addIncludePath("src/include");
120
121
  maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
121
122
  if (pic) lib.force_pic = pic;
122
- lib.install();
123
+ b.installArtifact(lib);
123
124
  c = true;
124
125
  } else {
125
126
  const lib = b.addStaticLibrary(.{
@@ -134,7 +135,8 @@ pub fn build(b: *std.Build) !void {
134
135
  lib.bundle_compiler_rt = true;
135
136
  maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
136
137
  if (pic) lib.force_pic = pic;
137
- lib.install();
138
+ if (emit_asm) lib.emit_asm = .emit;
139
+ b.installArtifact(lib);
138
140
  c = true;
139
141
  }
140
142
 
@@ -205,7 +207,7 @@ pub fn build(b: *std.Build) !void {
205
207
  const lint_exe =
206
208
  b.addExecutable(.{ .name = "lint", .root_source_file = .{ .path = "src/tools/lint.zig" } });
207
209
  if (tests.build) tests.step.dependOn(&lint_exe.step);
208
- const lint = lint_exe.run();
210
+ const lint = b.addRunArtifact(lint_exe);
209
211
 
210
212
  b.step("benchmark", "Run benchmark code").dependOn(&benchmark.step);
211
213
  b.step("fuzz", "Run fuzz tester").dependOn(&fuzz.step);
@@ -256,11 +258,8 @@ const TestStep = struct {
256
258
  pub fn create(b: *std.Build, options: *std.Build.OptionsStep, config: Config) *TestStep {
257
259
  const coverage = b.option([]const u8, "test-coverage", "Generate test coverage");
258
260
  const test_file = b.option([]const u8, "test-file", "Input file for test");
259
- const test_bin = b.option([]const u8, "test-bin", "Emit test binary to");
260
261
  const test_filter =
261
262
  b.option([]const u8, "test-filter", "Skip tests that do not match filter");
262
- const test_no_exec =
263
- b.option(bool, "test-no-exec", "Compiles test binary without running it") orelse false;
264
263
 
265
264
  const self = b.allocator.create(TestStep) catch @panic("OOM");
266
265
  const step = std.Build.Step.init(.{ .id = .custom, .name = "Run all tests", .owner = b });
@@ -274,21 +273,17 @@ const TestStep = struct {
274
273
  .root_source_file = .{ .path = path },
275
274
  .optimize = config.optimize,
276
275
  .target = config.target,
276
+ .filter = test_filter,
277
277
  });
278
278
  tests.setMainPkgPath("./");
279
- tests.setFilter(test_filter);
280
279
  tests.addOptions("build_options", options);
281
280
  tests.single_threaded = true;
282
281
  maybeStrip(b, tests, &tests.step, config.strip, config.cmd);
283
282
  if (config.pic) tests.force_pic = config.pic;
284
- if (test_bin) |bin| {
285
- tests.name = std.fs.path.basename(bin);
286
- if (std.fs.path.dirname(bin)) |dir| tests.setOutputDir(dir);
287
- }
288
283
  if (coverage) |c| {
289
284
  tests.setExecCmd(&.{ "kcov", "--include-pattern=src/lib", c, null });
290
285
  }
291
- self.step.dependOn(if (test_no_exec) &tests.step else &tests.run().step);
286
+ self.step.dependOn(&b.addRunArtifact(tests).step);
292
287
  }
293
288
  return self;
294
289
  }
@@ -326,7 +321,7 @@ fn tool(b: *std.Build, path: []const u8, config: ToolConfig) *std.Build.RunStep
326
321
  if (config.tool.tests) |ts| ts.step.dependOn(&exe.step);
327
322
  config.tool.exes.append(exe) catch @panic("OOM");
328
323
 
329
- const run = exe.run();
324
+ const run = b.addRunArtifact(exe);
330
325
  maybeStrip(b, exe, &run.step, config.general.strip, config.general.cmd);
331
326
  if (b.args) |args| run.addArgs(args);
332
327
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pkmn/engine",
3
- "version": "0.1.0-dev.02b7f810",
3
+ "version": "0.1.0-dev.0eb29f53",
4
4
  "description": "A minimal, complete, Pokémon battle simulation engine optimized for performance",
5
5
  "repository": "github:pkmn/engine",
6
6
  "license": "MIT",
@@ -10,7 +10,7 @@ const path = require('path');
10
10
  const {pipeline} = require('stream/promises');
11
11
  const tty = require('tty');
12
12
 
13
- const ZIG_VERSION = {major: 0, minor: 11, patch: 0, dev: 2168};
13
+ const ZIG_VERSION = {major: 0, minor: 11, patch: 0, dev: 2560};
14
14
  const DEV = ZIG_VERSION.dev ? `-dev.${ZIG_VERSION.dev}` : '';
15
15
  const VERSION = `${ZIG_VERSION.major}.${ZIG_VERSION.minor}.${ZIG_VERSION.patch}${DEV}`;
16
16
  const INDEX = 'https://ziglang.org/download/index.json';
@@ -34,11 +34,11 @@ fn bindings(env: c.napi_env) c.napi_value {
34
34
  }
35
35
 
36
36
  fn bind(env: c.napi_env, gen: anytype) c.napi_value {
37
- const options_size = @intCast(u32, gen.OPTIONS_SIZE);
37
+ const choices_size = @intCast(u32, gen.CHOICES_SIZE);
38
38
  const logs_size = @intCast(u32, gen.LOGS_SIZE);
39
39
  var object = Object.init(env);
40
40
  const properties = [_]c.napi_property_descriptor{
41
- Property.init("OPTIONS_SIZE", .{ .value = Number.init(env, options_size) }),
41
+ Property.init("CHOICES_SIZE", .{ .value = Number.init(env, choices_size) }),
42
42
  Property.init("LOGS_SIZE", .{ .value = Number.init(env, logs_size) }),
43
43
  Property.init("update", .{ .method = update(gen) }),
44
44
  Property.init("choices", .{ .method = choices(gen) }),
@@ -108,10 +108,10 @@ fn choices(gen: anytype) c.napi_callback {
108
108
  const request = @intToEnum(pkmn.Choice.Type, Number.get(env, argv[2], u8));
109
109
 
110
110
  assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
111
- assert(len == gen.OPTIONS_SIZE);
111
+ assert(len == gen.CHOICES_SIZE);
112
112
  assert(data != null);
113
113
 
114
- var out = @ptrCast([*]pkmn.Choice, data.?)[0..gen.OPTIONS_SIZE];
114
+ var out = @ptrCast([*]pkmn.Choice, data.?)[0..gen.CHOICES_SIZE];
115
115
  const n = battle.choices(player, request, out);
116
116
  return Number.init(env, @bitCast(u8, n));
117
117
  }
@@ -4,7 +4,7 @@ const pkmn = @import("../pkmn.zig");
4
4
  export const SHOWDOWN = pkmn.options.showdown;
5
5
  export const TRACE = pkmn.options.trace;
6
6
 
7
- export const GEN1_OPTIONS_SIZE =
8
- std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.OPTIONS_SIZE)) catch unreachable;
7
+ export const GEN1_CHOICES_SIZE =
8
+ std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.CHOICES_SIZE)) catch unreachable;
9
9
  export const GEN1_LOGS_SIZE =
10
10
  std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.LOGS_SIZE)) catch unreachable;
@@ -17,16 +17,16 @@ const expectEqual = std.testing.expectEqual;
17
17
  const expect = std.testing.expect;
18
18
 
19
19
  /// The minimum size in bytes required to hold all Generation I choice options.
20
- pub const MAX_OPTIONS: usize = 9; // move 1..4, switch 2..6
20
+ pub const MAX_CHOICES: usize = 9; // move 1..4, switch 2..6
21
21
  /// The optimal size in bytes required to hold all Generation I choice options.
22
- /// At least as large as MAX_OPTIONS.
22
+ /// At least as large as MAX_CHOICES.
23
23
  pub const MAX_LOGS: usize = 180;
24
24
 
25
25
  /// The maximum number of bytes possibly logged by a single Generation I update.
26
- pub const OPTIONS_SIZE = if (builtin.mode == .ReleaseSmall)
27
- MAX_OPTIONS
26
+ pub const CHOICES_SIZE = if (builtin.mode == .ReleaseSmall)
27
+ MAX_CHOICES
28
28
  else
29
- std.math.ceilPowerOfTwo(usize, MAX_OPTIONS) catch unreachable;
29
+ std.math.ceilPowerOfTwo(usize, MAX_CHOICES) catch unreachable;
30
30
  /// The optimal size in bytes required to hold the largest amount of log data possible from a
31
31
  /// single Generation I update. At least as large as MAX_LOGS.
32
32
  pub const LOGS_SIZE = if (builtin.mode == .ReleaseSmall)
@@ -56,6 +56,8 @@ const BOOSTS = &[_][2]u8{
56
56
 
57
57
  const MAX_STAT_VALUE = 999;
58
58
 
59
+ const DISTRIBUTION = [_]u3{ 2, 2, 2, 3, 3, 3, 4, 5 };
60
+
59
61
  pub fn update(battle: anytype, c1: Choice, c2: Choice, log: anytype) !Result {
60
62
  assert(c1.type != .Pass or c2.type != .Pass or battle.turn == 0);
61
63
  if (battle.turn == 0) return start(battle, log);
@@ -302,11 +304,7 @@ fn turnOrder(battle: anytype, c1: Choice, c2: Choice) Player {
302
304
  // Pokémon Showdown's beforeTurnCallback shenanigans
303
305
  if (showdown and m1 == .Counter and m2 == .Counter) battle.rng.advance(1);
304
306
 
305
- const p1 = if (showdown)
306
- battle.rng.range(u8, 0, 2) == 0
307
- else
308
- battle.rng.next() < Gen12.percent(50) + 1;
309
-
307
+ const p1 = Rolls.speedTie(battle);
310
308
  if (!showdown) return if (p1) .P1 else .P2;
311
309
 
312
310
  // Pokémon Showdown's "lockedmove" volatile's onBeforeTurn uses BattleQueue#changeAction,
@@ -316,7 +314,7 @@ fn turnOrder(battle: anytype, c1: Choice, c2: Choice) Player {
316
314
  const t1 = battle.side(.P1).active.volatiles.Thrashing;
317
315
  const t2 = battle.side(.P2).active.volatiles.Thrashing;
318
316
  // If *both* sides are thrashing it really should be another speed tie, but we've patched
319
- // that out and enforce host ordering of events, so P1 just goes first reqgardless of who
317
+ // that out and enforce host ordering of events, so P1 just goes first regardless of who
320
318
  // won the original coin flip
321
319
  if (t1 and t2) return .P1;
322
320
  return if (p1) if (t1 and !t2) .P2 else .P1 else if (t2 and !t1) .P1 else .P2;
@@ -538,12 +536,7 @@ fn beforeMove(
538
536
  } else {
539
537
  try log.activate(ident, .Confusion);
540
538
 
541
- const confused = if (showdown)
542
- !battle.rng.chance(u8, 128, 256)
543
- else
544
- battle.rng.next() >= Gen12.percent(50) + 1;
545
-
546
- if (confused) {
539
+ if (Rolls.confused(battle)) {
547
540
  assert(!volatiles.MultiHit);
548
541
  if (!volatiles.Rage) volatiles.state = 0;
549
542
  volatiles.Bide = false;
@@ -573,7 +566,7 @@ fn beforeMove(
573
566
  const uncapped = battle.last_damage;
574
567
  // Skipping adjustDamage / randomizeDamage / checkHit
575
568
  _ = try applyDamage(battle, player, target, .Confusion, log);
576
- // Pokémon Showdown thinks that Confusion damage is uncapped ¯\_(ツ)_/¯
569
+ // Pokémon Showdown thinks that confusion damage is uncapped ¯\_(ツ)_/¯
577
570
  if (showdown) battle.last_damage = uncapped;
578
571
 
579
572
  return .done;
@@ -583,22 +576,15 @@ fn beforeMove(
583
576
 
584
577
  if (!showdown and try disabled(side, ident, log)) return .done;
585
578
 
586
- if (Status.is(stored.status, .PAR)) {
587
- const paralyzed = if (showdown)
588
- battle.rng.chance(u8, 63, 256)
589
- else
590
- battle.rng.next() < Gen12.percent(25);
591
-
592
- if (paralyzed) {
593
- if (!volatiles.Rage) volatiles.state = 0;
594
- volatiles.Bide = false;
595
- volatiles.Thrashing = false;
596
- volatiles.Charging = false;
597
- volatiles.Binding = false;
598
- // GLITCH: Invulnerable is not cleared, resulting in permanent Fly/Dig invulnerability
599
- try log.cant(ident, .Paralysis);
600
- return .done;
601
- }
579
+ if (Status.is(stored.status, .PAR) and Rolls.paralyzed(battle)) {
580
+ if (!volatiles.Rage) volatiles.state = 0;
581
+ volatiles.Bide = false;
582
+ volatiles.Thrashing = false;
583
+ volatiles.Charging = false;
584
+ volatiles.Binding = false;
585
+ // GLITCH: Invulnerable is not cleared, resulting in permanent Fly/Dig invulnerability
586
+ try log.cant(ident, .Paralysis);
587
+ return .done;
602
588
  }
603
589
 
604
590
  if (volatiles.Bide) {
@@ -992,8 +978,7 @@ fn checkCriticalHit(battle: anytype, player: Player, move: Move.Data) bool {
992
978
  chance = if (side.active.volatiles.FocusEnergy) chance / 2 else @min(chance * 2, 255);
993
979
  chance = if (move.effect == .HighCritical) @min(chance * 4, 255) else chance / 2;
994
980
 
995
- if (showdown) return battle.rng.chance(u8, @intCast(u8, chance), 256);
996
- return std.math.rotl(u8, battle.rng.next(), 3) < chance;
981
+ return Rolls.criticalHit(battle, chance);
997
982
  }
998
983
 
999
984
  fn calcDamage(
@@ -1097,16 +1082,7 @@ fn adjustDamage(battle: anytype, player: Player) u16 {
1097
1082
 
1098
1083
  fn randomizeDamage(battle: anytype) void {
1099
1084
  if (battle.last_damage <= 1) return;
1100
-
1101
- const random = if (showdown)
1102
- battle.rng.range(u8, 217, 256)
1103
- else loop: {
1104
- while (true) {
1105
- const r = std.math.rotr(u8, battle.rng.next(), 1);
1106
- if (r >= 217) break :loop r;
1107
- }
1108
- };
1109
-
1085
+ const random = Rolls.damage(battle);
1110
1086
  battle.last_damage = @intCast(u16, @as(u32, battle.last_damage) *% random / 255);
1111
1087
  }
1112
1088
 
@@ -1124,16 +1100,9 @@ fn specialDamage(battle: anytype, player: Player, move: Move.Data, log: anytype)
1124
1100
  // GLITCH: if power = 0 then a desync occurs (or a miss on Pokémon Showdown)
1125
1101
  .Psywave => power: {
1126
1102
  const max = @intCast(u8, @as(u16, side.stored().level) * 3 / 2);
1127
- if (showdown) {
1128
- break :power battle.rng.range(u8, 0, max);
1129
- } else {
1130
- // GLITCH: Psywave infinite glitch loop
1131
- if (max <= 1) return Result.Error;
1132
- while (true) {
1133
- const r = battle.rng.next();
1134
- if (r < max) break :power r;
1135
- }
1136
- }
1103
+ // GLITCH: Psywave infinite glitch loop
1104
+ if (!showdown and max <= 1) return Result.Error;
1105
+ break :power Rolls.psywave(battle, max);
1137
1106
  },
1138
1107
  else => unreachable,
1139
1108
  };
@@ -1265,19 +1234,7 @@ fn metronome(
1265
1234
  ) !?Result {
1266
1235
  var side = battle.side(player);
1267
1236
 
1268
- side.last_selected_move = if (showdown) blk: {
1269
- const r = battle.rng.range(u8, 0, @enumToInt(Move.Struggle) - 2);
1270
- const mod = @as(u2, (if (r < @enumToInt(Move.Metronome) - 1) 1 else 2));
1271
- break :blk @intToEnum(Move, r + mod);
1272
- } else loop: {
1273
- while (true) {
1274
- const r = battle.rng.next();
1275
- if (r == 0 or r == @enumToInt(Move.Metronome)) continue;
1276
- if (r >= @enumToInt(Move.Struggle)) continue;
1277
- break :loop @intToEnum(Move, r);
1278
- }
1279
- };
1280
-
1237
+ side.last_selected_move = Rolls.metronome(battle);
1281
1238
  incrementPP(side, mslot);
1282
1239
 
1283
1240
  if (!try canMove(battle, player, mslot, auto, false, .Metronome, residual, log)) return null;
@@ -1352,10 +1309,7 @@ fn moveHit(battle: anytype, player: Player, move: Move.Data, immune: *bool, mist
1352
1309
  if (overwrite) side.active.volatiles.state = accuracy;
1353
1310
 
1354
1311
  // GLITCH: max accuracy is 255 so 1/256 chance of miss
1355
- break :miss if (showdown)
1356
- !battle.rng.chance(u8, @intCast(u8, accuracy), 256)
1357
- else
1358
- battle.rng.next() >= accuracy;
1312
+ break :miss !Rolls.hit(battle, accuracy);
1359
1313
  };
1360
1314
 
1361
1315
  // Pokémon Showdown reports miss instead of fail for moves blocked by Mist that 1/256 miss
@@ -1582,6 +1536,42 @@ fn checkEBC(battle: anytype) bool {
1582
1536
  return false;
1583
1537
  }
1584
1538
 
1539
+ fn disabled(side: *Side, ident: ID, log: anytype) !bool {
1540
+ if (side.active.volatiles.disabled_move != 0) {
1541
+ // A Pokémon that transforms after being disabled may end up with less move slots
1542
+ const m = side.active.moves[side.active.volatiles.disabled_move - 1].id;
1543
+ // side.last_selected_move can be Struggle here on Pokemon Showdown we need an extra check
1544
+ const last = if (showdown and m == .Bide and side.active.volatiles.Bide)
1545
+ m
1546
+ else
1547
+ side.last_selected_move;
1548
+ if (m != .None and m == last) {
1549
+ side.active.volatiles.Charging = false;
1550
+ try log.disabled(ident, last);
1551
+ return true;
1552
+ }
1553
+ }
1554
+ return false;
1555
+ }
1556
+
1557
+ inline fn buildRage(battle: anytype, who: Player, log: anytype) !void {
1558
+ const side = battle.side(who);
1559
+ if (side.active.volatiles.Rage and side.active.boosts.atk < 6) {
1560
+ try Effects.boost(battle, who, Move.get(.Rage), log);
1561
+ }
1562
+ }
1563
+
1564
+ fn handleThrashing(battle: anytype, active: *ActivePokemon) bool {
1565
+ var volatiles = &active.volatiles;
1566
+ assert(volatiles.Thrashing);
1567
+ if (volatiles.attacks > 0) return false;
1568
+
1569
+ volatiles.Thrashing = false;
1570
+ volatiles.Confusion = true;
1571
+ volatiles.confusion = Rolls.confusionDuration(battle);
1572
+ return true;
1573
+ }
1574
+
1585
1575
  inline fn onBegin(
1586
1576
  battle: anytype,
1587
1577
  player: Player,
@@ -1672,10 +1662,7 @@ pub const Effects = struct {
1672
1662
  side.active.volatiles.Bide = true;
1673
1663
  assert(!side.active.volatiles.Thrashing and !side.active.volatiles.Rage);
1674
1664
  side.active.volatiles.state = 0;
1675
- side.active.volatiles.attacks = @intCast(u3, if (showdown)
1676
- battle.rng.range(u4, 2, 4)
1677
- else
1678
- (battle.rng.next() & 1) + 2);
1665
+ side.active.volatiles.attacks = Rolls.duration(battle);
1679
1666
 
1680
1667
  try log.start(battle.active(player), .Bide);
1681
1668
  }
@@ -1697,14 +1684,8 @@ pub const Effects = struct {
1697
1684
  return;
1698
1685
  }
1699
1686
 
1700
- const chance = !foe.active.types.includes(move.type) and if (showdown)
1701
- battle.rng.chance(u8, @as(u8, if (move.effect == .BurnChance1) 26 else 77), 256)
1702
- else
1703
- battle.rng.next() < 1 + (if (move.effect == .BurnChance1)
1704
- Gen12.percent(10)
1705
- else
1706
- Gen12.percent(30));
1707
- if (!chance) return;
1687
+ if (foe.active.types.includes(move.type)) return;
1688
+ if (!Rolls.secondaryChance(battle, move.effect == .BurnChance1)) return;
1708
1689
 
1709
1690
  foe_stored.status = Status.init(.BRN);
1710
1691
  foe.active.stats.atk = @max(foe.active.stats.atk / 2, 1);
@@ -1728,11 +1709,7 @@ pub const Effects = struct {
1728
1709
  const sub = foe.active.volatiles.Substitute;
1729
1710
 
1730
1711
  if (move.effect == .ConfusionChance) {
1731
- const chance = if (showdown)
1732
- battle.rng.chance(u8, 25, 256)
1733
- else
1734
- battle.rng.next() < Gen12.percent(10);
1735
- if (!chance) return;
1712
+ if (!Rolls.confusionChance(battle)) return;
1736
1713
  } else {
1737
1714
  if (showdown) {
1738
1715
  if (!try checkHit(battle, player, move, log)) {
@@ -1751,10 +1728,7 @@ pub const Effects = struct {
1751
1728
 
1752
1729
  if (foe.active.volatiles.Confusion) return;
1753
1730
  foe.active.volatiles.Confusion = true;
1754
- foe.active.volatiles.confusion = @intCast(u3, if (showdown)
1755
- battle.rng.range(u8, 2, 6)
1756
- else
1757
- (battle.rng.next() & 3) + 2);
1731
+ foe.active.volatiles.confusion = Rolls.confusionDuration(battle);
1758
1732
 
1759
1733
  try log.start(battle.active(player.foe()), .Confusion);
1760
1734
  }
@@ -1804,11 +1778,8 @@ pub const Effects = struct {
1804
1778
  return Result.Error;
1805
1779
  }
1806
1780
 
1807
- volatiles.disabled_move = @intCast(u3, randomMoveSlot(&battle.rng, &foe.active.moves, n));
1808
- volatiles.disabled_duration = @intCast(u4, if (showdown)
1809
- battle.rng.range(u8, 1, 9)
1810
- else
1811
- (battle.rng.next() & 7) + 1);
1781
+ volatiles.disabled_move = @intCast(u3, Rolls.moveSlot(battle, &foe.active.moves, n));
1782
+ volatiles.disabled_duration = Rolls.disableDuration(battle);
1812
1783
 
1813
1784
  try log.startEffect(foe_ident, .Disable, foe.active.move(volatiles.disabled_move).id);
1814
1785
  return null;
@@ -1847,15 +1818,7 @@ pub const Effects = struct {
1847
1818
  var volatiles = &battle.foe(player).active.volatiles;
1848
1819
 
1849
1820
  if (volatiles.Substitute) return;
1850
-
1851
- const chance = if (showdown)
1852
- battle.rng.chance(u8, @as(u8, if (move.effect == .FlinchChance1) 26 else 77), 256)
1853
- else
1854
- battle.rng.next() < 1 + (if (move.effect == .FlinchChance1)
1855
- Gen12.percent(10)
1856
- else
1857
- Gen12.percent(30));
1858
- if (!chance) return;
1821
+ if (!Rolls.secondaryChance(battle, move.effect == .FlinchChance1)) return;
1859
1822
 
1860
1823
  volatiles.Flinch = true;
1861
1824
  volatiles.Recharging = false;
@@ -1881,12 +1844,8 @@ pub const Effects = struct {
1881
1844
  return if (showdown and !foe.active.types.includes(move.type)) battle.rng.advance(1);
1882
1845
  }
1883
1846
 
1884
- const chance = !foe.active.types.includes(move.type) and if (showdown)
1885
- battle.rng.chance(u8, 26, 256)
1886
- else
1887
- battle.rng.next() < 1 + Gen12.percent(10);
1888
- if (!chance) return;
1889
-
1847
+ if (foe.active.types.includes(move.type)) return;
1848
+ if (!Rolls.secondaryChance(battle, true)) return;
1890
1849
  // Freeze Clause Mod
1891
1850
  if (showdown) for (foe.pokemon) |p| if (Status.is(p.status, .FRZ)) return;
1892
1851
 
@@ -2031,7 +1990,7 @@ pub const Effects = struct {
2031
1990
  }
2032
1991
  if (!try checkHit(battle, player, move, log)) return;
2033
1992
 
2034
- const rslot = randomMoveSlot(&battle.rng, &foe.active.moves, 0);
1993
+ const rslot = Rolls.moveSlot(battle, &foe.active.moves, 0);
2035
1994
  side.active.move(oslot).id = foe.active.move(rslot).id;
2036
1995
 
2037
1996
  try log.startEffect(battle.active(player), .Mimic, side.active.move(oslot).id);
@@ -2052,7 +2011,8 @@ pub const Effects = struct {
2052
2011
  assert(!side.active.volatiles.MultiHit);
2053
2012
  side.active.volatiles.MultiHit = true;
2054
2013
 
2055
- side.active.volatiles.attacks = if (move.effect == .MultiHit) distribution(battle) else 2;
2014
+ side.active.volatiles.attacks =
2015
+ if (move.effect == .MultiHit) Rolls.distribution(battle) else 2;
2056
2016
  }
2057
2017
 
2058
2018
  fn paralyze(battle: anytype, player: Player, move: Move.Data, log: anytype) !void {
@@ -2096,14 +2056,8 @@ pub const Effects = struct {
2096
2056
  }
2097
2057
 
2098
2058
  // Body Slam can't paralyze a Normal type Pokémon
2099
- const chance = !foe.active.types.includes(move.type) and if (showdown)
2100
- battle.rng.chance(u8, @as(u8, if (move.effect == .ParalyzeChance1) 26 else 77), 256)
2101
- else
2102
- battle.rng.next() < 1 + (if (move.effect == .ParalyzeChance1)
2103
- Gen12.percent(10)
2104
- else
2105
- Gen12.percent(30));
2106
- if (!chance) return;
2059
+ if (foe.active.types.includes(move.type)) return;
2060
+ if (!Rolls.secondaryChance(battle, move.effect == .ParalyzeChance1)) return;
2107
2061
 
2108
2062
  foe_stored.status = Status.init(.PAR);
2109
2063
  foe.active.stats.spe = @max(foe.active.stats.spe / 4, 1);
@@ -2146,16 +2100,7 @@ pub const Effects = struct {
2146
2100
 
2147
2101
  if (move.effect == .Poison) {
2148
2102
  if (!showdown and !try checkHit(battle, player, move, log)) return;
2149
- } else {
2150
- const chance = if (showdown)
2151
- battle.rng.chance(u8, @as(u8, if (move.effect == .PoisonChance1) 52 else 103), 256)
2152
- else
2153
- battle.rng.next() < 1 + (if (move.effect == .PoisonChance1)
2154
- Gen12.percent(20)
2155
- else
2156
- Gen12.percent(40));
2157
- if (!chance) return;
2158
- }
2103
+ } else if (!Rolls.poisonChance(battle, move.effect == .PoisonChance1)) return;
2159
2104
 
2160
2105
  foe_stored.status = Status.init(.PSN);
2161
2106
  if (toxic) {
@@ -2222,16 +2167,7 @@ pub const Effects = struct {
2222
2167
  }
2223
2168
  foe.active.volatiles.Recharging = false;
2224
2169
 
2225
- const duration = @intCast(u3, if (showdown)
2226
- battle.rng.range(u8, 1, 8)
2227
- else loop: {
2228
- while (true) {
2229
- const r = battle.rng.next() & 7;
2230
- if (r != 0) break :loop r;
2231
- }
2232
- });
2233
-
2234
- foe_stored.status = Status.slp(duration);
2170
+ foe_stored.status = Status.slp(Rolls.sleep(battle));
2235
2171
  try log.statusFrom(foe_ident, foe_stored.status, battle.side(player).last_selected_move);
2236
2172
  }
2237
2173
 
@@ -2284,10 +2220,7 @@ pub const Effects = struct {
2284
2220
  assert(!volatiles.Bide);
2285
2221
 
2286
2222
  volatiles.Thrashing = true;
2287
- volatiles.attacks = @intCast(u3, if (showdown)
2288
- battle.rng.range(u8, 2, 4)
2289
- else
2290
- (battle.rng.next() & 1) + 2);
2223
+ volatiles.attacks = Rolls.duration(battle);
2291
2224
  }
2292
2225
 
2293
2226
  fn transform(battle: anytype, player: Player, log: anytype) !void {
@@ -2329,7 +2262,7 @@ pub const Effects = struct {
2329
2262
  // (Pokémon Showdown unitentionally patches this glitch, preventing automatic selection)
2330
2263
  if (!showdown) foe.active.volatiles.Recharging = false;
2331
2264
 
2332
- side.active.volatiles.attacks = distribution(battle) - 1;
2265
+ side.active.volatiles.attacks = Rolls.distribution(battle) - 1;
2333
2266
  }
2334
2267
 
2335
2268
  fn boost(battle: anytype, player: Player, move: Move.Data, log: anytype) !void {
@@ -2356,7 +2289,7 @@ pub const Effects = struct {
2356
2289
  return try log.fail(ident, .None);
2357
2290
  }
2358
2291
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.atk) + 6)];
2359
- const stat = unmodifiedStats(battle, player).atk;
2292
+ const stat = unmodifiedStats(battle, side).atk;
2360
2293
  stats.atk = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
2361
2294
  try log.boost(ident, reason, n);
2362
2295
  // Pokémon Showdown doesn't re-apply status modifiers after Rage boosts
@@ -2376,7 +2309,7 @@ pub const Effects = struct {
2376
2309
  return try log.fail(ident, .None);
2377
2310
  }
2378
2311
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.def) + 6)];
2379
- const stat = unmodifiedStats(battle, player).def;
2312
+ const stat = unmodifiedStats(battle, side).def;
2380
2313
  stats.def = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
2381
2314
  try log.boost(ident, .Defense, n);
2382
2315
  },
@@ -2393,7 +2326,7 @@ pub const Effects = struct {
2393
2326
  return try log.fail(ident, .None);
2394
2327
  }
2395
2328
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spe) + 6)];
2396
- const stat = unmodifiedStats(battle, player).spe;
2329
+ const stat = unmodifiedStats(battle, side).spe;
2397
2330
  stats.spe = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
2398
2331
  try log.boost(ident, .Speed, 2);
2399
2332
  },
@@ -2413,7 +2346,7 @@ pub const Effects = struct {
2413
2346
  return try log.fail(ident, .None);
2414
2347
  }
2415
2348
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spc) + 6)];
2416
- const stat = unmodifiedStats(battle, player).spc;
2349
+ const stat = unmodifiedStats(battle, side).spc;
2417
2350
  stats.spc = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
2418
2351
  try log.boost(ident, .SpecialAttack, n);
2419
2352
  try log.boost(ident, .SpecialDefense, n);
@@ -2440,11 +2373,7 @@ pub const Effects = struct {
2440
2373
  }
2441
2374
 
2442
2375
  if (move.effect.isStatDownChance()) {
2443
- const chance = if (showdown)
2444
- battle.rng.chance(u8, 85, 256)
2445
- else
2446
- battle.rng.next() < Gen12.percent(33) + 1;
2447
- if (!chance or foe.active.volatiles.Invulnerable) return;
2376
+ if (!Rolls.unboost(battle) or foe.active.volatiles.Invulnerable) return;
2448
2377
  } else if (!showdown and !try checkHit(battle, player, move, log)) {
2449
2378
  return; // checkHit already checks for Invulnerable
2450
2379
  }
@@ -2466,7 +2395,7 @@ pub const Effects = struct {
2466
2395
  return try log.fail(foe_ident, .None);
2467
2396
  }
2468
2397
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.atk) + 6)];
2469
- const stat = unmodifiedStats(battle, player.foe()).atk;
2398
+ const stat = unmodifiedStats(battle, foe).atk;
2470
2399
  stats.atk = @max(1, stat * mod[0] / mod[1]);
2471
2400
  try log.boost(foe_ident, .Attack, -1);
2472
2401
  },
@@ -2484,7 +2413,7 @@ pub const Effects = struct {
2484
2413
  return try log.fail(foe_ident, .None);
2485
2414
  }
2486
2415
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.def) + 6)];
2487
- const stat = unmodifiedStats(battle, player.foe()).def;
2416
+ const stat = unmodifiedStats(battle, foe).def;
2488
2417
  stats.def = @max(1, stat * mod[0] / mod[1]);
2489
2418
  try log.boost(foe_ident, .Defense, -@as(i8, n));
2490
2419
  },
@@ -2501,7 +2430,7 @@ pub const Effects = struct {
2501
2430
  return try log.fail(foe_ident, .None);
2502
2431
  }
2503
2432
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spe) + 6)];
2504
- const stat = unmodifiedStats(battle, player.foe()).spe;
2433
+ const stat = unmodifiedStats(battle, foe).spe;
2505
2434
  stats.spe = @max(1, stat * mod[0] / mod[1]);
2506
2435
  try log.boost(foe_ident, .Speed, -1);
2507
2436
  assert(boosts.spe >= -6);
@@ -2521,7 +2450,7 @@ pub const Effects = struct {
2521
2450
  return try log.fail(foe_ident, .None);
2522
2451
  }
2523
2452
  var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spc) + 6)];
2524
- const stat = unmodifiedStats(battle, player.foe()).spc;
2453
+ const stat = unmodifiedStats(battle, foe).spc;
2525
2454
  stats.spc = @max(1, stat * mod[0] / mod[1]);
2526
2455
  try log.boost(foe_ident, .SpecialAttack, -1);
2527
2456
  try log.boost(foe_ident, .SpecialDefense, -1);
@@ -2540,8 +2469,7 @@ pub const Effects = struct {
2540
2469
  }
2541
2470
  };
2542
2471
 
2543
- fn unmodifiedStats(battle: anytype, who: Player) *Stats(u16) {
2544
- const side = battle.side(who);
2472
+ fn unmodifiedStats(battle: anytype, side: *Side) *Stats(u16) {
2545
2473
  if (!side.active.volatiles.Transform) return &side.stored().stats;
2546
2474
  const id = ID.from(side.active.volatiles.transform);
2547
2475
  return &battle.side(id.player).pokemon[id.id - 1].stats;
@@ -2607,80 +2535,140 @@ fn clearVolatiles(battle: anytype, who: Player, log: anytype) !void {
2607
2535
  }
2608
2536
  }
2609
2537
 
2610
- fn disabled(side: *Side, ident: ID, log: anytype) !bool {
2611
- if (side.active.volatiles.disabled_move != 0) {
2612
- // A Pokémon that transforms after being disabled may end up with less move slots
2613
- const m = side.active.moves[side.active.volatiles.disabled_move - 1].id;
2614
- // side.last_selected_move can be Struggle here on Pokemon Showdown we need an extra check
2615
- const last = if (showdown and m == .Bide and side.active.volatiles.Bide)
2616
- m
2617
- else
2618
- side.last_selected_move;
2619
- if (m != .None and m == last) {
2620
- side.active.volatiles.Charging = false;
2621
- try log.disabled(ident, last);
2622
- return true;
2538
+ pub const Rolls = struct {
2539
+ inline fn speedTie(battle: anytype) bool {
2540
+ if (showdown) return battle.rng.range(u8, 0, 2) == 0;
2541
+ return battle.rng.next() < Gen12.percent(50) + 1;
2542
+ }
2543
+
2544
+ inline fn criticalHit(battle: anytype, chance: u16) bool {
2545
+ if (showdown) return battle.rng.chance(u8, @intCast(u8, chance), 256);
2546
+ return std.math.rotl(u8, battle.rng.next(), 3) < chance;
2547
+ }
2548
+
2549
+ inline fn damage(battle: anytype) u8 {
2550
+ if (showdown) return battle.rng.range(u8, 217, 256);
2551
+ while (true) {
2552
+ const r = std.math.rotr(u8, battle.rng.next(), 1);
2553
+ if (r >= 217) return r;
2623
2554
  }
2624
2555
  }
2625
- return false;
2626
- }
2627
2556
 
2628
- inline fn buildRage(battle: anytype, who: Player, log: anytype) !void {
2629
- const side = battle.side(who);
2630
- if (side.active.volatiles.Rage and side.active.boosts.atk < 6) {
2631
- try Effects.boost(battle, who, Move.get(.Rage), log);
2557
+ inline fn hit(battle: anytype, accuracy: u16) bool {
2558
+ if (showdown) return battle.rng.chance(u8, @intCast(u8, accuracy), 256);
2559
+ return battle.rng.next() < accuracy;
2632
2560
  }
2633
- }
2634
2561
 
2635
- fn handleThrashing(battle: anytype, active: *ActivePokemon) bool {
2636
- var volatiles = &active.volatiles;
2637
- assert(volatiles.Thrashing);
2638
- if (volatiles.attacks > 0) return false;
2562
+ inline fn confusionDuration(battle: anytype) u3 {
2563
+ if (showdown) return @intCast(u3, battle.rng.range(u8, 2, 6));
2564
+ return @intCast(u3, (battle.rng.next() & 3) + 2);
2565
+ }
2639
2566
 
2640
- volatiles.Thrashing = false;
2641
- volatiles.Confusion = true;
2642
- volatiles.confusion = @intCast(u3, if (showdown)
2643
- battle.rng.range(u8, 2, 6)
2644
- else
2645
- (battle.rng.next() & 3) + 2);
2567
+ inline fn confused(battle: anytype) bool {
2568
+ if (showdown) return !battle.rng.chance(u8, 128, 256);
2569
+ return battle.rng.next() >= Gen12.percent(50) + 1;
2570
+ }
2646
2571
 
2647
- return true;
2648
- }
2572
+ inline fn paralyzed(battle: anytype) bool {
2573
+ if (showdown) return battle.rng.chance(u8, 63, 256);
2574
+ return battle.rng.next() < Gen12.percent(25);
2575
+ }
2649
2576
 
2650
- const DISTRIBUTION = [_]u3{ 2, 2, 2, 3, 3, 3, 4, 5 };
2577
+ inline fn confusionChance(battle: anytype) bool {
2578
+ if (showdown) return battle.rng.chance(u8, 25, 256);
2579
+ return battle.rng.next() < Gen12.percent(10);
2580
+ }
2651
2581
 
2652
- fn distribution(battle: anytype) u3 {
2653
- if (showdown) return DISTRIBUTION[battle.rng.range(u8, 0, DISTRIBUTION.len)];
2654
- const r = (battle.rng.next() & 3);
2655
- return @intCast(u3, (if (r < 2) r else battle.rng.next() & 3) + 2);
2656
- }
2582
+ inline fn secondaryChance(battle: anytype, low: bool) bool {
2583
+ if (showdown) return battle.rng.chance(u8, @as(u8, if (low) 26 else 77), 256);
2584
+ return battle.rng.next() < 1 + (if (low) Gen12.percent(10) else Gen12.percent(30));
2585
+ }
2657
2586
 
2658
- fn randomMoveSlot(rand: anytype, moves: []MoveSlot, check_pp: u4) u4 {
2659
- if (showdown) {
2660
- if (check_pp == 0) {
2661
- var i: usize = moves.len;
2662
- while (i > 0) {
2663
- i -= 1;
2664
- if (moves[i].id != .None) return rand.range(u4, 0, @intCast(u4, i + 1)) + 1;
2665
- }
2666
- } else {
2667
- var r = rand.range(u4, 0, @intCast(u4, check_pp)) + 1;
2668
- var i: usize = 0;
2669
- while (i < moves.len and r > 0) : (i += 1) {
2670
- if (moves[i].pp > 0) {
2671
- r -= 1;
2672
- if (r == 0) break;
2587
+ inline fn poisonChance(battle: anytype, low: bool) bool {
2588
+ if (showdown) return battle.rng.chance(u8, @as(u8, if (low) 52 else 103), 256);
2589
+ return battle.rng.next() < 1 + (if (low) Gen12.percent(20) else Gen12.percent(40));
2590
+ }
2591
+
2592
+ inline fn sleep(battle: anytype) u3 {
2593
+ if (showdown) return @intCast(u3, battle.rng.range(u8, 1, 8));
2594
+ while (true) {
2595
+ const r = battle.rng.next() & 7;
2596
+ if (r != 0) return @intCast(u3, r);
2597
+ }
2598
+ }
2599
+
2600
+ inline fn duration(battle: anytype) u3 {
2601
+ if (showdown) return @intCast(u3, battle.rng.range(u4, 2, 4));
2602
+ return @intCast(u3, (battle.rng.next() & 1) + 2);
2603
+ }
2604
+
2605
+ fn moveSlot(battle: anytype, moves: []MoveSlot, check_pp: u4) u4 {
2606
+ if (showdown) {
2607
+ if (check_pp == 0) {
2608
+ var i: usize = moves.len;
2609
+ while (i > 0) {
2610
+ i -= 1;
2611
+ if (moves[i].id != .None) {
2612
+ return battle.rng.range(u4, 0, @intCast(u4, i + 1)) + 1;
2613
+ }
2614
+ }
2615
+ } else {
2616
+ var r = battle.rng.range(u4, 0, @intCast(u4, check_pp)) + 1;
2617
+ var i: usize = 0;
2618
+ while (i < moves.len and r > 0) : (i += 1) {
2619
+ if (moves[i].pp > 0) {
2620
+ r -= 1;
2621
+ if (r == 0) break;
2622
+ }
2673
2623
  }
2624
+ return @intCast(u4, i + 1);
2674
2625
  }
2675
- return @intCast(u4, i + 1);
2626
+ }
2627
+
2628
+ while (true) {
2629
+ const r = @intCast(u4, battle.rng.next() & 3);
2630
+ if (moves[r].id != .None and (check_pp == 0 or moves[r].pp > 0)) return r + 1;
2676
2631
  }
2677
2632
  }
2678
2633
 
2679
- while (true) {
2680
- const r = @intCast(u4, rand.next() & 3);
2681
- if (moves[r].id != .None and (check_pp == 0 or moves[r].pp > 0)) return r + 1;
2634
+ inline fn disableDuration(battle: anytype) u4 {
2635
+ if (showdown) return @intCast(u4, battle.rng.range(u8, 1, 9));
2636
+ return @intCast(u4, (battle.rng.next() & 7) + 1);
2682
2637
  }
2683
- }
2638
+
2639
+ inline fn metronome(battle: anytype) Move {
2640
+ if (showdown) {
2641
+ const r = battle.rng.range(u8, 0, @enumToInt(Move.Struggle) - 2);
2642
+ const mod = @as(u2, (if (r < @enumToInt(Move.Metronome) - 1) 1 else 2));
2643
+ return @intToEnum(Move, r + mod);
2644
+ }
2645
+ while (true) {
2646
+ const r = battle.rng.next();
2647
+ if (r == 0 or r == @enumToInt(Move.Metronome)) continue;
2648
+ if (r >= @enumToInt(Move.Struggle)) continue;
2649
+ return @intToEnum(Move, r);
2650
+ }
2651
+ }
2652
+
2653
+ inline fn psywave(battle: anytype, max: u8) u8 {
2654
+ if (showdown) return battle.rng.range(u8, 0, max);
2655
+ while (true) {
2656
+ const r = battle.rng.next();
2657
+ if (r < max) return r;
2658
+ }
2659
+ }
2660
+
2661
+ inline fn distribution(battle: anytype) u3 {
2662
+ if (showdown) return DISTRIBUTION[battle.rng.range(u8, 0, DISTRIBUTION.len)];
2663
+ const r = (battle.rng.next() & 3);
2664
+ return @intCast(u3, (if (r < 2) r else battle.rng.next() & 3) + 2);
2665
+ }
2666
+
2667
+ inline fn unboost(battle: anytype) bool {
2668
+ if (showdown) return battle.rng.chance(u8, 85, 256);
2669
+ return battle.rng.next() < Gen12.percent(33) + 1;
2670
+ }
2671
+ };
2684
2672
 
2685
2673
  test "RNG agreement" {
2686
2674
  if (!showdown) return;
@@ -19,13 +19,13 @@ const assert = std.debug.assert;
19
19
  const expectEqual = std.testing.expectEqual;
20
20
  const expect = std.testing.expect;
21
21
 
22
- pub const MAX_OPTIONS: usize = 9; // move 1..4, switch 2..6
22
+ pub const MAX_CHOICES: usize = 9; // move 1..4, switch 2..6
23
23
  pub const MAX_LOGS: usize = 180; // TODO
24
24
 
25
- pub const OPTIONS_SIZE = if (builtin.mode == .ReleaseSmall)
26
- MAX_OPTIONS
25
+ pub const CHOICES_SIZE = if (builtin.mode == .ReleaseSmall)
26
+ MAX_CHOICES
27
27
  else
28
- std.math.ceilPowerOfTwo(usize, MAX_OPTIONS) catch unreachable;
28
+ std.math.ceilPowerOfTwo(usize, MAX_CHOICES) catch unreachable;
29
29
  pub const LOGS_SIZE = if (builtin.mode == .ReleaseSmall)
30
30
  MAX_LOGS
31
31
  else
package/src/lib/pkmn.zig CHANGED
@@ -4,10 +4,10 @@ pub const options = @import("common/options.zig");
4
4
  pub const Options = options.Options;
5
5
 
6
6
  /// The minimum size in bytes required to hold all choice options.
7
- pub const MAX_OPTIONS = gen1.MAX_OPTIONS;
7
+ pub const MAX_CHOICES = gen1.MAX_CHOICES;
8
8
  /// The optimal size in bytes required to hold all choice options.
9
- /// At least as large as `MAX_OPTIONS`.
10
- pub const OPTIONS_SIZE = gen1.OPTIONS_SIZE;
9
+ /// At least as large as `MAX_CHOICES`.
10
+ pub const CHOICES_SIZE = gen1.CHOICES_SIZE;
11
11
  /// The maximum number of bytes possibly logged by a single update.
12
12
  pub const MAX_LOGS = gen1.MAX_LOGS;
13
13
  /// The optimal size in bytes required to hold the largest amount of log data