@pkmn/engine 0.1.0-dev.5570b5c5 → 0.1.0-dev.587596a6

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 (81) hide show
  1. package/LICENSE +1 -1
  2. package/README.md +29 -17
  3. package/build/pkg/addon/browser.d.ts +3 -0
  4. package/build/pkg/addon/browser.js +47 -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 +110 -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 +26 -4
  13. package/build/pkg/addon.js +34 -65
  14. package/build/pkg/addon.js.map +1 -1
  15. package/build/pkg/data/layout.json +15 -2
  16. package/build/pkg/data/protocol.json +23 -9
  17. package/build/pkg/data.d.ts +23 -1
  18. package/build/pkg/data.js.map +1 -1
  19. package/build/pkg/gen1.d.ts +15 -18
  20. package/build/pkg/gen1.js +28 -19
  21. package/build/pkg/gen1.js.map +1 -1
  22. package/build/pkg/index.d.ts +40 -90
  23. package/build/pkg/index.js +23 -70
  24. package/build/pkg/index.js.map +1 -1
  25. package/build/pkg/protocol.d.ts +20 -1
  26. package/build/pkg/protocol.js +105 -103
  27. package/build/pkg/protocol.js.map +1 -1
  28. package/build/tools/debug.js +68 -74
  29. package/build/tools/debug.js.map +1 -1
  30. package/build/tools/display/debug.jsx +152 -0
  31. package/build/tools/display/debug.jsx.map +1 -0
  32. package/build/tools/display/index.js +152 -0
  33. package/build/tools/display/index.js.map +1 -0
  34. package/build/tools/display/ui.jsx +359 -0
  35. package/build/tools/display/ui.jsx.map +1 -0
  36. package/build/tools/display/util.js +33 -0
  37. package/build/tools/display/util.js.map +1 -0
  38. package/build.zig +237 -98
  39. package/package.json +59 -138
  40. package/src/bin/install-pkmn-engine +25 -7
  41. package/src/bin/pkmn-debug +1 -1
  42. package/src/lib/bindings/c.zig +200 -0
  43. package/src/lib/bindings/node.zig +117 -0
  44. package/src/lib/bindings/wasm.zig +50 -0
  45. package/src/lib/common/array.zig +70 -0
  46. package/src/lib/common/data.zig +8 -8
  47. package/src/lib/common/debug.zig +32 -11
  48. package/src/lib/common/js.zig +3 -7
  49. package/src/lib/common/optional.zig +11 -17
  50. package/src/lib/common/options.zig +6 -0
  51. package/src/lib/common/protocol.zig +148 -134
  52. package/src/lib/common/rational.zig +338 -255
  53. package/src/lib/common/rng.zig +5 -7
  54. package/src/lib/common/util.zig +33 -1
  55. package/src/lib/gen1/calc.zig +701 -171
  56. package/src/lib/gen1/chance.zig +407 -298
  57. package/src/lib/gen1/data/moves.zig +2 -4
  58. package/src/lib/gen1/data/species.zig +1 -3
  59. package/src/lib/gen1/data/types.zig +3 -4
  60. package/src/lib/gen1/data.zig +43 -46
  61. package/src/lib/gen1/helpers.zig +91 -549
  62. package/src/lib/gen1/mechanics.zig +355 -258
  63. package/src/lib/gen2/calc.zig +35 -28
  64. package/src/lib/gen2/chance.zig +91 -510
  65. package/src/lib/gen2/data/items.zig +1 -3
  66. package/src/lib/gen2/data/moves.zig +2 -4
  67. package/src/lib/gen2/data/species.zig +1 -3
  68. package/src/lib/gen2/data/types.zig +7 -5
  69. package/src/lib/gen2/data.zig +33 -35
  70. package/src/lib/gen2/generated.zig +18 -23
  71. package/src/lib/gen2/helpers.zig +45 -26
  72. package/src/lib/gen2/mechanics.zig +97 -124
  73. package/src/lib/napi.h +2 -0
  74. package/src/lib/node.zig +4 -121
  75. package/src/lib/pkmn.zig +106 -33
  76. package/src/lib/wasm.zig +9 -9
  77. package/src/tools/display/dom.ts +93 -0
  78. package/src/tools/display/ui.css +354 -0
  79. package/build/test/display.js +0 -400
  80. package/build/test/display.js.map +0 -1
  81. package/src/test/display/pkmn.html.tmpl +0 -368
@@ -1,20 +1,17 @@
1
- const std = @import("std");
2
1
  const builtin = @import("builtin");
3
-
4
- const pkmn = @import("../pkmn.zig");
5
-
6
2
  const data = @import("data.zig");
7
3
  const options = @import("options.zig");
4
+ const pkmn = @import("../pkmn.zig");
5
+ const std = @import("std");
8
6
 
9
7
  const assert = std.debug.assert;
10
- const print = std.debug.print;
11
-
12
8
  const enabled = options.log;
13
-
14
- const Player = data.Player;
15
9
  const ID = data.ID;
10
+ const Player = data.Player;
11
+ const print = std.debug.print;
16
12
 
17
13
  const endian = builtin.cpu.arch.endian();
