@pkmn/engine 0.1.0-dev.44a51703 → 0.1.0-dev.44c4a618

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 (56) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +93 -57
  3. package/build/pkg/addon.js +9 -9
  4. package/build/pkg/addon.js.map +1 -1
  5. package/build/pkg/data/ids.json +12 -12
  6. package/build/pkg/data/layout.json +26 -4
  7. package/build/pkg/data/protocol.json +69 -12
  8. package/build/pkg/data.d.ts +4 -4
  9. package/build/pkg/data.js.map +1 -1
  10. package/build/pkg/gen1.js +15 -18
  11. package/build/pkg/gen1.js.map +1 -1
  12. package/build/pkg/index.d.ts +2 -1
  13. package/build/pkg/index.js.map +1 -1
  14. package/build/pkg/protocol.js +61 -42
  15. package/build/pkg/protocol.js.map +1 -1
  16. package/build/test/display.js +2 -2
  17. package/build/test/display.js.map +1 -1
  18. package/build/tools/debug.js +5 -4
  19. package/build/tools/debug.js.map +1 -1
  20. package/build.zig +142 -119
  21. package/package.json +54 -25
  22. package/src/bin/install-pkmn-engine +35 -22
  23. package/src/lib/common/battle.zig +17 -0
  24. package/src/lib/common/data.zig +12 -24
  25. package/src/lib/common/debug.zig +22 -13
  26. package/src/lib/common/js.zig +118 -0
  27. package/src/lib/common/optional.zig +67 -0
  28. package/src/lib/common/options.zig +11 -0
  29. package/src/lib/common/protocol.zig +845 -322
  30. package/src/lib/common/rational.zig +357 -0
  31. package/src/lib/common/rng.zig +30 -21
  32. package/src/lib/common/util.zig +12 -0
  33. package/src/lib/gen1/calc.zig +507 -0
  34. package/src/lib/gen1/chance.zig +1063 -0
  35. package/src/lib/gen1/data/moves.zig +192 -180
  36. package/src/lib/gen1/data/species.zig +3 -3
  37. package/src/lib/gen1/data/types.zig +7 -7
  38. package/src/lib/gen1/data.zig +86 -77
  39. package/src/lib/gen1/helpers.zig +658 -15
  40. package/src/lib/gen1/mechanics.zig +940 -675
  41. package/src/lib/gen2/calc.zig +143 -0
  42. package/src/lib/gen2/chance.zig +1315 -0
  43. package/src/lib/gen2/data/items.zig +12 -18
  44. package/src/lib/gen2/data/moves.zig +663 -569
  45. package/src/lib/gen2/data/species.zig +1 -1
  46. package/src/lib/gen2/data/types.zig +134 -31
  47. package/src/lib/gen2/data.zig +121 -84
  48. package/src/lib/gen2/generated.zig +806 -0
  49. package/src/lib/gen2/helpers.zig +45 -21
  50. package/src/lib/gen2/mechanics.zig +3591 -12
  51. package/src/lib/node.zig +131 -0
  52. package/src/lib/pkmn.zig +79 -5
  53. package/src/lib/{binding/wasm.zig → wasm.zig} +4 -1
  54. package/src/lib/binding/node.zig +0 -226
  55. package/src/lib/gen1/README.md +0 -814
  56. package/src/lib/gen2/README.md +0 -309
package/build.zig CHANGED
@@ -1,19 +1,6 @@
1
1
  const std = @import("std");
2
2
  const builtin = @import("builtin");
3
3
 
