@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.
- package/LICENSE +1 -1
- package/README.md +65 -15
- package/build/pkg/addon/browser.d.ts +3 -0
- package/build/pkg/addon/browser.js +47 -0
- package/build/pkg/addon/browser.js.map +1 -0
- package/build/pkg/addon/node.d.ts +3 -0
- package/build/pkg/addon/node.js +110 -0
- package/build/pkg/addon/node.js.map +1 -0
- package/build/pkg/addon/wasm.d.ts +2 -0
- package/build/pkg/addon/wasm.js +53 -0
- package/build/pkg/addon/wasm.js.map +1 -0
- package/build/pkg/addon.d.ts +25 -3
- package/build/pkg/addon.js +39 -71
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data/layout.json +15 -2
- package/build/pkg/data/protocol.json +23 -9
- package/build/pkg/data.d.ts +25 -4
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +15 -18
- package/build/pkg/gen1.js +28 -19
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +40 -90
- package/build/pkg/index.js +23 -70
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +20 -1
- package/build/pkg/protocol.js +109 -107
- package/build/pkg/protocol.js.map +1 -1
- package/build/tools/debug.js +53 -78
- package/build/tools/debug.js.map +1 -1
- package/build/tools/display/debug.jsx +152 -0
- package/build/tools/display/debug.jsx.map +1 -0
- package/build/tools/display/index.js +152 -0
- package/build/tools/display/index.js.map +1 -0
- package/build/tools/display/ui.jsx +359 -0
- package/build/tools/display/ui.jsx.map +1 -0
- package/build/tools/display/util.js +33 -0
- package/build/tools/display/util.js.map +1 -0
- package/build.zig +309 -79
- package/package.json +55 -135
- package/src/bin/install-pkmn-engine +19 -8
- package/src/bin/pkmn-debug +1 -1
- package/src/lib/bindings/c.zig +255 -0
- package/src/lib/bindings/node.zig +117 -0
- package/src/lib/bindings/wasm.zig +59 -0
- package/src/lib/common/array.zig +77 -0
- package/src/lib/common/data.zig +8 -8
- package/src/lib/common/debug.zig +39 -8
- package/src/lib/common/js.zig +4 -6
- package/src/lib/common/napi.zig +4 -0
- package/src/lib/common/optional.zig +13 -9
- package/src/lib/common/options.zig +6 -0
- package/src/lib/common/protocol.zig +50 -44
- package/src/lib/common/rational.zig +406 -166
- package/src/lib/common/rng.zig +5 -7
- package/src/lib/common/util.zig +65 -1
- package/src/lib/gen1/calc.zig +695 -159
- package/src/lib/gen1/chance.zig +415 -290
- package/src/lib/gen1/data/moves.zig +2 -4
- package/src/lib/gen1/data/species.zig +1 -3
- package/src/lib/gen1/data/types.zig +2 -3
- package/src/lib/gen1/data.zig +38 -41
- package/src/lib/gen1/helpers.zig +92 -548
- package/src/lib/gen1/mechanics.zig +342 -245
- package/src/lib/gen2/calc.zig +37 -27
- package/src/lib/gen2/chance.zig +90 -502
- package/src/lib/gen2/data/items.zig +1 -3
- package/src/lib/gen2/data/moves.zig +2 -4
- package/src/lib/gen2/data/species.zig +1 -3
- package/src/lib/gen2/data/types.zig +7 -5
- package/src/lib/gen2/data.zig +28 -30
- package/src/lib/gen2/generated.zig +18 -23
- package/src/lib/gen2/helpers.zig +46 -25
- package/src/lib/gen2/mechanics.zig +199 -141
- package/src/lib/node.zig +4 -121
- package/src/lib/pkmn.zig +17 -18
- package/src/lib/wasm.zig +13 -9
- package/src/tools/display/dom.ts +93 -0
- package/src/tools/display/ui.css +354 -0
- package/build/test/display.js +0 -400
- package/build/test/display.js.map +0 -1
- 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)
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
992
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
1344
|
-
|
|
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
|
-
|
|
1355
|
-
|
|
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
|
-
|
|
1364
|
-
|
|
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
|
-
|
|
1383
|
-
|
|
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
|
-
|
|
1413
|
-
|
|
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
|
-
|
|
1438
|
-
|
|
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
|
-
|
|
1449
|
-
|
|
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
|
-
|
|
1458
|
-
|
|
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
|
-
|
|
1471
|
-
|
|
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
|
-
|
|
1482
|
-
|
|
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
|
-
|
|
1490
|
-
|
|
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
|
-
|
|
1734
|
-
|
|
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
|
-
|
|
1768
|
-
|
|
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();
|