@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.
Files changed (84) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +145 -78
  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 +100 -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 +29 -0
  13. package/build/pkg/addon.js +80 -0
  14. package/build/pkg/addon.js.map +1 -0
  15. package/build/pkg/data/ids.json +12 -12
  16. package/build/pkg/data/layout.json +40 -5
  17. package/build/pkg/data/protocol.json +84 -13
  18. package/build/pkg/data.d.ts +28 -7
  19. package/build/pkg/data.js +3 -5
  20. package/build/pkg/data.js.map +1 -1
  21. package/build/pkg/gen1.d.ts +18 -20
  22. package/build/pkg/gen1.js +59 -44
  23. package/build/pkg/gen1.js.map +1 -1
  24. package/build/pkg/index.d.ts +57 -103
  25. package/build/pkg/index.js +6 -63
  26. package/build/pkg/index.js.map +1 -1
  27. package/build/pkg/protocol.d.ts +24 -3
  28. package/build/pkg/protocol.js +127 -104
  29. package/build/pkg/protocol.js.map +1 -1
  30. package/build/tools/debug.js +100 -0
  31. package/build/tools/debug.js.map +1 -0
  32. package/build/tools/display/debug.jsx +141 -0
  33. package/build/tools/display/debug.jsx.map +1 -0
  34. package/build/tools/display/index.js +142 -0
  35. package/build/tools/display/index.js.map +1 -0
  36. package/build/tools/display/ui.jsx +349 -0
  37. package/build/tools/display/ui.jsx.map +1 -0
  38. package/build/tools/display/util.js +33 -0
  39. package/build/tools/display/util.js.map +1 -0
  40. package/build.zig +417 -160
  41. package/package.json +92 -133
  42. package/src/bin/install-pkmn-engine +85 -42
  43. package/src/bin/pkmn-debug +62 -0
  44. package/src/lib/bindings/c.zig +255 -0
  45. package/src/lib/bindings/node.zig +121 -0
  46. package/src/lib/bindings/wasm.zig +59 -0
  47. package/src/lib/common/array.zig +77 -0
  48. package/src/lib/common/battle.zig +17 -0
  49. package/src/lib/common/data.zig +19 -31
  50. package/src/lib/common/debug.zig +58 -17
  51. package/src/lib/common/js.zig +120 -0
  52. package/src/lib/common/optional.zig +71 -0
  53. package/src/lib/common/options.zig +18 -3
  54. package/src/lib/common/protocol.zig +947 -407
  55. package/src/lib/common/rational.zig +449 -0
  56. package/src/lib/common/rng.zig +31 -24
  57. package/src/lib/common/util.zig +61 -0
  58. package/src/lib/gen1/calc.zig +953 -0
  59. package/src/lib/gen1/chance.zig +1185 -0
  60. package/src/lib/gen1/data/moves.zig +203 -193
  61. package/src/lib/gen1/data/species.zig +6 -8
  62. package/src/lib/gen1/data/types.zig +11 -12
  63. package/src/lib/gen1/data.zig +101 -90
  64. package/src/lib/gen1/helpers.zig +139 -54
  65. package/src/lib/gen1/mechanics.zig +1435 -916
  66. package/src/lib/gen2/calc.zig +153 -0
  67. package/src/lib/gen2/chance.zig +902 -0
  68. package/src/lib/gen2/data/items.zig +15 -23
  69. package/src/lib/gen2/data/moves.zig +665 -573
  70. package/src/lib/gen2/data/species.zig +3 -5
  71. package/src/lib/gen2/data/types.zig +138 -36
  72. package/src/lib/gen2/data.zig +134 -99
  73. package/src/lib/gen2/generated.zig +801 -0
  74. package/src/lib/gen2/helpers.zig +59 -44
  75. package/src/lib/gen2/mechanics.zig +3582 -30
  76. package/src/lib/node.zig +18 -0
  77. package/src/lib/pkmn.zig +93 -12
  78. package/src/lib/wasm.zig +17 -0
  79. package/src/tools/display/dom.ts +96 -0
  80. package/src/tools/display/ui.css +354 -0
  81. package/src/lib/binding/node.zig +0 -229
  82. package/src/lib/binding/wasm.zig +0 -10
  83. package/src/lib/gen1/README.md +0 -777
  84. 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.7f37a47c",
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
- "src/bin/install-pkmn-engine",
13
- "src/lib/binding/node.zig",
14
- "src/lib/binding/wasm.zig",
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/data.zig",
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
- "build/pkg/data/ids.json",
35
- "build/pkg/data/layout.json",
36
- "build/pkg/data/protocol.json",
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.7.33",
61
- "@pkmn/protocol": "^0.6.11"
101
+ "@pkmn/data": "^0.9.22",
102
+ "@pkmn/protocol": "^0.6.28"
62
103
  },
