@pkmn/engine 0.1.0-dev.a02611a4 → 0.1.0-dev.a15b6c17

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 (85) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +63 -26
  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 +110 -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 +26 -4
  13. package/build/pkg/addon.js +39 -71
  14. package/build/pkg/addon.js.map +1 -1
  15. package/build/pkg/data/ids.json +12 -12
  16. package/build/pkg/data/layout.json +17 -4
  17. package/build/pkg/data/protocol.json +84 -13
  18. package/build/pkg/data.d.ts +27 -5
  19. package/build/pkg/data.js.map +1 -1
  20. package/build/pkg/gen1.d.ts +15 -18
  21. package/build/pkg/gen1.js +30 -21
  22. package/build/pkg/gen1.js.map +1 -1
  23. package/build/pkg/index.d.ts +42 -91
  24. package/build/pkg/index.js +23 -70
  25. package/build/pkg/index.js.map +1 -1
  26. package/build/pkg/protocol.d.ts +29 -1
  27. package/build/pkg/protocol.js +123 -102
  28. package/build/pkg/protocol.js.map +1 -1
  29. package/build/tools/debug.js +84 -73
  30. package/build/tools/debug.js.map +1 -1
  31. package/build/tools/display/debug.jsx +66 -0
  32. package/build/tools/display/debug.jsx.map +1 -0
  33. package/build/tools/display/index.js +152 -0
  34. package/build/tools/display/index.js.map +1 -0
  35. package/build/tools/display/ui.jsx +360 -0
  36. package/build/tools/display/ui.jsx.map +1 -0
  37. package/build/tools/display/util.js +157 -0
  38. package/build/tools/display/util.js.map +1 -0
  39. package/build.zig +275 -122
  40. package/package.json +64 -123
  41. package/src/bin/install-pkmn-engine +47 -21
  42. package/src/bin/pkmn-debug +1 -1
  43. package/src/lib/bindings/c.zig +200 -0
  44. package/src/lib/{binding → bindings}/node.zig +15 -32
  45. package/src/lib/bindings/wasm.zig +50 -0
  46. package/src/lib/common/array.zig +70 -0
  47. package/src/lib/common/data.zig +12 -24
  48. package/src/lib/common/debug.zig +33 -28
  49. package/src/lib/common/js.zig +3 -7
  50. package/src/lib/common/optional.zig +19 -18
  51. package/src/lib/common/options.zig +6 -0
  52. package/src/lib/common/protocol.zig +927 -478
  53. package/src/lib/common/rational.zig +341 -254
  54. package/src/lib/common/rng.zig +22 -15
  55. package/src/lib/common/util.zig +33 -1
  56. package/src/lib/gen1/calc.zig +726 -177
  57. package/src/lib/gen1/chance.zig +484 -306
  58. package/src/lib/gen1/data/moves.zig +193 -183
  59. package/src/lib/gen1/data/species.zig +4 -6
  60. package/src/lib/gen1/data/types.zig +9 -10
  61. package/src/lib/gen1/data.zig +60 -75
  62. package/src/lib/gen1/helpers.zig +90 -563
  63. package/src/lib/gen1/mechanics.zig +696 -614
  64. package/src/lib/gen2/calc.zig +150 -0
  65. package/src/lib/gen2/chance.zig +896 -0
  66. package/src/lib/gen2/data/items.zig +13 -21
  67. package/src/lib/gen2/data/moves.zig +662 -583
  68. package/src/lib/gen2/data/species.zig +2 -4
  69. package/src/lib/gen2/data/types.zig +139 -34
  70. package/src/lib/gen2/data.zig +114 -96
  71. package/src/lib/gen2/generated.zig +801 -0
  72. package/src/lib/gen2/helpers.zig +49 -35
  73. package/src/lib/gen2/mechanics.zig +3324 -115
  74. package/src/lib/napi.h +2 -0
  75. package/src/lib/node.zig +14 -0
  76. package/src/lib/pkmn.zig +125 -29
  77. package/src/lib/wasm.zig +13 -0
  78. package/src/tools/display/dom.ts +108 -0
  79. package/src/tools/display/ui.css +354 -0
  80. package/build/test/display.js +0 -400
  81. package/build/test/display.js.map +0 -1
  82. package/src/lib/binding/wasm.zig +0 -12
  83. package/src/lib/gen1/README.md +0 -892
  84. package/src/lib/gen2/README.md +0 -308
  85. package/src/test/display/pkmn.html.tmpl +0 -368