14
+ const Endian = std.builtin.Endian;
18
15
 
19
16
  pub const ArgType = enum(u8) {
20
17
  None,
@@ -312,19 +309,29 @@ pub const Weather = enum(u8) {
312
309
  Upkeep,
313
310
  };
314
311
 
315
- /// Null object pattern implementation of `Log` backed by a `std.io.null_writer`.
316
- /// Ignores anything sent to it, though protocol logging should additionally be turned off
317
- /// entirely with `options.log`.
318
- pub const NULL = Log(@TypeOf(std.io.null_writer)){ .writer = std.io.null_writer };
319
-
320
- /// Logs protocol information to its `Writer` during a battle update when `options.log` is enabled.
321
- pub fn Log(comptime Writer: type) type {
312
+ /// Logs protocol information to its `WriterT` during a battle update when `options.log` is enabled.
313
+ pub fn Log(comptime WriterT: type) type {
322
314
  return struct {
323
315
  const Self = @This();
324
316
 
325
- writer: Writer,
317
+ writer: WriterT,
326
318
 
327
- pub const Error = Writer.Error;
319
+ pub const Error = err(WriterT);
320
+
321
+ fn err(comptime T: type) type {
322
+ const msg = "Invalid Writer type " ++ @typeName(T) ++ "'";
323
+ return switch (@typeInfo(T)) {
324
+ .pointer => |ptr_info| switch (ptr_info.size) {
325
+ .one => switch (@typeInfo(ptr_info.child)) {
326
+ .@"struct" => err(ptr_info.child),
327
+ else => @compileError(msg),
328
+ },
329
+ else => @compileError(msg),
330
+ },
331
+ .@"struct" => if (@hasDecl(T, "Error")) T.Error else @compileError(msg),
332
+ else => @compileError(msg),
333
+ };
334
+ }
328
335
 
329
336
  // source: ID, move: <Move>, target: ID, from?: <Move>
330
337
  pub fn move(self: Self, args: anytype) Error!void {
@@ -815,56 +822,68 @@ pub fn Log(comptime Writer: type) type {
815
822
  };
816
823
  }
817
824
 
818
- /// `Log` type backed by the optimized `ByteStream.Writer`.
819
- pub const FixedLog = Log(ByteStream.Writer);
825
+ /// `Log` type backed by the optimized `Writer`.
826
+ pub const FixedLog = Log(*Writer);
820
827
 
821
- /// Stripped down version of `std.io.FixedBufferStream` optimized for efficiently writing the
822
- /// individual protocol bytes. Note that the `ByteStream.Writer` is **not** a `std.io.Writer` and
823
- /// should not be used for general purpose writing.
824
- pub const ByteStream = struct {
828
+ /// Minimal logging helper optimized for efficiently writing the individual protocol bytes into a
829
+ /// fixed buffer. Note that this is **not** a `std.Io.Writer` and should not be used for general
830
+ /// purpose writing.
831
+ pub const Writer = struct {
825
832
  buffer: []u8,
826
833
  pos: usize = 0,
827
834
 
828
- pub const Writer = struct {
829
- stream: *ByteStream,
835
+ pub const Error = error{NoSpaceLeft};
830
836
 
831
- pub const Error = error{NoSpaceLeft};
837
+ pub fn writeByte(self: *Writer, byte: u8) Error!void {
838
+ if (self.pos >= self.buffer.len) return error.NoSpaceLeft;
839
+ self.buffer[self.pos] = byte;
840
+ self.pos += 1;
841
+ }
832
842
 
833
- pub fn writeAll(self: Writer, bytes: []const u8) Error!void {
834
- for (bytes) |b| try self.writeByte(b);
835
- }
843
+ pub fn writeAll(self: *Writer, bytes: []const u8) Error!void {
844
+ const npos = self.pos + bytes.len;
845
+ if (npos > self.buffer.len) return error.NoSpaceLeft;
846
+ @memcpy(self.buffer[self.pos..npos], bytes);
847
+ self.pos = npos;
848
+ }
836
849
 
837
- pub fn writeByte(self: Writer, byte: u8) Error!void {
838
- try self.stream.writeByte(byte);
839
- }
850
+ pub fn writeInt(self: *Writer, comptime T: type, v: T, end: std.builtin.Endian) Error!void {
851
+ const bytes = @divExact(@typeInfo(T).int.bits, 8);
852
+ const npos = self.pos + bytes;
853
+ if (npos > self.buffer.len) return error.NoSpaceLeft;
854
+ std.mem.writeInt(T, self.buffer[self.pos..][0..bytes], v, end);
855
+ self.pos = npos;
856
+ }
840
857
 
841
- pub fn writeInt(self: Writer, comptime T: type, v: T, end: std.builtin.Endian) Error!void {
842
- // TODO: rework this to write directly to the buffer?
843
- var bytes: [@divExact(@typeInfo(T).Int.bits, 8)]u8 = undefined;
844
- std.mem.writeInt(std.math.ByteAlignedInt(@TypeOf(v)), &bytes, v, end);
845
- return self.writeAll(&bytes);
846
- }
847
- };
858
+ pub fn reset(self: *Writer) void {
859
+ self.pos = 0;
860
+ }
861
+ };
862
+
863
+ /// Null object pattern implementation of `Log` backed by a null writer. Ignores anything sent to
864
+ /// it, though protocol logging should additionally be turned off entirely with `options.log`.
865
+ pub const NULL = Log(NullWriter){ .writer = .{} };
866
+
867
+ const NullWriter = struct {
868
+ pub const Error = error{};
848
869
 
849
- pub fn writer(self: *ByteStream) Writer {
850
- return .{ .stream = self };
870
+ pub fn writeByte(self: NullWriter, byte: u8) Error!void {
871
+ _ = .{ self, byte };
851
872
  }
852
873
 
853
- pub fn writeByte(self: *ByteStream, byte: u8) Writer.Error!void {
854
- if (self.pos >= self.buffer.len) return error.NoSpaceLeft;
855
- self.buffer[self.pos] = byte;
856
- self.pos += 1;
874
+ pub fn writeAll(self: NullWriter, bytes: []const u8) Error!void {
875
+ _ = .{ self, bytes };
857
876
  }
858
877
 
859
- pub fn reset(self: *ByteStream) void {
860
- self.pos = 0;
878
+ pub fn writeInt(self: NullWriter, comptime T: type, v: T, end: std.builtin.Endian) Error!void {
879
+ _ = .{ self, T, v, end };
861
880
  }
862
881
  };
863
882
 
864
883
  pub const Kind = enum { Move, Species, Type, Status, Item, Weather };
865
884
 
866
885
  pub fn format(
867
- comptime gen: anytype,
886
+ gen: anytype,
868
887
  a: []const u8,
869
888
  b: ?[]const u8,
870
889
  color: bool,
@@ -1207,12 +1226,8 @@ pub fn expectLog(
1207
1226
  ) !void {
1208
1227
  if (!enabled) return;
1209
1228
 
1210
- const color = if (std.process.hasEnvVarConstant("ZIG_DEBUG_COLOR"))
1211
- true
1212
- else switch (std.io.tty.detectConfig(std.io.getStdErr())) {
1213
- .escape_codes => true,
1214
- else => false,
1215
- };
1229
+ // TODO: ziglang/zig#30833 - read from environment
1230
+ const color = true;
1216
1231
 
1217
1232
  expectEqualBytes(expected, actual, offset) catch |err| switch (err) {
1218
1233
  error.TestExpectedEqual => {
@@ -1220,7 +1235,6 @@ pub fn expectLog(
1220
1235
  format(gen, actual, expected, color);
1221
1236
  return err;
1222
1237
  },
1223
- else => return err,
1224
1238
  };
1225
1239
  }
1226
1240
 
@@ -1228,7 +1242,7 @@ fn expectEqualBytes(expected: []const u8, actual: []const u8, offset: usize) !vo
1228
1242
  for (offset..@min(expected.len, actual.len)) |i| {
1229
1243
  if (expected[i] != actual[i]) {
1230
1244
  print(
1231
- "index {} incorrect. expected 0x{X:0>2}, found 0x{X:0>2}\n",
1245
+ "index {d} incorrect. expected 0x{X:0>2}, found 0x{X:0>2}\n",
1232
1246
  .{ i, expected[i], actual[i] },
1233
1247
  );
1234
1248
  return error.TestExpectedEqual;
@@ -1251,8 +1265,8 @@ const p1 = Player.P1;
1251
1265
  const p2 = Player.P2;
1252
1266
 
1253
1267
  var buf: [pkmn.LOGS_SIZE]u8 = undefined;
1254
- var stream: ByteStream = .{ .buffer = &buf };
1255
- var log: FixedLog = .{ .writer = stream.writer() };
1268
+ var writer: Writer = .{ .buffer = &buf };
1269
+ var log: FixedLog = .{ .writer = &writer };
1256
1270
 
1257
1271
  const gen1 = pkmn.gen1;
1258
1272
  const gen2 = pkmn.gen2;
@@ -1296,14 +1310,14 @@ test "|move|" {
1296
1310
  &.{ N(ArgType.Move), 0b1100, N(M1.Thunderbolt), 0b0101, N(Move.None) },
1297
1311
  buf[0..5],
1298
1312
  );
1299
- stream.reset();
1313
+ writer.reset();
1300
1314
 
1301
1315
  try log.move(.{ p2.ident(4), M1.Pound, p1.ident(5), M1.Metronome });
1302
1316
  try expectLog1(
1303
1317
  &.{ N(ArgType.Move), 0b1100, N(M1.Pound), 0b0101, N(Move.From), N(M1.Metronome) },
1304
1318
  buf[0..6],
1305
1319
  );
1306
- stream.reset();
1320
+ writer.reset();
1307
1321
 
1308
1322
  try log.move(.{ p2.ident(4), M1.SkullBash, ID{} });
1309
1323
  try log.laststill(.{});
@@ -1318,7 +1332,7 @@ test "|move|" {
1318
1332
  },
1319
1333
  buf[0..6],
1320
1334
  );
1321
- stream.reset();
1335
+ writer.reset();
1322
1336
 
1323
1337
  try log.move(.{ p2.ident(4), M1.Tackle, p1.ident(5) });
1324
1338
  try log.lastmiss(.{});
@@ -1333,7 +1347,7 @@ test "|move|" {
1333
1347
  },
1334
1348
  buf[0..6],
1335
1349
  );
1336
- stream.reset();
1350
+ writer.reset();
1337
1351
  }
1338
1352
 
1339
1353
  test "|switch|" {
@@ -1349,7 +1363,7 @@ test "|switch|" {
1349
1363
  .little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 91, 200, 0, 144, 1, par },
1350
1364
  };
1351
1365
  try expectLog1(expected, buf[0..9]);
1352
- stream.reset();
1366
+ writer.reset();
1353
1367
 
1354
1368
  snorlax.level = 100;
1355
1369
  snorlax.hp = 0;
@@ -1360,7 +1374,7 @@ test "|switch|" {
1360
1374
  .little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 0, 0, 144, 1, 0 },
1361
1375
  };
1362
1376
  try expectLog1(expected, buf[0..9]);
1363
- stream.reset();
1377
+ writer.reset();
1364
1378
 
1365
1379
  snorlax.hp = 400;
1366
1380
  try log.switched(.{ p2.ident(3), &snorlax });
@@ -1369,7 +1383,7 @@ test "|switch|" {
1369
1383
  .little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 144, 1, 144, 1, 0 },
1370
1384
  };
1371
1385
  try expectLog1(expected, buf[0..9]);
1372
- stream.reset();
1386
+ writer.reset();
1373
1387
 
1374
1388
  var blissey = gen2.helpers.Pokemon.init(.{ .species = .Blissey, .moves = &.{.Splash} });
1375
1389
  blissey.level = 91;
@@ -1388,27 +1402,27 @@ test "|switch|" {
1388
1402
  .little => .{ 200, 0, 144, 1, par },
1389
1403
  });
1390
1404
  try expectLog2(expected, buf[0..10]);
1391
- stream.reset();
1405
+ writer.reset();
1392
1406
  }
1393
1407
 
1394
1408
  test "|cant|" {
1395
1409
  try log.cant(.{ p2.ident(6), .Bound });
1396
1410
  try expectLog1(&.{ N(ArgType.Cant), 0b1110, N(Cant.Bound) }, buf[0..3]);
1397
- stream.reset();
1411
+ writer.reset();
1398
1412
 
1399
1413
  try log.cant(.{ p1.ident(2), .Disable, M1.Earthquake });
1400
1414
  try expectLog1(&.{ N(ArgType.Cant), 2, N(Cant.Disable), N(M1.Earthquake) }, buf[0..4]);
1401
- stream.reset();
1415
+ writer.reset();
1402
1416
  }
1403
1417
 
1404
1418
  test "|faint|" {
1405
1419
  try log.faint(.{ p2.ident(2), false });
1406
1420
  try expectLog1(&.{ N(ArgType.Faint), 0b1010 }, buf[0..2]);
1407
- stream.reset();
1421
+ writer.reset();
1408
1422
 
1409
1423
  try log.faint(.{ p2.ident(2), true });
1410
1424
  try expectLog1(&.{ N(ArgType.Faint), 0b1010, N(ArgType.None) }, buf[0..3]);
1411
- stream.reset();
1425
+ writer.reset();
1412
1426
  }
1413
1427
 
1414
1428
  test "|turn|" {
@@ -1418,19 +1432,19 @@ test "|turn|" {
1418
1432
  .little => &.{ N(ArgType.Turn), 42, 0, N(ArgType.None) },
1419
1433
  };
1420
1434
  try expectLog1(expected, buf[0..4]);
1421
- stream.reset();
1435
+ writer.reset();
1422
1436
  }
1423
1437
 
1424
1438
  test "|win|" {
1425
1439
  try log.win(.{.P2});
1426
1440
  try expectLog1(&.{ N(ArgType.Win), 1, N(ArgType.None) }, buf[0..3]);
1427
- stream.reset();
1441
+ writer.reset();
1428
1442
  }
1429
1443
 
1430
1444
  test "|tie|" {
1431
1445
  try log.tie(.{});
1432
1446
  try expectLog1(&.{ N(ArgType.Tie), N(ArgType.None) }, buf[0..2]);
1433
- stream.reset();
1447
+ writer.reset();
1434
1448
  }
1435
1449
 
1436
1450
  test "|-damage|" {
@@ -1443,7 +1457,7 @@ test "|-damage|" {
1443
1457
  .little => &.{ N(ArgType.Damage), 0b1010, 100, 2, 191, 2, 1, N(Damage.None) },
1444
1458
  };
1445
1459
  try expectLog1(expected, buf[0..8]);
1446
- stream.reset();
1460
+ writer.reset();
1447
1461
 
1448
1462
  chansey.hp = 100;
1449
1463
  chansey.stats.hp = 256;
@@ -1454,7 +1468,7 @@ test "|-damage|" {
1454
1468
  .little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0, N(Damage.Confusion) },
1455
1469
  };
1456
1470
  try expectLog1(expected, buf[0..8]);
1457
- stream.reset();
1471
+ writer.reset();
1458
1472
 
1459
1473
  chansey.status = gen1.Status.init(.PSN);
1460
1474
  try log.damage(.{ p2.ident(2), &chansey, .RecoilOf, p1.ident(1) });
@@ -1463,7 +1477,7 @@ test "|-damage|" {
1463
1477
  .little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0b1000, N(Damage.RecoilOf), 1 },
1464
1478
  };
1465
1479
  try expectLog1(expected, buf[0..9]);
1466
- stream.reset();
1480
+ writer.reset();
1467
1481
  }
1468
1482
 
1469
1483
  test "|-heal|" {
@@ -1476,7 +1490,7 @@ test "|-heal|" {
1476
1490
  .little => &.{ N(ArgType.Heal), 0b1010, 100, 2, 191, 2, 1, N(Heal.None) },
1477
1491
  };
1478
1492
  try expectLog1(expected, buf[0..8]);
1479
- stream.reset();
1493
+ writer.reset();
1480
1494
 
1481
1495
  chansey.hp = 100;
1482
1496
  chansey.stats.hp = 256;
@@ -1487,7 +1501,7 @@ test "|-heal|" {
1487
1501
  .little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Silent) },
1488
1502
  };
1489
1503
  try expectLog1(expected, buf[0..8]);
1490
- stream.reset();
1504
+ writer.reset();
1491
1505
 
1492
1506
  try log.heal(.{ p2.ident(2), &chansey, .Drain, p1.ident(1) });
1493
1507
  expected = switch (endian) {
@@ -1495,30 +1509,30 @@ test "|-heal|" {
1495
1509
  .little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Drain), 1 },
1496
1510
  };
1497
1511
  try expectLog1(expected, buf[0..9]);
1498
- stream.reset();
1512
+ writer.reset();
1499
1513
  }