63
104
  "devDependencies": {
64
- "@pkmn/eslint-config": "^3.0.0-alpha.0",
65
- "@pkmn/img": "^0.2.8",
66
- "@pkmn/sets": "^5.0.4",
67
- "@pkmn/sim": "0.7.33",
68
- "@types/html-minifier": "^4.0.2",
69
- "@types/jest": "^29.5.0",
70
- "@types/minimist": "^1.2.2",
71
- "@types/mustache": "^4.2.2",
72
- "@types/node": "^18.15.11",
73
- "@vitest/coverage-c8": "^0.29.8",
74
- "binaryen": "^112.0.0",
75
- "eslint": "^8.37.0",
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.0.2",
83
- "vitest": "^0.29.8"
131
+ "typescript": "^5.6.3",
132
+ "vitest": "^2.1.4"
84
133
  },
85
134
  "scripts": {
86
- "lint": "eslint --cache src --ext ts,js && eslint src/bin/install-pkmn-engine",
87
- "fix": "eslint --fix src --ext ts,js && eslint --fix src/bin/install-pkmn-engine",
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, dev: 2168};
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
- console.log('Installing 7zip-min package locally to unpack the archive...');
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
- console.log('tar command not found, falling back to 7z');
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
- console.log('Found existing compatible Zig executable:', zig_exe);
125
+ log('Found existing compatible Zig executable:', zig_exe);
124
126
  return zig_exe;
125
127
  } else {
126
- console.log(`Existing Zig executable is not compatible (${version} < ${VERSION}):`, zig_exe);
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
- const version = Object.keys(index)[+!ZIG_VERSION.dev];
165
- 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}`];
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
- console.log(`Downloading Zig tarball from ${url} to ${archive}`);
175
+ log(`Downloading Zig tarball from ${url} to ${archive}`);
172
176
  try {
173
177
  await download(url, archive, release.shasum);
174
178
 
175
- console.log(`Extracting tarball and installing to ${dir}`);
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
- console.log(`Zig${version === 'master' ? '' : ` v${version}`} executable:`, zig,
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
- console.log(
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
- console.log(`Cleaning up ${archive}`);
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
- console.log('Node headers:', include);
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, `node-${process.version}`, 'include', 'node');
218
+ const dest = path.join(dir, 'node');
215
219
  if (fs.existsSync(path.join(dest, 'node.h'))) {
216
- console.log('Node headers:', dest);
220
+ log('Node headers:', dest);
217
221
  return dest;
218
222
  } else {
219
- console.log(`Could not find Node headers at ${include}, downloading...`);
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
- console.log(`Downloading Node headers from ${url} to ${targz}`);
232
- await download(url, targz);
233
- await unpack(targz, dir);
236
+ log(`Downloading Node headers from ${url} to ${targz}`);
234
237
 
235
- console.log('Node headers:', dest);
238
+ try {
239
+ await download(url, targz);
240
+ await unpack(targz, dir);
241
+ fs.renameSync(path.join(unpacked, 'node'), dest);
236
242
 
237
- return dest;
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
- console.log('Node import library:', library);
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 = new URL('./win-x64/node.lib', process.release.headersUrl).href;
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
- console.log('Node import library:', dest);
263
+ log('Node import library:', dest);
252
264
  return dest;
253
265
  } else {
254
- console.log(`Could not find Node import library at ${library}, downloading...`);
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
- console.log(`Downloading Node import library from ${url} to ${dest}`);
275
+ log(`Downloading Node import library from ${url} to ${dest}`);
264
276
  await download(url, dest);
265
- console.log('Node import library:', dest);
277
+ log('Node import library:', dest);
266
278
 
267
279
  return dest;
268
280
  };
269
281
 
270
282
  (async () => {
271
- const options = (process.argv[2] || '').startsWith('--options=')
272
- ? process.argv[2].slice(10).split(' ') : undefined;
273
- if (process.argv.length > 3 ||
274
- process.argv.length === 3 && !(process.argv[2] === '--zig' || options)) {
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 (process.argv[2] === '--zig') process.exit(0);
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.trace) opts.push('-Dtrace');
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.TRACE.value]) opts.push('-Dtrace');
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
- configs.set('node', {type: 'node', options: options || ['-Dshowdown']});
331
- configs.set('wasm', {type: 'wasm', options: options || ['-Dshowdown']});
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') args.push(`-Dnode-import-library=${lib}`);
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
- console.log(`Building ${artifact}${flags}`);
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
- const actual = path.join('build', 'lib', `${prefix}pkmn${suffix}.node.${ext}`);
358
- fs.renameSync(actual, artifact);
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
+ });