@pkmn/engine 0.1.0-dev.cbdbb719 → 0.1.0-dev.cdc837af

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 (67) hide show
  1. package/build/pkg/addon/browser.d.ts +3 -0
  2. package/build/pkg/addon/browser.js +44 -0
  3. package/build/pkg/addon/browser.js.map +1 -0
  4. package/build/pkg/addon/node.d.ts +3 -0
  5. package/build/pkg/addon/node.js +97 -0
  6. package/build/pkg/addon/node.js.map +1 -0
  7. package/build/pkg/addon/wasm.d.ts +2 -0
  8. package/build/pkg/addon/wasm.js +21 -0
  9. package/build/pkg/addon/wasm.js.map +1 -0
  10. package/build/pkg/addon.d.ts +22 -0
  11. package/build/pkg/addon.js +29 -51
  12. package/build/pkg/addon.js.map +1 -1
  13. package/build/pkg/data.d.ts +23 -1
  14. package/build/pkg/data.js.map +1 -1
  15. package/build/pkg/gen1.js +1 -1
  16. package/build/pkg/gen1.js.map +1 -1
  17. package/build/pkg/index.d.ts +21 -8
  18. package/build/pkg/index.js +15 -10
  19. package/build/pkg/index.js.map +1 -1
  20. package/build/pkg/protocol.d.ts +20 -1
  21. package/build/pkg/protocol.js +105 -103
  22. package/build/pkg/protocol.js.map +1 -1
  23. package/build/tools/debug.js +35 -68
  24. package/build/tools/debug.js.map +1 -1
  25. package/build/tools/display/debug.jsx +141 -0
  26. package/build/tools/display/debug.jsx.map +1 -0
  27. package/build/tools/display/index.js +141 -0
  28. package/build/tools/display/index.js.map +1 -0
  29. package/build/tools/display/ui.jsx +349 -0
  30. package/build/tools/display/ui.jsx.map +1 -0
  31. package/build/tools/display/util.js +18 -0
  32. package/build/tools/display/util.js.map +1 -0
  33. package/build.zig +89 -70
  34. package/package.json +49 -32
  35. package/src/bin/install-pkmn-engine +4 -2
  36. package/src/bin/pkmn-debug +1 -1
  37. package/src/lib/common/debug.zig +39 -8
  38. package/src/lib/common/options.zig +2 -0
  39. package/src/lib/common/protocol.zig +4 -8
  40. package/src/lib/common/rational.zig +7 -5
  41. package/src/lib/common/rng.zig +1 -3
  42. package/src/lib/gen1/calc.zig +200 -53
  43. package/src/lib/gen1/chance.zig +40 -22
  44. package/src/lib/gen1/data/moves.zig +2 -4
  45. package/src/lib/gen1/data/species.zig +1 -3
  46. package/src/lib/gen1/data/types.zig +1 -2
  47. package/src/lib/gen1/data.zig +9 -13
  48. package/src/lib/gen1/helpers.zig +5 -21
  49. package/src/lib/gen1/mechanics.zig +55 -61
  50. package/src/lib/gen2/calc.zig +10 -18
  51. package/src/lib/gen2/chance.zig +8 -13
  52. package/src/lib/gen2/data/items.zig +1 -3
  53. package/src/lib/gen2/data/moves.zig +2 -4
  54. package/src/lib/gen2/data/species.zig +1 -3
  55. package/src/lib/gen2/data/types.zig +1 -2
  56. package/src/lib/gen2/data.zig +11 -15
  57. package/src/lib/gen2/generated.zig +18 -23
  58. package/src/lib/gen2/helpers.zig +5 -16
  59. package/src/lib/gen2/mechanics.zig +22 -36
  60. package/src/lib/node.zig +2 -4
  61. package/src/lib/pkmn.zig +4 -0
  62. package/src/lib/wasm.zig +1 -2
  63. package/src/tools/display/dom.ts +96 -0
  64. package/src/tools/display/ui.css +354 -0
  65. package/build/test/display.js +0 -405
  66. package/build/test/display.js.map +0 -1
  67. package/src/test/display/pkmn.html.tmpl +0 -368
