@pkmn/engine 0.1.0-dev.f918c3bd → 0.1.0-dev.fb6653d6
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 +51 -23
- 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 +53 -0
- package/build/pkg/addon/wasm.js.map +1 -0
- package/build/pkg/addon.d.ts +25 -3
- package/build/pkg/addon.js +39 -71
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data/ids.json +12 -12
- package/build/pkg/data/layout.json +17 -4
- package/build/pkg/data/protocol.json +23 -9
- package/build/pkg/data.d.ts +27 -5
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +13 -17
- package/build/pkg/gen1.js +8 -12
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +40 -91
- package/build/pkg/index.js +6 -63
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +20 -1
- package/build/pkg/protocol.js +109 -107
- package/build/pkg/protocol.js.map +1 -1
- package/build/tools/debug.js +36 -69
- 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 +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 +18 -0
- package/build/tools/display/util.js.map +1 -0
- package/build.zig +303 -101
- package/package.json +61 -132
- package/src/bin/install-pkmn-engine +30 -20
- package/src/bin/pkmn-debug +1 -1
- package/src/lib/{binding → bindings}/node.zig +8 -21
- package/src/lib/bindings/wasm.zig +58 -0
- package/src/lib/common/array.zig +77 -0
- package/src/lib/common/data.zig +8 -8
- package/src/lib/common/debug.zig +39 -8
- package/src/lib/common/js.zig +4 -2
- package/src/lib/common/optional.zig +21 -10
- package/src/lib/common/options.zig +6 -0
- package/src/lib/common/protocol.zig +421 -393
- package/src/lib/common/rational.zig +131 -35
- package/src/lib/common/rng.zig +16 -9
- package/src/lib/common/util.zig +50 -1
- package/src/lib/gen1/calc.zig +687 -160
- package/src/lib/gen1/chance.zig +434 -307
- package/src/lib/gen1/data/moves.zig +26 -14
- package/src/lib/gen1/data/species.zig +4 -6
- package/src/lib/gen1/data/types.zig +7 -8
- package/src/lib/gen1/data.zig +44 -47
- package/src/lib/gen1/helpers.zig +91 -562
- package/src/lib/gen1/mechanics.zig +641 -557
- package/src/lib/gen2/calc.zig +153 -0
- package/src/lib/gen2/chance.zig +902 -0
- package/src/lib/gen2/data/items.zig +13 -21
- package/src/lib/gen2/data/moves.zig +67 -47
- package/src/lib/gen2/data/species.zig +2 -4
- package/src/lib/gen2/data/types.zig +134 -32
- package/src/lib/gen2/data.zig +56 -54
- package/src/lib/gen2/generated.zig +801 -0
- package/src/lib/gen2/helpers.zig +46 -25
- package/src/lib/gen2/mechanics.zig +2778 -362
- package/src/lib/node.zig +18 -0
- package/src/lib/pkmn.zig +37 -15
- package/src/lib/wasm.zig +17 -0
- package/src/tools/display/dom.ts +96 -0
- package/src/tools/display/ui.css +354 -0
- package/build/test/display.js +0 -400
- package/build/test/display.js.map +0 -1
- package/src/lib/binding/wasm.zig +0 -12
- package/src/lib/gen1/README.md +0 -894
- package/src/lib/gen2/README.md +0 -328
- 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.fb6653d6",
|
|
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,13 +39,19 @@
|
|
|
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",
|
|
34
|
-
"
|
|
35
|
-
"
|
|
36
|
-
"
|
|
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/node.zig",
|
|
53
|
+
"src/lib/bindings/wasm.zig",
|
|
54
|
+
"src/lib/common/array.zig",
|
|
37
55
|
"src/lib/common/battle.zig",
|
|
38
56
|
"src/lib/common/data.zig",
|
|
39
57
|
"src/lib/common/debug.zig",
|
|
@@ -52,15 +70,21 @@
|
|
|
52
70
|
"src/lib/gen1/data/types.zig",
|
|
53
71
|
"src/lib/gen1/helpers.zig",
|
|
54
72
|
"src/lib/gen1/mechanics.zig",
|
|
73
|
+
"src/lib/gen2/calc.zig",
|
|
74
|
+
"src/lib/gen2/chance.zig",
|
|
55
75
|
"src/lib/gen2/data.zig",
|
|
56
76
|
"src/lib/gen2/data/items.zig",
|
|
57
77
|
"src/lib/gen2/data/moves.zig",
|
|
58
78
|
"src/lib/gen2/data/species.zig",
|
|
59
79
|
"src/lib/gen2/data/types.zig",
|
|
80
|
+
"src/lib/gen2/generated.zig",
|
|
60
81
|
"src/lib/gen2/helpers.zig",
|
|
61
82
|
"src/lib/gen2/mechanics.zig",
|
|
83
|
+
"src/lib/node.zig",
|
|
62
84
|
"src/lib/pkmn.zig",
|
|
63
|
-
"src/
|
|
85
|
+
"src/lib/wasm.zig",
|
|
86
|
+
"src/tools/display/dom.ts",
|
|
87
|
+
"src/tools/display/ui.css"
|
|
64
88
|
],
|
|
65
89
|
"engines": {
|
|
66
90
|
"node": ">=16.0.0"
|
|
@@ -73,149 +97,54 @@
|
|
|
73
97
|
"access": "public"
|
|
74
98
|
},
|
|
75
99
|
"dependencies": {
|
|
76
|
-
"@pkmn/data": "^0.
|
|
77
|
-
"@pkmn/protocol": "^0.6.
|
|
100
|
+
"@pkmn/data": "^0.9.20",
|
|
101
|
+
"@pkmn/protocol": "^0.6.27"
|
|
78
102
|
},
|
|
79
103
|
"devDependencies": {
|
|
80
|
-
"@pkmn/eslint-config": "^
|
|
81
|
-
"@pkmn/img": "^0.2.
|
|
82
|
-
"@pkmn/sets": "^5.
|
|
83
|
-
"@pkmn/sim": "0.
|
|
84
|
-
"@
|
|
85
|
-
"@types/
|
|
86
|
-
"@types/
|
|
87
|
-
"@types/
|
|
88
|
-
"@types/
|
|
89
|
-
"@
|
|
90
|
-
"
|
|
91
|
-
"
|
|
104
|
+
"@pkmn/eslint-config": "^9.0.0",
|
|
105
|
+
"@pkmn/img": "^0.2.32",
|
|
106
|
+
"@pkmn/sets": "^5.1.2",
|
|
107
|
+
"@pkmn/sim": "0.9.20",
|
|
108
|
+
"@pkmn/smogon": "^0.5.14",
|
|
109
|
+
"@types/html-minifier": "^4.0.5",
|
|
110
|
+
"@types/jest": "^29.5.13",
|
|
111
|
+
"@types/minimist": "^1.2.5",
|
|
112
|
+
"@types/mustache": "^4.2.5",
|
|
113
|
+
"@types/node": "^22.7.6",
|
|
114
|
+
"@types/react": "^18.3.11",
|
|
115
|
+
"@types/semver": "^7.5.8",
|
|
116
|
+
"@types/vscode": "^1.94.0",
|
|
117
|
+
"@vitest/coverage-v8": "^2.1.3",
|
|
118
|
+
"@vscode/vsce": "^3.2.0",
|
|
119
|
+
"binaryen": "^119.0.0",
|
|
120
|
+
"esbuild": "^0.24.0",
|
|
121
|
+
"eslint": "^9.12.0",
|
|
92
122
|
"html-minifier": "^4.0.0",
|
|
93
123
|
"json-stringify-pretty-compact": "3.0.0",
|
|
94
124
|
"minimist": "^1.2.8",
|
|
95
125
|
"mustache": "^4.2.0",
|
|
126
|
+
"semver": "^7.6.3",
|
|
96
127
|
"source-map-support": "^0.5.21",
|
|
128
|
+
"table": "^6.8.2",
|
|
97
129
|
"trakr": "^0.2.0",
|
|
98
|
-
"typescript": "^5.
|
|
99
|
-
"vitest": "^
|
|
130
|
+
"typescript": "^5.6.3",
|
|
131
|
+
"vitest": "^2.1.3"
|
|
100
132
|
},
|
|
101
133
|
"scripts": {
|
|
102
|
-
"lint": "eslint --cache src
|
|
103
|
-
"fix": "eslint --fix src
|
|
134
|
+
"lint": "eslint --cache src",
|
|
135
|
+
"fix": "eslint --fix src",
|
|
104
136
|
"compile": "tsc -p .",
|
|
105
137
|
"build": "npm run compile",
|
|
106
138
|
"test": "vitest src/pkg",
|
|
107
139
|
"test:integration": "vitest src/test",
|
|
108
140
|
"debug": "npm run compile && node build/tools/debug",
|
|
141
|
+
"demo": "npm run compile && node build/tools/demo",
|
|
109
142
|
"fuzz": "npm run compile && node build/test/fuzz",
|
|
110
143
|
"generate": "npm run compile && node build/tools/generate",
|
|
111
144
|
"release": "npm run compile && node build/tools/release",
|
|
112
145
|
"benchmark": "npm run compile && node build/test/benchmark",
|
|
113
146
|
"integration": "npm run compile && node build/test/integration",
|
|
147
|
+
"extension": "npm -C src/tools/vscode run build",
|
|
114
148
|
"postinstall": "node src/bin/install-pkmn-engine"
|
|
115
|
-
},
|
|
116
|
-
"eslintConfig": {
|
|
117
|
-
"extends": "@pkmn",
|
|
118
|
-
"ignorePatterns": [
|
|
119
|
-
"dist/",
|
|
120
|
-
"node_modules/",
|
|
121
|
-
"src/examples/zig",
|
|
122
|
-
"build/"
|
|
123
|
-
],
|
|
124
|
-
"env": {
|
|
125
|
-
"es6": true,
|
|
126
|
-
"node": true,
|
|
127
|
-
"browser": true
|
|
128
|
-
},
|
|
129
|
-
"overrides": [
|
|
130
|
-
{
|
|
131
|
-
"files": [
|
|
132
|
-
"**/*.ts"
|
|
133
|
-
],
|
|
134
|
-
"parserOptions": {
|
|
135
|
-
"project": [
|
|
136
|
-
"./tsconfig.json",
|
|
137
|
-
"./src/examples/js/tsconfig.json"
|
|
138
|
-
]
|
|
139
|
-
}
|
|
140
|
-
},
|
|
141
|
-
{
|
|
142
|
-
"files": [
|
|
143
|
-
"src/pkg/index.ts",
|
|
144
|
-
"src/test/display.ts",
|
|
145
|
-
"src/test/integration.ts"
|
|
146
|
-
],
|
|
147
|
-
"rules": {
|
|
148
|
-
"no-control-regex": "off",
|
|
149
|
-
"@typescript-eslint/no-empty-interface": "off",
|
|
150
|
-
"@typescript-eslint/no-shadow": "off",
|
|
151
|
-
"@typescript-eslint/no-unsafe-declaration-merging": "off"
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
"files": [
|
|
156
|
-
"src/pkg/addon.ts"
|
|
157
|
-
],
|
|
158
|
-
"rules": {
|
|
159
|
-
"@typescript-eslint/no-var-requires": "off"
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
"files": [
|
|
164
|
-
"src/test/benchmark*.ts"
|
|
165
|
-
],
|
|
166
|
-
"rules": {
|
|
167
|
-
"@typescript-eslint/no-unused-vars": "off",
|
|
168
|
-
"@typescript-eslint/no-redundant-type-constituents": "off"
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
"files": [
|
|
173
|
-
"src/pkg/protocol.test.ts"
|
|
174
|
-
],
|
|
175
|
-
"rules": {
|
|
176
|
-
"jest/no-standalone-expect": "off",
|
|
177
|
-
"jest/no-conditional-expect": "off"
|
|
178
|
-
}
|
|
179
|
-
},
|
|
180
|
-
{
|
|
181
|
-
"files": [
|
|
182
|
-
"src/test/*.test.ts",
|
|
183
|
-
"src/test/regression/*.test.ts"
|
|
184
|
-
],
|
|
185
|
-
"rules": {
|
|
186
|
-
"jest/no-standalone-expect": "off"
|
|
187
|
-
}
|
|
188
|
-
},
|
|
189
|
-
{
|
|
190
|
-
"files": [
|
|
191
|
-
"src/test/showdown/**"
|
|
192
|
-
],
|
|
193
|
-
"rules": {
|
|
194
|
-
"jest/expect-expect": [
|
|
195
|
-
"warn",
|
|
196
|
-
{
|
|
197
|
-
"assertFunctionNames": [
|
|
198
|
-
"expect",
|
|
199
|
-
"expectLog",
|
|
200
|
-
"verify"
|
|
201
|
-
]
|
|
202
|
-
}
|
|
203
|
-
]
|
|
204
|
-
}
|
|
205
|
-
},
|
|
206
|
-
{
|
|
207
|
-
"files": [
|
|
208
|
-
"src/tools/generate.ts"
|
|
209
|
-
],
|
|
210
|
-
"rules": {
|
|
211
|
-
"@typescript-eslint/restrict-template-expressions": [
|
|
212
|
-
"error",
|
|
213
|
-
{
|
|
214
|
-
"allowBoolean": true
|
|
215
|
-
}
|
|
216
|
-
]
|
|
217
|
-
}
|
|
218
|
-
}
|
|
219
|
-
]
|
|
220
149
|
}
|
|
221
150
|
}
|
|
@@ -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);
|
|
@@ -255,7 +257,7 @@ const downloadImportLib = async () => {
|
|
|
255
257
|
}
|
|
256
258
|
|
|
257
259
|
const dir = path.join(ROOT, 'build', 'lib');
|
|
258
|
-
const url =
|
|
260
|
+
const url = process.release.libUrl;
|
|
259
261
|
const dest = path.join(dir, path.basename(url));
|
|
260
262
|
if (fs.existsSync(path.join(dest))) {
|
|
261
263
|
log('Node import library:', dest);
|
|
@@ -283,19 +285,19 @@ const downloadImportLib = async () => {
|
|
|
283
285
|
let error = false;
|
|
284
286
|
for (let i = 2; i < process.argv.length; i++) {
|
|
285
287
|
switch (process.argv[i]) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
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
|
+
}
|
|
299
301
|
}
|
|
300
302
|
}
|
|
301
303
|
if (error) {
|
|
@@ -370,8 +372,10 @@ const downloadImportLib = async () => {
|
|
|
370
372
|
const args = ['build', '-p', 'build', ...opts];
|
|
371
373
|
if (!process.env.DEBUG_PKMN_ENGINE) args.push('-Doptimize=ReleaseFast', '-Dstrip');
|
|
372
374
|
if (config.type === 'node') {
|
|
373
|
-
args.push(`-Dnode-headers=${headers}`);
|
|
374
|
-
if (process.platform === 'win32')
|
|
375
|
+
args.push(`-Dnode-headers=${path.relative(ROOT, headers)}`);
|
|
376
|
+
if (process.platform === 'win32') {
|
|
377
|
+
args.push(`-Dnode-import-library=${path.relative(ROOT, lib)}`);
|
|
378
|
+
}
|
|
375
379
|
} else {
|
|
376
380
|
args.push('-Dwasm');
|
|
377
381
|
}
|
|
@@ -386,8 +390,14 @@ const downloadImportLib = async () => {
|
|
|
386
390
|
const prefix = process.platform === 'win32' ? '' : 'lib';
|
|
387
391
|
const ext = process.platform === 'darwin'
|
|
388
392
|
? 'dylib' : process.platform === 'win32' ? 'dll' : 'so';
|
|
389
|
-
|
|
390
|
-
|
|
393
|
+
try {
|
|
394
|
+
const actual = path.join(ROOT, 'build', 'lib', `${prefix}pkmn${suffix}.node.${ext}`);
|
|
395
|
+
fs.renameSync(actual, artifact);
|
|
396
|
+
} catch {
|
|
397
|
+
// ziglang/zig#19743 changed this path
|
|
398
|
+
const actual = path.join(ROOT, 'build', 'bin', `${prefix}pkmn${suffix}.node.${ext}`);
|
|
399
|
+
fs.renameSync(actual, artifact);
|
|
400
|
+
}
|
|
391
401
|
}
|
|
392
402
|
}
|
|
393
403
|
})().catch(e => {
|
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) {
|
|
@@ -1,7 +1,6 @@
|
|
|
1
|
-
const std = @import("std");
|
|
2
|
-
const pkmn = @import("../pkmn.zig");
|
|
3
|
-
|
|
4
1
|
const js = @import("../common/js.zig");
|
|
2
|
+
const pkmn = @import("../pkmn.zig");
|
|
3
|
+
const std = @import("std");
|
|
5
4
|
|
|
6
5
|
const assert = std.debug.assert;
|
|
7
6
|
|
|
@@ -10,16 +9,8 @@ const c = @cImport({
|
|
|
10
9
|
@cInclude("node_api.h");
|
|
11
10
|
});
|
|
12
11
|
|
|
13
|
-
export fn napi_register_module_v1(env: c.napi_env, exports: c.napi_value) c.napi_value {
|
|
14
|
-
const properties = [_]c.napi_property_descriptor{
|
|
15
|
-
js.Property.init("engine", .{ .value = register(env) }),
|
|
16
|
-
};
|
|
17
|
-
assert(c.napi_define_properties(env, exports, properties.len, &properties) == c.napi_ok);
|
|
18
|
-
return exports;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
12
|
pub fn register(env: c.napi_env) c.napi_value {
|
|
22
|
-
|
|
13
|
+
const object = js.Object.init(env);
|
|
23
14
|
const properties = [_]c.napi_property_descriptor{
|
|
24
15
|
js.Property.init("options", .{ .value = options(env) }),
|
|
25
16
|
js.Property.init("bindings", .{ .value = bindings(env) }),
|
|
@@ -29,7 +20,7 @@ pub fn register(env: c.napi_env) c.napi_value {
|
|
|
29
20
|
}
|
|
30
21
|
|
|
31
22
|
fn options(env: c.napi_env) c.napi_value {
|
|
32
|
-
|
|
23
|
+
const object = js.Object.init(env);
|
|
33
24
|
const properties = [_]c.napi_property_descriptor{
|
|
34
25
|
js.Property.init("showdown", .{ .value = js.Boolean.init(env, pkmn.options.showdown) }),
|
|
35
26
|
js.Property.init("log", .{ .value = js.Boolean.init(env, pkmn.options.log) }),
|
|
@@ -41,7 +32,7 @@ fn options(env: c.napi_env) c.napi_value {
|
|
|
41
32
|
}
|
|
42
33
|
|
|
43
34
|
fn bindings(env: c.napi_env) c.napi_value {
|
|
44
|
-
|
|
35
|
+
const array = js.Array.init(env, .{ .length = 1 });
|
|
45
36
|
js.Array.set(env, array, 0, bind(env, pkmn.gen1));
|
|
46
37
|
return array;
|
|
47
38
|
}
|
|
@@ -49,7 +40,7 @@ fn bindings(env: c.napi_env) c.napi_value {
|
|
|
49
40
|
fn bind(env: c.napi_env, gen: anytype) c.napi_value {
|
|
50
41
|
const choices_size: u32 = @intCast(gen.CHOICES_SIZE);
|
|
51
42
|
const logs_size: u32 = @intCast(gen.LOGS_SIZE);
|
|
52
|
-
|
|
43
|
+
const object = js.Object.init(env);
|
|
53
44
|
const properties = [_]c.napi_property_descriptor{
|
|
54
45
|
js.Property.init("CHOICES_SIZE", .{ .value = js.Number.init(env, choices_size) }),
|
|
55
46
|
js.Property.init("LOGS_SIZE", .{ .value = js.Number.init(env, logs_size) }),
|
|
@@ -72,7 +63,6 @@ fn update(gen: anytype) c.napi_callback {
|
|
|
72
63
|
var len: usize = 0;
|
|
73
64
|
assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
|
|
74
65
|
assert(len == @sizeOf(gen.Battle(gen.PRNG)));
|
|
75
|
-
assert(data != null);
|
|
76
66
|
|
|
77
67
|
var battle: *gen.Battle(gen.PRNG) = @alignCast(@ptrCast(data.?));
|
|
78
68
|
const c1: pkmn.Choice = @bitCast(js.Number.get(env, argv[1], u8));
|
|
@@ -85,9 +75,8 @@ fn update(gen: anytype) c.napi_callback {
|
|
|
85
75
|
else => result: {
|
|
86
76
|
assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
|
|
87
77
|
assert(len == gen.LOGS_SIZE);
|
|
88
|
-
assert(data != null);
|
|
89
78
|
|
|
90
|
-
|
|
79
|
+
const buf = @as([*]u8, @ptrCast(data.?))[0..gen.LOGS_SIZE];
|
|
91
80
|
var stream: pkmn.protocol.ByteStream = .{ .buffer = buf };
|
|
92
81
|
// TODO: extract out
|
|
93
82
|
var opts = pkmn.battle.options(
|
|
@@ -116,7 +105,6 @@ fn choices(gen: anytype) c.napi_callback {
|
|
|
116
105
|
var len: usize = 0;
|
|
117
106
|
assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
|
|
118
107
|
assert(len == @sizeOf(gen.Battle(gen.PRNG)));
|
|
119
|
-
assert(data != null);
|
|
120
108
|
|
|
121
109
|
var battle: *gen.Battle(gen.PRNG) = @alignCast(@ptrCast(data.?));
|
|
122
110
|
const player: pkmn.Player = @enumFromInt(js.Number.get(env, argv[1], u8));
|
|
@@ -124,9 +112,8 @@ fn choices(gen: anytype) c.napi_callback {
|
|
|
124
112
|
|
|
125
113
|
assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
|
|
126
114
|
assert(len == gen.CHOICES_SIZE);
|
|
127
|
-
assert(data != null);
|
|
128
115
|
|
|
129
|
-
|
|
116
|
+
const out = @as([*]pkmn.Choice, @ptrCast(data.?))[0..gen.CHOICES_SIZE];
|
|
130
117
|
const n = battle.choices(player, request, out);
|
|
131
118
|
return js.Number.init(env, @as(u8, @bitCast(n)));
|
|
132
119
|
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
const pkmn = @import("../pkmn.zig");
|
|
2
|
+
const std = @import("std");
|
|
3
|
+
|
|
4
|
+
const assert = std.debug.assert;
|
|
5
|
+
|
|
6
|
+
const Enum = if (@hasField(std.builtin.Type, "enum")) .@"enum" else .Enum;
|
|
7
|
+
|
|
8
|
+
pub const options = pkmn.options;
|
|
9
|
+
|
|
10
|
+
pub fn gen(comptime num: comptime_int) type {
|
|
11
|
+
const g = @field(pkmn, "gen" ++ std.fmt.comptimePrint("{d}", .{num}));
|
|
12
|
+
return struct {
|
|
13
|
+
pub const CHOICES_SIZE = size(g.CHOICES_SIZE);
|
|
14
|
+
pub const LOGS_SIZE = size(g.LOGS_SIZE);
|
|
15
|
+
|
|
16
|
+
pub fn update(
|
|
17
|
+
battle: *g.Battle(g.PRNG),
|
|
18
|
+
c1: pkmn.Choice,
|
|
19
|
+
c2: pkmn.Choice,
|
|
20
|
+
options_: ?[*]u8,
|
|
21
|
+
) callconv(.C) pkmn.Result {
|
|
22
|
+
return (if (options_) |o| result: {
|
|
23
|
+
const buf = @as([*]u8, @ptrCast(o))[0..g.LOGS_SIZE];
|
|
24
|
+
var stream: pkmn.protocol.ByteStream = .{ .buffer = buf };
|
|
25
|
+
// TODO: extract out
|
|
26
|
+
var opts = pkmn.battle.options(
|
|
27
|
+
pkmn.protocol.FixedLog{ .writer = stream.writer() },
|
|
28
|
+
g.chance.NULL,
|
|
29
|
+
g.calc.NULL,
|
|
30
|
+
);
|
|
31
|
+
break :result battle.update(c1, c2, &opts);
|
|
32
|
+
} else battle.update(c1, c2, &g.NULL)) catch unreachable;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
pub fn choices(
|
|
36
|
+
battle: *g.Battle(g.PRNG),
|
|
37
|
+
player: u8,
|
|
38
|
+
request: u8,
|
|
39
|
+
buf: [*]u8,
|
|
40
|
+
) callconv(.C) u8 {
|
|
41
|
+
assert(player <= @field(@typeInfo(pkmn.Player), @tagName(Enum)).fields.len);
|
|
42
|
+
assert(request <= @field(@typeInfo(pkmn.Choice.Type), @tagName(Enum)).fields.len);
|
|
43
|
+
|
|
44
|
+
const n = CHOICES_SIZE;
|
|
45
|
+
return battle.choices(@enumFromInt(player), @enumFromInt(request), @ptrCast(buf[0..n]));
|
|
46
|
+
}
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
pub fn exports() type {
|
|
51
|
+
@export(gen(1).update, .{ .name = "GEN1_update", .linkage = .Strong });
|
|
52
|
+
@export(gen(1).choices, .{ .name = "GEN1_choices", .linkage = .Strong });
|
|
53
|
+
return struct {};
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
fn size(n: usize) u32 {
|
|
57
|
+
return std.math.ceilPowerOfTwo(u32, @as(u32, @intCast(n))) catch unreachable;
|
|
58
|
+
}
|
|
@@ -0,0 +1,77 @@
|
|
|
1
|
+
const std = @import("std");
|
|
2
|
+
|
|
3
|
+
const expectEqual = std.testing.expectEqual;
|
|
4
|
+
const assert = std.debug.assert;
|
|
5
|
+
|
|
6
|
+
const Int = if (@hasField(std.builtin.Type, "int")) .int else .Int;
|
|
7
|
+
const Enum = if (@hasField(std.builtin.Type, "enum")) .@"enum" else .Enum;
|
|
8
|
+
|
|
9
|
+
/// Helpers for working with bit-packed arrays of non-powers-of-2 types.
|
|
10
|
+
/// NOTE: ziglang/zig#12547
|
|
11
|
+
pub fn Array(comptime n: comptime_int, comptime U: type) type {
|
|
12
|
+
return struct {
|
|
13
|
+
const size = @bitSizeOf(U);
|
|
14
|
+
const options = .{ .signedness = .unsigned, .bits = size * n };
|
|
15
|
+
pub const T = @Type(if (@hasField(std.builtin.Type, "int"))
|
|
16
|
+
.{ .int = options }
|
|
17
|
+
else
|
|
18
|
+
.{ .Int = options });
|
|
19
|
+
|
|
20
|
+
/// Returns the value stored at index `i` in the array `a`.
|
|
21
|
+
pub fn get(a: T, i: usize) U {
|
|
22
|
+
assert(i < n);
|
|
23
|
+
const shift = i * size;
|
|
24
|
+
const mask: T = (1 << size) - 1;
|
|
25
|
+
const result = (a >> @intCast(shift)) & mask;
|
|
26
|
+
return switch (@typeInfo(U)) {
|
|
27
|
+
Enum => @enumFromInt(result),
|
|
28
|
+
Int => @intCast(result),
|
|
29
|
+
else => unreachable,
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/// Sets the value at index `i` to `val` in the array `a`.
|
|
34
|
+
pub fn set(a: T, i: usize, val: U) T {
|
|
35
|
+
assert(i < n);
|
|
36
|
+
const v: T = switch (@typeInfo(U)) {
|
|
37
|
+
Enum => @intFromEnum(val),
|
|
38
|
+
Int => @intCast(val),
|
|
39
|
+
else => unreachable,
|
|
40
|
+
};
|
|
41
|
+
const shift = i * size;
|
|
42
|
+
const mask: T = @as(T, @intCast((1 << size) - 1)) << @intCast(shift);
|
|
43
|
+
const result: T = a & ~mask;
|
|
44
|
+
return result | (v << @intCast(shift));
|
|
45
|
+
}
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
test Array {
|
|
50
|
+
const A = Array(5, u8);
|
|
51
|
+
var a: A.T = 0;
|
|
52
|
+
try expectEqual(u40, @TypeOf(a));
|
|
53
|
+
|
|
54
|
+
a = A.set(a, 4, 241);
|
|
55
|
+
try expectEqual(@as(u8, 241), A.get(a, 4));
|
|
56
|
+
a = A.set(a, 4, 1);
|
|
57
|
+
try expectEqual(@as(u8, 1), A.get(a, 4));
|
|
58
|
+
|
|
59
|
+
for (0..5) |i| a = A.set(a, i, @intCast(i));
|
|
60
|
+
for (0..5) |i| try expectEqual(@as(u8, @intCast(i)), A.get(a, i));
|
|
61
|
+
|
|
62
|
+
const Optional = @import("optional.zig").Optional;
|
|
63
|
+
|
|
64
|
+
const B = Array(4, Optional(bool));
|
|
65
|
+
var b: B.T = 0;
|
|
66
|
+
try expectEqual(u8, @TypeOf(b));
|
|
67
|
+
|
|
68
|
+
b = B.set(b, 2, .true);
|
|
69
|
+
try expectEqual(Optional(bool).None, B.get(b, 1));
|
|
70
|
+
try expectEqual(Optional(bool).true, B.get(b, 2));
|
|
71
|
+
try expectEqual(@as(u8, 0b00100000), b);
|
|
72
|
+
b = B.set(b, 2, .None);
|
|
73
|
+
b = B.set(b, 0, .false);
|
|
74
|
+
try expectEqual(Optional(bool).None, B.get(b, 2));
|
|
75
|
+
try expectEqual(Optional(bool).false, B.get(b, 0));
|
|
76
|
+
try expectEqual(@as(u8, 0b0000001), b);
|
|
77
|
+
}
|
package/src/lib/common/data.zig
CHANGED
|
@@ -9,12 +9,12 @@ pub const Player = enum(u1) {
|
|
|
9
9
|
P2,
|
|
10
10
|
|
|
11
11
|
/// Returns a player's opponent.
|
|
12
|
-
pub
|
|
12
|
+
pub fn foe(self: Player) Player {
|
|
13
13
|
return @enumFromInt(~@intFromEnum(self));
|
|
14
14
|
}
|
|
15
15
|
|
|
16
16
|
/// Return's an identifier for the player's Pokémon at the one-indexed `id`.
|
|
17
|
-
pub
|
|
17
|
+
pub fn ident(self: Player, id: u3) ID {
|
|
18
18
|
assert(id > 0 and id <= 6);
|
|
19
19
|
return .{ .id = id, .player = self };
|
|
20
20
|
}
|
|
@@ -35,12 +35,12 @@ pub const ID = packed struct(u8) {
|
|
|
35
35
|
_: u4 = 0,
|
|
36
36
|
|
|
37
37
|
/// Converts the identifier into a number.
|
|
38
|
-
pub
|
|
38
|
+
pub fn int(self: ID) u4 {
|
|
39
39
|
return @intCast(@as(u8, @bitCast(self)));
|
|
40
40
|
}
|
|
41
41
|
|
|
42
42
|
/// Decodes the identifier from a number.
|
|
43
|
-
pub
|
|
43
|
+
pub fn from(id: u4) ID {
|
|
44
44
|
return @bitCast(@as(u8, id));
|
|
45
45
|
}
|
|
46
46
|
};
|
|
@@ -76,8 +76,8 @@ test Choice {
|
|
|
76
76
|
const p2: Choice = .{ .type = .Switch, .data = 5 };
|
|
77
77
|
try expectEqual(5, p2.data);
|
|
78
78
|
try expectEqual(Choice.Type.Move, p1.type);
|
|
79
|
-
try expectEqual(0b0001_0001, @as(u8, @bitCast(p1)));
|
|
80
|
-
try expectEqual(0b0001_0110, @as(u8, @bitCast(p2)));
|
|
79
|
+
try expectEqual(@as(u8, 0b0001_0001), @as(u8, @bitCast(p1)));
|
|
80
|
+
try expectEqual(@as(u8, 0b0001_0110), @as(u8, @bitCast(p2)));
|
|
81
81
|
}
|
|
82
82
|
|
|
83
83
|
/// The result of the battle - all results other than 'None' should be considered terminal.
|
|
@@ -112,6 +112,6 @@ pub const Result = packed struct(u8) {
|
|
|
112
112
|
};
|
|
113
113
|
|
|
114
114
|
test Result {
|
|
115
|
-
try expectEqual(0b0101_0000, @as(u8, @bitCast(Result.Default)));
|
|
116
|
-
try expectEqual(0b1000_0000, @as(u8, @bitCast(Result{ .p2 = .Switch })));
|
|
115
|
+
try expectEqual(@as(u8, 0b0101_0000), @as(u8, @bitCast(Result.Default)));
|
|
116
|
+
try expectEqual(@as(u8, 0b1000_0000), @as(u8, @bitCast(Result{ .p2 = .Switch })));
|
|
117
117
|
}
|