1500
1514
 
1501
1515
  test "|-status|" {
1502
1516
  try log.status(.{ p2.ident(6), gen1.Status.init(.BRN), .None });
1503
1517
  try expectLog1(&.{ N(ArgType.Status), 0b1110, 0b10000, N(Status.None) }, buf[0..4]);
1504
- stream.reset();
1518
+ writer.reset();
1505
1519
 
1506
1520
  try log.status(.{ p2.ident(2), gen1.Status.init(.PSN), .Silent });
1507
1521
  try expectLog1(&.{ N(ArgType.Status), 0b1010, 0b1000, N(Status.Silent) }, buf[0..4]);
1508
- stream.reset();
1522
+ writer.reset();
1509
1523
 
1510
1524
  try log.status(.{ p1.ident(1), gen1.Status.init(.PAR), .From, M1.BodySlam });
1511
1525
  try expectLog1(
1512
1526
  &.{ N(ArgType.Status), 0b0001, 0b1000000, N(Status.From), N(M1.BodySlam) },
1513
1527
  buf[0..5],
1514
1528
  );
1515
- stream.reset();
1529
+ writer.reset();
1516
1530
  }
1517
1531
 
1518
1532
  test "|-curestatus|" {
1519
1533
  try log.curestatus(.{ p2.ident(6), gen1.Status.slp(7), .Message });
1520
1534
  try expectLog1(&.{ N(ArgType.CureStatus), 0b1110, 0b111, N(CureStatus.Message) }, buf[0..4]);
1521
- stream.reset();
1535
+ writer.reset();
1522
1536
 
1523
1537
  try log.curestatus(.{ p1.ident(2), gen1.Status.TOX, .Silent });
1524
1538
  try expectLog1(&.{
@@ -1527,86 +1541,86 @@ test "|-curestatus|" {
1527
1541
  0b10001000,
1528
1542
  N(CureStatus.Silent),
1529
1543
  }, buf[0..4]);
1530
- stream.reset();
1544
+ writer.reset();
1531
1545
  }
1532
1546
 
1533
1547
  test "|-boost|" {
1534
1548
  try log.boost(.{ p2.ident(6), .Speed, 2 });
1535
1549
  try expectLog1(&.{ N(ArgType.Boost), 0b1110, N(Boost.Speed), 8 }, buf[0..4]);
1536
- stream.reset();
1550
+ writer.reset();
1537
1551
 
1538
1552
  try log.boost(.{ p1.ident(2), .Rage, 1 });
1539
1553
  try expectLog1(&.{ N(ArgType.Boost), 0b0010, N(Boost.Rage), 7 }, buf[0..4]);
1540
- stream.reset();
1554
+ writer.reset();
1541
1555
 
1542
1556
  try log.boost(.{ p2.ident(3), .Defense, -2 });
1543
1557
  try expectLog1(&.{ N(ArgType.Boost), 0b1011, N(Boost.Defense), 4 }, buf[0..4]);
1544
- stream.reset();
1558
+ writer.reset();
1545
1559
  }
1546
1560
 
1547
1561
  test "|-clearallboost|" {
1548
1562
  try log.clearallboost(.{});
1549
1563
  try expectLog1(&.{N(ArgType.ClearAllBoost)}, buf[0..1]);
1550
- stream.reset();
1564
+ writer.reset();
1551
1565
  }
1552
1566
 
1553
1567
  test "|-fail|" {
1554
1568
  try log.fail(.{ p2.ident(6), .None });
1555
1569
  try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.None) }, buf[0..3]);
