@pkmn/engine 0.1.0-dev.7963b917 → 0.1.0-dev.79957401

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (85) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +70 -28
  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 +39 -71
  14. package/build/pkg/addon.js.map +1 -1
  15. package/build/pkg/data/ids.json +12 -12
  16. package/build/pkg/data/layout.json +17 -4
  17. package/build/pkg/data/protocol.json +84 -13
  18. package/build/pkg/data.d.ts +27 -5
  19. package/build/pkg/data.js.map +1 -1
  20. package/build/pkg/gen1.d.ts +15 -18
  21. package/build/pkg/gen1.js +30 -21
  22. package/build/pkg/gen1.js.map +1 -1
  23. package/build/pkg/index.d.ts +42 -91
  24. package/build/pkg/index.js +23 -70
  25. package/build/pkg/index.js.map +1 -1
  26. package/build/pkg/protocol.d.ts +29 -1
  27. package/build/pkg/protocol.js +123 -102
  28. package/build/pkg/protocol.js.map +1 -1
  29. package/build/tools/debug.js +84 -73
  30. package/build/tools/debug.js.map +1 -1
  31. package/build/tools/display/debug.jsx +66 -0
  32. package/build/tools/display/debug.jsx.map +1 -0
  33. package/build/tools/display/index.js +152 -0
  34. package/build/tools/display/index.js.map +1 -0
  35. package/build/tools/display/ui.jsx +360 -0
  36. package/build/tools/display/ui.jsx.map +1 -0
  37. package/build/tools/display/util.js +157 -0
  38. package/build/tools/display/util.js.map +1 -0
  39. package/build.zig +397 -149
  40. package/package.json +62 -123
  41. package/src/bin/install-pkmn-engine +43 -22
  42. package/src/bin/pkmn-debug +1 -1
  43. package/src/lib/bindings/c.zig +201 -0
  44. package/src/lib/{binding → bindings}/node.zig +15 -32
  45. package/src/lib/bindings/wasm.zig +51 -0
  46. package/src/lib/common/array.zig +70 -0
  47. package/src/lib/common/data.zig +12 -24
  48. package/src/lib/common/debug.zig +46 -30
  49. package/src/lib/common/js.zig +3 -7
  50. package/src/lib/common/optional.zig +30 -24
  51. package/src/lib/common/options.zig +6 -0
  52. package/src/lib/common/protocol.zig +961 -450
  53. package/src/lib/common/rational.zig +341 -254
  54. package/src/lib/common/rng.zig +26 -19
  55. package/src/lib/common/util.zig +53 -1
  56. package/src/lib/gen1/calc.zig +726 -178
  57. package/src/lib/gen1/chance.zig +526 -324
  58. package/src/lib/gen1/data/moves.zig +193 -183
  59. package/src/lib/gen1/data/species.zig +4 -6
  60. package/src/lib/gen1/data/types.zig +9 -10
  61. package/src/lib/gen1/data.zig +78 -90
  62. package/src/lib/gen1/helpers.zig +114 -422
  63. package/src/lib/gen1/mechanics.zig +699 -615
  64. package/src/lib/gen2/calc.zig +150 -0
  65. package/src/lib/gen2/chance.zig +914 -0
  66. package/src/lib/gen2/data/items.zig +13 -21
  67. package/src/lib/gen2/data/moves.zig +664 -572
  68. package/src/lib/gen2/data/species.zig +2 -4
  69. package/src/lib/gen2/data/types.zig +139 -34
  70. package/src/lib/gen2/data.zig +131 -103
  71. package/src/lib/gen2/generated.zig +801 -0
  72. package/src/lib/gen2/helpers.zig +76 -51
  73. package/src/lib/gen2/mechanics.zig +3569 -29
  74. package/src/lib/napi.h +2 -0
  75. package/src/lib/node.zig +14 -0
  76. package/src/lib/pkmn.zig +125 -29
  77. package/src/lib/wasm.zig +13 -0
  78. package/src/tools/display/dom.ts +108 -0
  79. package/src/tools/display/ui.css +354 -0
  80. package/build/test/display.js +0 -400
  81. package/build/test/display.js.map +0 -1
  82. package/src/lib/binding/wasm.zig +0 -12
  83. package/src/lib/gen1/README.md +0 -812
  84. package/src/lib/gen2/README.md +0 -308
  85. package/src/test/display/pkmn.html.tmpl +0 -368
@@ -1,10 +1,8 @@
1
+ const options = @import("options.zig");
1
2
  const std = @import("std");
