@pkmn/engine 0.1.0-dev.47dcb76c → 0.1.0-dev.47f842bf

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 +65 -15
  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 +25 -3
  13. package/build/pkg/addon.js +39 -71
  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 +25 -4
  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 +109 -107
  27. package/build/pkg/protocol.js.map +1 -1
  28. package/build/tools/debug.js +53 -78
  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 +309 -79
  39. package/package.json +55 -135
  40. package/src/bin/install-pkmn-engine +19 -8
  41. package/src/bin/pkmn-debug +1 -1
  42. package/src/lib/bindings/c.zig +255 -0
  43. package/src/lib/bindings/node.zig +117 -0
  44. package/src/lib/bindings/wasm.zig +59 -0
  45. package/src/lib/common/array.zig +77 -0
  46. package/src/lib/common/data.zig +8 -8
  47. package/src/lib/common/debug.zig +39 -8
  48. package/src/lib/common/js.zig +4 -6
  49. package/src/lib/common/napi.zig +4 -0
  50. package/src/lib/common/optional.zig +13 -9
  51. package/src/lib/common/options.zig +6 -0
  52. package/src/lib/common/protocol.zig +50 -44
  53. package/src/lib/common/rational.zig +406 -166
  54. package/src/lib/common/rng.zig +5 -7
  55. package/src/lib/common/util.zig +65 -1
  56. package/src/lib/gen1/calc.zig +695 -159
  57. package/src/lib/gen1/chance.zig +415 -290
  58. package/src/lib/gen1/data/moves.zig +2 -4
  59. package/src/lib/gen1/data/species.zig +1 -3
  60. package/src/lib/gen1/data/types.zig +2 -3
  61. package/src/lib/gen1/data.zig +38 -41
  62. package/src/lib/gen1/helpers.zig +92 -548
  63. package/src/lib/gen1/mechanics.zig +342 -245
  64. package/src/lib/gen2/calc.zig +37 -27
  65. package/src/lib/gen2/chance.zig +90 -502
  66. package/src/lib/gen2/data/items.zig +1 -3
  67. package/src/lib/gen2/data/moves.zig +2 -4
  68. package/src/lib/gen2/data/species.zig +1 -3
  69. package/src/lib/gen2/data/types.zig +7 -5
  70. package/src/lib/gen2/data.zig +28 -30
  71. package/src/lib/gen2/generated.zig +18 -23
  72. package/src/lib/gen2/helpers.zig +46 -25
  73. package/src/lib/gen2/mechanics.zig +199 -141
  74. package/src/lib/node.zig +4 -121
  75. package/src/lib/pkmn.zig +17 -18
  76. package/src/lib/wasm.zig +13 -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,21 @@
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;
15
+ const big = if (@hasField(Endian, "big")) Endian.big else Endian.Big;
16
+ const little = if (@hasField(Endian, "little")) Endian.little else Endian.Little;
17
+
18
+ const Int = if (@hasField(std.builtin.Type, "int")) .int else .Int;
18
19
 