1556
- stream.reset();
1570
+ writer.reset();
1557
1571
 
1558
1572
  try log.fail(.{ p2.ident(6), .Sleep });
1559
1573
  try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.Sleep) }, buf[0..3]);
1560
- stream.reset();
1574
+ writer.reset();
1561
1575
 
1562
1576
  try log.fail(.{ p2.ident(6), .Substitute });
1563
1577
  try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.Substitute) }, buf[0..3]);
1564
- stream.reset();
1578
+ writer.reset();
1565
1579
 
1566
1580
  try log.fail(.{ p2.ident(6), .Weak });
1567
1581
  try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.Weak) }, buf[0..3]);
1568
- stream.reset();
1582
+ writer.reset();
1569
1583
  }
1570
1584
 
1571
1585
  test "|-miss|" {
1572
1586
  try log.miss(.{p2.ident(4)});
1573
1587
  try expectLog1(&.{ N(ArgType.Miss), 0b1100 }, buf[0..2]);
1574
- stream.reset();
1588
+ writer.reset();
1575
1589
  }
1576
1590
  test "|-hitcount|" {
1577
1591
  try log.hitcount(.{ p2.ident(1), 5 });
1578
1592
  try expectLog1(&.{ N(ArgType.HitCount), 0b1001, 5 }, buf[0..3]);
1579
- stream.reset();
1593
+ writer.reset();
1580
1594
  }