2
3
 
3
- const options = @import("./options.zig");
4
-
5
4
  const assert = std.debug.assert;
6
5
  const expectEqual = std.testing.expectEqual;
7
-
8
6
  const showdown = options.showdown;
9
7
 
10
8
  pub fn PRNG(comptime gen: comptime_int) type {
@@ -25,6 +23,11 @@ pub fn PRNG(comptime gen: comptime_int) type {
25
23
  pub fn next(self: *Self) Output(gen) {
26
24
  return self.src.next();
27
25
  }
26
+
27
+ pub fn advance(self: *Self, n: usize) void {
28
+ if (!options.advance) return;
29
+ for (0..n) |_| self.src.advance();
30
+ }
28
31
  };
29
32
  }
30
33
 
@@ -61,11 +64,15 @@ pub const PSRNG = extern struct {
61
64
  (@as(u64, self.range(u16, 0, 0x10000)) << 16) |
62
65
  (@as(u64, self.range(u16, 0, 0x10000)));
63
66
  }
67
+
68
+ pub fn Bound(comptime T: type) type {
69
+ return std.math.IntFittingRange(0, std.math.maxInt(T) + 1);
70
+ }
64
71
  };
65
72
 
66
73
  test PSRNG {
67
- var psrng = PSRNG{ .src = .{ .seed = 0x0001000200030004 } };
68
- try expectEqual(@as(u8, 121), psrng.range(u8, 0, 256));
74
+ var psrng: PSRNG = .{ .src = .{ .seed = 0x0001000200030004 } };
75
+ try expectEqual(121, psrng.range(u8, 0, 256));
69
76
  try expectEqual(false, psrng.chance(u8, 128, 256)); // 226 < 128
70
77
  }
71
78
 
@@ -79,7 +86,7 @@ pub const Gen12 = extern struct {
79
86
  assert(@sizeOf(Gen12) == 10);
80
87
  }
81
88
 
82
- pub fn percent(p: u8) u8 {
89
+ pub fn percent(comptime p: comptime_int) u8 {
83
90
  return @intCast((@as(u16, p) * 0xFF) / 100);
84
91
  }
85
92
 
@@ -89,18 +96,22 @@ pub const Gen12 = extern struct {
89
96
  self.index = (self.index + 1) % 9;
90
97
  return val;
91
98
  }
99
+
100
+ pub fn advance(self: *Gen12) void {
101
+ _ = self.next();
102
+ }
92
103
  };
93
104
 
94
105
  test Gen12 {
95
106
  const expected = [_]u8{ 6, 11, 16, 21, 26, 31, 36, 41, 46, 31, 56, 81 };
96
- var rng = Gen12{ .seed = .{ 1, 2, 3, 4, 5, 6, 7, 8, 9 } };
107
+ var rng: Gen12 = .{ .seed = .{ 1, 2, 3, 4, 5, 6, 7, 8, 9 } };
97
108
  for (expected) |e| {
98
109
  try expectEqual(e, rng.next());
99
110
  }
100
111
 
101
- try expectEqual(@as(u8, 16), Gen12.percent(6) + 1);
102
- try expectEqual(@as(u8, 16), Gen12.percent(7) - 1);
103
- try expectEqual(@as(u8, 128), Gen12.percent(50) + 1);
112
+ try expectEqual(16, Gen12.percent(6) + 1);
113
+ try expectEqual(16, Gen12.percent(7) - 1);
114
+ try expectEqual(128, Gen12.percent(50) + 1);
104
115
  }
105
116
 
106
117
  // https://pkmn.cc/pokeemerald/src/random.c
@@ -129,7 +140,7 @@ test Gen34 {
129
140
  .{ 0x80000000, 5, 0x0E425287 }, .{ 0x80000000, 10, 0x6F2CF4B2 },
130
141
  };
131
142
  for (data) |d| {
132
- var rng = Gen34{ .seed = d[0] };
143
+ var rng: Gen34 = .{ .seed = d[0] };
133
144
  for (0..d[1]) |_| _ = rng.next();
134
145
  try expectEqual(d[2], rng.seed);
135
146
  }
@@ -161,7 +172,7 @@ test Gen56 {
161
172
  .{ 0x8000000000000000, 10, 0xE7795501267F125A },
162
173
  };
163
174
  for (data) |d| {
164
- var rng = Gen56{ .seed = d[0] };
175
+ var rng: Gen56 = .{ .seed = d[0] };
165
176
  for (0..d[1]) |_| _ = rng.next();
166
177
  try expectEqual(d[2], rng.seed);
167
178
  }
