@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.
- package/build/pkg/addon/browser.d.ts +3 -0
- package/build/pkg/addon/browser.js +44 -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 +97 -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 +21 -0
- package/build/pkg/addon/wasm.js.map +1 -0
- package/build/pkg/addon.d.ts +22 -0
- package/build/pkg/addon.js +29 -51
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data.d.ts +23 -1
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.js +1 -1
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +21 -8
- package/build/pkg/index.js +15 -10
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +20 -1
- package/build/pkg/protocol.js +105 -103
- package/build/pkg/protocol.js.map +1 -1
- package/build/tools/debug.js +35 -68
- package/build/tools/debug.js.map +1 -1
- package/build/tools/display/debug.jsx +141 -0
- package/build/tools/display/debug.jsx.map +1 -0
- package/build/tools/display/index.js +141 -0
- package/build/tools/display/index.js.map +1 -0
- package/build/tools/display/ui.jsx +349 -0
- package/build/tools/display/ui.jsx.map +1 -0
- package/build/tools/display/util.js +18 -0
- package/build/tools/display/util.js.map +1 -0
- package/build.zig +89 -70
- package/package.json +49 -32
- package/src/bin/install-pkmn-engine +4 -2
- package/src/bin/pkmn-debug +1 -1
- package/src/lib/common/debug.zig +39 -8
- package/src/lib/common/options.zig +2 -0
- package/src/lib/common/protocol.zig +4 -8
- package/src/lib/common/rational.zig +7 -5
- package/src/lib/common/rng.zig +1 -3
- package/src/lib/gen1/calc.zig +200 -53
- package/src/lib/gen1/chance.zig +40 -22
- 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 +1 -2
- package/src/lib/gen1/data.zig +9 -13
- package/src/lib/gen1/helpers.zig +5 -21
- package/src/lib/gen1/mechanics.zig +55 -61
- package/src/lib/gen2/calc.zig +10 -18
- package/src/lib/gen2/chance.zig +8 -13
- 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 +1 -2
- package/src/lib/gen2/data.zig +11 -15
- package/src/lib/gen2/generated.zig +18 -23
- package/src/lib/gen2/helpers.zig +5 -16
- package/src/lib/gen2/mechanics.zig +22 -36
- package/src/lib/node.zig +2 -4
- package/src/lib/pkmn.zig +4 -0
- package/src/lib/wasm.zig +1 -2
- package/src/tools/display/dom.ts +96 -0
- package/src/tools/display/ui.css +354 -0
- package/build/test/display.js +0 -405
- package/build/test/display.js.map +0 -1
- 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.
|
|
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/
|
|
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.
|
|
80
|
-
"@pkmn/protocol": "^0.6.
|
|
98
|
+
"@pkmn/data": "^0.9.17",
|
|
99
|
+
"@pkmn/protocol": "^0.6.26"
|
|
81
100
|
},
|
|
82
101
|
"devDependencies": {
|
|
83
|
-
"@pkmn/eslint-config": "^8.
|
|
84
|
-
"@pkmn/img": "^0.2.
|
|
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.
|
|
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.
|
|
108
|
+
"@types/jest": "^29.5.13",
|
|
89
109
|
"@types/minimist": "^1.2.5",
|
|
90
110
|
"@types/mustache": "^4.2.5",
|
|
91
|
-
"@types/node": "^22.
|
|
111
|
+
"@types/node": "^22.5.5",
|
|
112
|
+
"@types/react": "^18.3.8",
|
|
92
113
|
"@types/semver": "^7.5.8",
|
|
93
|
-
"@
|
|
94
|
-
"
|
|
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": "
|
|
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.
|
|
105
|
-
"vitest": "^2.
|
|
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
|
-
|
|
167
|
-
const
|
|
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);
|
package/src/bin/pkmn-debug
CHANGED
|
@@ -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', '
|
|
18
|
+
for (const dep of ['@pkmn/img', 'html-minifier', 'esbuild']) {
|
|
19
19
|
try {
|
|
20
20
|
require.resolve(dep);
|
|
21
21
|
} catch (e) {
|
package/src/lib/common/debug.zig
CHANGED
|
@@ -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
|
|
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
|
-
|
|
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
|
-
|
|
55
|
+
Array => |info| {
|
|
46
56
|
if (info.child == u8) return stderr.print("{s}", .{value}) catch return;
|
|
47
57
|
@compileError(err);
|
|
48
58
|
},
|
|
49
|
-
|
|
59
|
+
Pointer => |ptr_info| switch (ptr_info.size) {
|
|
50
60
|
.One => switch (@typeInfo(ptr_info.child)) {
|
|
51
|
-
|
|
61
|
+
Array => |info| {
|
|
52
62
|
if (info.child == u8) return stderr.print("{s}", .{value}) catch return;
|
|
53
63
|
@compileError(err);
|
|
54
64
|
},
|
|
55
|
-
|
|
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
|
-
|
|
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
|
|
29
|
-
// start reducing when we get sufficiently close to the limit of the mantissa
|
|
30
|
-
// we expect updates to involve numbers < 2**10, so we should be safe
|
|
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
|
package/src/lib/common/rng.zig
CHANGED
|
@@ -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 {
|