package/LICENSE CHANGED
@@ -1,6 +1,4 @@
1
- The MIT License (MIT)
2
-
3
- Copyright (c) 2021-2023 pkmn contributors
1
+ Copyright (c) 2021-2026 pkmn contributors
4
2
 
5
3
  Permission is hereby granted, free of charge, to any person obtaining a copy of
6
4
  this software and associated documentation files (the "Software"), to deal in
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  <br />
4
4
  <br />
5
5
  <a href="https://github.com/pkmn/engine/actions/workflows/test.yml">
6
- <img alt="Test Status" src="https://github.com/pkmn/engine/workflows/Tests/badge.svg" />
6
+ <img alt="Test Status" src="https://github.com/pkmn/engine/actions/workflows/test.yml/badge.svg" />
7
7
  </a>
8
8
  <a href="#status">
9
9
  <img alt="WIP" src="https://img.shields.io/badge/status-WIP-red.svg" />
@@ -57,9 +57,13 @@ $ zig build --prefix /usr/local -Doptimize=ReleaseFast
57
57
  ```
58
58
 
59
59
  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.11.0 or
61
- greater, though tracks Zig's master branch so this may change in the future if breaking language
62
- changes are introduced.
60
+ walk through how to install Zig on each platform - the engine code should work on Zig v0.16.0,
61
+ though tracks Zig's master branch so this may change in the future if breaking language changes are
62
+ introduced. Note that **due to a [bug in the Zig
63
+ compiler](https://github.com/ziglang/zig/issues/17768), building a version of [Zig from
64
+ source](https://codeberg.org/ziglang/zig#building-from-source) after having applied a
65
+ [patch](zig.patch) to revert [ziglang/zig#17391](https://github.com/ziglang/zig/pull/17391) is
66
+ recommended for performance**.
63
67
 
64
68
  `libpkmn` can be built with `-Dshowdown` to instead produce the Pokémon Showdown compatible
65
69
  `libpkmn-showdown` library. Furthermore, protocol message logging can be enabled through `-Dlog`.
@@ -87,25 +91,49 @@ directly or build the addons manually and place the artifacts in the expected pa
87
91
 
88
92
  ### `pkmn`
89
93
 
90
- Until the [Zig package manager](https://github.com/ziglang/zig/projects/4) is completed, the
91
- recommended way of using the `pkmn` package in Zig is by either copying this repository into your
92
- project or by using [git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) and then
93
- adding the following to your `build.zig`:
94
+ To include `pkmn`, add it as a dependency in your project's
95
+ [`build.zig.zon`](https://github.com/ziglang/zig/blob/master/doc/build.zig.zon.md) using [Zig's
96
+ Package Management
97
+ system](https://ziglang.org/download/0.11.0/release-notes.html#Package-Management):
98
+
99
+ ```zig
100
+ .dependencies = .{
101
+ .pkmn = .{
102
+ .url = "https://github.com/pkmn/engine/archive/RELEASE.tar.gz",
103
+ },
104
+ },
105
+ ```
106
+
107
+ Replace `RELEASE` with the tag for the [release](https://github.com/pkmn/engine/releases) you wish
108
+ to use (e.g. `0.1.0` or `nightly`) or the specific hash of any commit. Next, run `zig build` and
109
+ copy the expected hash from the error message into your `build.zig.zon` alongside the `.url`:
110
+
111
+ ```sh
112
+ $ zig build
113
+ error: dependency is missing hash field
114
+ .url = "https://github.com/pkmn/engine/archive/nightly.tar.gz",
115
+ ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
116
+ note: expected .hash = "122056b93b403033cb7d9bed96a02c2eb8cc1275515976167726ada6eb4207e8ef8a",
117
+ ```
118
+
119
+ Note that this hash is **not** going to be the same as the commit hash. After adding the hash to
120
+ your `build.zig.zon` you will be able to import the `pkmn` package's build helpers into your
121
+ `build.zig`:
94
122
 
95
123
  ```zig
