@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.
- package/LICENSE +1 -3
- package/README.md +104 -59
- package/build/pkg/addon/browser.d.ts +3 -0
- package/build/pkg/addon/browser.js +47 -0
- package/build/pkg/addon/browser.js.map +1 -0
- package/build/pkg/addon/node.d.ts +3 -0
- package/build/pkg/addon/node.js +110 -0
- package/build/pkg/addon/node.js.map +1 -0
- package/build/pkg/addon/wasm.d.ts +2 -0
- package/build/pkg/addon/wasm.js +53 -0
- package/build/pkg/addon/wasm.js.map +1 -0
- package/build/pkg/addon.d.ts +26 -4
- package/build/pkg/addon.js +39 -71
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data/ids.json +12 -12
- package/build/pkg/data/layout.json +17 -4
- package/build/pkg/data/protocol.json +84 -13
- package/build/pkg/data.d.ts +27 -5
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +15 -18
- package/build/pkg/gen1.js +30 -21
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +42 -91
- package/build/pkg/index.js +23 -70
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +29 -1
- package/build/pkg/protocol.js +123 -102
- package/build/pkg/protocol.js.map +1 -1
- package/build/tools/debug.js +84 -73
- package/build/tools/debug.js.map +1 -1
- package/build/tools/display/debug.jsx +66 -0
- package/build/tools/display/debug.jsx.map +1 -0
- package/build/tools/display/index.js +152 -0
- package/build/tools/display/index.js.map +1 -0
- package/build/tools/display/ui.jsx +360 -0
- package/build/tools/display/ui.jsx.map +1 -0
- package/build/tools/display/util.js +157 -0
- package/build/tools/display/util.js.map +1 -0
- package/build.zig +304 -142
- package/package.json +71 -121
- package/src/bin/install-pkmn-engine +48 -22
- package/src/bin/pkmn-debug +1 -1
- package/src/lib/bindings/c.zig +200 -0
- package/src/lib/{binding → bindings}/node.zig +15 -32
- package/src/lib/bindings/wasm.zig +50 -0
- package/src/lib/common/array.zig +70 -0
- package/src/lib/common/battle.zig +17 -0
- package/src/lib/common/data.zig +12 -24
- package/src/lib/common/debug.zig +33 -28
- package/src/lib/common/js.zig +114 -0
- package/src/lib/common/optional.zig +61 -0
- package/src/lib/common/options.zig +6 -0
- package/src/lib/common/protocol.zig +964 -450
- package/src/lib/common/rational.zig +440 -0
- package/src/lib/common/rng.zig +22 -15
- package/src/lib/common/util.zig +44 -0
- package/src/lib/gen1/calc.zig +975 -0
- package/src/lib/gen1/chance.zig +1222 -0
- package/src/lib/gen1/data/moves.zig +193 -183
- package/src/lib/gen1/data/species.zig +4 -6
- package/src/lib/gen1/data/types.zig +9 -10
- package/src/lib/gen1/data.zig +71 -81
- package/src/lib/gen1/helpers.zig +90 -410
- package/src/lib/gen1/mechanics.zig +712 -648
- package/src/lib/gen2/calc.zig +150 -0
- package/src/lib/gen2/chance.zig +896 -0
- package/src/lib/gen2/data/items.zig +13 -21
- package/src/lib/gen2/data/moves.zig +664 -572
- package/src/lib/gen2/data/species.zig +2 -4
- package/src/lib/gen2/data/types.zig +139 -34
- package/src/lib/gen2/data.zig +121 -96
- package/src/lib/gen2/generated.zig +801 -0
- package/src/lib/gen2/helpers.zig +53 -38
- package/src/lib/gen2/mechanics.zig +3580 -29
- package/src/lib/napi.h +2 -0
- package/src/lib/node.zig +14 -0
- package/src/lib/pkmn.zig +125 -29
- package/src/lib/wasm.zig +13 -0
- package/src/tools/display/dom.ts +108 -0
- package/src/tools/display/ui.css +354 -0
- package/build/test/display.js +0 -400
- package/build/test/display.js.map +0 -1
- package/src/lib/binding/wasm.zig +0 -12
- package/src/lib/gen1/README.md +0 -814
- package/src/lib/gen2/README.md +0 -309
- package/src/test/display/pkmn.html.tmpl +0 -368
package/LICENSE
CHANGED
|
@@ -1,6 +1,4 @@
|
|
|
1
|
-
|
|
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/
|
|
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.
|
|
53
|
-
|
|
54
|
-
|
|
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`
|
|
71
|
-
|
|
72
|
-
[`install-pkmn-engine`](src/bin/install-pkmn-engine) which
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
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
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
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
|
|
99
|
-
|
|
100
|
-
|
|
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
|
|
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
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
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
|
|
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`](
|
|
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
|
-
|
|
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)](
|
|
198
|
+
[(full code)](examples/c/example.c)
|
|
163
199
|
|
|
164
|
-
The C API
|
|
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
|
|
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 = (
|
|
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.
|
|
191
|
-
c2 = battle.
|
|
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)](
|
|
234
|
+
[(full code)](examples/js/example.ts)
|
|
198
235
|
|
|
199
|
-
By default, the `@pkmn/engine` package
|
|
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
|
|
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`](
|
|
210
|
-
|
|
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
|
|
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 =
|
|
228
|
-
var c2 =
|
|
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)](
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
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
|
|
330
|
-
choices
|
|
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
|
|
334
|
-
it
|
|
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,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;
|