@pkmn/engine 0.1.0-dev.437f6a52 → 0.1.0-dev.4438e918

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 (86) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +104 -59
  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 +304 -142
  40. package/package.json +71 -121
  41. package/src/bin/install-pkmn-engine +48 -22
  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/battle.zig +17 -0
  48. package/src/lib/common/data.zig +12 -24
  49. package/src/lib/common/debug.zig +33 -28
  50. package/src/lib/common/js.zig +114 -0
  51. package/src/lib/common/optional.zig +61 -0
  52. package/src/lib/common/options.zig +6 -0
  53. package/src/lib/common/protocol.zig +964 -450
  54. package/src/lib/common/rational.zig +440 -0
  55. package/src/lib/common/rng.zig +22 -15
  56. package/src/lib/common/util.zig +44 -0
  57. package/src/lib/gen1/calc.zig +975 -0
  58. package/src/lib/gen1/chance.zig +1222 -0
  59. package/src/lib/gen1/data/moves.zig +193 -183
  60. package/src/lib/gen1/data/species.zig +4 -6
  61. package/src/lib/gen1/data/types.zig +9 -10
  62. package/src/lib/gen1/data.zig +71 -81
  63. package/src/lib/gen1/helpers.zig +90 -410
  64. package/src/lib/gen1/mechanics.zig +712 -648
  65. package/src/lib/gen2/calc.zig +150 -0
  66. package/src/lib/gen2/chance.zig +896 -0
  67. package/src/lib/gen2/data/items.zig +13 -21
  68. package/src/lib/gen2/data/moves.zig +664 -572
  69. package/src/lib/gen2/data/species.zig +2 -4
  70. package/src/lib/gen2/data/types.zig +139 -34
  71. package/src/lib/gen2/data.zig +121 -96
  72. package/src/lib/gen2/generated.zig +801 -0
  73. package/src/lib/gen2/helpers.zig +53 -38
  74. package/src/lib/gen2/mechanics.zig +3580 -29
  75. package/src/lib/napi.h +2 -0
  76. package/src/lib/node.zig +14 -0
  77. package/src/lib/pkmn.zig +125 -29
  78. package/src/lib/wasm.zig +13 -0
  79. package/src/tools/display/dom.ts +108 -0
  80. package/src/tools/display/ui.css +354 -0
  81. package/build/test/display.js +0 -400
  82. package/build/test/display.js.map +0 -1
  83. package/src/lib/binding/wasm.zig +0 -12
  84. package/src/lib/gen1/README.md +0 -814
  85. package/src/lib/gen2/README.md +0 -309
  86. 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" />
@@ -12,6 +12,14 @@
12
12
  <img alt="License" src="https://img.shields.io/badge/License-MIT-blue.svg" />
13
13
  </a>
14
14
  </p>