package/package.json CHANGED
@@ -1,19 +1,31 @@
1
1
  {
2
2
  "name": "@pkmn/engine",
3
- "version": "0.1.0-dev.cbdbb719",
3
+ "version": "0.1.0-dev.cdc837af",
4
4
  "description": "A minimal, complete, Pokémon battle simulation engine optimized for performance",
5
5
  "repository": "github:pkmn/engine",
6
6
  "license": "MIT",
7
7
  "sideEffects": false,
8
8
  "main": "build/pkg/index.js",
9
9
  "types": "build/pkg/index.d.ts",
10
+ "browser": {
11
+ "./build/pkg/addon/node.js": "./build/pkg/addon/browser.js"
12
+ },
10
13
  "files": [
11
14
  "build.zig",
12
- "build/pkg/data.d.ts",
13
- "build/pkg/data.js.map",
14
15
  "build/pkg/addon.d.ts",
15
16
  "build/pkg/addon.js.map",
16
17
  "build/pkg/addon.js",
18
+ "build/pkg/addon/browser.d.ts",
19
+ "build/pkg/addon/browser.js.map",
20
+ "build/pkg/addon/browser.js",
21
+ "build/pkg/addon/node.d.ts",
22
+ "build/pkg/addon/node.js.map",
23
+ "build/pkg/addon/node.js",
24
+ "build/pkg/addon/wasm.d.ts",
25
+ "build/pkg/addon/wasm.js.map",
26
+ "build/pkg/addon/wasm.js",
27
+ "build/pkg/data.d.ts",
28
+ "build/pkg/data.js.map",
17
29
  "build/pkg/data.js",
18
30
  "build/pkg/data/ids.json",
19
31
  "build/pkg/data/layout.json",
@@ -27,15 +39,21 @@
27
39
  "build/pkg/protocol.d.ts",
28
40
  "build/pkg/protocol.js.map",
29
41
  "build/pkg/protocol.js",
30
- "build/test/display.js.map",
31
- "build/test/display.js",
32
42
  "build/tools/debug.js.map",
33
43
  "build/tools/debug.js",
44
+ "build/tools/display/index.js.map",
45
+ "build/tools/display/index.js",
46
+ "build/tools/display/debug.jsx.map",
47
+ "build/tools/display/debug.jsx",
48
+ "build/tools/display/ui.jsx.map",
49
+ "build/tools/display/ui.jsx",
50
+ "build/tools/display/util.js.map",
51
+ "build/tools/display/util.js",
52
+ "src/lib/common/array.zig",
34
53
  "src/lib/common/battle.zig",
35
54
  "src/lib/common/data.zig",
36
55
  "src/lib/common/debug.zig",
37
56
  "src/lib/common/js.zig",
38
- "src/lib/common/array.zig",
39
57
  "src/lib/common/optional.zig",
40
58
  "src/lib/common/options.zig",
41
59
  "src/lib/common/protocol.zig",
@@ -63,7 +81,8 @@
63
81
  "src/lib/node.zig",
64
82
  "src/lib/pkmn.zig",
65
83
  "src/lib/wasm.zig",
66
- "src/test/display/pkmn.html.tmpl"
84
+ "src/tools/display/dom.ts",
85
+ "src/tools/display/ui.css"
67
86
  ],
68
87
  "engines": {
69
88
  "node": ">=16.0.0"
@@ -76,33 +95,38 @@
76
95
  "access": "public"
77
96
  },
78
97
  "dependencies": {
79
- "@pkmn/data": "^0.9.11",
80
- "@pkmn/protocol": "^0.6.25"
98
+ "@pkmn/data": "^0.9.17",
99
+ "@pkmn/protocol": "^0.6.26"
81
100
  },
82
101
  "devDependencies": {
83
- "@pkmn/eslint-config": "^8.1.0",
84
- "@pkmn/img": "^0.2.31",
102
+ "@pkmn/eslint-config": "^8.3.0",
103
+ "@pkmn/img": "^0.2.32",
85
104
  "@pkmn/sets": "^5.1.2",
86
- "@pkmn/sim": "0.9.11",
105
+ "@pkmn/sim": "0.9.17",
106
+ "@pkmn/smogon": "^0.5.13",
87
107
  "@types/html-minifier": "^4.0.5",
88
- "@types/jest": "^29.5.12",
108
+ "@types/jest": "^29.5.13",
89
109
  "@types/minimist": "^1.2.5",
90
110
  "@types/mustache": "^4.2.5",
91
- "@types/node": "^22.0.2",
111
+ "@types/node": "^22.5.5",
112
+ "@types/react": "^18.3.8",
92
113
  "@types/semver": "^7.5.8",
93
- "@vitest/coverage-v8": "^2.0.5",
94
- "binaryen": "^118.0.0",
114
+ "@types/vscode": "^1.93.0",
115
+ "@vitest/coverage-v8": "^2.1.1",
116
+ "@vscode/vsce": "^3.1.0",
117
+ "binaryen": "^119.0.0",
118
+ "esbuild": "^0.23.1",
95
119
  "eslint": "<=8",
96
120
  "html-minifier": "^4.0.0",
97
- "json-stringify-pretty-compact": "4.0.0",
121
+ "json-stringify-pretty-compact": "3.0.0",
98
122
  "minimist": "^1.2.8",
99
123
  "mustache": "^4.2.0",
100
124
  "semver": "^7.6.3",
101
125
  "source-map-support": "^0.5.21",
102
126
  "table": "^6.8.2",
103
127
  "trakr": "^0.2.0",
104
- "typescript": "^5.5.4",
105
- "vitest": "^2.0.5"
128
+ "typescript": "^5.6.2",
129
+ "vitest": "^2.1.1"
106
130
  },
107
131
  "scripts": {
108
132
  "lint": "eslint --cache src --ext ts,js && eslint src/bin/*",
@@ -112,11 +136,13 @@
112
136
  "test": "vitest src/pkg",
113
137
  "test:integration": "vitest src/test",
114
138
  "debug": "npm run compile && node build/tools/debug",
139
+ "demo": "npm run compile && node build/tools/demo",
115
140
  "fuzz": "npm run compile && node build/test/fuzz",
116
141
  "generate": "npm run compile && node build/tools/generate",
117
142
  "release": "npm run compile && node build/tools/release",
118
143
  "benchmark": "npm run compile && node build/test/benchmark",
119
144
  "integration": "npm run compile && node build/test/integration",
145
+ "extension": "npm -C src/tools/vscode run build",
120
146
  "postinstall": "node src/bin/install-pkmn-engine"
121
147
  },
122
148
  "eslintConfig": {
@@ -125,7 +151,8 @@
125
151
  "dist/",
126
152
  "node_modules/",
127
153
  "examples/zig",
128
- "build/"
154
+ "build/",
155
+ "extension.js"
129
156
  ],
130
157
  "env": {
131
158
  "es6": true,
@@ -144,18 +171,9 @@
144
171
  ]
145
172
  }