1581
1595
 
1582
1596
  test "|-prepare|" {
1583
1597
  try log.prepare(.{ p2.ident(2), M1.Dig });
1584
1598
  try expectLog1(&.{ N(ArgType.Prepare), 0b1010, N(M1.Dig) }, buf[0..3]);
1585
- stream.reset();
1599
+ writer.reset();
1586
1600
  }
1587
1601
 
1588
1602
  test "|-mustrecharge|" {
1589
1603
  try log.mustrecharge(.{p1.ident(6)});
1590
1604
  try expectLog1(&.{ N(ArgType.MustRecharge), 0b0110 }, buf[0..2]);
1591
- stream.reset();
1605
+ writer.reset();
1592
1606
  }
1593
1607
 
1594
1608
  test "|-activate|" {
1595
1609
  try log.activate(.{ p1.ident(2), .Struggle });
1596
1610
  try expectLog1(&.{ N(ArgType.Activate), 0b0010, N(Activate.Struggle) }, buf[0..3]);
1597
- stream.reset();
1611
+ writer.reset();
1598
1612
 
1599
1613
  try log.activate(.{ p2.ident(4), .Mist });
1600
1614
  try expectLog1(&.{ N(ArgType.Activate), 0b1100, N(Activate.Mist) }, buf[0..3]);
1601
- stream.reset();
1615
+ writer.reset();
1602
1616
 
1603
1617
  try log.activate(.{ p2.ident(6), .Substitute });
1604
1618
  try expectLog1(&.{ N(ArgType.Activate), 0b1110, N(Activate.Substitute) }, buf[0..3]);
1605
- stream.reset();
1619
+ writer.reset();
1606
1620
 
1607
1621
  try log.activate(.{ p1.ident(2), .Splash });
1608
1622
  try expectLog1(&.{ N(ArgType.Activate), 0b0010, N(Activate.Splash) }, buf[0..3]);
1609
- stream.reset();
1623
+ writer.reset();
1610
1624
 
1611
1625
  try log.activate(.{ p1.ident(4), .SubstituteBlock, M2.Spite });
1612
1626
  try expectLog1(&.{
@@ -1615,27 +1629,27 @@ test "|-activate|" {
1615
1629
  N(Activate.SubstituteBlock),
1616
1630
  N(M2.Spite),
1617
1631
  }, buf[0..4]);
1618
- stream.reset();
1632
+ writer.reset();
1619
1633
 
1620
1634
  try log.activate(.{ p1.ident(3), .Magnitude, 5 });
1621
1635
  try expectLog1(&.{ N(ArgType.Activate), 0b0011, N(Activate.Magnitude), 5 }, buf[0..4]);
1622
- stream.reset();
1636
+ writer.reset();
1623
1637
  }
1624
1638
 
1625
1639
  test "|-fieldactivate|" {
1626
1640
  try log.fieldactivate(.{});
1627
1641
  try expectLog1(&.{N(ArgType.FieldActivate)}, buf[0..1]);
1628
- stream.reset();
1642
+ writer.reset();
1629
1643
  }
1630
1644
 
1631
1645
  test "|-start|" {
1632
1646
  try log.start(.{ p2.ident(6), .Bide });
1633
1647
  try expectLog1(&.{ N(ArgType.Start), 0b1110, N(Start.Bide) }, buf[0..3]);
1634
- stream.reset();
1648
+ writer.reset();
1635
1649
 
1636
1650
  try log.start(.{ p1.ident(2), .ConfusionSilent });
1637
1651
  try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.ConfusionSilent) }, buf[0..3]);