96
124
  const std = @import("std");
97
- const pkmn = @import("lib/pkmn/build.zig");
98
125
 
99
126
  pub fn build(b: *std.Build) void {
100
127
  ...
101
- exe.addModule("pkmn", pkmn.module(b, .{ .showdown = true, .log = true }));
128
+ const pkmn = b.dependency("pkmn", .{ .showdown = true, .log = true });
129
+ exe.root_module.addImport("pkmn", pkmn.module("pkmn"));
102
130
  ...
103
131
  }
104
132
  ```
105
133
 
106
- The engine's `build.zig` exposes a `module` function that takes an options structure to allow for
107
- configuring whether or not Pokémon Showdown compatibility mode or protocol message logging should be
108
- enabled. Alternatively, you may set options via a `pkmn_options` [root source file
134
+ The `pkmn` package can be configured with various options such as whether or not Pokémon Showdown
135
+ compatibility mode or protocol message logging should be enabled. Alternatively, you may set options
136
+ via a `pkmn_options` [root source file
109
137
  declaration](https://ziglang.org/documentation/master/#Root-Source-File). There are several
110
138
  undocumented internal options that can be tweaked as well via build or root options, though these
111
139
  options aren't officially supported, affect correctness, and may change meaning or behavior without
@@ -142,7 +170,7 @@ documentation](docs/PROTOCOL.md) goes into greater detail on the specifics of up
142
170
  potential logs that may result.
143
171
 
144
172
  *The snippets below are meant to merely illustrate in broad strokes how the pkmn engine can be used
145
- \- the [`examples`](src/examples) directory contains fully commented and runnable code.*
173
+ \- the [`examples`](examples) directory contains fully commented and runnable code.*
146
174
 
147
175
  ### C
148
176
 
@@ -167,7 +195,7 @@ while (!pkmn_result_type(result = pkmn_battle_update(&battle, c1, c2, &options))
167
195
  if (pkmn_error(result)) exit(1);
168
196
  ```
169
197
 
170
- [(full code)](src/examples/c/example.c)
198
+ [(full code)](examples/c/example.c)
171
199
 
172
200
  The C API doesn't export any helpers for creating or accessing the opaque battle objects - it's