146
173
  },
147
- {
148
- "files": [
149
- "src/test/display.ts"
150
- ],
151
- "rules": {
152
- "@typescript-eslint/no-unnecessary-type-assertion": "off"
153
- }
154
- },
155
174
  {
156
175
  "files": [
157
176
  "src/pkg/index.ts",
158
- "src/test/display.ts",
159
177
  "src/test/integration.ts"
160
178
  ],
161
179
  "rules": {
@@ -167,7 +185,7 @@
167
185
  },
168
186
  {
169
187
  "files": [
170
- "src/pkg/addon.ts"
188
+ "src/pkg/addon/node.ts"
171
189
  ],
172
190
  "rules": {
173
191
  "@typescript-eslint/no-var-requires": "off"
@@ -193,8 +211,7 @@
193
211
  },
194
212
  {
195
213
  "files": [
196
- "src/test/*.test.ts",
197
- "src/test/regression/*.test.ts"
214
+ "src/test/*.test.ts"
198
215
  ],
199
216
  "rules": {
200
217
  "jest/no-standalone-expect": "off"
@@ -163,8 +163,10 @@ const install = async () => {
163
163
  }
164
164
 
165
165
  const index = JSON.parse(await fetch(INDEX));
166
- const version = Object.keys(index)[+!ZIG_VERSION.dev];
167
- const release = index[version][`${arch}-${platform}`];
166
+ // TODO: ziglang/zig#17768
167
+ // const version = Object.keys(index)[+!ZIG_VERSION.dev];
168
+ const version = VERSION;
169
+ const release = index[VERSION][`${arch}-${platform}`];
168
170
  const url = release.tarball;
169
171
 
170
172
  let base = path.basename(url);
@@ -15,7 +15,7 @@ const ROOT = resolve(__dirname, '..', '..');
15
15
  const packageJSON = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8'));
16
16
 
17
17
  const missing = [];
18
- for (const dep of ['@pkmn/img', 'html-minifier', 'mustache']) {
18
+ for (const dep of ['@pkmn/img', 'html-minifier', 'esbuild']) {
19
19
  try {
20
20
  require.resolve(dep);
21
21
  } catch (e) {
@@ -3,9 +3,19 @@ const std = @import("std");
3
3
  const debug = std.debug;
4
4
  const io = std.io;
5
5
 
6
+ const Array = if (@hasField(std.builtin.Type, "array")) .array else .Array;
7
+ const Enum = if (@hasField(std.builtin.Type, "enum")) .@"enum" else .Enum;
8
+ const Optional = if (@hasField(std.builtin.Type, "optional")) .optional else .Optional;
9
+ const Pointer = if (@hasField(std.builtin.Type, "pointer")) .pointer else .Pointer;
10
+ const Struct = if (@hasField(std.builtin.Type, "struct")) .@"struct" else .Struct;
11
+ const Union = if (@hasField(std.builtin.Type, "union")) .@"union" else .Union;
12
+
6
13
  pub fn print(value: anytype) void {
7
- debug.lockStdErr();
8
- defer debug.unlockStdErr();
14
+ if (@hasDecl(debug, "lockStdErr")) debug.lockStdErr() else debug.getStderrMutex().lock();
15
+ defer if (@hasDecl(debug, "unlockStdErr"))
16
+ debug.unlockStdErr()
17
+ else
18
+ debug.getStderrMutex().unlock();
9
19
  const stderr = io.getStdErr().writer();
10
20
 
11
21
  nosuspend {
@@ -19,7 +29,7 @@ pub fn print(value: anytype) void {
19
29
  }) catch return;
20
30
  } else {
21
31
  switch (@typeInfo(@TypeOf(value))) {
22
- .Struct => |info| {
32
+ Struct => |info| {
23
33
  if (info.is_tuple) {
24
34
  inline for (info.fields, 0..) |f, i| {
25
35
  inspect(@field(value, f.name));
@@ -42,17 +52,17 @@ fn inspect(value: anytype) void {
42
52
  nosuspend {
43
53
  const err = "Unable to format type '" ++ @typeName(@TypeOf(value)) ++ "'";
44
54
  switch (@typeInfo(@TypeOf(value))) {
45
- .Array => |info| {
55
+ Array => |info| {
46
56
  if (info.child == u8) return stderr.print("{s}", .{value}) catch return;
47
57
  @compileError(err);
48
58
  },
49
- .Pointer => |ptr_info| switch (ptr_info.size) {
59
+ Pointer => |ptr_info| switch (ptr_info.size) {
50
60
  .One => switch (@typeInfo(ptr_info.child)) {
51
- .Array => |info| {
61
+ Array => |info| {
52
62
  if (info.child == u8) return stderr.print("{s}", .{value}) catch return;
53
63
  @compileError(err);
54
64
  },
55
- .Enum, .Union, .Struct => return inspect(value.*),
65
+ Enum, Union, Struct => return inspect(value.*),
56
66
  else => @compileError(err),
57
67
  },
58
68
  .Many, .C => {
@@ -67,8 +77,29 @@ fn inspect(value: anytype) void {
67
77
  @compileError(err);
68
78
  },
69
79
  },
70
- .Optional => stderr.print("{?}", .{value}) catch return,
80
+ Optional => stderr.print("{?}", .{value}) catch return,
71
81
  else => stderr.print("{}", .{value}) catch return,
72
82
  }
73
83
  }
74
84
  }
85
+
86
+ const showdown = @import("./options.zig").showdown;
87
+ const Result = @import("./data.zig").Result;
88
+ const Choice = @import("./data.zig").Choice;
89
+
90
+ pub fn dump(gen: u8, battle: anytype, frame: ?struct { Result, Choice, Choice }) void {
91
+ const file = std.fs.cwd().createFile("logs/dump.bin", .{}) catch return;
92
+ defer file.close();
93
+ var w = file.writer();
94
+ w.writeByte(@intFromBool(showdown)) catch return;
95
+ w.writeByte(gen) catch return;
96
+ w.writeInt(i16, 0, .little) catch return;
97
+ w.writeInt(i32, 0, .little) catch return;
98
+ w.writeStruct(battle) catch return;
99
+ w.writeStruct(battle) catch return;
100
+ if (frame) |f| {
101
+ w.writeStruct(f[0]) catch return;
102
+ w.writeStruct(f[1]) catch return;
103
+ w.writeStruct(f[2]) catch return;
104
+ }
105
+ }
@@ -11,6 +11,7 @@ pub const Options = struct {
11
11
  ebc: ?bool = null,
12
12
  key: ?bool = null,
13
13
  miss: ?bool = null,
14
+ overwrite: ?bool = null,
14
15
  internal: ?bool = null,
15
16
  };
16
17
 
@@ -27,6 +28,7 @@ pub const advance = get("advance", true);
27
28
  pub const ebc = get("ebc", true);
28
29
  pub const key = get("key", false);
29
30
  pub const miss = get("miss", true);
31
+ pub const overwrite = get("overwrite", true);
30
32
  pub const internal = get("internal", false);
31
33
 
32
34
  fn get(comptime name: []const u8, default: bool) bool {
@@ -1,18 +1,14 @@
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();
18
14
  const Endian = std.builtin.Endian;
@@ -15,7 +15,9 @@ const ComptimeFloat =
15
15
 
16
16
  /// Specialization of a rational number used by the engine to compute probabilties.
17
17
  /// For performance reasons the rational is only reduced lazily and thus `reduce` must be
18
- /// invoked explicitly before reading.
18
+ /// invoked explicitly before reading. Note that this laziness means that this implementation
19
+ /// sometimes overflows in places where an eager reduced implementation would not - to achieve
20
+ /// the same behavior as an eager implementation simply call `reduce` after each operation.
19
21
  pub fn Rational(comptime T: type) type {
20
22
  return extern struct {
21
23
  const Self = @This();
@@ -25,10 +27,10 @@ pub fn Rational(comptime T: type) type {
25
27
  /// Denominator. Must always be >= 1. Not guaranteed to be reduced in all cases.
26
28
  q: T = 1,
27
29
 
28
- // With floats we can't rely on an overflow bit to let us know when to reduce, so we instead
29
- // start reducing when we get sufficiently close to the limit of the mantissa (in our domain
30
- // we expect updates to involve numbers < 2**10, so we should be safe not reducing before we
31
- // are 2**10 away from "overflowing" the mantissa)
30
+ // With floats we can't rely on an overflow bit to let us know when to reduce, so we
31
+ // instead start reducing when we get sufficiently close to the limit of the mantissa
32
+ // (in our domain we expect updates to involve numbers < 2**10, so we should be safe
33
+ // not reducing before we are 2**10 away from "overflowing" the mantissa)
32
34
  const REDUCE = if (@typeInfo(T) == Float)
33
35
  std.math.pow(T, 2, std.math.floatMantissaBits(T) - 10)
34
36
  else
@@ -1,10 +1,8 @@
1
- const std = @import("std");
2
-
3
1
  const options = @import("options.zig");
2
+ const std = @import("std");
4
3
 
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 {