19
20
  pub const ArgType = enum(u8) {
20
21
  None,
@@ -220,6 +221,7 @@ pub const Activate = enum(u8) {
220
221
  BeatUp, // FIXME of
221
222
 
222
223
  Magnitude,
224
+ Spite,
223
225
  };
224
226
 
225
227
  pub const Start = enum(u8) {
@@ -544,6 +546,7 @@ pub fn Log(comptime Writer: type) type {
544
546
  // ident: ID, reason: Activate
545
547
  // ident: ID, reason: .SubstituteBlock, m: <Move>
546
548
  // ident: ID, reason: .Magnitude, num: u8
549
+ // ident: ID, reason: .Spite, m: <Move>, num: u8
547
550
  pub fn activate(self: Self, args: anytype) Error!void {
548
551
  if (!enabled) return;
549
552
 
@@ -561,6 +564,9 @@ pub fn Log(comptime Writer: type) type {
561
564
  assert(reason == .Magnitude);
562
565
  try self.writer.writeByte(args[2]);
563
566
  }
567
+ } else if (args.len == 4) {
568
+ assert(reason == .Spite);
569
+ try self.writer.writeAll(&.{ @intFromEnum(args[2]), args[3] });
564
570
  }
565
571
  }
566
572
 
@@ -835,7 +841,7 @@ pub const ByteStream = struct {
835
841
 
836
842
  pub fn writeInt(self: Writer, comptime T: type, v: T, end: std.builtin.Endian) Error!void {
837
843
  // TODO: rework this to write directly to the buffer?
838
- var bytes: [@divExact(@typeInfo(T).Int.bits, 8)]u8 = undefined;
844
+ var bytes: [@divExact(@field(@typeInfo(T), @tagName(Int)).bits, 8)]u8 = undefined;
839
845
  std.mem.writeInt(std.math.ByteAlignedInt(@TypeOf(v)), &bytes, v, end);
840
846
  return self.writeAll(&bytes);
841
847
  }
@@ -859,7 +865,7 @@ pub const ByteStream = struct {
859
865
  pub const Kind = enum { Move, Species, Type, Status, Item, Weather };
860
866
 
861
867
  pub fn format(
862
- comptime gen: anytype,
868
+ gen: anytype,
863
869
  a: []const u8,
864
870
  b: ?[]const u8,
865
871
  color: bool,
@@ -951,13 +957,13 @@ pub fn format(
951
957
  }
952
958
  printc(" L{d}", .{a[i]}, a, b, &i, 1, color);
953
959
  switch (endian) {
954
- .big => {
960
+ big => {
955
961
  var hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
956
962
  printc(" {d}", .{hp}, a, b, &i, 2, color);
957
963
  hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
958
964
  printc("/{d}", .{hp}, a, b, &i, 2, color);
959
965
  },
960
- .little => {
966
+ little => {
961
967
  var hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
962
968
  printc(" {d}", .{hp}, a, b, &i, 2, color);
963
969
  hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
@@ -988,8 +994,8 @@ pub fn format(
988
994
  },
989
995
  .Turn => {
990
996
  const turn = switch (endian) {
991
- .big => @as(u16, a[i]) << 8 | @as(u16, a[i + 1]),
992
- .little => @as(u16, a[i + 1]) << 8 | @as(u16, a[i]),
997
+ big => @as(u16, a[i]) << 8 | @as(u16, a[i + 1]),
998
+ little => @as(u16, a[i + 1]) << 8 | @as(u16, a[i]),
993
999
  };
994
1000
  printc(" {d}", .{turn}, a, b, &i, 2, color);
995
1001
  },
@@ -1000,13 +1006,13 @@ pub fn format(
1000
1006
  var id = ID.from(@intCast(a[i]));
1001
1007
  printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
1002
1008
  switch (endian) {
1003
- .big => {
1009
+ big => {
1004
1010
  var hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
1005
1011
  printc(" {d}", .{hp}, a, b, &i, 2, color);
1006
1012
  hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
1007
1013
  printc("/{d}", .{hp}, a, b, &i, 2, color);
1008
1014
  },
1009
- .little => {
1015
+ little => {
1010
1016
  var hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
1011
1017
  printc(" {d}", .{hp}, a, b, &i, 2, color);
1012
1018
  hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
@@ -1128,13 +1134,13 @@ pub fn format(
1128
1134
  const id = ID.from(@intCast(a[i]));
1129
1135
  printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
1130
1136
  switch (endian) {
1131
- .big => {
1137
+ big => {
1132
1138
  var hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
1133
1139
  printc(" {d}", .{hp}, a, b, &i, 2, color);
1134
1140
  hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
1135
1141
  printc("/{d}", .{hp}, a, b, &i, 2, color);
1136
1142
  },
1137
- .little => {
1143
+ little => {
1138
1144
  var hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
1139
1145
  printc(" {d}", .{hp}, a, b, &i, 2, color);
1140
1146
  hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
@@ -1340,8 +1346,8 @@ test "|switch|" {
1340
1346
  try log.switched(.{ p2.ident(3), &snorlax });
1341
1347
  const par = 0b1000000;
1342
1348
  var expected: []const u8 = switch (endian) {
1343
- .big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 91, 0, 200, 1, 144, par },
1344
- .little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 91, 200, 0, 144, 1, par },
1349
+ big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 91, 0, 200, 1, 144, par },
1350
+ little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 91, 200, 0, 144, 1, par },
1345
1351
  };
1346
1352
  try expectLog1(expected, buf[0..9]);
1347
1353
  stream.reset();
@@ -1351,8 +1357,8 @@ test "|switch|" {
1351
1357
  snorlax.status = 0;
1352
1358
  try log.switched(.{ p2.ident(3), &snorlax });
1353
1359
  expected = switch (endian) {
1354
- .big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 0, 0, 1, 144, 0 },
1355
- .little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 0, 0, 144, 1, 0 },
1360
+ big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 0, 0, 1, 144, 0 },
1361
+ little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 0, 0, 144, 1, 0 },
1356
1362
  };
1357
1363
  try expectLog1(expected, buf[0..9]);
1358
1364
  stream.reset();
@@ -1360,8 +1366,8 @@ test "|switch|" {
1360
1366
  snorlax.hp = 400;
1361
1367
  try log.switched(.{ p2.ident(3), &snorlax });
1362
1368
  expected = switch (endian) {
1363
- .big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 1, 144, 1, 144, 0 },
1364
- .little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 144, 1, 144, 1, 0 },
1369
+ big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 1, 144, 1, 144, 0 },
1370
+ little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 144, 1, 144, 1, 0 },
1365
1371
  };
1366
1372
  try expectLog1(expected, buf[0..9]);
1367
1373
  stream.reset();
@@ -1379,8 +1385,8 @@ test "|switch|" {
1379
1385
  N(gen2.Gender.Female),
1380
1386
  91,
1381
1387
  } ++ switch (endian) {
1382
- .big => .{ 0, 200, 1, 144, par },
1383
- .little => .{ 200, 0, 144, 1, par },
1388
+ big => .{ 0, 200, 1, 144, par },
1389
+ little => .{ 200, 0, 144, 1, par },
1384
1390
  });
1385
1391
  try expectLog2(expected, buf[0..10]);
1386
1392
  stream.reset();
@@ -1409,8 +1415,8 @@ test "|faint|" {
1409
1415
  test "|turn|" {
1410
1416
  try log.turn(.{42});
1411
1417
  const expected = switch (endian) {
1412
- .big => &.{ N(ArgType.Turn), 0, 42, N(ArgType.None) },
1413
- .little => &.{ N(ArgType.Turn), 42, 0, N(ArgType.None) },
1418
+ big => &.{ N(ArgType.Turn), 0, 42, N(ArgType.None) },
1419
+ little => &.{ N(ArgType.Turn), 42, 0, N(ArgType.None) },
1414
1420
  };
1415
1421
  try expectLog1(expected, buf[0..4]);
1416
1422
  stream.reset();
@@ -1434,8 +1440,8 @@ test "|-damage|" {
1434
1440
  chansey.status = gen1.Status.slp(1);
1435
1441
  try log.damage(.{ p2.ident(2), &chansey, .None });
1436
1442
  var expected: []const u8 = switch (endian) {
1437
- .big => &.{ N(ArgType.Damage), 0b1010, 2, 100, 2, 191, 1, N(Damage.None) },
1438
- .little => &.{ N(ArgType.Damage), 0b1010, 100, 2, 191, 2, 1, N(Damage.None) },
1443
+ big => &.{ N(ArgType.Damage), 0b1010, 2, 100, 2, 191, 1, N(Damage.None) },
1444
+ little => &.{ N(ArgType.Damage), 0b1010, 100, 2, 191, 2, 1, N(Damage.None) },
1439
1445
  };
1440
1446
  try expectLog1(expected, buf[0..8]);
1441
1447
  stream.reset();
@@ -1445,8 +1451,8 @@ test "|-damage|" {
1445
1451
  chansey.status = 0;
1446
1452
  try log.damage(.{ p2.ident(2), &chansey, .Confusion });
1447
1453
  expected = switch (endian) {
1448
- .big => &.{ N(ArgType.Damage), 0b1010, 0, 100, 1, 0, 0, N(Damage.Confusion) },
1449
- .little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0, N(Damage.Confusion) },
1454
+ big => &.{ N(ArgType.Damage), 0b1010, 0, 100, 1, 0, 0, N(Damage.Confusion) },
1455
+ little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0, N(Damage.Confusion) },
1450
1456
  };
1451
1457
  try expectLog1(expected, buf[0..8]);
1452
1458
  stream.reset();
@@ -1454,8 +1460,8 @@ test "|-damage|" {
1454
1460
  chansey.status = gen1.Status.init(.PSN);
1455
1461
  try log.damage(.{ p2.ident(2), &chansey, .RecoilOf, p1.ident(1) });
1456
1462
  expected = switch (endian) {
1457
- .big => &.{ N(ArgType.Damage), 0b1010, 0, 100, 1, 0, 0b1000, N(Damage.RecoilOf), 1 },
1458
- .little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0b1000, N(Damage.RecoilOf), 1 },
1463
+ big => &.{ N(ArgType.Damage), 0b1010, 0, 100, 1, 0, 0b1000, N(Damage.RecoilOf), 1 },
1464
+ little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0b1000, N(Damage.RecoilOf), 1 },
1459
1465
  };
1460
1466
  try expectLog1(expected, buf[0..9]);
1461
1467
  stream.reset();
@@ -1467,8 +1473,8 @@ test "|-heal|" {
1467
1473
  chansey.status = gen1.Status.slp(1);
1468
1474
  try log.heal(.{ p2.ident(2), &chansey, .None });
1469
1475
  var expected: []const u8 = switch (endian) {
1470
- .big => &.{ N(ArgType.Heal), 0b1010, 2, 100, 2, 191, 1, N(Heal.None) },
1471
- .little => &.{ N(ArgType.Heal), 0b1010, 100, 2, 191, 2, 1, N(Heal.None) },
1476
+ big => &.{ N(ArgType.Heal), 0b1010, 2, 100, 2, 191, 1, N(Heal.None) },
1477
+ little => &.{ N(ArgType.Heal), 0b1010, 100, 2, 191, 2, 1, N(Heal.None) },
1472
1478
  };
1473
1479
  try expectLog1(expected, buf[0..8]);
1474
1480
  stream.reset();
@@ -1478,16 +1484,16 @@ test "|-heal|" {
1478
1484
  chansey.status = 0;
1479
1485
  try log.heal(.{ p2.ident(2), &chansey, .Silent });
1480
1486
  expected = switch (endian) {
1481
- .big => &.{ N(ArgType.Heal), 0b1010, 0, 100, 1, 0, 0, N(Heal.Silent) },
1482
- .little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Silent) },
1487
+ big => &.{ N(ArgType.Heal), 0b1010, 0, 100, 1, 0, 0, N(Heal.Silent) },
1488
+ little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Silent) },
1483
1489
  };
1484
1490
  try expectLog1(expected, buf[0..8]);
1485
1491
  stream.reset();
1486
1492
 
1487
1493
  try log.heal(.{ p2.ident(2), &chansey, .Drain, p1.ident(1) });
1488
1494
  expected = switch (endian) {
1489
- .big => &.{ N(ArgType.Heal), 0b1010, 0, 100, 1, 0, 0, N(Heal.Drain), 1 },
1490
- .little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Drain), 1 },
1495
+ big => &.{ N(ArgType.Heal), 0b1010, 0, 100, 1, 0, 0, N(Heal.Drain), 1 },
1496
+ little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Drain), 1 },
1491
1497
  };
1492
1498
  try expectLog1(expected, buf[0..9]);
1493
1499
  stream.reset();
@@ -1730,8 +1736,8 @@ test "|drag|" {
1730
1736
  N(gen2.Gender.Female),
1731
1737
  91,
1732
1738
  } ++ switch (endian) {
1733
- .big => .{ 0, 200, 1, 144, par },
1734
- .little => .{ 200, 0, 144, 1, par },
1739
+ big => .{ 0, 200, 1, 144, par },
1740
+ little => .{ 200, 0, 144, 1, par },
1735
1741
  });
1736
1742
  try expectLog2(expected, buf[0..10]);
1737
1743
  stream.reset();
@@ -1764,8 +1770,8 @@ test "|-sethp|" {
1764
1770
  blissey.hp = 612;
1765
1771
  try log.sethp(.{ p2.ident(2), &blissey, .Silent });
1766
1772
  const expected: []const u8 = switch (endian) {
1767
- .big => &.{ N(ArgType.SetHP), 0b1010, 2, 100, 2, 201, 0, N(SetHP.Silent) },
1768
- .little => &.{ N(ArgType.SetHP), 0b1010, 100, 2, 201, 2, 0, N(SetHP.Silent) },
1773
+ big => &.{ N(ArgType.SetHP), 0b1010, 2, 100, 2, 201, 0, N(SetHP.Silent) },
1774
+ little => &.{ N(ArgType.SetHP), 0b1010, 100, 2, 201, 2, 0, N(SetHP.Silent) },
1769
1775
  };
1770
1776
  try expectLog2(expected, buf[0..8]);
1771
1777
  stream.reset();