173
201
  instead intended to be used as the foundation for more ergonomic bindings in [other
@@ -185,24 +213,25 @@ protocol via `Log.parse`.
185
213
  ```ts
186
214
  import {Dex} from '@pkmn/dex';
187
215
  import {Generations} from '@pkmn/data';
188
- import {Battle} from '@pkmn/engine';
216
+ import {Battle, Choice} from '@pkmn/engine';
189
217
 
190
218
  const gens = new Generations(Dex);
191
219
  const battle = Battle.create(...);
192
220
 
193
- const choose = (n: number) => Math.random() * n;
221
+ const choose = (choices: Choice[]) =>
222
+ choices[Math.floor(Math.random() * choices.length)];
194
223
 
195
224
  let result: Result;
196
225
  let c1: Choice, c2: Choice;
197
226
  while (!(result = battle.update(c1, c2)).type) {
198
- c1 = battle.choose('p1', result, choose);
199
- c2 = battle.choose('p2', result, choose);
227
+ c1 = choose(battle.choices('p1', result));
228
+ c2 = choose(battle.choices('p2', result));
200
229
  }
201
230
 
202
231
  console.log(result);
203
232
  ```
204
233
 
205
- [(full code)](src/examples/js/example.ts)
234
+ [(full code)](examples/js/example.ts)
206
235
 
207
236
  By default, the `@pkmn/engine` package compiles the engine with `-Dshowdown`, though by running
208
237
  `install-pkmn-engine` directly and passing in `--options` you can override this default and build
@@ -214,7 +243,7 @@ library should be seamless.
214
243
 
215
244
  Despite relying on the native engine code, the `@pkmn/engine` code is designed to also work in
216
245
  browsers which support [WebAssembly](https://webassembly.org/). Running `npm run start:web` from the
217
- [`examples`](src/examples/js) directory starts a server that can be used to demonstrate the engine
246
+ [`examples`](examples/js) directory starts a server that can be used to demonstrate the engine
218
247
  running in the browser.
219
248
 
220
249
  ### Zig
@@ -226,14 +255,15 @@ be used when logging is enabled to allow for easily printing e.g. to standard ou
226
255
  const std = @import("std");
227
256
  const pkmn = @import("pkmn");
228
257
 
229
- var random = std.rand.DefaultPrng.init(seed).random();
258
+ var prng: std.Random.DefaultPrng = .init(seed);
259
+ var random = prng.random();
230
260
  var choices: [pkmn.CHOICES_SIZE]pkmn.Choice = undefined;
231
261
 
232
262
  var battle = ...
233
263
  var options = pkmn.battle.options(...);
234
264
 
235
- var c1 = pkmn.Choice{};
236
- var c2 = pkmn.Choice{};
265
+ var c1: pkmn.Choice = .{};
266
+ var c2: pkmn.Choice = .{};
237
267
 
238
268
  var result = try battle.update(c1, c2, &options);
239
269
  while (result.type == .None) : (result = try battle.update(c1, c2, &options)) {
@@ -244,7 +274,7 @@ while (result.type == .None) : (result = try battle.update(c1, c2, &options)) {
244
274
  std.debug.print("{}\n", .{result.type});
245
275
  ```
246
276
 
247
- [(full code)](src/examples/zig/example.zig)
277
+ [(full code)](examples/zig/example.zig)
248
278
 
249
279
  The Zig package also supports some APIs which are difficult to expose elsewhere such as the
250
280
  `FixedRNG` which allows you to fully specify the exact RNG frames (which can be useful for ensuring
@@ -294,6 +324,13 @@ instead:
294
324
  $ pkmn-debug <file> > index.html
295
325
  ```
296
326
 
327
+ Finally, `pkmn-debug` also supports a `--json` flag which causes the decoded data to be dumped as
328
+ JSON instead of HTML:
329
+
330
+ ```sh
331
+ $ pkmn-debug --json <file> > index.json
332
+ ```
333
+
297
334
  ## Status
298
335
 
299
336
  The engine is currently expected to be developed over multiple stages:
@@ -306,7 +343,7 @@ The engine is currently expected to be developed over multiple stages:
306
343
  | ***3*** | *modern generations* |
307
344
 
308
345
  Currently, most of the foundational work from stage 0 is done:
309
-
346
+
310
347
  - [benchmark and integration testing](src/test) infrastructure
311
348
  - [documentation](docs) about design, research, methodology, etc
312
349
  - definition and implementation of the [protocol](docs/PROTOCOL.md) that's used by the engine
@@ -0,0 +1,3 @@
1
+ import type { Argument } from '../addon';
2
+ export declare function load(showdown: boolean, addon?: Argument): Promise<import("../addon").Bindings<boolean>>;
3
+ export declare function loadSync(): void;
@@ -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,3 @@
1
+ import type { Argument } from '../addon';
2
+ export declare function load(showdown: boolean, addon?: Argument): Promise<any>;
3
+ export declare function loadSync(showdown: boolean): any;
@@ -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,2 @@
1
+ import type { Bindings } from '../addon';
2
+ export declare function toBindings<T extends boolean>(w: WebAssembly.Exports): Bindings<T>;
@@ -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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"}
@@ -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: ArrayBuffer, c1?: Choice, c2?: Choice, log?: ArrayBuffer): Result;
5
- export declare function choices(index: number, showdown: boolean, battle: ArrayBuffer, player: Player, choice: Choice['type'], buf: ArrayBuffer): Choice[];
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;
@@ -1,78 +1,58 @@
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 });
26
- exports.size = exports.choose = exports.choices = exports.update = exports.supports = exports.check = void 0;
27
- const path = __importStar(require("path"));
28
- const _1 = require(".");
29
- const ROOT = path.join(__dirname, '..', '..');
30
- let ADDON = undefined;
31
- function load() {
32
- if (ADDON)
33
- return ADDON;
34
- let pkmn = undefined;
35
- let showdown = undefined;
36
- try {
37
- pkmn = require(path.join(ROOT, 'build', 'lib', 'pkmn.node')).engine;
38
- }
39
- catch { }
40
- try {
41
- showdown =
42
- require(path.join(ROOT, 'build', 'lib', 'pkmn-showdown.node')).engine;
43
- }
44
- catch { }
45
- if (!pkmn && !showdown) {
46
- throw new Error('Could not find native addons - did you run `npx install-pkmn-engine`?');
3
+ exports.initialize = initialize;
4
+ exports.check = check;
5
+ exports.supports = supports;
6
+ exports.update = update;
7
+ exports.choices = choices;
8
+ exports.size = size;
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}`);
47
17
  }
48
- return (ADDON = [pkmn, showdown]);
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(() => { });
49
25
  }
50
26
  function check(showdown) {
51
- if (!load()[+showdown]) {
52
- const opts = ADDON[+!showdown].options.log ? ['-log'] : [];
27
+ if (!addons(showdown)[+showdown]) {
28
+ const opts = ADDONS[+!showdown].options.log ? ['-log'] : [];
53
29
  if (showdown)
54
30
  opts.push('-Dshowdown');
55
31
  throw new Error(`@pkmn/engine has ${showdown ? 'not' : 'only'} been configured to support Pokémon Showdown.` +
56
32
  `\n(running \`npx install-pkmn-engine --options='${opts.join(' ')}'\` can fix this issue).`);
57
33
  }
58
34
  }
