@pkmn/engine 0.1.0-dev.d716e940 → 0.1.0-dev.d73cd76c
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 +114 -69
- 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 +110 -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 +26 -4
- package/build/pkg/addon.js +39 -70
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data/ids.json +12 -12
- package/build/pkg/data/layout.json +39 -4
- package/build/pkg/data/protocol.json +84 -13
- package/build/pkg/data.d.ts +27 -5
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +15 -18
- package/build/pkg/gen1.js +43 -37
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +42 -91
- package/build/pkg/index.js +23 -70
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +29 -1
- package/build/pkg/protocol.js +123 -102
- package/build/pkg/protocol.js.map +1 -1
- package/build/tools/debug.js +84 -73
- package/build/tools/debug.js.map +1 -1
- package/build/tools/display/debug.jsx +66 -0
- package/build/tools/display/debug.jsx.map +1 -0
- package/build/tools/display/index.js +152 -0
- package/build/tools/display/index.js.map +1 -0
- package/build/tools/display/ui.jsx +360 -0
- package/build/tools/display/ui.jsx.map +1 -0
- package/build/tools/display/util.js +157 -0
- package/build/tools/display/util.js.map +1 -0
- package/build.zig +428 -176
- package/package.json +72 -122
- package/src/bin/install-pkmn-engine +56 -25
- package/src/bin/pkmn-debug +1 -1
- package/src/lib/bindings/c.zig +201 -0
- package/src/lib/bindings/node.zig +117 -0
- package/src/lib/bindings/wasm.zig +51 -0
- package/src/lib/common/array.zig +70 -0
- package/src/lib/common/battle.zig +17 -0
- package/src/lib/common/data.zig +19 -31
- package/src/lib/common/debug.zig +58 -33
- package/src/lib/common/js.zig +114 -0
- package/src/lib/common/optional.zig +71 -0
- package/src/lib/common/options.zig +15 -0
- package/src/lib/common/protocol.zig +1037 -462
- package/src/lib/common/rational.zig +440 -0
- package/src/lib/common/rng.zig +31 -24
- package/src/lib/common/util.zig +64 -0
- package/src/lib/gen1/calc.zig +975 -0
- package/src/lib/gen1/chance.zig +1246 -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 +12 -13
- package/src/lib/gen1/data.zig +98 -89
- package/src/lib/gen1/helpers.zig +159 -51
- package/src/lib/gen1/mechanics.zig +1211 -846
- package/src/lib/gen2/calc.zig +150 -0
- package/src/lib/gen2/chance.zig +914 -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 +141 -36
- package/src/lib/gen2/data.zig +136 -100
- package/src/lib/gen2/generated.zig +801 -0
- package/src/lib/gen2/helpers.zig +81 -58
- package/src/lib/gen2/mechanics.zig +3582 -30
- package/src/lib/napi.h +2 -0
- package/src/lib/node.zig +14 -0
- package/src/lib/pkmn.zig +172 -17
- package/src/lib/wasm.zig +13 -0
- package/src/tools/display/dom.ts +108 -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/node.zig +0 -229
- package/src/lib/binding/wasm.zig +0 -10
- package/src/lib/gen1/README.md +0 -812
- package/src/lib/gen2/README.md +0 -309
- 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.d73cd76c",
|
|
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,33 +39,54 @@
|
|
|
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/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",
|
|
37
57
|
"src/lib/common/data.zig",
|
|
38
58
|
"src/lib/common/debug.zig",
|
|
59
|
+
"src/lib/common/js.zig",
|
|
60
|
+
"src/lib/common/optional.zig",
|
|
39
61
|
"src/lib/common/options.zig",
|
|
40
62
|
"src/lib/common/protocol.zig",
|
|
63
|
+
"src/lib/common/rational.zig",
|
|
41
64
|
"src/lib/common/rng.zig",
|
|
65
|
+
"src/lib/common/util.zig",
|
|
66
|
+
"src/lib/gen1/calc.zig",
|
|
67
|
+
"src/lib/gen1/chance.zig",
|
|
42
68
|
"src/lib/gen1/data.zig",
|
|
43
69
|
"src/lib/gen1/data/moves.zig",
|
|
44
70
|
"src/lib/gen1/data/species.zig",
|
|
45
71
|
"src/lib/gen1/data/types.zig",
|
|
46
72
|
"src/lib/gen1/helpers.zig",
|
|
47
73
|
"src/lib/gen1/mechanics.zig",
|
|
74
|
+
"src/lib/gen2/calc.zig",
|
|
75
|
+
"src/lib/gen2/chance.zig",
|
|
48
76
|
"src/lib/gen2/data.zig",
|
|
49
77
|
"src/lib/gen2/data/items.zig",
|
|
50
78
|
"src/lib/gen2/data/moves.zig",
|
|
51
79
|
"src/lib/gen2/data/species.zig",
|
|
52
80
|
"src/lib/gen2/data/types.zig",
|
|
81
|
+
"src/lib/gen2/generated.zig",
|
|
53
82
|
"src/lib/gen2/helpers.zig",
|
|
54
83
|
"src/lib/gen2/mechanics.zig",
|
|
84
|
+
"src/lib/napi.h",
|
|
85
|
+
"src/lib/node.zig",
|
|
55
86
|
"src/lib/pkmn.zig",
|
|
56
|
-
"src/
|
|
87
|
+
"src/lib/wasm.zig",
|
|
88
|
+
"src/tools/display/dom.ts",
|
|
89
|
+
"src/tools/display/ui.css"
|
|
57
90
|
],
|
|
58
91
|
"engines": {
|
|
59
92
|
"node": ">=16.0.0"
|
|
@@ -66,138 +99,55 @@
|
|
|
66
99
|
"access": "public"
|
|
67
100
|
},
|
|
68
101
|
"dependencies": {
|
|
69
|
-
"@pkmn/data": "
|
|
70
|
-
"@pkmn/protocol": "^0.
|
|
102
|
+
"@pkmn/data": "0.9.35",
|
|
103
|
+
"@pkmn/protocol": "^0.7.3"
|
|
71
104
|
},
|
|
72
105
|
"devDependencies": {
|
|
73
|
-
"@pkmn/
|
|
74
|
-
"@pkmn/
|
|
75
|
-
"@pkmn/
|
|
76
|
-
"@pkmn/
|
|
77
|
-
"@
|
|
78
|
-
"@
|
|
79
|
-
"@types/
|
|
80
|
-
"@types/
|
|
81
|
-
"@types/
|
|
82
|
-
"@
|
|
83
|
-
"
|
|
84
|
-
"
|
|
106
|
+
"@pkmn/dex-types": "0.9.35",
|
|
107
|
+
"@pkmn/eslint-config": "^9.28.0",
|
|
108
|
+
"@pkmn/img": "^0.3.4",
|
|
109
|
+
"@pkmn/sets": "^5.2.0",
|
|
110
|
+
"@pkmn/sim": "0.9.31",
|
|
111
|
+
"@pkmn/smogon": "0.5.21",
|
|
112
|
+
"@types/html-minifier": "^4.0.6",
|
|
113
|
+
"@types/jest": "^30.0.0",
|
|
114
|
+
"@types/minimist": "^1.2.5",
|
|
115
|
+
"@types/mustache": "^4.2.6",
|
|
116
|
+
"@types/node": "^26.0.0",
|
|
117
|
+
"@types/react": "^19.2.17",
|
|
118
|
+
"@types/semver": "^7.7.1",
|
|
119
|
+
"@types/vscode": "^1.125.0",
|
|
120
|
+
"@vitest/coverage-v8": "^4.1.9",
|
|
121
|
+
"@vscode/vsce": "^3.9.2",
|
|
122
|
+
"binaryen": "^130.0.0",
|
|
123
|
+
"esbuild": "^0.28.1",
|
|
124
|
+
"eslint": "<10",
|
|
85
125
|
"html-minifier": "^4.0.0",
|
|
86
|
-
"json-stringify-pretty-compact": "
|
|
126
|
+
"json-stringify-pretty-compact": "3.0.0",
|
|
87
127
|
"minimist": "^1.2.8",
|
|
88
128
|
"mustache": "^4.2.0",
|
|
129
|
+
"semver": "^7.8.5",
|
|
89
130
|
"source-map-support": "^0.5.21",
|
|
131
|
+
"table": "^6.9.0",
|
|
90
132
|
"trakr": "^0.2.0",
|
|
91
|
-
"typescript": "^
|
|
92
|
-
"vitest": "^
|
|
133
|
+
"typescript": "^6.0.3",
|
|
134
|
+
"vitest": "^4.1.9"
|
|
93
135
|
},
|
|
94
136
|
"scripts": {
|
|
95
|
-
"lint": "eslint --cache src
|
|
96
|
-
"fix": "eslint --fix src
|
|
137
|
+
"lint": "eslint --cache src",
|
|
138
|
+
"fix": "eslint --fix src",
|
|
97
139
|
"compile": "tsc -p .",
|
|
98
140
|
"build": "npm run compile",
|
|
99
141
|
"test": "vitest src/pkg",
|
|
100
142
|
"test:integration": "vitest src/test",
|
|
101
143
|
"debug": "npm run compile && node build/tools/debug",
|
|
144
|
+
"demo": "npm run compile && node build/tools/demo",
|
|
102
145
|
"fuzz": "npm run compile && node build/test/fuzz",
|
|
103
146
|
"generate": "npm run compile && node build/tools/generate",
|
|
104
147
|
"release": "npm run compile && node build/tools/release",
|
|
105
148
|
"benchmark": "npm run compile && node build/test/benchmark",
|
|
106
149
|
"integration": "npm run compile && node build/test/integration",
|
|
150
|
+
"extension": "npm -C src/tools/vscode run build",
|
|
107
151
|
"postinstall": "node src/bin/install-pkmn-engine"
|
|
108
|
-
},
|
|
109
|
-
"eslintConfig": {
|
|
110
|
-
"extends": "@pkmn",
|
|
111
|
-
"ignorePatterns": [
|
|
112
|
-
"dist/",
|
|
113
|
-
"node_modules/",
|
|
114
|
-
"src/examples/zig",
|
|
115
|
-
"build/"
|
|
116
|
-
],
|
|
117
|
-
"env": {
|
|
118
|
-
"es6": true,
|
|
119
|
-
"node": true,
|
|
120
|
-
"browser": true
|
|
121
|
-
},
|
|
122
|
-
"overrides": [
|
|
123
|
-
{
|
|
124
|
-
"files": [
|
|
125
|
-
"**/*.ts"
|
|
126
|
-
],
|
|
127
|
-
"parserOptions": {
|
|
128
|
-
"project": [
|
|
129
|
-
"./tsconfig.json",
|
|
130
|
-
"./src/examples/js/tsconfig.json"
|
|
131
|
-
]
|
|
132
|
-
}
|
|
133
|
-
},
|
|
134
|
-
{
|
|
135
|
-
"files": [
|
|
136
|
-
"src/pkg/index.ts",
|
|
137
|
-
"src/test/display.ts",
|
|
138
|
-
"src/test/integration.ts"
|
|
139
|
-
],
|
|
140
|
-
"rules": {
|
|
141
|
-
"no-control-regex": "off",
|
|
142
|
-
"@typescript-eslint/no-empty-interface": "off",
|
|
143
|
-
"@typescript-eslint/no-shadow": "off"
|
|
144
|
-
}
|
|
145
|
-
},
|
|
146
|
-
{
|
|
147
|
-
"files": [
|
|
148
|
-
"src/pkg/addon.ts"
|
|
149
|
-
],
|
|
150
|
-
"rules": {
|
|
151
|
-
"@typescript-eslint/no-var-requires": "off"
|
|
152
|
-
}
|
|
153
|
-
},
|
|
154
|
-
{
|
|
155
|
-
"files": [
|
|
156
|
-
"src/test/benchmark*.ts"
|
|
157
|
-
],
|
|
158
|
-
"rules": {
|
|
159
|
-
"@typescript-eslint/no-unused-vars": "off"
|
|
160
|
-
}
|
|
161
|
-
},
|
|
162
|
-
{
|
|
163
|
-
"files": [
|
|
164
|
-
"src/test/*.test.ts",
|
|
165
|
-
"src/test/regression/*.test.ts"
|
|
166
|
-
],
|
|
167
|
-
"rules": {
|
|
168
|
-
"jest/no-standalone-expect": "off"
|
|
169
|
-
}
|
|
170
|
-
},
|
|
171
|
-
{
|
|
172
|
-
"files": [
|
|
173
|
-
"src/test/showdown/**"
|
|
174
|
-
],
|
|
175
|
-
"rules": {
|
|
176
|
-
"jest/expect-expect": [
|
|
177
|
-
"warn",
|
|
178
|
-
{
|
|
179
|
-
"assertFunctionNames": [
|
|
180
|
-
"expect",
|
|
181
|
-
"expectLog",
|
|
182
|
-
"verify"
|
|
183
|
-
]
|
|
184
|
-
}
|
|
185
|
-
]
|
|
186
|
-
}
|
|
187
|
-
},
|
|
188
|
-
{
|
|
189
|
-
"files": [
|
|
190
|
-
"src/tools/generate.ts"
|
|
191
|
-
],
|
|
192
|
-
"rules": {
|
|
193
|
-
"@typescript-eslint/restrict-template-expressions": [
|
|
194
|
-
"error",
|
|
195
|
-
{
|
|
196
|
-
"allowBoolean": true
|
|
197
|
-
}
|
|
198
|
-
]
|
|
199
|
-
}
|
|
200
|
-
}
|
|
201
|
-
]
|
|
202
152
|
}
|
|
203
153
|
}
|
|
@@ -10,7 +10,7 @@ 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:
|
|
13
|
+
const ZIG_VERSION = {major: 0, minor: 16, 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';
|
|
@@ -111,15 +111,31 @@ const unpack = async (input, output) => {
|
|
|
111
111
|
}
|
|
112
112
|
};
|
|
113
113
|
|
|
114
|
+
const parse = s => {
|
|
115
|
+
try {
|
|
116
|
+
return JSON.parse(s);
|
|
117
|
+
} catch (e) {
|
|
118
|
+
if (!(e instanceof SyntaxError)) throw e;
|
|
119
|
+
const json = s
|
|
120
|
+
// "key": -> "key": (ensures keys are quoted)
|
|
121
|
+
.replace(/\.([a-zA-Z_][a-zA-Z0-9_]*)\s*=/g, '"$1":')
|
|
122
|
+
// .{ -> { (converts ZON struct to JSON object)
|
|
123
|
+
.replace(/\.\{/g, '{')
|
|
124
|
+
// Remove trailing commas, which are invalid in JSON
|
|
125
|
+
.replace(/,\s*([}\]])/g, '$1');
|
|
126
|
+
return JSON.parse(json);
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
|
|
114
130
|
const find = zig => {
|
|
115
131
|
try {
|
|
116
|
-
const {zig_exe, version} =
|
|
132
|
+
const {zig_exe, version} = parse(sh(zig, ['env']));
|
|
117
133
|
const [major, minor, patch, dev] = version.split('.').map(n => parseInt(n));
|
|
118
134
|
|
|
119
135
|
const compatible = major > ZIG_VERSION.major ||
|
|
120
136
|
(major >= ZIG_VERSION.major && minor > ZIG_VERSION.minor) ||
|
|
121
137
|
(major >= ZIG_VERSION.major && minor >= ZIG_VERSION.minor && patch >= ZIG_VERSION.patch &&
|
|
122
|
-
(!ZIG_VERSION.dev || (dev && dev >= ZIG_VERSION.dev)));
|
|
138
|
+
(!ZIG_VERSION.dev || (dev && dev >= parseInt(ZIG_VERSION.dev))));
|
|
123
139
|
|
|
124
140
|
if (compatible) {
|
|
125
141
|
log('Found existing compatible Zig executable:', zig_exe);
|
|
@@ -164,6 +180,7 @@ const install = async () => {
|
|
|
164
180
|
|
|
165
181
|
const index = JSON.parse(await fetch(INDEX));
|
|
166
182
|
const version = Object.keys(index)[+!ZIG_VERSION.dev];
|
|
183
|
+
// const version = VERSION; // TODO
|
|
167
184
|
const release = index[version][`${arch}-${platform}`];
|
|
168
185
|
const url = release.tarball;
|
|
169
186
|
|
|
@@ -255,7 +272,7 @@ const downloadImportLib = async () => {
|
|
|
255
272
|
}
|
|
256
273
|
|
|
257
274
|
const dir = path.join(ROOT, 'build', 'lib');
|
|
258
|
-
const url =
|
|
275
|
+
const url = process.release.libUrl;
|
|
259
276
|
const dest = path.join(dir, path.basename(url));
|
|
260
277
|
if (fs.existsSync(path.join(dest))) {
|
|
261
278
|
log('Node import library:', dest);
|
|
@@ -283,19 +300,19 @@ const downloadImportLib = async () => {
|
|
|
283
300
|
let error = false;
|
|
284
301
|
for (let i = 2; i < process.argv.length; i++) {
|
|
285
302
|
switch (process.argv[i]) {
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
303
|
+
case "--silent": {
|
|
304
|
+
SILENT = true;
|
|
305
|
+
break;
|
|
306
|
+
}
|
|
307
|
+
case "--zig": {
|
|
308
|
+
if (options || only) error = true;
|
|
309
|
+
only = true;
|
|
310
|
+
break;
|
|
311
|
+
}
|
|
312
|
+
default: {
|
|
313
|
+
if (options || only || !process.argv[i].startsWith('--options=')) error = true;
|
|
314
|
+
options = process.argv[i].slice(10).split(' ');
|
|
315
|
+
}
|
|
299
316
|
}
|
|
300
317
|
}
|
|
301
318
|
if (error) {
|
|
@@ -323,6 +340,7 @@ const downloadImportLib = async () => {
|
|
|
323
340
|
const libs = path.join(ROOT, 'build', 'lib');
|
|
324
341
|
if (fs.existsSync(libs)) {
|
|
325
342
|
for (const file of fs.readdirSync(libs)) {
|
|
343
|
+
if (!file.startsWith('pkmn')) continue;
|
|
326
344
|
const type = path.extname(file).slice(1);
|
|
327
345
|
if (type !== 'node' && type !== 'wasm') continue;
|
|
328
346
|
// If we don't copy the addon before loading it Windows will return an
|
|
@@ -336,14 +354,18 @@ const downloadImportLib = async () => {
|
|
|
336
354
|
node = true;
|
|
337
355
|
if (!options) {
|
|
338
356
|
const addon = require(copy);
|
|
339
|
-
if (addon.options.showdown) opts.push('-Dshowdown');
|
|
340
|
-
if (addon.options.log) opts.push('-Dlog');
|
|
357
|
+
if (addon.engine.options.showdown) opts.push('-Dshowdown');
|
|
358
|
+
if (addon.engine.options.log) opts.push('-Dlog');
|
|
359
|
+
if (addon.engine.options.chance) opts.push('-Dchance');
|
|
360
|
+
if (addon.engine.options.calc) opts.push('-Dcalc');
|
|
341
361
|
}
|
|
342
362
|
} else if (!options) {
|
|
343
363
|
const addon = await WebAssembly.instantiate(fs.readFileSync(copy));
|
|
344
364
|
const values = new Uint8Array(addon.instance.exports.memory.buffer);
|
|
345
365
|
if (values[addon.instance.exports.SHOWDOWN.value]) opts.push('-Dshowdown');
|
|
346
366
|
if (values[addon.instance.exports.LOG.value]) opts.push('-Dlog');
|
|
367
|
+
if (values[addon.instance.exports.CHANCE.value]) opts.push('-Dchance');
|
|
368
|
+
if (values[addon.instance.exports.CALC.value]) opts.push('-Dcalc');
|
|
347
369
|
}
|
|
348
370
|
const key = `${type} ${opts.sort().join(' ')}`;
|
|
349
371
|
if (!configs.has(key)) configs.set(key, {type, options: opts});
|
|
@@ -354,8 +376,9 @@ const downloadImportLib = async () => {
|
|
|
354
376
|
// either the default options or whatever was passed in
|
|
355
377
|
if (!configs.size) {
|
|
356
378
|
node = true;
|
|
357
|
-
|
|
358
|
-
configs.set('
|
|
379
|
+
const DEFAULT = ['-Dshowdown'];
|
|
380
|
+
configs.set('node', {type: 'node', options: options || DEFAULT});
|
|
381
|
+
configs.set('wasm', {type: 'wasm', options: options || DEFAULT});
|
|
359
382
|
}
|
|
360
383
|
|
|
361
384
|
const headers = node ? await downloadHeaders() : undefined;
|
|
@@ -365,8 +388,10 @@ const downloadImportLib = async () => {
|
|
|
365
388
|
const args = ['build', '-p', 'build', ...opts];
|
|
366
389
|
if (!process.env.DEBUG_PKMN_ENGINE) args.push('-Doptimize=ReleaseFast', '-Dstrip');
|
|
367
390
|
if (config.type === 'node') {
|
|
368
|
-
args.push(`-Dnode-headers=${headers}`);
|
|
369
|
-
if (process.platform === 'win32')
|
|
391
|
+
args.push(`-Dnode-headers=${path.relative(ROOT, headers)}`);
|
|
392
|
+
if (process.platform === 'win32') {
|
|
393
|
+
args.push(`-Dnode-import-library=${path.relative(ROOT, lib)}`);
|
|
394
|
+
}
|
|
370
395
|
} else {
|
|
371
396
|
args.push('-Dwasm');
|
|
372
397
|
}
|
|
@@ -381,8 +406,14 @@ const downloadImportLib = async () => {
|
|
|
381
406
|
const prefix = process.platform === 'win32' ? '' : 'lib';
|
|
382
407
|
const ext = process.platform === 'darwin'
|
|
383
408
|
? 'dylib' : process.platform === 'win32' ? 'dll' : 'so';
|
|
384
|
-
|
|
385
|
-
|
|
409
|
+
try {
|
|
410
|
+
const actual = path.join(ROOT, 'build', 'lib', `${prefix}pkmn${suffix}.node.${ext}`);
|
|
411
|
+
fs.renameSync(actual, artifact);
|
|
412
|
+
} catch {
|
|
413
|
+
// ziglang/zig#19743 changed this path
|
|
414
|
+
const actual = path.join(ROOT, 'build', 'bin', `${prefix}pkmn${suffix}.node.${ext}`);
|
|
415
|
+
fs.renameSync(actual, artifact);
|
|
416
|
+
}
|
|
386
417
|
}
|
|
387
418
|
}
|
|
388
419
|
})().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) {
|
|
@@ -0,0 +1,201 @@
|
|
|
1
|
+
const pkmn = @import("../pkmn.zig");
|
|
2
|
+
const std = @import("std");
|
|
3
|
+
const util = @import("../common/util.zig");
|
|
4
|
+
|
|
5
|
+
const assert = std.debug.assert;
|
|
6
|
+
|
|
7
|
+
const ERROR: u8 = 0b1100;
|
|
8
|
+
|
|
9
|
+
pub const OPTIONS: extern struct {
|
|
10
|
+
showdown: bool,
|
|
11
|
+
log: bool,
|
|
12
|
+
chance: bool,
|
|
13
|
+
calc: bool,
|
|
14
|
+
} = .{
|
|
15
|
+
.showdown = pkmn.options.showdown,
|
|
16
|
+
.log = pkmn.options.log,
|
|
17
|
+
.chance = pkmn.options.chance,
|
|
18
|
+
.calc = pkmn.options.calc,
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
pub const MAX_CHOICES = pkmn.MAX_CHOICES;
|
|
22
|
+
pub const CHOICES_SIZE = pkmn.CHOICES_SIZE;
|
|
23
|
+
pub const MAX_LOGS = pkmn.MAX_LOGS;
|
|
24
|
+
pub const LOGS_SIZE = pkmn.LOGS_SIZE;
|
|
25
|
+
|
|
26
|
+
pub fn choice_init(choice: u8, data: u8) callconv(.c) u8 {
|
|
27
|
+
assert(choice <= util.EnumFieldsLen(pkmn.Choice.Type));
|
|
28
|
+
assert(data <= 6);
|
|
29
|
+
return @bitCast(pkmn.Choice{ .type = @enumFromInt(choice), .data = @intCast(data) });
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
pub fn choice_type(choice: u8) callconv(.c) u8 {
|
|
33
|
+
return @intFromEnum(@as(pkmn.Choice, @bitCast(choice)).type);
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
pub fn choice_data(choice: u8) callconv(.c) u8 {
|
|
37
|
+
return @as(u8, @as(pkmn.Choice, @bitCast(choice)).data);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
pub fn result_type(result: u8) callconv(.c) u8 {
|
|
41
|
+
return @intFromEnum(@as(pkmn.Result, @bitCast(result)).type);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
pub fn result_p1(result: u8) callconv(.c) u8 {
|
|
45
|
+
assert(!err(result));
|
|
46
|
+
return @intFromEnum(@as(pkmn.Result, @bitCast(result)).p1);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
pub fn result_p2(result: u8) callconv(.c) u8 {
|
|
50
|
+
assert(!err(result));
|
|
51
|
+
return @intFromEnum(@as(pkmn.Result, @bitCast(result)).p2);
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
pub fn err(result: u8) callconv(.c) bool {
|
|
55
|
+
return result == ERROR;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
pub fn psrng_init(prng: *pkmn.PSRNG, seed: u64) callconv(.c) void {
|
|
59
|
+
prng.src = .{ .seed = seed };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
pub fn psrng_next(prng: *pkmn.PSRNG) callconv(.c) u32 {
|
|
63
|
+
return prng.next();
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
pub fn rational_init(rational: *pkmn.Rational(f64)) callconv(.c) void {
|
|
67
|
+
rational.reset();
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
pub fn rational_reduce(rational: *pkmn.Rational(f64)) callconv(.c) void {
|
|
71
|
+
rational.reduce();
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
pub fn rational_numerator(rational: *const pkmn.Rational(f64)) callconv(.c) f64 {
|
|
75
|
+
return rational.p;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
pub fn rational_denominator(rational: *const pkmn.Rational(f64)) callconv(.c) f64 {
|
|
79
|
+
return rational.q;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
const log_options = extern struct {
|
|
83
|
+
buf: [*]u8,
|
|
84
|
+
len: usize,
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
pub fn gen(comptime num: comptime_int) type {
|
|
88
|
+
const g = @field(pkmn, "gen" ++ std.fmt.comptimePrint("{d}", .{num}));
|
|
89
|
+
|
|
90
|
+
return struct {
|
|
91
|
+
pub const MAX_CHOICES = g.MAX_CHOICES;
|
|
92
|
+
pub const CHOICES_SIZE = g.CHOICES_SIZE;
|
|
93
|
+
pub const MAX_LOGS = g.MAX_LOGS;
|
|
94
|
+
pub const LOGS_SIZE = g.LOGS_SIZE;
|
|
95
|
+
|
|
96
|
+
const chance_options = extern struct {
|
|
97
|
+
probability: pkmn.Rational(f64),
|
|
98
|
+
actions: g.chance.Actions,
|
|
99
|
+
durations: g.chance.Durations,
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
const calc_options = extern struct {
|
|
103
|
+
overrides: g.chance.Actions,
|
|
104
|
+
};
|
|
105
|
+
|
|
106
|
+
const battle_options = struct {
|
|
107
|
+
writer: pkmn.protocol.Writer,
|
|
108
|
+
log: pkmn.protocol.FixedLog,
|
|
109
|
+
chance: g.Chance(pkmn.Rational(f64)),
|
|
110
|
+
calc: g.Calc,
|
|
111
|
+
|
|
112
|
+
comptime {
|
|
113
|
+
assert(@sizeOf(battle_options) <= 128);
|
|
114
|
+
}
|
|
115
|
+
};
|
|
116
|
+
|
|
117
|
+
pub fn battle_options_set(
|
|
118
|
+
options: *battle_options,
|
|
119
|
+
log: ?*const log_options,
|
|
120
|
+
chance: ?*const chance_options,
|
|
121
|
+
calc: ?*const calc_options,
|
|
122
|
+
) callconv(.c) void {
|
|
123
|
+
if (pkmn.options.log) {
|
|
124
|
+
if (log) |l| {
|
|
125
|
+
options.writer = .{ .buffer = l.buf[0..l.len] };
|
|
126
|
+
options.log = .{ .writer = &options.writer };
|
|
127
|
+
} else {
|
|
128
|
+
options.writer.reset();
|
|
129
|
+
}
|
|
130
|
+
}
|
|
131
|
+
if (pkmn.options.chance) {
|
|
132
|
+
if (chance) |c| {
|
|
133
|
+
options.chance = .{
|
|
134
|
+
.probability = c.probability,
|
|
135
|
+
.actions = c.actions,
|
|
136
|
+
.durations = c.durations,
|
|
137
|
+
};
|
|
138
|
+
} else {
|
|
139
|
+
options.chance.reset();
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
if (pkmn.options.calc) {
|
|
143
|
+
if (calc) |c| {
|
|
144
|
+
options.calc = .{ .overrides = c.overrides };
|
|
145
|
+
} else {
|
|
146
|
+
options.calc = .{};
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
pub fn battle_options_chance_probability(
|
|
152
|
+
options: *battle_options,
|
|
153
|
+
) callconv(.c) *pkmn.Rational(f64) {
|
|
154
|
+
return &options.chance.probability;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
pub fn battle_options_chance_actions(
|
|
158
|
+
options: *battle_options,
|
|
159
|
+
) callconv(.c) *g.chance.Actions {
|
|
160
|
+
return &options.chance.actions;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
pub fn battle_options_chance_durations(
|
|
164
|
+
options: *battle_options,
|
|
165
|
+
) callconv(.c) *g.chance.Durations {
|
|
166
|
+
return &options.chance.durations;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
pub fn battle_options_calc_summaries(
|
|
170
|
+
options: *battle_options,
|
|
171
|
+
) callconv(.c) *g.calc.Summaries {
|
|
172
|
+
return &options.calc.summaries;
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
pub fn battle_update(
|
|
176
|
+
battle: *g.Battle(g.PRNG),
|
|
177
|
+
c1: pkmn.Choice,
|
|
178
|
+
c2: pkmn.Choice,
|
|
179
|
+
opts: ?*battle_options,
|
|
180
|
+
) callconv(.c) pkmn.Result {
|
|
181
|
+
if ((pkmn.options.log or pkmn.options.chance or pkmn.options.calc) and opts != null) {
|
|
182
|
+
return battle.update(c1, c2, opts.?) catch return @bitCast(ERROR);
|
|
183
|
+
}
|
|
184
|
+
return battle.update(c1, c2, &g.NULL) catch unreachable;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
pub fn battle_choices(
|
|
188
|
+
battle: *const g.Battle(g.PRNG),
|
|
189
|
+
player: u8,
|
|
190
|
+
request: u8,
|
|
191
|
+
out: [*]u8,
|
|
192
|
+
n: usize,
|
|
193
|
+
) callconv(.c) u8 {
|
|
194
|
+
assert(player <= util.EnumFieldsLen(pkmn.Player));
|
|
195
|
+
assert(request <= util.EnumFieldsLen(pkmn.Choice.Type));
|
|
196
|
+
|
|
197
|
+
assert(!pkmn.options.showdown or n > 0);
|
|
198
|
+
return battle.choices(@enumFromInt(player), @enumFromInt(request), @ptrCast(out[0..n]));
|
|
199
|
+
}
|
|
200
|
+
};
|
|
201
|
+
}
|