15
+
16
+ > [!WARNING]
17
+ > **This project is under heavy development** and currently the `main` branch contains numerous breaking
18
+ > changes which may not work and which are not fully documented. Please **wait for the forthcoming
19
+ > initial v0.1 release** before depending on this project (code from the
20
+ > [`old`](https://github.com/pkmn/engine/releases/tag/old) tag can also be used to experiment with a
21
+ > more stable version of the codebase).
22
+
15
23
  <hr />
16
24
 
17
25
  A minimal, complete, Pokémon battle simulation engine optimized for performance and
@@ -49,9 +57,13 @@ $ zig build --prefix /usr/local -Doptimize=ReleaseFast
49
57
  ```
50
58
 
51
59
  The Zig website has [installation instructions](https://ziglang.org/learn/getting-started/) which
52
- walk through how to install Zig on each platform - the engine code should work on Zig v0.11.0 dev
53
- build 3859 or greater, though tracks Zig's master branch so this may change in the future if
54
- breaking language 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**.
55
67
 
56
68
  `libpkmn` can be built with `-Dshowdown` to instead produce the Pokémon Showdown compatible
57
69
  `libpkmn-showdown` library. Furthermore, protocol message logging can be enabled through `-Dlog`.
@@ -67,40 +79,64 @@ $ npm install @pkmn/engine
67
79
  ```
68
80
 
69
81
  The driver depends on being able to find compiled Node/WASM addons in
70
- `node_modules/@pkmn/engine/build/lib` in order to be useful. When you install the package a
71
- [`postinstall` lifecycle script](https://docs.npmjs.com/cli/v8/using-npm/scripts) will run
72
- [`install-pkmn-engine`](src/bin/install-pkmn-engine) which will check for a compatible `zig`
73
- compiler (see above regarding minimum version) and download one to
74
- `node_module/@pkmn/engine/build/bin` if it can't find one, as well as looking for (and downloading,
75
- if necessary) the required Node headers needed to successfully build the addons natively.
82
+ `node_modules/@pkmn/engine/build/lib` to be useful. When you install the package a [`postinstall`
83
+ lifecycle script](https://docs.npmjs.com/cli/v8/using-npm/scripts) runs
84
+ [`install-pkmn-engine`](src/bin/install-pkmn-engine) which checks for a compatible `zig` compiler
85
+ (see earlier regarding minimum version) and download one to `node_module/@pkmn/engine/build/bin` if
86
+ it can't find one, as well as looking for (and downloading, if necessary) the required Node headers
87
+ needed to successfully build the addons natively.
76
88
 
77
89
  **If you have configured `npm` to `--ignore-scripts` you must either run `npx install-pkmn-engine`
78
90
  directly or build the addons manually and place the artifacts in the expected paths.**
79
91
 
80
92
  ### `pkmn`
81
93
 
82
- Until the [Zig package manager](https://github.com/ziglang/zig/projects/4) is completed, the
83
- recommended way of using the `pkmn` package in Zig is by either copying this repository into your
84
- project or by using [git submodules](https://git-scm.com/book/en/v2/Git-Tools-Submodules) and then
85
- 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`:
86
122
 
87
123
  ```zig
88
124
  const std = @import("std");
89
- const pkmn = @import("lib/pkmn/build.zig");
90
125
 
91
126
  pub fn build(b: *std.Build) void {
92
127
  ...
93
- 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"));
94
130
  ...
95
131
  }
96
132
  ```
97
133
 
98
- The engine's `build.zig` exposes a `module` function that takes an options structure to allow for
99
- configuring whether or not Pokémon Showdown compatibility mode or protocol message logging should be
100
- 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
101
137
  declaration](https://ziglang.org/documentation/master/#Root-Source-File). There are several
102
138
  undocumented internal options that can be tweaked as well via build or root options, though these
103
- options are not officially supported, affect correctness, and may change meaning or behavior without
139
+ options aren't officially supported, affect correctness, and may change meaning or behavior without
104
140
  warning. Use at your own risk.
105
141
 
106
142
  ```zig
@@ -112,11 +148,11 @@ pub const pkmn_options = .{ .showdown = true, .log = true };
112
148
  For each Pokémon generation, the engine provides a battle structure with two functions - a function
113
149
  to `update` the battle's state based on both players' choices and a function that defines which
114
150
  `choices` are valid at that decision point (at the beginning of a battle both player's must "pass"
115
- as their first choice in order to switch in the first member of their party). If `-Dlog` protocol
116
- logging is enabled each update will produce logs which can be decoded into a buffer (`LOGS_SIZE`
117
- constants are provided to make it easy to allocate a buffer of the correct size). Each `update` will
118
- return a result to indicate either that the battle has terminated or which types of choices will be
119
- available for each player.
151
+ as their first choice to switch in the first member of their party). If `-Dlog` protocol logging is
152
+ enabled each update produces logs which can be decoded into a buffer (`LOGS_SIZE` constants are
153
+ provided to make it easy to allocate a buffer of the correct size). Each `update` returns a result
154
+ to indicate either that the battle has terminated or which types of choices are available for each
155
+ player.
120
156
 
121
157
  Unlike [Pokémon Showdown's
122
158
  SIM-PROTOCOL](https://github.com/smogon/pokemon-showdown/blob/master/sim/SIM-PROTOCOL.md#choice-requests)
@@ -128,19 +164,19 @@ state or cause the engine to crash.**
128
164
 
129
165
  Battles may be played out from any point but to freshly initialize a battle which is yet to start
130
166
  the turn count and active Pokémon should be zeroed out (driver code should handle this for you).
131
- Most driver code should also provide helpers to make initialize a battle convenient - check the
167
+ Most driver code should also provide helpers to make initializing battle convenient - check the
132
168
  respective documentation and examples for the bindings being used. The engine's [protocol
133
169
  documentation](docs/PROTOCOL.md) goes into greater detail on the specifics of updates and the
134
170
  potential logs that may result.
135
171
 
136
172
  *The snippets below are meant to merely illustrate in broad strokes how the pkmn engine can be used
137
- \- the [`examples`](src/examples) directory contains fully commented and runnable code.*
173
+ \- the [`examples`](examples) directory contains fully commented and runnable code.*
138
174
 
139
175
  ### C
140
176
 
141
177
  [`pkmn.h`](src/include/pkmn.h) exports the C API for `libpkmn`. Symbols are all prefixed with
142
178
  `pkmn_` to avoid name collisions. If `-Dlog` is enabled and logging throws an error then the error
143
- will be encoded in the `pkmn_result` and can be checked with `pkmn_error`.
179
+ is encoded in the `pkmn_result` and can be checked with `pkmn_error`.
144
180
 
145
181
  ```c
146
182
  #include <pkmn.h>
@@ -159,55 +195,56 @@ while (!pkmn_result_type(result = pkmn_battle_update(&battle, c1, c2, &options))
159
195
  if (pkmn_error(result)) exit(1);
160
196
  ```
161
197
 
162
- [(full code)](src/examples/c/example.c)
198
+ [(full code)](examples/c/example.c)
163
199
 
164
- The C API does not export any helpers for creating or accessing the opaque battle objects - it is
200
+ The C API doesn't export any helpers for creating or accessing the opaque battle objects - it's
165
201
  instead intended to be used as the foundation for more ergonomic bindings in [other
166
202
  languages](#other) (the lack of namespaces and bit fields having an implementation-defined layout in
167
203
  C are the main contributing factors to the sparseness of what `libpkmn` chooses to expose).
168
204
 
169
205
  ### JavaScript / TypeScript
170
206
 
171
- `@pkmn/engine` depends on the [`@pkmn/data`](https://www.npmjs.com/package/@pkmn/data) which
207
+ `@pkmn/engine` depends on the [`@pkmn/data`](https://www.npmjs.com/package/@pkmn/data) package which
172
208
  requires a `Dex` implementation to be provided as well. The `Battle.create` function can be used to
173
209
  initialize a `Battle` from the beginning, or `Battle.restore` can be used to re-instantiate a battle
174
- which is in already progress. If logging is enabled the output can be turned into Pokémon Showdown
210
+ which is already in progress. If logging is enabled the output can be turned into Pokémon Showdown
175
211
  protocol via `Log.parse`.
176
212
 
177
213
  ```ts
178
214
  import {Dex} from '@pkmn/dex';
179
215
  import {Generations} from '@pkmn/data';
180
- import {Battle} from '@pkmn/engine';
216
+ import {Battle, Choice} from '@pkmn/engine';
181
217
 
182
218
  const gens = new Generations(Dex);
183
219
  const battle = Battle.create(...);
184
220
 
185
- const choose = (n: number) => Math.random() * n;
221
+ const choose = (choices: Choice[]) =>
222
+ choices[Math.floor(Math.random() * choices.length)];
186
223
 
187
224
  let result: Result;
188
225
  let c1: Choice, c2: Choice;
189
226
  while (!(result = battle.update(c1, c2)).type) {
190
- c1 = battle.choose('p1', result, choose);
191
- c2 = battle.choose('p2', result, choose);
227
+ c1 = choose(battle.choices('p1', result));
228
+ c2 = choose(battle.choices('p2', result));
192
229
  }
193
230
 
194
231
  console.log(result);
195
232
  ```
196
233
 
197
- [(full code)](src/examples/js/example.ts)
234
+ [(full code)](examples/js/example.ts)
198
235
 
199
- By default, the `@pkmn/engine` package will compile the engine with `-Dshowdown`, though by running
236
+ By default, the `@pkmn/engine` package compiles the engine with `-Dshowdown`, though by running
200
237
  `install-pkmn-engine` directly and passing in `--options` you can override this default and build
201
238
  different configurations of the extension for the driver to use. The driver can support
202
239
  configurations both with and without Pokémon Showdown compatibility simultaneously if present. On
203
- update, the post-install script will attempt to rebuild whichever extensions it finds with the same
240
+ update, the post-install script attempts to rebuild whichever extensions it finds with the same
204
241
  configuration parameters that were originally used meaning updating to the newest version of the
205
242
  library should be seamless.
206
243
 
207
244
  Despite relying on the native engine code, the `@pkmn/engine` code is designed to also work in
208
245
  browsers which support [WebAssembly](https://webassembly.org/). Running `npm run start:web` from the
209
- [`examples`](src/examples/js) directory will start a server that can be used to demonstrate the
210
- engine running in the browser.
246
+ [`examples`](examples/js) directory starts a server that can be used to demonstrate the engine
247
+ running in the browser.
211
248
 
212
249
  ### Zig
213
250
 
@@ -218,14 +255,15 @@ be used when logging is enabled to allow for easily printing e.g. to standard ou
218
255
  const std = @import("std");
219
256
  const pkmn = @import("pkmn");
220
257
 
221
- var random = std.rand.DefaultPrng.init(seed).random();
258
+ var prng: std.Random.DefaultPrng = .init(seed);
259
+ var random = prng.random();
222
260
  var choices: [pkmn.CHOICES_SIZE]pkmn.Choice = undefined;
223
261
 
224
262
  var battle = ...
225
263
  var options = pkmn.battle.options(...);
226
264
 
227
- var c1 = pkmn.Choice{};
228
- var c2 = pkmn.Choice{};
265
+ var c1: pkmn.Choice = .{};
266
+ var c2: pkmn.Choice = .{};
229
267
 
230
268
  var result = try battle.update(c1, c2, &options);
231
269
  while (result.type == .None) : (result = try battle.update(c1, c2, &options)) {
@@ -236,11 +274,11 @@ while (result.type == .None) : (result = try battle.update(c1, c2, &options)) {
236
274
  std.debug.print("{}\n", .{result.type});
237
275
  ```
238
276
 
239
- [(full code)](src/examples/zig/example.zig)
277
+ [(full code)](examples/zig/example.zig)
240
278
 
241
279
  The Zig package also supports some APIs which are difficult to expose elsewhere such as the
242
280
  `FixedRNG` which allows you to fully specify the exact RNG frames (which can be useful for ensuring
243
- certain outcomes/effects always occur) for a battle, though doing so will change the size of the
281
+ certain outcomes/effects always occur) for a battle, though doing so changes the size of the
244
282
  `Battle` object.
245
283
 
246
284
  ### Other
@@ -251,7 +289,7 @@ simplify the process even further [`src/data`](src/data) contains JSON dumps of
251
289
  data, structure sizes and offsets, and protocol information used by the reference driver code. The
252
290
  following is a list of known `libpkmn` bindings written by developers outside of the [pkmn
253
291
  organization](https://github.com/pkmn) that may be helpful (though note that these projects may not
254
- necessarily be up-to-date/complete/correct - inclusion in this list does not imply endorsement):
292
+ necessarily be up-to-date/complete/correct - inclusion in this list doesn't imply endorsement):
255
293
 
256
294
  | Language | License | URL |
257
295
  | ---------- | --------- | ------------------------------------ |
@@ -279,13 +317,20 @@ By default, `pkmn-debug` expects to read [binary debug protocol](docs/PROTOCOL.m
279
317
  $ <cmd> | pkmn-debug > index.html
280
318
  ```
281
319
 
282
- Alternatively, if a single filename argument is passed to the `pkmn-debug` it will read from that
320
+ Alternatively, if a single filename argument is passed to the `pkmn-debug` it reads from that
283
321
  instead:
284
322
 
285
323
  ```sh
286
324
  $ pkmn-debug <file> > index.html
287
325
  ```
288
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
+
289
334
  ## Status
290
335
 
291
336
  The engine is currently expected to be developed over multiple stages:
@@ -298,17 +343,17 @@ The engine is currently expected to be developed over multiple stages:
298
343
  | ***3*** | *modern generations* |
299
344
 
300
345
  Currently, most of the foundational work from stage 0 is done:
301
-
346
+
302
347
  - [benchmark and integration testing](src/test) infrastructure
303
348
  - [documentation](docs) about design, research, methodology, etc
304
- - definition and implementation of the [protocol](docs/PROTOCOL.md) that will be used by the engine
349
+ - definition and implementation of the [protocol](docs/PROTOCOL.md) that's used by the engine
305
350
 
306
- **Stage 1 is currently in progress** and will see the implementation of the actual Generation I & II
351
+ **Stage 1 is currently in progress** and involves the implementation of the actual Generation I & II
307
352
  battle engines, followed by Generation III & IV in stage 2. The implementation of further Pokémon
308
- generations is in scope for the project but should not be considered as part of the immediate
309
- roadmap (i.e. exploring the options for broadening support for old generation APIs will be given
310
- higher priority than implementing more modern generations). Furthermore, implementation of modern
311
- generations is soft-blocked on the [availability of high quality
353
+ generations is in scope for the project but shouldn't be considered part of the immediate roadmap
354
+ (i.e. exploring the options for broadening support for old generation APIs is given higher priority
355
+ than implementing more modern generations). Furthermore, implementation of modern generations is
356
+ soft-blocked on the [availability of high quality
312
357
  decompilations](https://github.com/orgs/pret/repositories) of the original games in question.
313
358
 
314
359
  Certain features will always be deemed **out of scope**:
@@ -326,10 +371,10 @@ The pkmn engine is distributed under the terms of the [MIT License](LICENSE).
326
371
  [^1]: In the case of Pokémon Showdown, only bugs which stem from a misimplementation of specific
327
372
  effects are reproduced in the engine, bugs which are the result of a misunderstanding of the
328
373
  fundamental mechanics of Pokémon or which simply arise due to specific Pokémon Showdown
329
- implementation details that are not replicable without making the same (incorrect) architectural
330
- choices are not. Furthermore, the "Pokémon Showdown" code referenced by this project includes
374
+ implementation details that aren't replicable without making the same (incorrect) architectural
375
+ choices aren't. Furthermore, the "Pokémon Showdown" code referenced by this project includes
331
376
  several [patches](docs/TESTING.md#patches) to improve accuracy and smooth over some of the more
332
377
  egregious implementation issues. In practical terms, the vast majority of games played out in the
333
- pkmn engine's compatibility mode and on this patched Pokémon Showdown simulator will be the same,
334
- it is only in a well defined and documented set of circumstances where the two implementations
378
+ pkmn engine's compatibility mode and on this patched Pokémon Showdown simulator are the same,
379
+ it's only in a well defined and documented set of circumstances where the two implementations
335
380
  diverge.
@@ -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;