59
- exports.check = check;
60
35
  function supports(showdown, log) {
61
- if (!load()[+showdown])
36
+ if (!addons(showdown)[+showdown])
62
37
  return false;
63
38
  if (log === undefined)
64
39
  return true;
65
- return ADDON[+showdown].options.log === log;
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;
66
48
  }
67
- exports.supports = supports;
68
49
  function update(index, showdown, battle, c1, c2, log) {
69
- return _1.Result.decode(ADDON[+showdown].bindings[index]
70
- .update(battle, _1.Choice.encode(c1), _1.Choice.encode(c2), log));
50
+ return common_1.Result.decode(ADDONS[+showdown].bindings[index]
51
+ .update(battle, common_1.Choice.encode(c1), common_1.Choice.encode(c2), log));
71
52
  }
72
- exports.update = update;
73
- function choices(index, showdown, battle, player, choice, buf) {
53
+ function choices(index, showdown, battle, player, choice, out) {
74
54
  const request = choice[0] === 'p' ? 0 : choice[0] === 'm' ? 1 : 2;
75
- const n = ADDON[+showdown].bindings[index].choices(battle, +(player !== 'p1'), request, buf);
55
+ const n = ADDONS[+showdown].bindings[index].choices(battle, +(player !== 'p1'), request, out.buffer);
76
56
  // The top-level API signature means our hands our tied with respect to
77
57
  // writing really fast bindings here. The simplest approach would be to return
78
58
  // the ArrayBuffer the bindings populate as well as its size and only decode a
@@ -87,26 +67,14 @@ function choices(index, showdown, battle, player, choice, buf) {
87
67
  // choices function for each generation within node.zig. We could do something
88
68
  // really galaxy-brained and return some sort of frankenstein subclass of
89
69
  // Array backed by ArrayBuffer which would lazily decode the Choice on access,
90
- // but thats ultimately not worth the effort. You can't have both a high-level
91
- // idiomatic API and performance here, hence why the choose function below
92
- // exists.
70
+ // but thats ultimately not worth the effort.
93
71
  const options = new Array(n);
94
- const data = new Uint8Array(buf);
95
72
  for (let i = 0; i < n; i++)
96
- options[i] = _1.Choice.decode(data[i]);
73
+ options[i] = common_1.Choice.decode(out[i]);
97
74
  return options;
98
75
  }
99
- exports.choices = choices;
100
- function choose(index, showdown, battle, player, choice, buf, fn) {
101
- const request = choice[0] === 'p' ? 0 : choice[0] === 'm' ? 1 : 2;
102
- const n = ADDON[+showdown].bindings[index].choices(battle, +(player !== 'p1'), request, buf);
103
- const data = new Uint8Array(buf);
104
- return _1.Choice.decode(data[fn(n)]);
105
- }
106
- exports.choose = choose;
107
76
  function size(index, type) {
108
- const bindings = (ADDON[1] ?? ADDON[0]).bindings[index];
77
+ const bindings = (ADDONS[1] ?? ADDONS[0]).bindings[index];
109
78
  return type[0] === 'c' ? bindings.CHOICES_SIZE : bindings.LOGS_SIZE;
110
79
  }
111
- exports.size = size;
112
80
  //# sourceMappingURL=addon.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"addon.js","sourceRoot":"","sources":["../../src/pkg/addon.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,2CAA6B;AAE7B,wBAAyC;AAEzC,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AAE9C,IAAI,KAAK,GAAoD,SAAS,CAAC;AAcvE,SAAS,IAAI;IACX,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,GAAgC,SAAS,CAAC;IAClD,IAAI,QAAQ,GAA+B,SAAS,CAAC;IACrD,IAAI;QACF,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,WAAW,CAAC,CAAC,CAAC,MAAyB,CAAC;KACxF;IAAC,MAAM,GAAG;IACX,IAAI;QACF,QAAQ;YACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,oBAAoB,CAAC,CAAC,CAAC,MAAwB,CAAC;KAC3F;IAAC,MAAM,GAAG;IACX,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,EAAE;QACtB,MAAM,IAAI,KAAK,CAAC,uEAAuE,CAAC,CAAC;KAC1F;IACD,OAAO,CAAC,KAAK,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;AACpC,CAAC;AAED,SAAgB,KAAK,CAAC,QAAiB;IACrC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,EAAE;QACtB,MAAM,IAAI,GAAG,KAAM,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;KACH;AACH,CAAC;AATD,sBASC;AAED,SAAgB,QAAQ,CAAC,QAAiB,EAAE,GAAa;IACvD,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAC;IACrC,IAAI,GAAG,KAAK,SAAS;QAAE,OAAO,IAAI,CAAC;IACnC,OAAO,KAAM,CAAC,CAAC,QAAQ,CAAE,CAAC,OAAO,CAAC,GAAG,KAAK,GAAG,CAAC;AAChD,CAAC;AAJD,4BAIC;AAED,SAAgB,MAAM,CACpB,KAAa,EACb,QAAiB,EACjB,MAAmB,EACnB,EAAW,EACX,EAAW,EACX,GAAiB;IAEjB,OAAO,SAAM,CAAC,MAAM,CAAC,KAAM,CAAC,CAAC,QAAQ,CAAE,CAAC,QAAQ,CAAC,KAAK,CAAC;SACpD,MAAM,CAAC,MAAM,EAAE,SAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,SAAM,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;AAChE,CAAC;AAVD,wBAUC;AAED,SAAgB,OAAO,CACrB,KAAa,EACb,QAAiB,EACjB,MAAmB,EACnB,MAAc,EACd,MAAsB,EACtB,GAAgB;IAEhB,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,GAAG,KAAM,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,CAAC;IAC/F,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,8EAA8E;IAC9E,0EAA0E;IAC1E,UAAU;IACV,MAAM,OAAO,GAAG,IAAI,KAAK,CAAS,CAAC,CAAC,CAAC;IACrC,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;QAAE,OAAO,CAAC,CAAC,CAAC,GAAG,SAAM,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;IAChE,OAAO,OAAO,CAAC;AACjB,CAAC;AA/BD,0BA+BC;AAED,SAAgB,MAAM,CACpB,KAAa,EACb,QAAiB,EACjB,MAAmB,EACnB,MAAc,EACd,MAAsB,EACtB,GAAgB,EAChB,EAAyB;IAEzB,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,GAAG,KAAM,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,CAAC;IAC/F,MAAM,IAAI,GAAG,IAAI,UAAU,CAAC,GAAG,CAAC,CAAC;IACjC,OAAO,SAAM,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpC,CAAC;AAbD,wBAaC;AAED,SAAgB,IAAI,CAAC,KAAa,EAAE,IAAuB;IACzD,MAAM,QAAQ,GAAG,CAAC,KAAM,CAAC,CAAC,CAAC,IAAI,KAAM,CAAC,CAAC,CAAC,CAAE,CAAC,QAAQ,CAAC,KAAK,CAAE,CAAC;IAC5D,OAAO,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC;AACtE,CAAC;AAHD,oBAGC"}
1
+ {"version":3,"file":"addon.js","sourceRoot":"","sources":["../../src/pkg/addon.ts"],"names":[],"mappings":"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"}