@pkmn/engine 0.1.0-dev.b01cb48c → 0.1.0-dev.b14f2221
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 -1
- package/README.md +21 -11
- 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 +34 -65
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data/layout.json +15 -2
- package/build/pkg/data/protocol.json +23 -9
- package/build/pkg/data.d.ts +23 -1
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +15 -18
- package/build/pkg/gen1.js +28 -19
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +40 -90
- package/build/pkg/index.js +23 -70
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +20 -1
- package/build/pkg/protocol.js +105 -103
- package/build/pkg/protocol.js.map +1 -1
- package/build/tools/debug.js +68 -74
- package/build/tools/debug.js.map +1 -1
- package/build/tools/display/debug.jsx +152 -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 +359 -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 +255 -102
- package/package.json +59 -138
- package/src/bin/install-pkmn-engine +25 -7
- package/src/bin/pkmn-debug +1 -1
- package/src/lib/bindings/c.zig +200 -0
- package/src/lib/bindings/node.zig +117 -0
- package/src/lib/bindings/wasm.zig +50 -0
- package/src/lib/common/array.zig +70 -0
- package/src/lib/common/data.zig +8 -8
- package/src/lib/common/debug.zig +30 -9
- package/src/lib/common/js.zig +3 -7
- package/src/lib/common/optional.zig +11 -17
- package/src/lib/common/options.zig +4 -0
- package/src/lib/common/protocol.zig +195 -159
- package/src/lib/common/rational.zig +303 -310
- package/src/lib/common/rng.zig +5 -7
- package/src/lib/common/util.zig +33 -1
- package/src/lib/gen1/calc.zig +324 -180
- package/src/lib/gen1/chance.zig +536 -140
- package/src/lib/gen1/data/moves.zig +2 -4
- package/src/lib/gen1/data/species.zig +1 -3
- package/src/lib/gen1/data/types.zig +3 -4
- package/src/lib/gen1/data.zig +40 -43
- package/src/lib/gen1/helpers.zig +17 -29
- package/src/lib/gen1/mechanics.zig +240 -187
- package/src/lib/gen2/calc.zig +35 -28
- package/src/lib/gen2/chance.zig +88 -74
- package/src/lib/gen2/data/items.zig +1 -3
- package/src/lib/gen2/data/moves.zig +2 -4
- package/src/lib/gen2/data/species.zig +1 -3
- package/src/lib/gen2/data/types.zig +7 -5
- package/src/lib/gen2/data.zig +33 -35
- package/src/lib/gen2/generated.zig +18 -23
- package/src/lib/gen2/helpers.zig +9 -20
- package/src/lib/gen2/mechanics.zig +98 -98
- package/src/lib/napi.h +2 -0
- package/src/lib/node.zig +4 -121
- package/src/lib/pkmn.zig +103 -22
- package/src/lib/wasm.zig +9 -9
- package/src/tools/display/dom.ts +93 -0
- package/src/tools/display/ui.css +354 -0
- package/build/test/display.js +0 -405
- package/build/test/display.js.map +0 -1
- package/src/test/display/pkmn.html.tmpl +0 -368
package/LICENSE
CHANGED
package/README.md
CHANGED
|
@@ -20,6 +20,10 @@
|
|
|
20
20
|
> [`old`](https://github.com/pkmn/engine/releases/tag/old) tag can also be used to experiment with a
|
|
21
21
|
> more stable version of the codebase).
|
|
22
22
|
|
|
23
|
+
> [!IMPORTANT]
|
|
24
|
+
> While this project aims to support the most recent stable Zig release and the Zig master branch,
|
|
25
|
+
> **only the Zig master branch is currently supported** due to breaking changes upstream.
|
|
26
|
+
|
|
23
27
|
<hr />
|
|
24
28
|
|
|
25
29
|
A minimal, complete, Pokémon battle simulation engine optimized for performance and
|
|
@@ -57,9 +61,14 @@ $ zig build --prefix /usr/local -Doptimize=ReleaseFast
|
|
|
57
61
|
```
|
|
58
62
|
|
|
59
63
|
The Zig website has [installation instructions](https://ziglang.org/learn/getting-started/) which
|
|
60
|
-
walk through how to install Zig on each platform - the engine code should work on Zig v0.
|
|
64
|
+
walk through how to install Zig on each platform - ~~the engine code should work on Zig v0.14.0,
|
|
61
65
|
though tracks Zig's master branch so this may change in the future if breaking language changes are
|
|
62
|
-
introduced
|
|
66
|
+
introduced~~ the engine code currently only works on the Zig master branch due to breaking language
|
|
67
|
+
changes that have been introduced. Note that **due to a [bug in the Zig
|
|
68
|
+
compiler](https://github.com/ziglang/zig/issues/17768), building a version of [Zig from
|
|
69
|
+
source](https://codeberg.org/ziglang/zig#building-from-source) after having applied a
|
|
70
|
+
[patch](zig.patch) to revert [ziglang/zig#17391](https://github.com/ziglang/zig/pull/17391) is
|
|
71
|
+
recommended for performance**.
|
|
63
72
|
|
|
64
73
|
`libpkmn` can be built with `-Dshowdown` to instead produce the Pokémon Showdown compatible
|
|
65
74
|
`libpkmn-showdown` library. Furthermore, protocol message logging can be enabled through `-Dlog`.
|
|
@@ -92,7 +101,6 @@ To include `pkmn`, add it as a dependency in your project's
|
|
|
92
101
|
Package Management
|
|
93
102
|
system](https://ziglang.org/download/0.11.0/release-notes.html#Package-Management):
|
|
94
103
|
|
|
95
|
-
|
|
96
104
|
```zig
|
|
97
105
|
.dependencies = .{
|
|
98
106
|
.pkmn = .{
|
|
@@ -210,18 +218,19 @@ protocol via `Log.parse`.
|
|
|
210
218
|
```ts
|
|
211
219
|
import {Dex} from '@pkmn/dex';
|
|
212
220
|
import {Generations} from '@pkmn/data';
|
|
213
|
-
import {Battle} from '@pkmn/engine';
|
|
221
|
+
import {Battle, Choice} from '@pkmn/engine';
|
|
214
222
|
|
|
215
223
|
const gens = new Generations(Dex);
|
|
216
224
|
const battle = Battle.create(...);
|
|
217
225
|
|
|
218
|
-
const choose = (
|
|
226
|
+
const choose = (choices: Choice[]) =>
|
|
227
|
+
choices[Math.floor(Math.random() * choices.length)];
|
|
219
228
|
|
|
220
229
|
let result: Result;
|
|
221
230
|
let c1: Choice, c2: Choice;
|
|
222
231
|
while (!(result = battle.update(c1, c2)).type) {
|
|
223
|
-
c1 = battle.
|
|
224
|
-
c2 = battle.
|
|
232
|
+
c1 = choose(battle.choices('p1', result));
|
|
233
|
+
c2 = choose(battle.choices('p2', result));
|
|
225
234
|
}
|
|
226
235
|
|
|
227
236
|
console.log(result);
|
|
@@ -251,14 +260,15 @@ be used when logging is enabled to allow for easily printing e.g. to standard ou
|
|
|
251
260
|
const std = @import("std");
|
|
252
261
|
const pkmn = @import("pkmn");
|
|
253
262
|
|
|
254
|
-
var
|
|
263
|
+
var prng: std.Random.DefaultPrng = .init(seed);
|
|
264
|
+
var random = prng.random();
|
|
255
265
|
var choices: [pkmn.CHOICES_SIZE]pkmn.Choice = undefined;
|
|
256
266
|
|
|
257
267
|
var battle = ...
|
|
258
268
|
var options = pkmn.battle.options(...);
|
|
259
269
|
|
|
260
|
-
var c1 =
|
|
261
|
-
var c2 =
|
|
270
|
+
var c1: pkmn.Choice = .{};
|
|
271
|
+
var c2: pkmn.Choice = .{};
|
|
262
272
|
|
|
263
273
|
var result = try battle.update(c1, c2, &options);
|
|
264
274
|
while (result.type == .None) : (result = try battle.update(c1, c2, &options)) {
|
|
@@ -331,7 +341,7 @@ The engine is currently expected to be developed over multiple stages:
|
|
|
331
341
|
| ***3*** | *modern generations* |
|
|
332
342
|
|
|
333
343
|
Currently, most of the foundational work from stage 0 is done:
|
|
334
|
-
|
|
344
|
+
|
|
335
345
|
- [benchmark and integration testing](src/test) infrastructure
|
|
336
346
|
- [documentation](docs) about design, research, methodology, etc
|
|
337
347
|
- definition and implementation of the [protocol](docs/PROTOCOL.md) that's used by the engine
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.load = load;
|
|
4
|
+
exports.loadSync = loadSync;
|
|
5
|
+
const wasm_1 = require("./wasm");
|
|
6
|
+
async function load(showdown, addon) {
|
|
7
|
+
if (typeof addon === 'string' && addon !== 'wasm') {
|
|
8
|
+
throw new Error('Unable to load native addons in the browser!');
|
|
9
|
+
}
|
|
10
|
+
let wasm;
|
|
11
|
+
if (addon instanceof WebAssembly.Instance) {
|
|
12
|
+
wasm = addon;
|
|
13
|
+
}
|
|
14
|
+
else if (addon instanceof WebAssembly.Module) {
|
|
15
|
+
try {
|
|
16
|
+
wasm = (await WebAssembly.instantiate(addon));
|
|
17
|
+
}
|
|
18
|
+
catch (err) {
|
|
19
|
+
if (!(err instanceof Error))
|
|
20
|
+
throw err;
|
|
21
|
+
throw new Error(`Could not instantiate WASM module!\n${err.message}`);
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
else {
|
|
25
|
+
const name = `pkmn${showdown ? '-showdown' : ''}.wasm`;
|
|
26
|
+
try {
|
|
27
|
+
const response = !addon || addon === 'wasm' ? fetch(name)
|
|
28
|
+
: addon instanceof URL ? fetch(addon) : addon;
|
|
29
|
+
wasm = (await WebAssembly.instantiateStreaming(response)).instance;
|
|
30
|
+
}
|
|
31
|
+
catch (err) {
|
|
32
|
+
if (!(err instanceof Error))
|
|
33
|
+
throw err;
|
|
34
|
+
const message = !addon || addon === 'wasm'
|
|
35
|
+
? `Could not find ${name} - did you run \`npx install-pkmn-engine\`?`
|
|
36
|
+
: addon instanceof URL
|
|
37
|
+
? `Could not fetch WASM module from '${addon.href}'!`
|
|
38
|
+
: 'Could not instantiate WASM module!';
|
|
39
|
+
throw new Error(`${message}\n${err.message}`);
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
return (0, wasm_1.toBindings)(wasm.exports);
|
|
43
|
+
}
|
|
44
|
+
function loadSync() {
|
|
45
|
+
throw new Error('You must `initialize` the WASM addon before using the engine!');
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=browser.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"browser.js","sourceRoot":"","sources":["../../../src/pkg/addon/browser.ts"],"names":[],"mappings":";;AAKA,oBAiCC;AAED,4BAEC;AAvCD,iCAAkC;AAE3B,KAAK,UAAU,IAAI,CAAC,QAAiB,EAAE,KAAgB;IAC5D,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,MAAM,EAAE,CAAC;QAClD,MAAM,IAAI,KAAK,CAAC,8CAA8C,CAAC,CAAC;IAClE,CAAC;IAED,IAAI,IAA0B,CAAC;IAC/B,IAAI,KAAK,YAAY,WAAW,CAAC,QAAQ,EAAE,CAAC;QAC1C,IAAI,GAAG,KAAK,CAAC;IACf,CAAC;SAAM,IAAI,KAAK,YAAY,WAAW,CAAC,MAAM,EAAE,CAAC;QAC/C,IAAI,CAAC;YACH,IAAI,GAAG,CAAC,MAAM,WAAW,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC,CAAC;QAChD,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;gBAAE,MAAM,GAAG,CAAC;YACvC,MAAM,IAAI,KAAK,CAAC,uCAAuC,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QACxE,CAAC;IACH,CAAC;SAAM,CAAC;QACN,MAAM,IAAI,GAAG,OAAO,QAAQ,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,EAAE,OAAO,CAAC;QACvD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC;gBACvD,CAAC,CAAE,KAAiC,YAAY,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;YAC7E,IAAI,GAAG,CAAC,MAAM,WAAW,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QACrE,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,IAAI,CAAC,CAAC,GAAG,YAAY,KAAK,CAAC;gBAAE,MAAM,GAAG,CAAC;YACvC,MAAM,OAAO,GAAG,CAAC,KAAK,IAAI,KAAK,KAAK,MAAM;gBACxC,CAAC,CAAC,kBAAkB,IAAI,6CAA6C;gBACrE,CAAC,CAAE,KAAiC,YAAY,GAAG;oBACjD,CAAC,CAAC,qCAAsC,KAAa,CAAC,IAAI,IAAI;oBAC9D,CAAC,CAAC,oCAAoC,CAAC;YAC3C,MAAM,IAAI,KAAK,CAAC,GAAG,OAAO,KAAK,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC;QAChD,CAAC;IACH,CAAC;IAED,OAAO,IAAA,iBAAU,EAAC,IAAI,CAAC,OAAO,CAAC,CAAC;AAClC,CAAC;AAED,SAAgB,QAAQ;IACtB,MAAM,IAAI,KAAK,CAAC,+DAA+D,CAAC,CAAC;AACnF,CAAC"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
exports.load = load;
|
|
37
|
+
exports.loadSync = loadSync;
|
|
38
|
+
const fs = __importStar(require("fs"));
|
|
39
|
+
const path = __importStar(require("path"));
|
|
40
|
+
const wasm_1 = require("./wasm");
|
|
41
|
+
const ROOT = path.join(__dirname, '..', '..', '..');
|
|
42
|
+
const LIB = path.join(ROOT, 'build', 'lib');
|
|
43
|
+
const NODE = [path.join(LIB, 'pkmn.node'), path.join(LIB, 'pkmn-showdown.node')];
|
|
44
|
+
const WASM = [path.join(LIB, 'pkmn.wasm'), path.join(LIB, 'pkmn-showdown.wasm')];
|
|
45
|
+
async function load(showdown, addon) {
|
|
46
|
+
if (addon === undefined || typeof addon === 'string' && addon !== 'wasm') {
|
|
47
|
+
try {
|
|
48
|
+
return require(!addon || addon === 'node' ? NODE[+showdown] : addon).engine;
|
|
49
|
+
}
|
|
50
|
+
catch (err) {
|
|
51
|
+
if (!(err instanceof Error))
|
|
52
|
+
return err;
|
|
53
|
+
if (addon && addon !== 'node') {
|
|
54
|
+
throw new Error(`Unable to load native addon: '${addon}'\n${err.message}`);
|
|
55
|
+
}
|
|
56
|
+
else {
|
|
57
|
+
throw error(NODE[+showdown], err);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
let wasm;
|
|
62
|
+
if (addon === 'wasm') {
|
|
63
|
+
try {
|
|
64
|
+
wasm = (await WebAssembly.instantiate(fs.readFileSync(WASM[+showdown]))).instance;
|
|
65
|
+
}
|
|
66
|
+
catch (err) {
|
|
67
|
+
throw error(WASM[+showdown], err);
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
else if (addon instanceof WebAssembly.Instance) {
|
|
71
|
+
wasm = addon;
|
|
72
|
+
}
|
|
73
|
+
else if (addon instanceof WebAssembly.Module) {
|
|
74
|
+
try {
|
|
75
|
+
wasm = (await WebAssembly.instantiate(addon));
|
|
76
|
+
}
|
|
77
|
+
catch (err) {
|
|
78
|
+
if (!(err instanceof Error))
|
|
79
|
+
throw err;
|
|
80
|
+
throw new Error(`Could not instantiate WASM module!\n${err.message}`);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
else {
|
|
84
|
+
try {
|
|
85
|
+
const response = addon instanceof Promise ? addon : fetch(addon);
|
|
86
|
+
wasm = (await WebAssembly.instantiateStreaming(response)).instance;
|
|
87
|
+
}
|
|
88
|
+
catch (err) {
|
|
89
|
+
if (!(err instanceof Error))
|
|
90
|
+
throw err;
|
|
91
|
+
throw new Error(`Could not instantiate WASM module!\n${err.message}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
return (0, wasm_1.toBindings)(wasm.exports);
|
|
95
|
+
}
|
|
96
|
+
function loadSync(showdown) {
|
|
97
|
+
try {
|
|
98
|
+
return require(NODE[+showdown]).engine;
|
|
99
|
+
}
|
|
100
|
+
catch {
|
|
101
|
+
return undefined;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
function error(file, err) {
|
|
105
|
+
if (!(err instanceof Error))
|
|
106
|
+
return err;
|
|
107
|
+
const message = `Could not find ${path.basename(file)} addon`;
|
|
108
|
+
return new Error(`${message} - did you run \`npx install-pkmn-engine\`?\n${err.message}`);
|
|
109
|
+
}
|
|
110
|
+
//# sourceMappingURL=node.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node.js","sourceRoot":"","sources":["../../../src/pkg/addon/node.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.toBindings = toBindings;
|
|
4
|
+
const data_1 = require("../data");
|
|
5
|
+
function toBindings(w) {
|
|
6
|
+
const memory = new Uint8Array(w.memory.buffer);
|
|
7
|
+
return {
|
|
8
|
+
options: {
|
|
9
|
+
showdown: !!memory[w.SHOWDOWN.valueOf()],
|
|
10
|
+
log: !!memory[w.LOG.valueOf()],
|
|
11
|
+
chance: !!memory[w.CHANCE.valueOf()],
|
|
12
|
+
calc: !!memory[w.CALC.valueOf()],
|
|
13
|
+
},
|
|
14
|
+
bindings: [toBinding(1, w)],
|
|
15
|
+
};
|
|
16
|
+
}
|
|
17
|
+
function toBinding(gen, w) {
|
|
18
|
+
const prefix = `GEN${gen}`;
|
|
19
|
+
const buf = w.memory.buffer;
|
|
20
|
+
const constants = new Uint32Array(buf);
|
|
21
|
+
const CHOICES_SIZE = constants[w[`${prefix}_CHOICES_SIZE`].valueOf() / 4];
|
|
22
|
+
const LOGS_SIZE = constants[w[`${prefix}_LOGS_SIZE`].valueOf() / 4];
|
|
23
|
+
const size = data_1.LAYOUT[gen - 1].sizes.Battle;
|
|
24
|
+
const update = w[`${prefix}_update`];
|
|
25
|
+
const choices = w[`${prefix}_choices`];
|
|
26
|
+
const memory = new Uint8Array(buf);
|
|
27
|
+
return {
|
|
28
|
+
CHOICES_SIZE,
|
|
29
|
+
LOGS_SIZE,
|
|
30
|
+
update(battle, c1, c2, log) {
|
|
31
|
+
const bytes = new Uint8Array(battle);
|
|
32
|
+
memory.set(bytes, 0);
|
|
33
|
+
let result;
|
|
34
|
+
if (log) {
|
|
35
|
+
result = update(0, c1, c2, size);
|
|
36
|
+
new Uint8Array(log).set(memory.subarray(size, size + LOGS_SIZE));
|
|
37
|
+
}
|
|
38
|
+
else {
|
|
39
|
+
result = update(0, c1, c2, 0);
|
|
40
|
+
}
|
|
41
|
+
bytes.set(memory.subarray(0, size));
|
|
42
|
+
return result;
|
|
43
|
+
},
|
|
44
|
+
choices(battle, player, request, options) {
|
|
45
|
+
const opts = new Uint8Array(options);
|
|
46
|
+
memory.set(new Uint8Array(battle));
|
|
47
|
+
const n = choices(0, player, request, size);
|
|
48
|
+
opts.set(memory.subarray(size, size + n));
|
|
49
|
+
return n;
|
|
50
|
+
},
|
|
51
|
+
};
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=wasm.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../src/pkg/addon/wasm.ts"],"names":[],"mappings":"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"}
|
package/build/pkg/addon.d.ts
CHANGED
|
@@ -1,7 +1,29 @@
|
|
|
1
|
-
import { Choice, Player, Result } from '
|
|
1
|
+
import { Choice, Player, Result } from './common';
|
|
2
|
+
export type Argument = string | URL | WebAssembly.Module | WebAssembly.Instance | Promise<Response>;
|
|
3
|
+
export interface Bindings<T extends boolean> {
|
|
4
|
+
/**
|
|
5
|
+
* The compile-time options the bindings were built with. showdown is special
|
|
6
|
+
* cased because it changes the name of addon.
|
|
7
|
+
*/
|
|
8
|
+
options: {
|
|
9
|
+
showdown: T;
|
|
10
|
+
log: boolean;
|
|
11
|
+
chance: boolean;
|
|
12
|
+
calc: boolean;
|
|
13
|
+
};
|
|
14
|
+
/** Bindings are per-generation, Generation I is index 0. */
|
|
15
|
+
bindings: Binding[];
|
|
16
|
+
}
|
|
17
|
+
export interface Binding {
|
|
18
|
+
CHOICES_SIZE: number;
|
|
19
|
+
LOGS_SIZE: number;
|
|
20
|
+
update(battle: ArrayBufferLike, c1: number, c2: number, log: ArrayBufferLike | undefined): number;
|
|
21
|
+
choices(battle: ArrayBufferLike, player: number, request: number, out: ArrayBufferLike): number;
|
|
22
|
+
}
|
|
23
|
+
/** TODO */
|
|
24
|
+
export declare function initialize(showdown: boolean, addon?: Argument): Promise<void | undefined>;
|
|
2
25
|
export declare function check(showdown: boolean): void;
|
|
3
26
|
export declare function supports(showdown: boolean, log?: boolean): boolean;
|
|
4
|
-
export declare function update(index: number, showdown: boolean, battle:
|
|
5
|
-
export declare function choices(index: number, showdown: boolean, battle:
|
|
6
|
-
export declare function choose(index: number, showdown: boolean, battle: ArrayBuffer, player: Player, choice: Choice['type'], buf: ArrayBuffer, fn: (n: number) => number): Choice;
|
|
27
|
+
export declare function update(index: number, showdown: boolean, battle: ArrayBufferLike, c1?: Choice, c2?: Choice, log?: ArrayBufferLike): Result;
|
|
28
|
+
export declare function choices(index: number, showdown: boolean, battle: ArrayBufferLike, player: Player, choice: Choice['type'], out: Uint8Array): Choice[];
|
|
7
29
|
export declare function size(index: number, type: 'choices' | 'log'): number;
|
package/build/pkg/addon.js
CHANGED
|
@@ -1,60 +1,31 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
-
if (k2 === undefined) k2 = k;
|
|
4
|
-
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
-
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
-
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
-
}
|
|
8
|
-
Object.defineProperty(o, k2, desc);
|
|
9
|
-
}) : (function(o, m, k, k2) {
|
|
10
|
-
if (k2 === undefined) k2 = k;
|
|
11
|
-
o[k2] = m[k];
|
|
12
|
-
}));
|
|
13
|
-
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
-
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
-
}) : function(o, v) {
|
|
16
|
-
o["default"] = v;
|
|
17
|
-
});
|
|
18
|
-
var __importStar = (this && this.__importStar) || function (mod) {
|
|
19
|
-
if (mod && mod.__esModule) return mod;
|
|
20
|
-
var result = {};
|
|
21
|
-
if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
|
|
22
|
-
__setModuleDefault(result, mod);
|
|
23
|
-
return result;
|
|
24
|
-
};
|
|
25
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.initialize = initialize;
|
|
26
4
|
exports.check = check;
|
|
27
5
|
exports.supports = supports;
|
|
28
6
|
exports.update = update;
|
|
29
7
|
exports.choices = choices;
|
|
30
|
-
exports.choose = choose;
|
|
31
8
|
exports.size = size;
|
|
32
|
-
const
|
|
33
|
-
const
|
|
34
|
-
const
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
let showdown = undefined;
|
|
41
|
-
try {
|
|
42
|
-
pkmn = require(path.join(ROOT, 'build', 'lib', 'pkmn.node')).engine;
|
|
43
|
-
}
|
|
44
|
-
catch { }
|
|
45
|
-
try {
|
|
46
|
-
showdown =
|
|
47
|
-
require(path.join(ROOT, 'build', 'lib', 'pkmn-showdown.node')).engine;
|
|
48
|
-
}
|
|
49
|
-
catch { }
|
|
50
|
-
if (!pkmn && !showdown) {
|
|
51
|
-
throw new Error('Could not find native addons - did you run `npx install-pkmn-engine`?');
|
|
9
|
+
const node_1 = require("./addon/node");
|
|
10
|
+
const common_1 = require("./common");
|
|
11
|
+
const ADDONS = [];
|
|
12
|
+
const loading = [];
|
|
13
|
+
/** TODO */
|
|
14
|
+
async function initialize(showdown, addon) {
|
|
15
|
+
if (loading[+showdown]) {
|
|
16
|
+
throw new Error(`Cannot call initialize more than once with showdown=${showdown}`);
|
|
52
17
|
}
|
|
53
|
-
|
|
18
|
+
loading[+showdown] = (0, node_1.load)(showdown, addon);
|
|
19
|
+
loading[+showdown].then(a => {
|
|
20
|
+
ADDONS[+showdown] = a;
|
|
21
|
+
}).catch(() => {
|
|
22
|
+
loading[+showdown] = undefined;
|
|
23
|
+
});
|
|
24
|
+
return loading[+showdown]?.then(() => { });
|
|
54
25
|
}
|
|
55
26
|
function check(showdown) {
|
|
56
|
-
if (!
|
|
57
|
-
const opts =
|
|
27
|
+
if (!addons(showdown)[+showdown]) {
|
|
28
|
+
const opts = ADDONS[+!showdown].options.log ? ['-log'] : [];
|
|
58
29
|
if (showdown)
|
|
59
30
|
opts.push('-Dshowdown');
|
|
60
31
|
throw new Error(`@pkmn/engine has ${showdown ? 'not' : 'only'} been configured to support Pokémon Showdown.` +
|
|
@@ -62,19 +33,26 @@ function check(showdown) {
|
|
|
62
33
|
}
|
|
63
34
|
}
|
|
64
35
|
function supports(showdown, log) {
|
|
65
|
-
if (!
|
|
36
|
+
if (!addons(showdown)[+showdown])
|
|
66
37
|
return false;
|
|
67
38
|
if (log === undefined)
|
|
68
39
|
return true;
|
|
69
|
-
return
|
|
40
|
+
return ADDONS[+showdown].options.log === log;
|
|
41
|
+
}
|
|
42
|
+
function addons(showdown) {
|
|
43
|
+
if (ADDONS[+showdown])
|
|
44
|
+
return ADDONS;
|
|
45
|
+
// If we havem't been initialized attempt to autoload if we're on Node
|
|
46
|
+
ADDONS[+showdown] = (0, node_1.loadSync)(showdown);
|
|
47
|
+
return ADDONS;
|
|
70
48
|
}
|
|
71
49
|
function update(index, showdown, battle, c1, c2, log) {
|
|
72
|
-
return
|
|
73
|
-
.update(battle,
|
|
50
|
+
return common_1.Result.decode(ADDONS[+showdown].bindings[index]
|
|
51
|
+
.update(battle, common_1.Choice.encode(c1), common_1.Choice.encode(c2), log));
|
|
74
52
|
}
|
|
75
|
-
function choices(index, showdown, battle, player, choice,
|
|
53
|
+
function choices(index, showdown, battle, player, choice, out) {
|
|
76
54
|
const request = choice[0] === 'p' ? 0 : choice[0] === 'm' ? 1 : 2;
|
|
77
|
-
const n =
|
|
55
|
+
const n = ADDONS[+showdown].bindings[index].choices(battle, +(player !== 'p1'), request, out.buffer);
|
|
78
56
|
// The top-level API signature means our hands our tied with respect to
|
|
79
57
|
// writing really fast bindings here. The simplest approach would be to return
|
|
80
58
|
// the ArrayBuffer the bindings populate as well as its size and only decode a
|
|
@@ -89,23 +67,14 @@ function choices(index, showdown, battle, player, choice, buf) {
|
|
|
89
67
|
// choices function for each generation within node.zig. We could do something
|
|
90
68
|
// really galaxy-brained and return some sort of frankenstein subclass of
|
|
91
69
|
// Array backed by ArrayBuffer which would lazily decode the Choice on access,
|
|
92
|
-
// but thats ultimately not worth the effort.
|
|
93
|
-
// idiomatic API and performance here, hence why the choose function below
|
|
94
|
-
// exists.
|
|
70
|
+
// but thats ultimately not worth the effort.
|
|
95
71
|
const options = new Array(n);
|
|
96
|
-
const data = new Uint8Array(buf);
|
|
97
72
|
for (let i = 0; i < n; i++)
|
|
98
|
-
options[i] =
|
|
73
|
+
options[i] = common_1.Choice.decode(out[i]);
|
|
99
74
|
return options;
|
|
100
75
|
}
|
|
101
|
-
function choose(index, showdown, battle, player, choice, buf, fn) {
|
|
102
|
-
const request = choice[0] === 'p' ? 0 : choice[0] === 'm' ? 1 : 2;
|
|
103
|
-
const n = ADDON[+showdown].bindings[index].choices(battle, +(player !== 'p1'), request, buf);
|
|
104
|
-
const data = new Uint8Array(buf);
|
|
105
|
-
return _1.Choice.decode(data[fn(n)]);
|
|
106
|
-
}
|
|
107
76
|
function size(index, type) {
|
|
108
|
-
const bindings = (
|
|
77
|
+
const bindings = (ADDONS[1] ?? ADDONS[0]).bindings[index];
|
|
109
78
|
return type[0] === 'c' ? bindings.CHOICES_SIZE : bindings.LOGS_SIZE;
|
|
110
79
|
}
|
|
111
80
|
//# sourceMappingURL=addon.js.map
|
package/build/pkg/addon.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"addon.js","sourceRoot":"","sources":["../../src/pkg/addon.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"addon.js","sourceRoot":"","sources":["../../src/pkg/addon.ts"],"names":[],"mappings":";;AA0BA,gCAWC;AAED,sBASC;AAED,4BAIC;AASD,wBAUC;AAED,0BA6BC;AAED,oBAGC;AA7GD,uCAA4C;AAC5C,qCAAgD;AAqBhD,MAAM,MAAM,GAAwC,EAAE,CAAC;AACvD,MAAM,OAAO,GAA0D,EAAE,CAAC;AAE1E,WAAW;AACJ,KAAK,UAAU,UAAU,CAAC,QAAiB,EAAE,KAAgB;IAClE,IAAI,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACvB,MAAM,IAAI,KAAK,CAAC,uDAAuD,QAAQ,EAAE,CAAC,CAAC;IACrF,CAAC;IACD,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAA,WAAI,EAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC3C,OAAO,CAAC,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;QAC3B,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,EAAE;QACZ,OAAO,CAAC,CAAC,QAAQ,CAAC,GAAG,SAAS,CAAC;IACjC,CAAC,CAAC,CAAC;IACH,OAAO,OAAO,CAAC,CAAC,QAAQ,CAAC,EAAE,IAAI,CAAC,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,KAAK,CAAC,QAAiB;IACrC,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC;QACjC,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAE,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7D,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;QACtC,MAAM,IAAI,KAAK,CACb,oBAAoB,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,+CAA+C;YAC5F,mDAAmD,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,0BAA0B,CAC5F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAgB,QAAQ,CAAC,QAAiB,EAAE,GAAa;IACvD,IAAI,CAAC,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IAC/C,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,MAAM,CAAC,CAAC,QAAQ,CAAE,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC;AAChD,CAAC;AAED,SAAS,MAAM,CAAC,QAAiB;IAC/B,IAAI,MAAM,CAAC,CAAC,QAAQ,CAAC;QAAE,OAAO,MAAM,CAAC;IACrC,sEAAsE;IACtE,MAAM,CAAC,CAAC,QAAQ,CAAC,GAAG,IAAA,eAAQ,EAAC,QAAQ,CAAC,CAAC;IACvC,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAgB,MAAM,CACpB,KAAa,EACb,QAAiB,EACjB,MAAuB,EACvB,EAAW,EACX,EAAW,EACX,GAAqB;IAErB,OAAO,eAAM,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,QAAQ,CAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;SACpD,MAAM,CAAC,MAAM,EAAE,eAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,eAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAED,SAAgB,OAAO,CACrB,KAAa,EACb,QAAiB,EACjB,MAAuB,EACvB,MAAc,EACd,MAAsB,EACtB,GAAe;IAEf,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAClE,MAAM,CAAC,GACL,MAAM,CAAC,CAAC,QAAQ,CAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IAC9F,uEAAuE;IACvE,8EAA8E;IAC9E,8EAA8E;IAC9E,oEAAoE;IACpE,0EAA0E;IAC1E,2EAA2E;IAC3E,4EAA4E;IAC5E,8EAA8E;IAC9E,4EAA4E;IAC5E,2EAA2E;IAC3E,uEAAuE;IACvE,8EAA8E;IAC9E,yEAAyE;IACzE,8EAA8E;IAC9E,6CAA6C;IAC7C,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC;IACrC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC,CAAC,GAAG,eAAM,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;IAC/D,OAAO,OAAO,CAAC;AACjB,CAAC;AAED,SAAgB,IAAI,CAAC,KAAa,EAAE,IAAuB;IACzD,MAAM,QAAQ,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAC3D,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AACtE,CAAC"}
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
"Pokemon": 24,
|
|
7
7
|
"ActivePokemon": 32,
|
|
8
8
|
"Actions": 16,
|
|
9
|
+
"Durations": 8,
|
|
9
10
|
"Summaries": 12
|
|
10
11
|
},
|
|
11
12
|
"offsets": {
|
|
@@ -92,12 +93,24 @@
|
|
|
92
93
|
"confused": 16,
|
|
93
94
|
"paralyzed": 18,
|
|
94
95
|
"duration": 20,
|
|
95
|
-
"
|
|
96
|
-
"
|
|
96
|
+
"sleep": 24,
|
|
97
|
+
"confusion": 26,
|
|
98
|
+
"disable": 29,
|
|
99
|
+
"attacking": 31,
|
|
100
|
+
"binding": 33,
|
|
101
|
+
"move_slot": 36,
|
|
102
|
+
"pp": 40,
|
|
97
103
|
"multi_hit": 44,
|
|
98
104
|
"psywave": 48,
|
|
99
105
|
"metronome": 56
|
|
100
106
|
},
|
|
107
|
+
"Duration": {
|
|
108
|
+
"sleeps": 0,
|
|
109
|
+
"confusion": 18,
|
|
110
|
+
"disable": 21,
|
|
111
|
+
"attacking": 25,
|
|
112
|
+
"binding": 28
|
|
113
|
+
},
|
|
101
114
|
"Damage": {
|
|
102
115
|
"base": 0,
|
|
103
116
|
"final": 2,
|