4
- pub const Options = struct { showdown: ?bool = null, log: ?bool = null };
5
-
6
- pub fn module(b: *std.Build, options: Options) *std.Build.Module {
7
- const dirname = comptime std.fs.path.dirname(@src().file) orelse ".";
8
- const build_options = b.addOptions();
9
- build_options.addOption(?bool, "showdown", options.showdown);
10
- build_options.addOption(?bool, "log", options.log);
11
- return b.createModule(.{
12
- .source_file = .{ .path = dirname ++ "/src/lib/pkmn.zig" },
13
- .dependencies = &.{.{ .name = "build_options", .module = build_options.createModule() }},
14
- });
15
- }
16
-
17
4
  pub fn build(b: *std.Build) !void {
18
5
  const target = b.standardTargetOptions(.{});
19
6
  const optimize = b.standardOptimizeOption(.{});
@@ -25,9 +12,10 @@ pub fn build(b: *std.Build) !void {
25
12
  const wasm_stack_size =
26
13
  b.option(u64, "wasm-stack-size", "The size of WASM stack") orelse std.wasm.page_size;
27
14
  const dynamic = b.option(bool, "dynamic", "Build a dynamic library") orelse false;
28
- const strip = b.option(bool, "strip", "Strip debugging symbols from binary") orelse false;
29
- const pic = b.option(bool, "pic", "Force position independent code") orelse false;
15
+ const strip = b.option(bool, "strip", "Strip debugging symbols from binary");
16
+ const pic = b.option(bool, "pic", "Force position independent code");
30
17
  const emit_asm = b.option(bool, "emit-asm", "Output .s (assembly code)") orelse false;
18
+ const emit_ll = b.option(bool, "emit-ll", "Output .ll (LLVM IR)") orelse false;
31
19
 
32
20
  const cmd = b.findProgram(&.{"strip"}, &.{}) catch null;
33
21
 
@@ -36,43 +24,54 @@ pub fn build(b: *std.Build) !void {
36
24
  defer parsed.deinit();
37
25
  const version = parsed.value.object.get("version").?.string;
38
26
  const description = parsed.value.object.get("description").?.string;
39
- var repository = std.mem.split(u8, parsed.value.object.get("repository").?.string, ":");
27
+ var repository = std.mem.splitSequence(u8, parsed.value.object.get("repository").?.string, ":");
40
28
  std.debug.assert(std.mem.eql(u8, repository.first(), "github"));
41
29
 
42
30
  const showdown =
43
31
  b.option(bool, "showdown", "Enable Pokémon Showdown compatibility mode") orelse false;
44
32
  const log = b.option(bool, "log", "Enable protocol message logging") orelse false;
33
+ const chance = b.option(bool, "chance", "Enable update probability tracking") orelse false;
34
+ const calc = b.option(bool, "calc", "Enable damage calculator support") orelse false;
45
35
 
46
36
  const options = b.addOptions();
47
37
  options.addOption(?bool, "showdown", showdown);
48
38
  options.addOption(?bool, "log", log);
39
+ options.addOption(?bool, "chance", chance);
40
+ options.addOption(?bool, "calc", calc);
49
41
 
50
42
  const name = if (showdown) "pkmn-showdown" else "pkmn";
51
43
 
44
+ const module = b.addModule("pkmn", .{
45
+ .root_source_file = b.path("src/lib/pkmn.zig"),
46
+ .optimize = optimize,
47
+ .target = target,
48
+ .imports = &.{.{ .name = "build_options", .module = options.createModule() }},
49
+ });
50
+
52
51
  var c = false;
53
52
  if (node_headers) |headers| {
54
53
  const addon = b.fmt("{s}.node", .{name});
55
54
  const lib = b.addSharedLibrary(.{
56
55
  .name = addon,
57
- .root_source_file = .{ .path = "src/lib/binding/node.zig" },
56
+ .root_source_file = b.path("src/lib/node.zig"),
58
57
  .optimize = optimize,
59
58
  .target = target,
59
+ .strip = strip,
60
+ .pic = pic,
60
61
  });
61
- lib.addOptions("build_options", options);
62
- lib.setMainPkgPath("./");
63
- lib.addSystemIncludePath(headers);
62
+ lib.root_module.addOptions("build_options", options);
63
+ lib.addSystemIncludePath(b.path(headers));
64
64
  lib.linkLibC();
65
65
  if (node_import_lib) |il| {
66
- lib.addObjectFile(il);
67
- } else if ((try std.zig.system.NativeTargetInfo.detect(target)).target.os.tag == .windows) {
66
+ lib.addObjectFile(b.path(il));
67
+ } else if (target.result.os.tag == .windows) {
68
68
  try std.io.getStdErr().writeAll("Must provide --node-import-library path on Windows\n");
69
69
  std.process.exit(1);
70
70
  }
71
71
  lib.linker_allow_shlib_undefined = true;
72
72
  maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
73
- if (pic) lib.force_pic = pic;
74
73
  // Always emit to build/lib because this is where the driver code expects to find it
75
- // TODO(ziglang/zig#2231): using the following used to work (though was hacky):
74
+ // TODO: ziglang/zig#2231 - using the following used to work (though was hacky):
76
75
  //
77
76
  // lib.emit_bin = .{ .emit_to = b.fmt("build/lib/{s}", .{addon}) };
78
77
  // b.getInstallStep().dependOn(&lib.step);
@@ -81,74 +80,101 @@ pub fn build(b: *std.Build) !void {
81
80
  // rename the file ourself in install-pkmn-engine
82
81
  b.installArtifact(lib);
83
82
  } else if (wasm) {
84
- const lib = b.addSharedLibrary(.{
83
+ const exe = b.addExecutable(.{
85
84
  .name = name,
86
- .root_source_file = .{ .path = "src/lib/binding/wasm.zig" },
85
+ .root_source_file = b.path("src/lib/wasm.zig"),
87
86
  .optimize = switch (optimize) {
88
87
  .ReleaseFast, .ReleaseSafe => .ReleaseSmall,
89
88
  else => optimize,
90
89
  },
91
- .target = .{ .cpu_arch = .wasm32, .os_tag = .freestanding },
90
+ .target = b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding }),
91
+ .strip = strip,
92
+ .pic = pic,
92
93
  });
93
- lib.addOptions("build_options", options);
94
- lib.setMainPkgPath("./");
95
- lib.stack_size = wasm_stack_size;
96
- lib.rdynamic = true;
97
- lib.strip = strip;
98
- if (pic) lib.force_pic = pic;
94
+ exe.root_module.addOptions("build_options", options);
95
+ exe.root_module.export_symbol_names = &[_][]const u8{
96
+ "SHOWDOWN",
97
+ "LOG",
98
+ "CHANCE",
99
+ "CALC",
100
+ "GEN1_CHOICES_SIZE",
101
+ "GEN1_LOGS_SIZE",
102
+ };
103
+ exe.entry = .disabled;
104
+ exe.stack_size = wasm_stack_size;
99
105
  const opt = b.findProgram(&.{"wasm-opt"}, &.{"./node_modules/.bin"}) catch null;
100
106
  if (optimize != .Debug and opt != null) {
101
107
  const out = b.fmt("build/lib/{s}.wasm", .{name});
102
108
  const sh = b.addSystemCommand(&.{ opt.?, "-O4" });
103
- sh.addArtifactArg(lib);
109
+ sh.addArtifactArg(exe);
104
110
  sh.addArg("-o");
105
- sh.addFileSourceArg(.{ .path = out });
111
+ sh.addFileArg(b.path(out));
106
112
  b.getInstallStep().dependOn(&sh.step);
113
+ } else {
114
+ b.getInstallStep().dependOn(&b.addInstallArtifact(exe, .{
115
+ .dest_dir = .{ .override = std.Build.InstallDir{ .lib = {} } },
116
+ }).step);
107
117
  }
108
- b.installArtifact(lib);
109
118
  } else if (dynamic) {
110
119
  const lib = b.addSharedLibrary(.{
111
120
  .name = name,
112
- .root_source_file = .{ .path = "src/lib/binding/c.zig" },
121
+ .root_source_file = b.path("src/lib/c.zig"),
113
122
  .version = try std.SemanticVersion.parse(version),
114
123
  .optimize = optimize,
115
124
  .target = target,
125
+ .strip = strip,
126
+ .pic = pic,
116
127
  });
117
- lib.addOptions("build_options", options);
118
- lib.setMainPkgPath("./");
119
- lib.addIncludePath("src/include");
128
+ lib.root_module.addOptions("build_options", options);
129
+ lib.addIncludePath(b.path("src/include"));
120
130
  maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
121
- if (pic) lib.force_pic = pic;
122
131
  b.installArtifact(lib);
123
132
  c = true;
124
133
  } else {
125
134
  const lib = b.addStaticLibrary(.{
126
135
  .name = name,
127
- .root_source_file = .{ .path = "src/lib/binding/c.zig" },
136
+ .root_source_file = b.path("src/lib/c.zig"),
128
137
  .optimize = optimize,
129
138
  .target = target,
139
+ .strip = strip,
140
+ .pic = pic,
130
141
  });
131
- lib.addOptions("build_options", options);
132
- lib.setMainPkgPath("./");
133
- lib.addIncludePath("src/include");
142
+ lib.root_module.addOptions("build_options", options);
143
+ lib.addIncludePath(b.path("src/include"));
134
144
  lib.bundle_compiler_rt = true;
135
145
  maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
136
- if (pic) lib.force_pic = pic;
137
- if (emit_asm) lib.emit_asm = .emit;
146
+ if (emit_asm) {
147
+ b.getInstallStep().dependOn(&b.addInstallFileWithDir(
148
+ lib.getEmittedAsm(),
149
+ .prefix,
150
+ b.fmt("{s}.s", .{name}),
151
+ ).step);
152
+ }
153
+ if (emit_ll) {
154
+ b.getInstallStep().dependOn(&b.addInstallFileWithDir(
155
+ lib.getEmittedLlvmIr(),
156
+ .prefix,
157
+ b.fmt("{s}.ll", .{name}),
158
+ ).step);
159
+ }
138
160
  b.installArtifact(lib);
139
161
  c = true;
140
162
  }
141
163
 
142
164
  if (c) {
143
165
  const header = b.addInstallFileWithDir(
144
- .{ .path = "src/include/pkmn.h" },
166
+ b.path("src/include/pkmn.h"),
145
167
  .header,
146
168
  "pkmn.h",
147
169
  );
148
170
  b.getInstallStep().dependOn(&header.step);
149
171
 
150
172
  const pc = b.fmt("lib{s}.pc", .{name});
151
- const file = try b.cache_root.join(b.allocator, &.{pc});
173
+ const file = try std.fs.path.relative(
174
+ b.allocator,
175
+ try std.process.getCwdAlloc(b.allocator),
176
+ try b.cache_root.join(b.allocator, &.{pc}),
177
+ );
152
178
  const pkgconfig_file = try std.fs.cwd().createFile(file, .{});
153
179
 
154
180
  const dirname = comptime std.fs.path.dirname(@src().file) orelse ".";
@@ -177,14 +203,16 @@ pub fn build(b: *std.Build) !void {
177
203
  .strip = strip,
178
204
  .cmd = cmd,
179
205
  };
206
+
207
+ // TODO: tests can be run multiple times due to @imports
180
208
  const tests = TestStep.create(b, options, config);
181
209
 
182
- var exes = std.ArrayList(*std.Build.CompileStep).init(b.allocator);
210
+ var exes = std.ArrayList(*std.Build.Step.Compile).init(b.allocator);
183
211
  const tools: ToolConfig = .{
212
+ .showdown = showdown,
213
+ .module = module,
184
214
  .general = config,
185
215
  .tool = .{
186
- .showdown = showdown,
187
- .log = log,
188
216
  .tests = if (tests.build) tests else null,
189
217
  .exes = &exes,
190
218
  },
@@ -193,39 +221,42 @@ pub fn build(b: *std.Build) !void {
193
221
  var benchmark_config = tools;
194
222
  benchmark_config.general.optimize = .ReleaseFast;
195
223
  benchmark_config.general.strip = true;
196
- const benchmark = tool(b, "src/test/benchmark.zig", benchmark_config);
224
+ const benchmark = try tool(b, "src/test/benchmark.zig", benchmark_config);
197
225
 
198
226
  var fuzz_config = tools;
199
227
  fuzz_config.general.strip = false;
200
228
  fuzz_config.tool.name = "fuzz";
201
- const fuzz = tool(b, "src/test/benchmark.zig", fuzz_config);
202
-
203
- const serde = tool(b, "src/tools/serde.zig", tools);
204
- const protocol = tool(b, "src/tools/protocol.zig", tools);
205
-
206
- const lint_exe =
207
- b.addExecutable(.{ .name = "lint", .root_source_file = .{ .path = "src/tools/lint.zig" } });
208
- if (tests.build) tests.step.dependOn(&lint_exe.step);
209
- const lint = b.addRunArtifact(lint_exe);
210
-
211
- b.step("benchmark", "Run benchmark code").dependOn(&benchmark.step);
212
- b.step("fuzz", "Run fuzz tester").dependOn(&fuzz.step);
213
- b.step("lint", "Lint source files").dependOn(&lint.step);
214
- b.step("protocol", "Run protocol dump tool").dependOn(&protocol.step);
215
- b.step("serde", "Run serialization/deserialization tool").dependOn(&serde.step);
229
+ const fuzz = try tool(b, "src/test/fuzz.zig", fuzz_config);
230
+
231
+ const analyze = try tool(b, "src/tools/analyze.zig", tools);
232
+ const dump = try tool(b, "src/tools/dump.zig", tools);
233
+ const transitions = try tool(b, "src/tools/transitions.zig", tools);
234
+
235
+ // FIXME: serde randomly fails to build in some release configurations
236
+ var hack = tools;
237
+ if (optimize != .Debug) hack.tool.tests = null;
238
+ const serde = try tool(b, "src/tools/serde.zig", hack);
239
+
240
+ if (analyze) |t| b.step("analyze", "Run LLVM analysis tool").dependOn(&t.step);
241
+ if (benchmark) |t| b.step("benchmark", "Run benchmark code").dependOn(&t.step);
242
+ if (dump) |t| b.step("dump", "Run protocol dump tool").dependOn(&t.step);
243
+ if (fuzz) |t| b.step("fuzz", "Run fuzz tester").dependOn(&t.step);
244
+ if (serde) |t| b.step("serde", "Run serialization/deserialization tool").dependOn(&t.step);
216
245
  b.step("test", "Run all tests").dependOn(&tests.step);
217
246
  b.step("tools", "Install tools").dependOn(&ToolsStep.create(b, &exes).step);
247
+ if (transitions) |t| {
248
+ b.step("transitions", "Visualize transitions algorithm search").dependOn(&t.step);
249
+ }
218
250
  }
219
251
 
220
252
  fn maybeStrip(
221
253
  b: *std.Build,
222
- artifact: *std.Build.CompileStep,
254
+ artifact: *std.Build.Step.Compile,
223
255
  step: *std.Build.Step,
224
- strip: bool,
256
+ strip: ?bool,
225
257
  cmd: ?[]const u8,
226
258
  ) void {
227
- artifact.strip = strip;
228
- if (!strip or cmd == null) return;
259
+ if (!(strip orelse false) or cmd == null) return;
229
260
  // Using `strip -r -u` for dynamic libraries is supposed to work on macOS but doesn't...
230
261
  const mac = builtin.os.tag == .macos;
231
262
  if (mac and artifact.isDynamicLibrary()) return;
@@ -237,86 +268,78 @@ fn maybeStrip(
237
268
  }
238
269
 
239
270
  const Config = struct {
240
- target: std.zig.CrossTarget,
271
+ target: std.Build.ResolvedTarget,
241
272
  optimize: std.builtin.OptimizeMode,
242
- pic: bool,
243
- strip: bool,
273
+ pic: ?bool,
274
+ strip: ?bool,
244
275
  cmd: ?[]const u8,
245
276
  };
246
277
 
247
- const TESTS = .{
248
- "src/lib/common/test.zig",
249
- "src/lib/gen1/test.zig",
250
- "src/lib/gen2/test.zig",
251
- };
252
-
253
278
  const TestStep = struct {
254
279
  step: std.Build.Step,
255
280
  build: bool,
256
281
 
257
- pub fn create(b: *std.Build, options: *std.Build.OptionsStep, config: Config) *TestStep {
282
+ pub fn create(b: *std.Build, options: *std.Build.Step.Options, config: Config) *TestStep {
258
283
  const coverage = b.option([]const u8, "test-coverage", "Generate test coverage");
259
- const test_file = b.option([]const u8, "test-file", "Input file for test");
260
284
  const test_filter =
261
285
  b.option([]const u8, "test-filter", "Skip tests that do not match filter");
262
286
 
263
287
  const self = b.allocator.create(TestStep) catch @panic("OOM");
264
288
  const step = std.Build.Step.init(.{ .id = .custom, .name = "Run all tests", .owner = b });
265
- self.* = TestStep{ .step = step, .build = test_filter == null };
266
-
267
- const paths: []const []const u8 =
268
- if (test_file) |t| &.{t} else if (coverage != null) &.{"src/lib/test.zig"} else &TESTS;
269
- for (paths) |path| {
270
- const tests = b.addTest(.{
271
- .name = std.fs.path.basename(std.fs.path.dirname(path).?),
272
- .root_source_file = .{ .path = path },
273
- .optimize = config.optimize,
274
- .target = config.target,
275
- .filter = test_filter,
276
- });
277
- tests.setMainPkgPath("./");
278
- tests.addOptions("build_options", options);
279
- tests.single_threaded = true;
280
- maybeStrip(b, tests, &tests.step, config.strip, config.cmd);
281
- if (config.pic) tests.force_pic = config.pic;
282
- if (coverage) |c| {
283
- tests.setExecCmd(&.{ "kcov", "--include-pattern=src/lib", c, null });
284
- }
285
- self.step.dependOn(&b.addRunArtifact(tests).step);
289
+ self.* = .{ .step = step, .build = test_filter == null };
290
+
291
+ const tests = b.addTest(.{
292
+ .root_source_file = b.path("src/lib/test.zig"),
293
+ .optimize = config.optimize,
294
+ .target = config.target,
295
+ .filter = test_filter,
296
+ .single_threaded = true,
297
+ .strip = config.strip,
298
+ .pic = config.pic,
299
+ });
300
+ tests.root_module.addOptions("build_options", options);
301
+ maybeStrip(b, tests, &tests.step, config.strip, config.cmd);
302
+ if (coverage) |c| {
303
+ tests.setExecCmd(&.{ "kcov", "--include-pattern=src/lib", c, null });
286
304
  }
305
+ self.step.dependOn(&b.addRunArtifact(tests).step);
306
+
287
307
  return self;
288
308
  }
289
309
  };
290
310
 
291
311
  const ToolConfig = struct {
312
+ showdown: ?bool,
313
+ module: *std.Build.Module,
292
314
  general: Config,
293
315
  tool: struct {
294
- showdown: bool,
295
- log: bool,
296
316
  tests: ?*TestStep,
297
317
  name: ?[]const u8 = null,
298
- exes: *std.ArrayList(*std.Build.CompileStep),
318
+ exes: *std.ArrayList(*std.Build.Step.Compile),
299
319
  },
300
320
  };
301
321
 
302
- fn tool(b: *std.Build, path: []const u8, config: ToolConfig) *std.Build.RunStep {
322
+ fn tool(b: *std.Build, path: []const u8, config: ToolConfig) !?*std.Build.Step.Run {
323
+ std.fs.cwd().access(path, .{}) catch |err| switch (err) {
324
+ error.FileNotFound => return null,
325
+ else => |e| return e,
326
+ };
303
327
  var name = config.tool.name orelse std.fs.path.basename(path);
304
328
  const index = std.mem.lastIndexOfScalar(u8, name, '.');
305
329
  if (index) |i| name = name[0..i];
306
- if (config.tool.showdown) name = b.fmt("{s}-showdown", .{name});
330
+ if (config.showdown orelse false) name = b.fmt("{s}-showdown", .{name});
307
331
 
308
332
  const exe = b.addExecutable(.{
309
333
  .name = name,
310
- .root_source_file = .{ .path = path },
334
+ .root_source_file = b.path(path),
311
335
  .target = config.general.target,
312
336
  .optimize = config.general.optimize,
337
+ .single_threaded = true,
338
+ .strip = config.general.strip,
339
+ .pic = config.general.pic,
313
340
  });
314
- exe.addModule("pkmn", module(b, .{
315
- .showdown = config.tool.showdown,
316
- .log = config.tool.log,
317
- }));
318
- exe.single_threaded = true;
319
- if (config.general.pic) exe.force_pic = config.general.pic;
341
+ exe.root_module.addImport("pkmn", config.module);
342
+
320
343
  if (config.tool.tests) |ts| ts.step.dependOn(&exe.step);
321
344
  config.tool.exes.append(exe) catch @panic("OOM");
322
345
 
@@ -330,11 +353,11 @@ fn tool(b: *std.Build, path: []const u8, config: ToolConfig) *std.Build.RunStep
330
353
  const ToolsStep = struct {
331
354
  step: std.Build.Step,
332
355
 
333
- pub fn create(b: *std.Build, exes: *std.ArrayList(*std.Build.CompileStep)) *ToolsStep {
356
+ pub fn create(b: *std.Build, exes: *std.ArrayList(*std.Build.Step.Compile)) *ToolsStep {
334
357
  const self = b.allocator.create(ToolsStep) catch @panic("OOM");
335
358
  const step = std.Build.Step.init(.{ .id = .custom, .name = "Install tools", .owner = b });
336
- self.* = ToolsStep{ .step = step };
337
- for (exes.items) |t| self.step.dependOn(&b.addInstallArtifact(t).step);
359
+ self.* = .{ .step = step };
360
+ for (exes.items) |t| self.step.dependOn(&b.addInstallArtifact(t, .{}).step);
338
361
  return self;
339
362
  }
340
363
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pkmn/engine",
3
- "version": "0.1.0-dev.44a51703",
3
+ "version": "0.1.0-dev.44c4a618",
4
4
  "description": "A minimal, complete, Pokémon battle simulation engine optimized for performance",
5
5
  "repository": "github:pkmn/engine",
6
6
  "license": "MIT",
@@ -31,28 +31,37 @@
31
31
  "build/test/display.js",
32
32
  "build/tools/debug.js.map",
33
33
  "build/tools/debug.js",
34
- "src/bin/install-pkmn-engine",
35
- "src/lib/binding/node.zig",
36
- "src/lib/binding/wasm.zig",
34
+ "src/lib/common/battle.zig",
37
35
  "src/lib/common/data.zig",
38
36
  "src/lib/common/debug.zig",
37
+ "src/lib/common/js.zig",
38
+ "src/lib/common/optional.zig",
39
39
  "src/lib/common/options.zig",
40
40
  "src/lib/common/protocol.zig",
41
+ "src/lib/common/rational.zig",
41
42
  "src/lib/common/rng.zig",
43
+ "src/lib/common/util.zig",
44
+ "src/lib/gen1/calc.zig",
45
+ "src/lib/gen1/chance.zig",
42
46
  "src/lib/gen1/data.zig",
43
47
  "src/lib/gen1/data/moves.zig",
44
48
  "src/lib/gen1/data/species.zig",
45
49
  "src/lib/gen1/data/types.zig",
46
50
  "src/lib/gen1/helpers.zig",
47
51
  "src/lib/gen1/mechanics.zig",
52
+ "src/lib/gen2/calc.zig",
53
+ "src/lib/gen2/chance.zig",
48
54
  "src/lib/gen2/data.zig",
49
55
  "src/lib/gen2/data/items.zig",
50
56
  "src/lib/gen2/data/moves.zig",
51
57
  "src/lib/gen2/data/species.zig",
52
58
  "src/lib/gen2/data/types.zig",
59
+ "src/lib/gen2/generated.zig",
53
60
  "src/lib/gen2/helpers.zig",
54
61
  "src/lib/gen2/mechanics.zig",
62
+ "src/lib/node.zig",
55
63
  "src/lib/pkmn.zig",
64
+ "src/lib/wasm.zig",
56
65
  "src/test/display/pkmn.html.tmpl"
57
66
  ],
58
67
  "engines": {
@@ -66,30 +75,31 @@
66
75
  "access": "public"
67
76
  },
68
77
  "dependencies": {
69
- "@pkmn/data": "^0.7.44",
70
- "@pkmn/protocol": "^0.6.12"
78
+ "@pkmn/data": "^0.9.11",
79
+ "@pkmn/protocol": "^0.6.25"
71
80
  },
72
81
  "devDependencies": {
73
- "@pkmn/eslint-config": "^3.2.0",
74
- "@pkmn/img": "^0.2.12",
75
- "@pkmn/sets": "^5.0.4",
76
- "@pkmn/sim": "0.7.44",
77
- "@types/html-minifier": "^4.0.2",
78
- "@types/jest": "^29.5.2",
79
- "@types/minimist": "^1.2.2",
80
- "@types/mustache": "^4.2.2",
81
- "@types/node": "^20.3.1",
82
- "@vitest/coverage-c8": "^0.32.2",
83
- "binaryen": "^113.0.0",
84
- "eslint": "^8.43.0",
82
+ "@pkmn/eslint-config": "^8.1.0",
83
+ "@pkmn/img": "^0.2.31",
84
+ "@pkmn/sets": "^5.1.2",
85
+ "@pkmn/sim": "0.9.11",
86
+ "@types/html-minifier": "^4.0.5",
87
+ "@types/jest": "^29.5.12",
88
+ "@types/minimist": "^1.2.5",
89
+ "@types/mustache": "^4.2.5",
90
+ "@types/node": "^22.0.2",
91
+ "@vitest/coverage-v8": "^2.0.5",
92
+ "binaryen": "^118.0.0",
93
+ "eslint": "<=8",
85
94
  "html-minifier": "^4.0.0",
86
- "json-stringify-pretty-compact": "3.0.0",
95
+ "json-stringify-pretty-compact": "4.0.0",
87
96
  "minimist": "^1.2.8",
88
97
  "mustache": "^4.2.0",
89
98
  "source-map-support": "^0.5.21",
99
+ "table": "^6.8.2",
90
100
  "trakr": "^0.2.0",
91
- "typescript": "^5.1.3",
92
- "vitest": "^0.32.2"
101
+ "typescript": "^5.5.4",
102
+ "vitest": "^2.0.5"
93
103
  },
94
104
  "scripts": {
95
105
  "lint": "eslint --cache src --ext ts,js && eslint src/bin/*",
@@ -111,7 +121,7 @@
111
121
  "ignorePatterns": [
112
122
  "dist/",
113
123
  "node_modules/",
114
- "src/examples/zig",
124
+ "examples/zig",
115
125
  "build/"
116
126
  ],
117
127
  "env": {
@@ -127,10 +137,18 @@
127
137
  "parserOptions": {
128
138
  "project": [
129
139
  "./tsconfig.json",
130
- "./src/examples/js/tsconfig.json"
140
+ "./examples/js/tsconfig.json"
131
141
  ]
132
142
  }
133
143
  },
144
+ {
145
+ "files": [
146
+ "src/test/display.ts"
147
+ ],
148
+ "rules": {
149
+ "@typescript-eslint/no-unnecessary-type-assertion": "off"
150
+ }
151
+ },
134
152
  {
135
153
  "files": [
136
154
  "src/pkg/index.ts",
@@ -140,7 +158,8 @@
140
158
  "rules": {
141
159
  "no-control-regex": "off",
142
160
  "@typescript-eslint/no-empty-interface": "off",
143
- "@typescript-eslint/no-shadow": "off"
161
+ "@typescript-eslint/no-shadow": "off",
162
+ "@typescript-eslint/no-unsafe-declaration-merging": "off"
144
163
  }
145
164
  },
146
165
  {
@@ -156,7 +175,17 @@
156
175
  "src/test/benchmark*.ts"
157
176
  ],
158
177
  "rules": {
159
- "@typescript-eslint/no-unused-vars": "off"
178
+ "@typescript-eslint/no-unused-vars": "off",
179
+ "@typescript-eslint/no-redundant-type-constituents": "off"
180
+ }
181
+ },
182
+ {
183
+ "files": [
184
+ "src/pkg/protocol.test.ts"
185
+ ],
186
+ "rules": {
187
+ "jest/no-standalone-expect": "off",
188
+ "jest/no-conditional-expect": "off"
160
189
  }
161
190
  },
162
191
  {