1638
- stream.reset();
1652
+ writer.reset();
1639
1653
 
1640
1654
  try log.start(.{
1641
1655
  p2.ident(6),
@@ -1647,7 +1661,7 @@ test "|-start|" {
1647
1661
  &.{ N(ArgType.Start), 0b1110, N(Start.TypeChange), 0b1000_1000, 0b1101 },
1648
1662
  buf[0..5],
1649
1663
  );
1650
- stream.reset();
1664
+ writer.reset();
1651
1665
 
1652
1666
  try log.start(.{
1653
1667
  p1.ident(2),
@@ -1659,65 +1673,65 @@ test "|-start|" {
1659
1673
  &.{ N(ArgType.Start), 0b0010, N(Start.TypeChange), 0b0011_0110, 0b1100 },
1660
1674
  buf[0..5],
1661
1675
  );
1662
- stream.reset();
1676
+ writer.reset();
1663
1677
 
1664
1678
  try log.start(.{ p1.ident(2), .Disable, M1.Surf });
1665
1679
  try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.Disable), N(M1.Surf) }, buf[0..4]);
1666
- stream.reset();
1680
+ writer.reset();
1667
1681
 
1668
1682
  try log.start(.{ p1.ident(2), .Mimic, M1.Surf });
1669
1683
  try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.Mimic), N(M1.Surf) }, buf[0..4]);