@@ -188,7 +199,7 @@ pub fn FixedRNG(comptime gen: comptime_int, comptime len: usize) type {
188
199
  for (0..n) |_| _ = self.next();
189
200
  }
190
201
 
191
- pub fn range(self: *Self, comptime T: type, from: T, to: Bound(T)) T {
202
+ pub fn range(self: *Self, comptime T: type, from: T, to: PSRNG.Bound(T)) T {
192
203
  assert(showdown);
193
204
  return @intCast(@as(u64, self.next()) * (to - from) / divisor + from);
194
205
  }
@@ -197,7 +208,7 @@ pub fn FixedRNG(comptime gen: comptime_int, comptime len: usize) type {
197
208
  self: *Self,
198
209
  comptime T: type,
199
210
  numerator: T,
200
- denominator: Bound(T),
211
+ denominator: PSRNG.Bound(T),
201
212
  ) bool {
202
213
  assert(showdown);
203
214
  assert(denominator > 0);
@@ -213,7 +224,7 @@ pub fn FixedRNG(comptime gen: comptime_int, comptime len: usize) type {
213
224
  test FixedRNG {
214
225
  const Type = if (showdown) u32 else u8;
215
226
  const expected = [_]Type{ 42, 255, 0 };
216
- var rng = FixedRNG(1, expected.len){ .rolls = expected };
227
+ var rng: FixedRNG(1, expected.len) = .{ .rolls = expected };
217
228
  for (expected) |e| {
218
229
  try expectEqual(e, rng.next());
219
230
  }
@@ -228,7 +239,3 @@ fn Output(comptime gen: comptime_int) type {
228
239
  else => unreachable,
229
240
  };
230
241
  }
231
-
232
- fn Bound(comptime T: type) type {
233
- return std.math.IntFittingRange(0, std.math.maxInt(T) + 1);
234
- }
@@ -1,12 +1,64 @@
1
1
  const std = @import("std");
2
2
 
3
+ const expect = std.testing.expect;
3
4
  const expectEqual = std.testing.expectEqual;
4
5
 
5
6
  pub fn PointerType(comptime P: type, comptime C: type) type {
6
- return if (@typeInfo(P).Pointer.is_const) *const C else *C;
7
+ const ptr_info = @typeInfo(P).pointer;
8
+ const is_const = if (@hasField(@TypeOf(ptr_info), "attrs"))
9
+ ptr_info.attrs.@"const"
10
+ else
11
+ ptr_info.is_const;
12
+ return if (is_const) *const C else *C;
7
13
  }
8
14
 
9
15
  test PointerType {
10
16
  try expectEqual(*bool, PointerType(*u8, bool));
11
17
  try expectEqual(*const f64, PointerType(*const i32, f64));
12
18
  }
19
+
20
+ pub fn EnumFieldsLen(comptime E: type) usize {
21
+ const info = @typeInfo(E).@"enum";
22
+ return if (@hasField(@TypeOf(info), "fields"))
23
+ info.fields.len
24
+ else
25
+ info.field_names.len;
26
+ }
27
+
28
+ test EnumFieldsLen {
29
+ const E1 = enum { A, B, C };
30
+ const E2 = enum(u8) { A = 0, B = 10, C = 20, D = 30 };
31
+ try expectEqual(3, EnumFieldsLen(E1));
32
+ try expectEqual(4, EnumFieldsLen(E2));
33
+ }
34
+
35
+ pub fn isPointerTo(p: anytype, comptime P: type) bool {
36
+ const info = @typeInfo(@TypeOf(p));
37
+ return switch (info) {
38
+ .pointer => info.pointer.child == P,
39
+ else => false,
40
+ };
41
+ }
42
+
43
+ test isPointerTo {
44
+ const S = struct {};
45
+ const s: S = .{};
46
+ try expect(!isPointerTo(s, S));
47
+ try expect(isPointerTo(&s, S));
48
+ }
49
+
50
+ pub fn repeat(comptime xs: anytype, comptime n: usize) [xs.len * n]@TypeOf(xs[0]) {
51
+ comptime {
52
+ const T = @TypeOf(xs[0]);
53
+ var ts: [xs.len * n]T = undefined;
54
+
55
+ var i: usize = 0;
56
+ while (i < n) : (i += 1) {
57
+ for (xs, 0..) |v, j| {
58
+ ts[i * xs.len + j] = v;
59
+ }
60
+ }
61
+
62
+ return ts;
63
+ }
64
+ }