@pkmn/engine 0.1.0-dev.7f37a47c → 0.1.0-dev.7feed58c
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 -3
- package/README.md +145 -78
- 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 +100 -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 +29 -0
- package/build/pkg/addon.js +80 -0
- package/build/pkg/addon.js.map +1 -0
- package/build/pkg/data/ids.json +12 -12
- package/build/pkg/data/layout.json +40 -5
- package/build/pkg/data/protocol.json +84 -13
- package/build/pkg/data.d.ts +28 -7
- package/build/pkg/data.js +3 -5
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +18 -20
- package/build/pkg/gen1.js +59 -44
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +57 -103
- package/build/pkg/index.js +6 -63
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +24 -3
- package/build/pkg/protocol.js +127 -104
- package/build/pkg/protocol.js.map +1 -1
- package/build/tools/debug.js +100 -0
- package/build/tools/debug.js.map +1 -0
- package/build/tools/display/debug.jsx +141 -0
- package/build/tools/display/debug.jsx.map +1 -0
- package/build/tools/display/index.js +142 -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 +33 -0
- package/build/tools/display/util.js.map +1 -0
- package/build.zig +417 -160
- package/package.json +92 -133
- package/src/bin/install-pkmn-engine +85 -42
- package/src/bin/pkmn-debug +62 -0
- package/src/lib/bindings/c.zig +255 -0
- package/src/lib/bindings/node.zig +121 -0
- package/src/lib/bindings/wasm.zig +59 -0
- package/src/lib/common/array.zig +77 -0
- package/src/lib/common/battle.zig +17 -0
- package/src/lib/common/data.zig +19 -31
- package/src/lib/common/debug.zig +58 -17
- package/src/lib/common/js.zig +120 -0
- package/src/lib/common/optional.zig +71 -0
- package/src/lib/common/options.zig +18 -3
- package/src/lib/common/protocol.zig +947 -407
- package/src/lib/common/rational.zig +449 -0
- package/src/lib/common/rng.zig +31 -24
- package/src/lib/common/util.zig +61 -0
- package/src/lib/gen1/calc.zig +953 -0
- package/src/lib/gen1/chance.zig +1185 -0
- package/src/lib/gen1/data/moves.zig +203 -193
- package/src/lib/gen1/data/species.zig +6 -8
- package/src/lib/gen1/data/types.zig +11 -12
- package/src/lib/gen1/data.zig +101 -90
- package/src/lib/gen1/helpers.zig +139 -54
- package/src/lib/gen1/mechanics.zig +1435 -916
- package/src/lib/gen2/calc.zig +153 -0
- package/src/lib/gen2/chance.zig +902 -0
- package/src/lib/gen2/data/items.zig +15 -23
- package/src/lib/gen2/data/moves.zig +665 -573
- package/src/lib/gen2/data/species.zig +3 -5
- package/src/lib/gen2/data/types.zig +138 -36
- package/src/lib/gen2/data.zig +134 -99
- package/src/lib/gen2/generated.zig +801 -0
- package/src/lib/gen2/helpers.zig +59 -44
- package/src/lib/gen2/mechanics.zig +3582 -30
- package/src/lib/node.zig +18 -0
- package/src/lib/pkmn.zig +93 -12
- package/src/lib/wasm.zig +17 -0
- package/src/tools/display/dom.ts +96 -0
- package/src/tools/display/ui.css +354 -0
- package/src/lib/binding/node.zig +0 -229
- package/src/lib/binding/wasm.zig +0 -10
- package/src/lib/gen1/README.md +0 -777
- package/src/lib/gen2/README.md +0 -309
package/package.json
CHANGED
|
@@ -1,192 +1,151 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pkmn/engine",
|
|
3
|
-
"version": "0.1.0-dev.
|
|
3
|
+
"version": "0.1.0-dev.7feed58c",
|
|
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
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
+
"build/pkg/addon.d.ts",
|
|
16
|
+
"build/pkg/addon.js.map",
|
|
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",
|
|
29
|
+
"build/pkg/data.js",
|
|
30
|
+
"build/pkg/data/ids.json",
|
|
31
|
+
"build/pkg/data/layout.json",
|
|
32
|
+
"build/pkg/data/protocol.json",
|
|
33
|
+
"build/pkg/gen1.d.ts",
|
|
34
|
+
"build/pkg/gen1.js.map",
|
|
35
|
+
"build/pkg/gen1.js",
|
|
36
|
+
"build/pkg/index.d.ts",
|
|
37
|
+
"build/pkg/index.js.map",
|
|
38
|
+
"build/pkg/index.js",
|
|
39
|
+
"build/pkg/protocol.d.ts",
|
|
40
|
+
"build/pkg/protocol.js.map",
|
|
41
|
+
"build/pkg/protocol.js",
|
|
42
|
+
"build/tools/debug.js.map",
|
|
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/bindings/c.zig",
|
|
53
|
+
"src/lib/bindings/node.zig",
|
|
54
|
+
"src/lib/bindings/wasm.zig",
|
|
55
|
+
"src/lib/common/array.zig",
|
|
56
|
+
"src/lib/common/battle.zig",
|
|
15
57
|
"src/lib/common/data.zig",
|
|
16
58
|
"src/lib/common/debug.zig",
|
|
59
|
+
"src/lib/common/js.zig",
|
|
60
|
+
"src/lib/common/optional.zig",
|
|
17
61
|
"src/lib/common/options.zig",
|
|
18
62
|
"src/lib/common/protocol.zig",
|
|
63
|
+
"src/lib/common/rational.zig",
|
|
19
64
|
"src/lib/common/rng.zig",
|
|
65
|
+
"src/lib/common/util.zig",
|
|
66
|
+
"src/lib/gen1/calc.zig",
|
|
67
|
+
"src/lib/gen1/chance.zig",
|
|
68
|
+
"src/lib/gen1/data.zig",
|
|
20
69
|
"src/lib/gen1/data/moves.zig",
|
|
21
70
|
"src/lib/gen1/data/species.zig",
|
|
22
71
|
"src/lib/gen1/data/types.zig",
|
|
23
|
-
"src/lib/gen1/data.zig",
|
|
24
72
|
"src/lib/gen1/helpers.zig",
|
|
25
73
|
"src/lib/gen1/mechanics.zig",
|
|
74
|
+
"src/lib/gen2/calc.zig",
|
|
75
|
+
"src/lib/gen2/chance.zig",
|
|
76
|
+
"src/lib/gen2/data.zig",
|
|
26
77
|
"src/lib/gen2/data/items.zig",
|
|
27
78
|
"src/lib/gen2/data/moves.zig",
|
|
28
79
|
"src/lib/gen2/data/species.zig",
|
|
29
80
|
"src/lib/gen2/data/types.zig",
|
|
30
|
-
"src/lib/gen2/
|
|
81
|
+
"src/lib/gen2/generated.zig",
|
|
31
82
|
"src/lib/gen2/helpers.zig",
|
|
32
83
|
"src/lib/gen2/mechanics.zig",
|
|
84
|
+
"src/lib/node.zig",
|
|
33
85
|
"src/lib/pkmn.zig",
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
37
|
-
"build/pkg/data.d.ts",
|
|
38
|
-
"build/pkg/data.js",
|
|
39
|
-
"build/pkg/data.js.map",
|
|
40
|
-
"build/pkg/gen1.d.ts",
|
|
41
|
-
"build/pkg/gen1.js",
|
|
42
|
-
"build/pkg/gen1.js.map",
|
|
43
|
-
"build/pkg/index.d.ts",
|
|
44
|
-
"build/pkg/index.js",
|
|
45
|
-
"build/pkg/index.js.map",
|
|
46
|
-
"build/pkg/protocol.d.ts",
|
|
47
|
-
"build/pkg/protocol.js",
|
|
48
|
-
"build/pkg/protocol.js.map"
|
|
86
|
+
"src/lib/wasm.zig",
|
|
87
|
+
"src/tools/display/dom.ts",
|
|
88
|
+
"src/tools/display/ui.css"
|
|
49
89
|
],
|
|
50
90
|
"engines": {
|
|
51
91
|
"node": ">=16.0.0"
|
|
52
92
|
},
|
|
53
93
|
"bin": {
|
|
54
|
-
"install-pkmn-engine": "src/bin/install-pkmn-engine"
|
|
94
|
+
"install-pkmn-engine": "src/bin/install-pkmn-engine",
|
|
95
|
+
"pkmn-debug": "src/bin/pkmn-debug"
|
|
55
96
|
},
|
|
56
97
|
"publishConfig": {
|
|
57
98
|
"access": "public"
|
|
58
99
|
},
|
|
59
100
|
"dependencies": {
|
|
60
|
-
"@pkmn/data": "^0.
|
|
61
|
-
"@pkmn/protocol": "^0.6.
|
|
101
|
+
"@pkmn/data": "^0.9.22",
|
|
102
|
+
"@pkmn/protocol": "^0.6.28"
|
|
62
103
|
},
|
|
63
104
|
"devDependencies": {
|
|
64
|
-
"@pkmn/eslint-config": "^
|
|
65
|
-
"@pkmn/img": "^0.2.
|
|
66
|
-
"@pkmn/sets": "^5.
|
|
67
|
-
"@pkmn/sim": "0.
|
|
68
|
-
"@
|
|
69
|
-
"@types/
|
|
70
|
-
"@types/
|
|
71
|
-
"@types/
|
|
72
|
-
"@types/
|
|
73
|
-
"@
|
|
74
|
-
"
|
|
75
|
-
"
|
|
105
|
+
"@pkmn/eslint-config": "^9.1.0",
|
|
106
|
+
"@pkmn/img": "^0.2.33",
|
|
107
|
+
"@pkmn/sets": "^5.1.2",
|
|
108
|
+
"@pkmn/sim": "0.9.22",
|
|
109
|
+
"@pkmn/smogon": "^0.5.15",
|
|
110
|
+
"@types/html-minifier": "^4.0.5",
|
|
111
|
+
"@types/jest": "^29.5.14",
|
|
112
|
+
"@types/minimist": "^1.2.5",
|
|
113
|
+
"@types/mustache": "^4.2.5",
|
|
114
|
+
"@types/node": "^22.8.7",
|
|
115
|
+
"@types/react": "^18.3.12",
|
|
116
|
+
"@types/semver": "^7.5.8",
|
|
117
|
+
"@types/vscode": "^1.95.0",
|
|
118
|
+
"@vitest/coverage-v8": "^2.1.4",
|
|
119
|
+
"@vscode/vsce": "^3.2.1",
|
|
120
|
+
"binaryen": "^120.0.0",
|
|
121
|
+
"esbuild": "^0.24.0",
|
|
122
|
+
"eslint": "^9.14.0",
|
|
76
123
|
"html-minifier": "^4.0.0",
|
|
77
124
|
"json-stringify-pretty-compact": "3.0.0",
|
|
78
125
|
"minimist": "^1.2.8",
|
|
79
126
|
"mustache": "^4.2.0",
|
|
127
|
+
"semver": "^7.6.3",
|
|
80
128
|
"source-map-support": "^0.5.21",
|
|
129
|
+
"table": "^6.8.2",
|
|
81
130
|
"trakr": "^0.2.0",
|
|
82
|
-
"typescript": "^5.
|
|
83
|
-
"vitest": "^
|
|
131
|
+
"typescript": "^5.6.3",
|
|
132
|
+
"vitest": "^2.1.4"
|
|
84
133
|
},
|
|
85
134
|
"scripts": {
|
|
86
|
-
"lint": "eslint --cache src
|
|
87
|
-
"fix": "eslint --fix src
|
|
135
|
+
"lint": "eslint --cache src",
|
|
136
|
+
"fix": "eslint --fix src",
|
|
88
137
|
"compile": "tsc -p .",
|
|
89
138
|
"build": "npm run compile",
|
|
90
139
|
"test": "vitest src/pkg",
|
|
91
140
|
"test:integration": "vitest src/test",
|
|
141
|
+
"debug": "npm run compile && node build/tools/debug",
|
|
142
|
+
"demo": "npm run compile && node build/tools/demo",
|
|
92
143
|
"fuzz": "npm run compile && node build/test/fuzz",
|
|
93
144
|
"generate": "npm run compile && node build/tools/generate",
|
|
94
145
|
"release": "npm run compile && node build/tools/release",
|
|
95
146
|
"benchmark": "npm run compile && node build/test/benchmark",
|
|
96
147
|
"integration": "npm run compile && node build/test/integration",
|
|
148
|
+
"extension": "npm -C src/tools/vscode run build",
|
|
97
149
|
"postinstall": "node src/bin/install-pkmn-engine"
|
|
98
|
-
},
|
|
99
|
-
"eslintConfig": {
|
|
100
|
-
"extends": "@pkmn",
|
|
101
|
-
"ignorePatterns": [
|
|
102
|
-
"dist/",
|
|
103
|
-
"node_modules/",
|
|
104
|
-
"src/examples/zig",
|
|
105
|
-
"build/"
|
|
106
|
-
],
|
|
107
|
-
"env": {
|
|
108
|
-
"es6": true,
|
|
109
|
-
"node": true,
|
|
110
|
-
"browser": true
|
|
111
|
-
},
|
|
112
|
-
"overrides": [
|
|
113
|
-
{
|
|
114
|
-
"files": [
|
|
115
|
-
"**/*.ts"
|
|
116
|
-
],
|
|
117
|
-
"parserOptions": {
|
|
118
|
-
"project": [
|
|
119
|
-
"./tsconfig.json",
|
|
120
|
-
"./src/examples/js/tsconfig.json"
|
|
121
|
-
]
|
|
122
|
-
}
|
|
123
|
-
},
|
|
124
|
-
{
|
|
125
|
-
"files": [
|
|
126
|
-
"src/pkg/index.ts",
|
|
127
|
-
"src/test/display.ts",
|
|
128
|
-
"src/test/integration.ts"
|
|
129
|
-
],
|
|
130
|
-
"rules": {
|
|
131
|
-
"no-control-regex": "off",
|
|
132
|
-
"@typescript-eslint/no-empty-interface": "off",
|
|
133
|
-
"@typescript-eslint/no-shadow": "off"
|
|
134
|
-
}
|
|
135
|
-
},
|
|
136
|
-
{
|
|
137
|
-
"files": [
|
|
138
|
-
"src/pkg/addon.ts"
|
|
139
|
-
],
|
|
140
|
-
"rules": {
|
|
141
|
-
"@typescript-eslint/no-var-requires": "off"
|
|
142
|
-
}
|
|
143
|
-
},
|
|
144
|
-
{
|
|
145
|
-
"files": [
|
|
146
|
-
"src/test/benchmark*.ts"
|
|
147
|
-
],
|
|
148
|
-
"rules": {
|
|
149
|
-
"@typescript-eslint/no-unused-vars": "off"
|
|
150
|
-
}
|
|
151
|
-
},
|
|
152
|
-
{
|
|
153
|
-
"files": [
|
|
154
|
-
"src/test/*.test.ts"
|
|
155
|
-
],
|
|
156
|
-
"rules": {
|
|
157
|
-
"jest/no-standalone-expect": "off"
|
|
158
|
-
}
|
|
159
|
-
},
|
|
160
|
-
{
|
|
161
|
-
"files": [
|
|
162
|
-
"src/test/showdown/**"
|
|
163
|
-
],
|
|
164
|
-
"rules": {
|
|
165
|
-
"jest/expect-expect": [
|
|
166
|
-
"warn",
|
|
167
|
-
{
|
|
168
|
-
"assertFunctionNames": [
|
|
169
|
-
"expect",
|
|
170
|
-
"expectLog",
|
|
171
|
-
"verify"
|
|
172
|
-
]
|
|
173
|
-
}
|
|
174
|
-
]
|
|
175
|
-
}
|
|
176
|
-
},
|
|
177
|
-
{
|
|
178
|
-
"files": [
|
|
179
|
-
"src/tools/generate.ts"
|
|
180
|
-
],
|
|
181
|
-
"rules": {
|
|
182
|
-
"@typescript-eslint/restrict-template-expressions": [
|
|
183
|
-
"error",
|
|
184
|
-
{
|
|
185
|
-
"allowBoolean": true
|
|
186
|
-
}
|
|
187
|
-
]
|
|
188
|
-
}
|
|
189
|
-
}
|
|
190
|
-
]
|
|
191
150
|
}
|
|
192
151
|
}
|
|
@@ -10,13 +10,15 @@ const path = require('path');
|
|
|
10
10
|
const {pipeline} = require('stream/promises');
|
|
11
11
|
const tty = require('tty');
|
|
12
12
|
|
|
13
|
-
const ZIG_VERSION = {major: 0, minor: 11, patch: 0
|
|
13
|
+
const ZIG_VERSION = {major: 0, minor: 11, patch: 0};
|
|
14
14
|
const DEV = ZIG_VERSION.dev ? `-dev.${ZIG_VERSION.dev}` : '';
|
|
15
15
|
const VERSION = `${ZIG_VERSION.major}.${ZIG_VERSION.minor}.${ZIG_VERSION.patch}${DEV}`;
|
|
16
16
|
const INDEX = 'https://ziglang.org/download/index.json';
|
|
17
17
|
const ROOT = path.resolve(__dirname, '..', '..');
|
|
18
|
+
let SILENT = false;
|
|
18
19
|
|
|
19
20
|
const sh = (cmd, args) => execFileSync(cmd, args, {encoding: 'utf8', cwd: ROOT});
|
|
21
|
+
const log = (...args) => { if (!SILENT) console.log(...args); };
|
|
20
22
|
|
|
21
23
|
// This is hardly the browser fetch API, but it works for our primitive needs
|
|
22
24
|
const fetch = url => new Promise((resolve, reject) => {
|
|
@@ -61,7 +63,7 @@ const unpack7 = (input, output) => new Promise((resolve, reject) => {
|
|
|
61
63
|
require.resolve('7zip-min');
|
|
62
64
|
} catch (err) {
|
|
63
65
|
if (err.code !== 'MODULE_NOT_FOUND') throw err;
|
|
64
|
-
|
|
66
|
+
log('Installing 7zip-min package locally to unpack the archive...');
|
|
65
67
|
sh('npm', ['install', '7zip-min', '--no-audit', '--no-save']);
|
|
66
68
|
}
|
|
67
69
|
|
|
@@ -83,7 +85,7 @@ const unpack = async (input, output) => {
|
|
|
83
85
|
sh('tar', ['xf', input, '-C', output]);
|
|
84
86
|
return;
|
|
85
87
|
} catch {
|
|
86
|
-
|
|
88
|
+
log('tar command not found, falling back to 7z');
|
|
87
89
|
}
|
|
88
90
|
}
|
|
89
91
|
// Try to use a 7z binary if we can, and only install 7zip-min as a last resort
|
|
@@ -120,10 +122,10 @@ const find = zig => {
|
|
|
120
122
|
(!ZIG_VERSION.dev || (dev && dev >= ZIG_VERSION.dev)));
|
|
121
123
|
|
|
122
124
|
if (compatible) {
|
|
123
|
-
|
|
125
|
+
log('Found existing compatible Zig executable:', zig_exe);
|
|
124
126
|
return zig_exe;
|
|
125
127
|
} else {
|
|
126
|
-
|
|
128
|
+
log(`Existing Zig executable is not compatible (${version} < ${VERSION}):`, zig_exe);
|
|
127
129
|
}
|
|
128
130
|
} catch (err) {
|
|
129
131
|
if (err.code !== 'ENOENT') throw err;
|
|
@@ -161,18 +163,20 @@ const install = async () => {
|
|
|
161
163
|
}
|
|
162
164
|
|
|
163
165
|
const index = JSON.parse(await fetch(INDEX));
|
|
164
|
-
|
|
165
|
-
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}`];
|
|
166
170
|
const url = release.tarball;
|
|
167
171
|
|
|
168
172
|
let base = path.basename(url);
|
|
169
173
|
const archive = path.join(dir, path.basename(url));
|
|
170
174
|
|
|
171
|
-
|
|
175
|
+
log(`Downloading Zig tarball from ${url} to ${archive}`);
|
|
172
176
|
try {
|
|
173
177
|
await download(url, archive, release.shasum);
|
|
174
178
|
|
|
175
|
-
|
|
179
|
+
log(`Extracting tarball and installing to ${dir}`);
|
|
176
180
|
await unpack(archive, dir);
|
|
177
181
|
if (archive.endsWith('.zip')) {
|
|
178
182
|
base = base.slice(0, -4);
|
|
@@ -187,17 +191,17 @@ const install = async () => {
|
|
|
187
191
|
} catch (err) {
|
|
188
192
|
if (err.code !== 'ENOENT') throw err;
|
|
189
193
|
}
|
|
190
|
-
|
|
194
|
+
log(`Zig${version === 'master' ? '' : ` v${version}`} executable:`, zig,
|
|
191
195
|
'(this version of Zig will be retained to speed up future updates)');
|
|
192
196
|
const [pre, post] = tty.isatty(1) ? ['\x1b[1m\x1b[35m', '\x1b[0m'] : ['', ''];
|
|
193
|
-
|
|
197
|
+
log(
|
|
194
198
|
`${pre}Consider moving the ${path.dirname(zig)} directory and adding it to your PATH`,
|
|
195
199
|
`to use Zig on other projects, or delete this if you wish to save space.${post}`
|
|
196
200
|
);
|
|
197
201
|
|
|
198
202
|
return zig;
|
|
199
203
|
} finally {
|
|
200
|
-
|
|
204
|
+
log(`Cleaning up ${archive}`);
|
|
201
205
|
try { fs.rmSync(archive); } catch {}
|
|
202
206
|
}
|
|
203
207
|
};
|
|
@@ -206,17 +210,17 @@ const install = async () => {
|
|
|
206
210
|
const downloadHeaders = async () => {
|
|
207
211
|
const include = path.resolve(process.execPath, '..', '..', 'include', 'node');
|
|
208
212
|
if (fs.existsSync(path.join(include, 'node.h'))) {
|
|
209
|
-
|
|
213
|
+
log('Node headers:', include);
|
|
210
214
|
return include;
|
|
211
215
|
}
|
|
212
216
|
|
|
213
217
|
const dir = path.join(ROOT, 'build', 'include');
|
|
214
|
-
const dest = path.join(dir,
|
|
218
|
+
const dest = path.join(dir, 'node');
|
|
215
219
|
if (fs.existsSync(path.join(dest, 'node.h'))) {
|
|
216
|
-
|
|
220
|
+
log('Node headers:', dest);
|
|
217
221
|
return dest;
|
|
218
222
|
} else {
|
|
219
|
-
|
|
223
|
+
log(`Could not find Node headers at ${include}, downloading...`);
|
|
220
224
|
}
|
|
221
225
|
|
|
222
226
|
try {
|
|
@@ -227,31 +231,39 @@ const downloadHeaders = async () => {
|
|
|
227
231
|
|
|
228
232
|
const url = process.release.headersUrl;
|
|
229
233
|
const targz = path.join(dir, path.basename(url));
|
|
234
|
+
const unpacked = path.join(dir, `node-${process.version}`, 'include');
|
|
230
235
|
|
|
231
|
-
|
|
232
|
-
await download(url, targz);
|
|
233
|
-
await unpack(targz, dir);
|
|
236
|
+
log(`Downloading Node headers from ${url} to ${targz}`);
|
|
234
237
|
|
|
235
|
-
|
|
238
|
+
try {
|
|
239
|
+
await download(url, targz);
|
|
240
|
+
await unpack(targz, dir);
|
|
241
|
+
fs.renameSync(path.join(unpacked, 'node'), dest);
|
|
236
242
|
|
|
237
|
-
|
|
243
|
+
log('Node headers:', dest);
|
|
244
|
+
|
|
245
|
+
return dest;
|
|
246
|
+
} finally {
|
|
247
|
+
try { fs.rmSync(targz); } catch {}
|
|
248
|
+
try { fs.rmSync(unpacked, {recursive: true}); } catch {}
|
|
249
|
+
}
|
|
238
250
|
};
|
|
239
251
|
|
|
240
252
|
const downloadImportLib = async () => {
|
|
241
253
|
const library = path.resolve(process.execPath, '..', 'node.lib');
|
|
242
254
|
if (fs.existsSync(path.join(library, 'node.h'))) {
|
|
243
|
-
|
|
255
|
+
log('Node import library:', library);
|
|
244
256
|
return library;
|
|
245
257
|
}
|
|
246
258
|
|
|
247
259
|
const dir = path.join(ROOT, 'build', 'lib');
|
|
248
|
-
const url =
|
|
260
|
+
const url = process.release.libUrl;
|
|
249
261
|
const dest = path.join(dir, path.basename(url));
|
|
250
262
|
if (fs.existsSync(path.join(dest))) {
|
|
251
|
-
|
|
263
|
+
log('Node import library:', dest);
|
|
252
264
|
return dest;
|
|
253
265
|
} else {
|
|
254
|
-
|
|
266
|
+
log(`Could not find Node import library at ${library}, downloading...`);
|
|
255
267
|
}
|
|
256
268
|
|
|
257
269
|
try {
|
|
@@ -260,24 +272,41 @@ const downloadImportLib = async () => {
|
|
|
260
272
|
if (err.code !== 'EEXIST') throw err;
|
|
261
273
|
}
|
|
262
274
|
|
|
263
|
-
|
|
275
|
+
log(`Downloading Node import library from ${url} to ${dest}`);
|
|
264
276
|
await download(url, dest);
|
|
265
|
-
|
|
277
|
+
log('Node import library:', dest);
|
|
266
278
|
|
|
267
279
|
return dest;
|
|
268
280
|
};
|
|
269
281
|
|
|
270
282
|
(async () => {
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
283
|
+
let only = false;
|
|
284
|
+
let options = undefined;
|
|
285
|
+
let error = false;
|
|
286
|
+
for (let i = 2; i < process.argv.length; i++) {
|
|
287
|
+
switch (process.argv[i]) {
|
|
288
|
+
case "--silent": {
|
|
289
|
+
SILENT = true;
|
|
290
|
+
break;
|
|
291
|
+
}
|
|
292
|
+
case "--zig": {
|
|
293
|
+
if (options || only) error = true;
|
|
294
|
+
only = true;
|
|
295
|
+
break;
|
|
296
|
+
}
|
|
297
|
+
default: {
|
|
298
|
+
if (options || only || !process.argv[i].startsWith('--options=')) error = true;
|
|
299
|
+
options = process.argv[i].slice(10).split(' ');
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
if (error) {
|
|
275
304
|
console.error('Invalid arguments');
|
|
276
305
|
process.exit(1);
|
|
277
306
|
}
|
|
278
307
|
|
|
279
308
|
const zig = await install();
|
|
280
|
-
if (
|
|
309
|
+
if (only) process.exit(0);
|
|
281
310
|
|
|
282
311
|
let tmp;
|
|
283
312
|
try {
|
|
@@ -296,6 +325,7 @@ const downloadImportLib = async () => {
|
|
|
296
325
|
const libs = path.join(ROOT, 'build', 'lib');
|
|
297
326
|
if (fs.existsSync(libs)) {
|
|
298
327
|
for (const file of fs.readdirSync(libs)) {
|
|
328
|
+
if (!file.startsWith('pkmn')) continue;
|
|
299
329
|
const type = path.extname(file).slice(1);
|
|
300
330
|
if (type !== 'node' && type !== 'wasm') continue;
|
|
301
331
|
// If we don't copy the addon before loading it Windows will return an
|
|
@@ -309,14 +339,18 @@ const downloadImportLib = async () => {
|
|
|
309
339
|
node = true;
|
|
310
340
|
if (!options) {
|
|
311
341
|
const addon = require(copy);
|
|
312
|
-
if (addon.options.showdown) opts.push('-Dshowdown');
|
|
313
|
-
if (addon.options.
|
|
342
|
+
if (addon.engine.options.showdown) opts.push('-Dshowdown');
|
|
343
|
+
if (addon.engine.options.log) opts.push('-Dlog');
|
|
344
|
+
if (addon.engine.options.chance) opts.push('-Dchance');
|
|
345
|
+
if (addon.engine.options.calc) opts.push('-Dcalc');
|
|
314
346
|
}
|
|
315
347
|
} else if (!options) {
|
|
316
348
|
const addon = await WebAssembly.instantiate(fs.readFileSync(copy));
|
|
317
349
|
const values = new Uint8Array(addon.instance.exports.memory.buffer);
|
|
318
350
|
if (values[addon.instance.exports.SHOWDOWN.value]) opts.push('-Dshowdown');
|
|
319
|
-
if (values[addon.instance.exports.
|
|
351
|
+
if (values[addon.instance.exports.LOG.value]) opts.push('-Dlog');
|
|
352
|
+
if (values[addon.instance.exports.CHANCE.value]) opts.push('-Dchance');
|
|
353
|
+
if (values[addon.instance.exports.CALC.value]) opts.push('-Dcalc');
|
|
320
354
|
}
|
|
321
355
|
const key = `${type} ${opts.sort().join(' ')}`;
|
|
322
356
|
if (!configs.has(key)) configs.set(key, {type, options: opts});
|
|
@@ -327,8 +361,9 @@ const downloadImportLib = async () => {
|
|
|
327
361
|
// either the default options or whatever was passed in
|
|
328
362
|
if (!configs.size) {
|
|
329
363
|
node = true;
|
|
330
|
-
|
|
331
|
-
configs.set('
|
|
364
|
+
const DEFAULT = ['-Dshowdown'];
|
|
365
|
+
configs.set('node', {type: 'node', options: options || DEFAULT});
|
|
366
|
+
configs.set('wasm', {type: 'wasm', options: options || DEFAULT});
|
|
332
367
|
}
|
|
333
368
|
|
|
334
369
|
const headers = node ? await downloadHeaders() : undefined;
|
|
@@ -338,8 +373,10 @@ const downloadImportLib = async () => {
|
|
|
338
373
|
const args = ['build', '-p', 'build', ...opts];
|
|
339
374
|
if (!process.env.DEBUG_PKMN_ENGINE) args.push('-Doptimize=ReleaseFast', '-Dstrip');
|
|
340
375
|
if (config.type === 'node') {
|
|
341
|
-
args.push(`-Dnode-headers=${headers}`);
|
|
342
|
-
if (process.platform === 'win32')
|
|
376
|
+
args.push(`-Dnode-headers=${path.relative(ROOT, headers)}`);
|
|
377
|
+
if (process.platform === 'win32') {
|
|
378
|
+
args.push(`-Dnode-import-library=${path.relative(ROOT, lib)}`);
|
|
379
|
+
}
|
|
343
380
|
} else {
|
|
344
381
|
args.push('-Dwasm');
|
|
345
382
|
}
|
|
@@ -347,15 +384,21 @@ const downloadImportLib = async () => {
|
|
|
347
384
|
opts.includes('-Dshowdown') || opts.includes('-Dshowdown=true') ? '-showdown' : '';
|
|
348
385
|
const flags = opts.length ? ` (${opts.join(' ')})` : '';
|
|
349
386
|
const artifact = path.join('build', 'lib', `pkmn${suffix}.${config.type}`);
|
|
350
|
-
|
|
387
|
+
log(`Building ${artifact}${flags}`);
|
|
351
388
|
sh(zig, args);
|
|
352
389
|
// TODO: ziglang/zig#14647 broke emit_to so we get to rename the file ourselves...
|
|
353
390
|
if (config.type === 'node') {
|
|
354
391
|
const prefix = process.platform === 'win32' ? '' : 'lib';
|
|
355
392
|
const ext = process.platform === 'darwin'
|
|
356
393
|
? 'dylib' : process.platform === 'win32' ? 'dll' : 'so';
|
|
357
|
-
|
|
358
|
-
|
|
394
|
+
try {
|
|
395
|
+
const actual = path.join(ROOT, 'build', 'lib', `${prefix}pkmn${suffix}.node.${ext}`);
|
|
396
|
+
fs.renameSync(actual, artifact);
|
|
397
|
+
} catch {
|
|
398
|
+
// ziglang/zig#19743 changed this path
|
|
399
|
+
const actual = path.join(ROOT, 'build', 'bin', `${prefix}pkmn${suffix}.node.${ext}`);
|
|
400
|
+
fs.renameSync(actual, artifact);
|
|
401
|
+
}
|
|
359
402
|
}
|
|
360
403
|
}
|
|
361
404
|
})().catch(e => {
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
'use strict';
|
|
3
|
+
|
|
4
|
+
try {
|
|
5
|
+
require('source-map-support').install();
|
|
6
|
+
} catch (err) {
|
|
7
|
+
if (err.code !== 'MODULE_NOT_FOUND') throw err;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const {execFileSync} = require('child_process');
|
|
11
|
+
const {readFileSync} = require('fs');
|
|
12
|
+
const {join, resolve} = require('path');
|
|
13
|
+
|
|
14
|
+
const ROOT = resolve(__dirname, '..', '..');
|
|
15
|
+
const packageJSON = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8'));
|
|
16
|
+
|
|
17
|
+
const missing = [];
|
|
18
|
+
for (const dep of ['@pkmn/img', 'html-minifier', 'esbuild']) {
|
|
19
|
+
try {
|
|
20
|
+
require.resolve(dep);
|
|
21
|
+
} catch (e) {
|
|
22
|
+
if (e.code !== 'MODULE_NOT_FOUND') throw e;
|
|
23
|
+
missing.push(`${dep}@${packageJSON.devDependencies[dep]}`);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
let Dex = undefined;
|
|
28
|
+
try {
|
|
29
|
+
Dex = require('@pkmn/sim').Dex;
|
|
30
|
+
} catch (err) {
|
|
31
|
+
if (err.code !== 'MODULE_NOT_FOUND') throw err;
|
|
32
|
+
try {
|
|
33
|
+
Dex = require('@pkmn/dex').Dex;
|
|
34
|
+
} catch (e) {
|
|
35
|
+
if (e.code !== 'MODULE_NOT_FOUND') throw e;
|
|
36
|
+
missing.push(`@pkmn/dex@${packageJSON.dependencies['@pkmn/data']}`);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
if (missing.length) {
|
|
41
|
+
if (+/^v(\d+)/.exec(process.version)[1] < 16) {
|
|
42
|
+
console.error('pkmn-debug requires Node v16+');
|
|
43
|
+
process.exit(1);
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
execFileSync('npm', ['install', ...missing, '--global'], {encoding: 'utf8'});
|
|
47
|
+
|
|
48
|
+
const node_modules = execFileSync('npm', ['root', '--global'], {encoding: 'utf8'}).trim();
|
|
49
|
+
if (!process.env.NODE_PATH || !process.env.NODE_PATH.includes(node_modules)) {
|
|
50
|
+
console.error(`NODE_PATH must include npm's global node_modules directory: '${node_modules}'`);
|
|
51
|
+
process.exit(1);
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
const {Generations} = require('@pkmn/data');
|
|
56
|
+
|
|
57
|
+
const {run} = require('../../build/tools/debug');
|
|
58
|
+
|
|
59
|
+
run(new Generations(Dex)).catch(err => {
|
|
60
|
+
console.error(err.message);
|
|
61
|
+
process.exit(1);
|
|
62
|
+
});
|