1670
- stream.reset();
1684
+ writer.reset();
1671
1685
  }
1672
1686
 
1673
1687
  test "|-end|" {
1674
1688
  try log.end(.{ p2.ident(6), .Bide });
1675
1689
  try expectLog1(&.{ N(ArgType.End), 0b1110, N(End.Bide) }, buf[0..3]);
1676
- stream.reset();
1690
+ writer.reset();
1677
1691
 
1678
1692
  try log.end(.{ p1.ident(2), .ConfusionSilent });
1679
1693
  try expectLog1(&.{ N(ArgType.End), 0b0010, N(End.ConfusionSilent) }, buf[0..3]);
1680
- stream.reset();
1694
+ writer.reset();
1681
1695
  }
1682
1696
 
1683
1697
  test "|-ohko|" {
1684
1698
  try log.ohko(.{});
1685
1699
  try expectLog1(&.{N(ArgType.OHKO)}, buf[0..1]);
1686
- stream.reset();
1700
+ writer.reset();
1687
1701
  }
1688
1702
 
1689
1703
  test "|-crit|" {
1690
1704
  try log.crit(.{p2.ident(5)});
1691
1705
  try expectLog1(&.{ N(ArgType.Crit), 0b1101 }, buf[0..2]);
1692
- stream.reset();
1706
+ writer.reset();
1693
1707
  }
1694
1708
 
1695
1709
  test "|-supereffective|" {
1696
1710
  try log.supereffective(.{p1.ident(1)});
1697
1711
  try expectLog1(&.{ N(ArgType.SuperEffective), 0b0001 }, buf[0..2]);
1698
- stream.reset();
1712
+ writer.reset();
1699
1713
  }
1700
1714
 
1701
1715
  test "|-resisted|" {
1702
1716
  try log.resisted(.{p2.ident(2)});
1703
1717
  try expectLog1(&.{ N(ArgType.Resisted), 0b1010 }, buf[0..2]);
1704
- stream.reset();
1718
+ writer.reset();
1705
1719
  }
1706
1720
 
1707
1721
  test "|-immune|" {
1708
1722
  try log.immune(.{ p1.ident(3), .None });
1709
1723
  try expectLog1(&.{ N(ArgType.Immune), 0b0011, N(Immune.None) }, buf[0..3]);
1710
- stream.reset();
1724
+ writer.reset();
1711
1725
 
1712
1726
  try log.immune(.{ p2.ident(2), .OHKO });
1713
1727
  try expectLog1(&.{ N(ArgType.Immune), 0b1010, N(Immune.OHKO) }, buf[0..3]);
1714
- stream.reset();
1728
+ writer.reset();
1715
1729
  }
1716
1730
 
1717
1731
  test "|-transform|" {
1718
1732
  try log.transform(.{ p2.ident(4), p1.ident(5) });
1719
1733
  try expectLog1(&.{ N(ArgType.Transform), 0b1100, 0b0101 }, buf[0..3]);
1720
- stream.reset();
1734
+ writer.reset();
1721
1735
  }
1722
1736
 
1723
1737
  test "|drag|" {
@@ -1739,29 +1753,29 @@ test "|drag|" {
1739
1753
  .little => .{ 200, 0, 144, 1, par },
1740
1754
  });
1741
1755
  try expectLog2(expected, buf[0..10]);
1742
- stream.reset();
1756
+ writer.reset();
1743
1757
  }
1744
1758
 
1745
1759
  test "|-item|" {
1746
1760
  try log.item(.{ p2.ident(2), I2.GoldBerry, p1.ident(4) });
1747
1761
  try expectLog2(&.{ N(ArgType.Item), 0b1010, N(I2.GoldBerry), 0b0100 }, buf[0..4]);
1748
- stream.reset();
1762
+ writer.reset();
1749
1763
  }
1750
1764
 
1751
1765
  test "|-enditem|" {
1752
1766
  try log.enditem(.{ p1.ident(1), I2.BerserkGene, .None });
1753
1767
  try expectLog2(&.{ N(ArgType.EndItem), 0b0001, N(I2.BerserkGene), N(EndItem.None) }, buf[0..4]);
1754
- stream.reset();
1768
+ writer.reset();
1755
1769
 
1756
1770
  try log.enditem(.{ p2.ident(4), I2.PRZCureBerry, .Eat });
1757
1771
  try expectLog2(&.{ N(ArgType.EndItem), 0b1100, N(I2.PRZCureBerry), N(EndItem.Eat) }, buf[0..4]);
1758
- stream.reset();
1772
+ writer.reset();
1759
1773
  }
1760
1774
 
1761
1775
  test "|-cureteam|" {
1762
1776
  try log.cureteam(.{p2.ident(5)});
1763
1777
  try expectLog2(&.{ N(ArgType.CureTeam), 0b1101 }, buf[0..2]);
1764
- stream.reset();
1778
+ writer.reset();
1765
1779
  }
1766
1780
 
1767
1781
  test "|-sethp|" {
@@ -1773,35 +1787,35 @@ test "|-sethp|" {
1773
1787
  .little => &.{ N(ArgType.SetHP), 0b1010, 100, 2, 201, 2, 0, N(SetHP.Silent) },
1774
1788
  };
1775
1789
  try expectLog2(expected, buf[0..8]);
1776
- stream.reset();
1790
+ writer.reset();
1777
1791
  }
1778
1792
 
1779
1793
  test "|-setboost|" {
1780
1794
  try log.setboost(.{ p2.ident(6), 6 });
1781
1795
  try expectLog2(&.{ N(ArgType.SetBoost), 0b1110, 12 }, buf[0..3]);
1782
- stream.reset();
1796
+ writer.reset();
1783
1797
 
1784
1798
  try log.setboost(.{ p2.ident(3), 2 });
1785
1799
  try expectLog2(&.{ N(ArgType.SetBoost), 0b1011, 8 }, buf[0..3]);
1786
- stream.reset();
1800
+ writer.reset();
1787
1801
  }
1788
1802
 
1789
1803
  test "|-copyboost|" {
1790
1804
  try log.copyboost(.{ p2.ident(3), p1.ident(6) });
1791
1805
  try expectLog2(&.{ N(ArgType.CopyBoost), 0b1011, 0b0110 }, buf[0..3]);
1792
- stream.reset();
1806
+ writer.reset();
1793
1807
  }
1794
1808
 
1795
1809
  test "|-sidestart|" {
1796
1810
  try log.sidestart(.{ .P2, .Reflect });
1797
1811
  try expectLog2(&.{ N(ArgType.SideStart), 1, N(Side.Reflect) }, buf[0..3]);
1798
- stream.reset();
1812
+ writer.reset();
1799
1813
  }
1800
1814
 
1801
1815
  test "|-sideend|" {
1802
1816
  try log.sideend(.{ .P2, .LightScreen });
1803
1817
  try expectLog2(&.{ N(ArgType.SideEnd), 1, N(Side.LightScreen) }, buf[0..3]);
1804
- stream.reset();
1818
+ writer.reset();
1805
1819
 
1806
1820
  try log.sideend(.{ .P1, .Spikes, p1.ident(3) });
1807
1821
  try expectLog2(&.{
@@ -1810,27 +1824,27 @@ test "|-sideend|" {
1810
1824
  N(Side.Spikes),
1811
1825
  0b0011,
1812
1826
  }, buf[0..4]);
1813
- stream.reset();
1827
+ writer.reset();
1814
1828
  }
1815
1829
 
1816
1830
  test "|-singlemove|" {
1817
1831
  try log.singlemove(.{ p2.ident(2), M2.DestinyBond });
1818
1832
  try expectLog2(&.{ N(ArgType.SingleMove), 0b1010, N(M2.DestinyBond) }, buf[0..3]);
1819
- stream.reset();
1833
+ writer.reset();
1820
1834
  }
1821
1835
 
1822
1836
  test "|-singleturn|" {
1823
1837
  try log.singleturn(.{ p1.ident(3), M2.Protect });
1824
1838
  try expectLog2(&.{ N(ArgType.SingleTurn), 0b0011, N(M2.Protect) }, buf[0..3]);
1825
- stream.reset();
1839
+ writer.reset();
1826
1840
  }
1827
1841
 
1828
1842
  test "|-weather|" {
1829
1843
  try log.weather(.{ W2.Rain, .Upkeep });
1830
1844
  try expectLog2(&.{ N(ArgType.Weather), N(W2.Rain), N(Weather.Upkeep) }, buf[0..3]);
1831
- stream.reset();
1845
+ writer.reset();
1832
1846
 
1833
1847
  try log.weather(.{ W2.None, .None });
1834
1848
  try expectLog2(&.{ N(ArgType.Weather), N(W2.None), N(Weather.None) }, buf[0..3]);
1835
- stream.reset();
1849
+ writer.reset();
1836
1850
  }