@pkmn/engine 0.1.0-dev.d97c6e03 → 0.1.0-dev.fb5bf955
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/README.md +5 -5
- package/build/pkg/addon.d.ts +1 -1
- package/build/pkg/addon.js +1 -1
- package/build/pkg/gen1.js +1 -1
- package/build/test/display.js +1 -2
- package/build/test/display.js.map +1 -1
- package/build.zig +15 -10
- package/package.json +1 -1
- package/src/bin/install-pkmn-engine +1 -1
- package/src/bin/pkmn-debug +6 -29
- package/src/lib/binding/node.zig +4 -4
- package/src/lib/binding/wasm.zig +2 -2
- package/src/lib/gen1/README.md +5 -12
- package/src/lib/gen1/data.zig +5 -5
- package/src/lib/gen1/mechanics.zig +235 -231
- package/src/lib/gen2/data.zig +4 -4
- package/src/lib/pkmn.zig +3 -3
package/README.md
CHANGED
|
@@ -50,7 +50,7 @@ $ zig build --prefix /usr/local -Doptimize=ReleaseFast
|
|
|
50
50
|
|
|
51
51
|
The Zig website has [installation instructions](https://ziglang.org/learn/getting-started/) which
|
|
52
52
|
walk through how to install Zig on each platform - the engine code should work on Zig v0.11.0 dev
|
|
53
|
-
build
|
|
53
|
+
build 2168 or greater, though tracks Zig's master branch so this may change in the future if
|
|
54
54
|
breaking language changes are introduced:
|
|
55
55
|
|
|
56
56
|
`libpkmn` can be built with `-Dshowdown` to instead produce the Pokémon Showdown compatible
|
|
@@ -121,7 +121,7 @@ for each player.
|
|
|
121
121
|
Unlike [Pokémon Showdown's
|
|
122
122
|
SIM-PROTOCOL](https://github.com/smogon/pokemon-showdown/blob/master/sim/SIM-PROTOCOL.md#choice-requests)
|
|
123
123
|
which provides a rich request object at each decision point, the pkmn engine computes the possible
|
|
124
|
-
choices on demand based on the result of the previous `update` and the battle state (`
|
|
124
|
+
choices on demand based on the result of the previous `update` and the battle state (`OPTIONS_SIZE`
|
|
125
125
|
is a good size to initialize the buffer passed to `choices`). **Attempting to update the battle with
|
|
126
126
|
a choice not present in the options returned by `choices` is undefined behavior and may corrupt
|
|
127
127
|
state or cause the engine to crash.**
|
|
@@ -216,7 +216,7 @@ const std = @import("std");
|
|
|
216
216
|
const pkmn = @import("pkmn");
|
|
217
217
|
|
|
218
218
|
var random = std.rand.DefaultPrng.init(seed).random();
|
|
219
|
-
var
|
|
219
|
+
var options: [pkmn.OPTIONS_SIZE]pkmn.Choice = undefined;
|
|
220
220
|
|
|
221
221
|
var battle = ...
|
|
222
222
|
var log = ...
|
|
@@ -226,8 +226,8 @@ var c2 = pkmn.Choice{};
|
|
|
226
226
|
|
|
227
227
|
var result = try battle.update(c1, c2, log);
|
|
228
228
|
while (result.type == .None) : (result = try battle.update(c1, c2, log)) {
|
|
229
|
-
c1 =
|
|
230
|
-
c2 =
|
|
229
|
+
c1 = options[random.uintLessThan(u8, battle.choices(.P1, result.p1, &options))];
|
|
230
|
+
c2 = options[random.uintLessThan(u8, battle.choices(.P2, result.p2, &options))];
|
|
231
231
|
}
|
|
232
232
|
|
|
233
233
|
std.debug.print("{}\n", .{result.type});
|
package/build/pkg/addon.d.ts
CHANGED
|
@@ -4,4 +4,4 @@ export declare function supports(showdown: boolean, trace?: boolean): boolean;
|
|
|
4
4
|
export declare function update(index: number, showdown: boolean, battle: ArrayBuffer, c1?: Choice, c2?: Choice, log?: ArrayBuffer): Result;
|
|
5
5
|
export declare function choices(index: number, showdown: boolean, battle: ArrayBuffer, player: Player, choice: Choice['type'], buf: ArrayBuffer): Choice[];
|
|
6
6
|
export declare function choose(index: number, showdown: boolean, battle: ArrayBuffer, player: Player, choice: Choice['type'], buf: ArrayBuffer, fn: (n: number) => number): Choice;
|
|
7
|
-
export declare function size(index: number, type: '
|
|
7
|
+
export declare function size(index: number, type: 'options' | 'log'): number;
|
package/build/pkg/addon.js
CHANGED
|
@@ -105,7 +105,7 @@ function choose(index, showdown, battle, player, choice, buf, fn) {
|
|
|
105
105
|
exports.choose = choose;
|
|
106
106
|
function size(index, type) {
|
|
107
107
|
const bindings = (ADDON[1] ?? ADDON[0]).bindings[index];
|
|
108
|
-
return type[0] === '
|
|
108
|
+
return type[0] === 'o' ? bindings.OPTIONS_SIZE : bindings.LOGS_SIZE;
|
|
109
109
|
}
|
|
110
110
|
exports.size = size;
|
|
111
111
|
//# sourceMappingURL=addon.js.map
|
package/build/pkg/gen1.js
CHANGED
|
@@ -50,7 +50,7 @@ class Battle {
|
|
|
50
50
|
this.config = config;
|
|
51
51
|
this.lookup = lookup;
|
|
52
52
|
this.data = data;
|
|
53
|
-
this.options = new ArrayBuffer(addon.size(0, '
|
|
53
|
+
this.options = new ArrayBuffer(addon.size(0, 'options'));
|
|
54
54
|
this.buf = config.log ? new ArrayBuffer(addon.size(0, 'log')) : undefined;
|
|
55
55
|
this.log = config.log ? new DataView(this.buf) : undefined;
|
|
56
56
|
this.cache = [undefined, undefined];
|
package/build/test/display.js
CHANGED
|
@@ -88,8 +88,7 @@ function render(gen, showdown, error, seed, frames, partial = {}) {
|
|
|
88
88
|
buf.push(`<pre class="error"><code>${escapeHTML(err)}</pre></code>`);
|
|
89
89
|
}
|
|
90
90
|
const type = Array.isArray(last) ? 'showdown' : 'pkmn';
|
|
91
|
-
|
|
92
|
-
return (0, html_minifier_1.minify)(render(fs.readFileSync(template(type), 'utf8'), type === 'pkmn'
|
|
91
|
+
return (0, html_minifier_1.minify)(mustache.render(fs.readFileSync(template(type), 'utf8'), type === 'pkmn'
|
|
93
92
|
? { content: buf.join('') }
|
|
94
93
|
: {
|
|
95
94
|
seed: buf.shift(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/test/display.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,uCAAyB;AACzB,2CAA6B;AAG7B,mCAAyC;AACzC,iDAAqC;AACrC,mDAAqC;AAIrC,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;AACjD,MAAM,QAAQ,GAAG,CAAC,CAAsB,EAAE,EAAE,CAC1C,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,SAAS,EAAE,GAAG,CAAC,YAAY,CAAC,CAAC;AAE9D,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC;AACjD,MAAM,SAAS,GAA+E;IAC5F,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,CAAC,WAAW,EAAE,SAAS,CAAC;IACnC,MAAM,EAAE,CAAC,QAAQ,EAAE,KAAK,CAAC;IACzB,QAAQ,EAAE,CAAC,UAAU,EAAE,MAAM,CAAC;IAC9B,OAAO,EAAE,CAAC,SAAS,EAAE,KAAK,CAAC;IAC3B,YAAY,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;IACtC,SAAS,EAAE,CAAC,WAAW,EAAE,KAAK,CAAC;IAC/B,IAAI,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC;IACtB,WAAW,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;IACrC,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,CAAC;IAClC,UAAU,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;IACjC,IAAI,EAAE,CAAC,MAAM,EAAE,SAAS,CAAC;IACzB,SAAS,EAAE,CAAC,YAAY,EAAE,KAAK,CAAC;IAChC,WAAW,EAAE,CAAC,cAAc,EAAE,MAAM,CAAC;IACrC,OAAO,EAAE,CAAC,SAAS,EAAE,MAAM,CAAC;IAC5B,SAAS,EAAE,CAAC,aAAa,EAAE,SAAS,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,GAAG,CAAC,MAAe,EAAE,EAAE,CAAC,MAAM;IACxC,CAAC,CAAC,MAAM,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,EAAE;IACxE,CAAC,CAAC,KAAK,CAAC;AAEV,MAAM,MAAM,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC,OAAO,KAAK,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,KAAe,EAAE,CAAC;AACvF,MAAM,IAAI,GAAG,CAAC,IAAc,EAAE,EAAE;IAC9B,OAAO,IAAI,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC;QAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IACzD,OAAO,IAAI,CAAC;AACd,CAAC,CAAC;AAEF,MAAM,OAAO,GAAG,CAAC,IAAgB,EAAE,EAAE,CACnC,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAa,CAAC,EAAE,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC;SAClE,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,MAAM,CAAE,IAAI,CAAC,MAAc,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAErE,MAAM,KAAK,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC;IACjD,CAAC,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,mBAAmB;QACpD,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,EAAE,CAAC;AAElB,MAAM,MAAM,GAAG,CAAC,MAAoB,EAAE,EAAE,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;AAAzE,QAAA,MAAM,UAAmE;AActF,SAAgB,MAAM,CACpB,GAAe,EACf,QAAiB,EACjB,KAAyB,EACzB,IAAwB,EACxB,MAAuB,EACvB,UAA0B,EAAE;IAE5B,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,IAAI,IAAI;QAAE,GAAG,CAAC,IAAI,CAAC,SAAS,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IAEpE,IAAI,IAAI,GAAwC,SAAS,CAAC;IAC1D,KAAK,MAAM,KAAK,IAAI,MAAM,EAAE;QAC1B,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,QAAQ,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,CAAC;QACnD,IAAI,QAAQ,IAAI,KAAK,EAAE;YACrB,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC;SACrB;aAAM;YACL,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;YAClB,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;SAC1B;KACF;IACD,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,GAAG,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;IAEjD,IAAI,KAAK,EAAE;QACT,MAAM,GAAG,GAAG,KAAK,CAAC,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,4BAA4B,UAAU,CAAC,GAAG,CAAC,eAAe,CAAC,CAAC;KACtE;IAED,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,MAAM,CAAC;IACvD,MAAM,MAAM,GAAG,CAAC,QAAQ,IAAI,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAE,QAAgB,CAAC,OAAO,CAAC,CAAC,MAAM,CAAC;IACpF,OAAO,IAAA,sBAAM,EACX,MAAM,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC,EAAE,IAAI,KAAK,MAAM;QAC7D,CAAC,CAAC,EAAC,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,EAAC;QACzB,CAAC,CAAC;YACA,IAAI,EAAE,GAAG,CAAC,KAAK,EAAE;YACjB,OAAO,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC;SAC1B,CAAC,EACJ,EAAC,SAAS,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAC,CAClC,CAAC;AACJ,CAAC;AAzCD,wBAyCC;AAED,SAAS,YAAY,CACnB,GAAe,EACf,QAAiB,EACjB,OAAuB,EACvB,IAA8B;IAE9B,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,IAAI,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;QACzC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC;QAC9B,GAAG,CAAC,IAAI,CAAC,cAAc,IAAA,cAAM,EAAC,OAAO,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC;QAC9D,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;SAAM,IAAI,OAAO,IAAI,OAAO,IAAI,OAAO,CAAC,KAAK,EAAE;QAC9C,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;QACnC,KAAK,MAAM,IAAI,IAAI,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE;YAC5C,GAAG,CAAC,IAAI,CAAC,SAAS,KAAK,CAAC,IAAI,CAAC,IAAI,IAAI,eAAe,CAAC,CAAC;SACvD;QACD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;KAC1B;IACD,IAAI,QAAQ,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,EAAE;QACzC,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,CAAC,MAAM,EAAE,IAAoB,CAAC,CAAC,CAAC;KAC9E;SAAM,IAAI,MAAM,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,EAAE;QAC5C,GAAG,CAAC,IAAI,CAAC,qBAAqB,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KAChE;IACD,IAAI,OAAO,CAAC,MAAM,EAAE;QAClB,MAAM,EAAC,MAAM,EAAE,EAAE,EAAE,EAAE,EAAC,GAAG,OAAO,CAAC;QACjC,GAAG,CAAC,IAAI,CAAC,iDAAiD,CAAC,CAAC;QAC5D,GAAG,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,EAAE,UAAU,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;QAClF,GAAG,CAAC,IAAI,CAAC,2BAA2B,MAAM,CAAC,EAAE,UAAU,MAAM,CAAC,EAAE,CAAC,eAAe,CAAC,CAAC;QAClF,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;IACD,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,aAAa,CACpB,GAAe,EACf,QAAiB,EACjB,MAAoB,EACpB,IAAmB;IAEnB,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACjC,IAAI,MAAM,CAAC,IAAI,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,GAAG,CAAC,IAAI,CAAC,YAAY,MAAM,CAAC,IAAI,OAAO,CAAC,CAAC;QACzC,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;QAChC,GAAG,CAAC,IAAI,CAAC,sCAAsC,MAAM,CAAC,UAAU,QAAQ,CAAC,CAAC;QAC1E,GAAG,CAAC,IAAI,CAAC,+BAA+B,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACnB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;IACD,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IAC1C,MAAM,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;IACxE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;IAClE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,WAAW,CAClB,GAAe,EACf,QAAiB,EACjB,OAAgB,EAChB,MAAmB,EACnB,IAAU,EACV,IAAW;IAEX,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,GAAG,CAAC,IAAI,CAAC,oBAAoB,MAAM,IAAI,CAAC,CAAC;IACzC,IAAI,OAAO,EAAE;QACX,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,IAAI,CAAC,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,YAAY,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;QAC1F,GAAG,CAAC,IAAI,CAAC,wCAAwC,IAAI,QAAQ,CAAC,CAAC;QAC/D,MAAM,QAAQ,GACZ,IAAI,CAAC,gBAAgB,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,gBAAgB,CAAE,CAAC,IAAI,CAAC,CAAC,CAAC,eAAe,CAAC;QACvF,MAAM,KAAK,GACT,IAAI,CAAC,iBAAiB,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,iBAAiB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/D,GAAG,CAAC,IAAI,CAAC,4CAA4C,QAAQ,GAAG,KAAK,QAAQ,CAAC,CAAC;QAC/E,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;IACD,IAAI,IAAI,CAAC,MAAM,EAAE;QACf,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACjC,IAAI,IAAI,GAAG,SAAS,CAAC;QACrB,IAAI,IAAI,EAAE;YACR,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE;gBAClC,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE;oBAC7C,IAAI,GAAG,OAAO,CAAC;oBACf,MAAM;iBACP;aACF;SACF;QACD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACjE,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;IACD,GAAG,CAAC,IAAI,CAAC,wBAAwB,CAAC,CAAC;IACnC,GAAG,CAAC,IAAI,CAAC,kCAAkC,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,CAAC,CAAC;IACV,MAAM,CAAC,GAAG,EAAE,CAAC;IACb,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE;QAClC,IAAI,CAAC,KAAK,CAAC;YAAE,CAAC,CAAC,IAAI,CAAC,+BAA+B,CAAC,CAAC;QACrD,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;QAC9B,CAAC,EAAE,CAAC;KACL;IACD,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;IACrB,GAAG,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;IAC7B,KAAK,MAAM,OAAO,IAAI,IAAI,CAAC,OAAO,EAAE;QAClC,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,GAAG,EAAE,QAAQ,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC;KACzD;IACD,GAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;IACvB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,MAAM,KAAK,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,EAAE,KAAK,CAAU,CAAC;AAEjE,SAAS,cAAc,CACrB,GAAe,EACf,QAAiB,EACjB,OAAgB,EAChB,MAAe,EACf,IAAc;IAEd,MAAM,GAAG,GAAG,EAAE,CAAC;IACf,GAAG,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IAClC,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC;IAElE,SAAS;IACT,MAAM,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAC,GAAG,KAAK,CAAC,OAAO,CAAC,CAAC;IACtD,GAAG,CAAC,IAAI,CAAC,4BAA4B,KAAK,IAAI,CAAC,CAAC;IAChD,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IACxF,GAAG,CAAC,IAAI,CAAC,oEAAoE,CAAC,CAAC;IAC/E,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,IAAI,OAAO,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,CAAC,CAAC;IACrD,IAAI,IAAI,GAAW,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAE,CAAC,IAAI,CAAC;IAClD,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,OAAO;QAAE,IAAI,GAAG,OAAO,IAAI,OAAO,CAAC;IACpF,GAAG,CAAC,IAAI,CAAC,WAAW,IAAI,iBAAiB,OAAO,CAAC,KAAK,mBAAmB,CAAC,CAAC;IAC3E,IAAI,MAAM,IAAI,OAAO,CAAC,OAAO,KAAK,OAAO,CAAC,MAAM,CAAC,OAAO;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IAC5E,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACpB,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,MAAM,KAAK,GAAG,UAAU,KAAK,yBAAyB,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IACnF,MAAM,EAAE,GAAG,kBAAkB,KAAK,YAAY,KAAK,UAAU,CAAC;IAC9D,IAAI,IAAI,IAAI,IAAI,CAAC,QAAQ,KAAK,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE;QACtE,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,KAAK,GAAG,UAAU,IAAI,CAAC,KAAK,yBAAyB,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;QAC7F,GAAG,CAAC,IAAI,CAAC,sBAAsB,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,YAAY,KAAK,IAAI,CAAC,CAAC;QAC3F,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACb,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;SAAM;QACL,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;KACd;IACD,GAAG,CAAC,IAAI,CAAC,uBAAuB,OAAO,SAAS,CAAC,CAAC;IAClD,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IAEzB,iBAAiB;IACjB,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,EAAE,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC;IACtD,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAC5D,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC5B,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IACvD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnB,GAAG,CAAC,IAAI,CAAC,qBAAqB,CAAC,CAAC;IAChC,IAAI,CAAC,MAAM;QAAE,GAAG,CAAC,IAAI,CAAC,yBAAyB,SAAS,CAAC,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAC;IAExF,iBAAiB;IACjB,GAAG,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;IAC3C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK;YAAE,SAAS;QAC9C,GAAG,CAAC,IAAI,CAAC,OAAO,GAAG,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;KACjD;IACD,GAAG,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IACtB,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,IAAI,GAAG,CAAC,GAAG,KAAK,CAAC,IAAI,IAAI,KAAK,KAAK;YAAE,SAAS;QAC9C,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,IAAe,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;QAC3D,GAAG,CAAC,IAAI,CAAC,OAAO,WAAW,CAAC,KAAK,CAAC,IAAc,CAAC,EAAE,KAAK,CAAC,OAAO,CAAC,CAAC;KACnE;IACD,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAC1B,IAAI,MAAM,EAAE;QACV,GAAG,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;QACjC,IAAI,OAAO,CAAC,MAAM,CAAC,QAAQ,EAAE;YAC3B,GAAG,CAAC,IAAI,CAAC,mCAAmC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;SAC5F;QACD,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE;YAC1B,GAAG,CAAC,IAAI,CAAC,kCAAkC,YAAY,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;SAC1F;QACD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;IACD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAEnB,QAAQ;IACR,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,CAAC,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC;IAC5D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE;QACxB,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC,IAAI,CAAC;QAC1C,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,EAAE,CAAE,CAAC,EAAE,GAAG,CAAC,GAAG,CAAC,EAAE,GAAG,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QACpF,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,EAAE,IAAK,IAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAC;QACtE,MAAM,KAAK,GACR,IAAY,CAAC,QAAQ,CAAC,CAAC,CAAC,oBAAqB,IAAY,CAAC,QAAkB,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;QACxF,MAAM,EAAE,GAAG,WAAW,IAAI,CAAC,EAAE,IAAI,KAAK,WAAW,CAAC;QAClD,GAAG,CAAC,IAAI,CAAC,cAAc,QAAQ,KAAK,KAAK,IAAI,IAAI,IAAI,EAAE,OAAO,CAAC,CAAC;KACjE;IACD,GAAG,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;IAExB,YAAY;IACZ,IAAI,MAAM,EAAE;QACV,GAAG,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAC;QACpC,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,SAAS,EAAE;YACjC,MAAM,QAAQ,GAAG,CAA+B,CAAC;YACjD,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,GAAG,SAAS,CAAC,QAAQ,CAAE,CAAC;YAC1C,IAAI,IAAI,GAAG,EAAE,CAAC;YACd,IAAI,CAAC,SAAS,EAAE,WAAW,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE;gBAC7D,IAAI,GAAG,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC;aAClE;iBAAM,IAAI,QAAQ,KAAK,MAAM,EAAE;gBAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC;gBACzC,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,KAAK,GAAG,CAAC,MAAM,GAAG,CAAC;aAC1C;iBAAM,IAAI,QAAQ,KAAK,MAAM,EAAE;gBAC9B,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC;gBACzC,IAAI,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aACpD;iBAAM,IAAI,QAAQ,KAAK,WAAW,EAAE;gBACnC,MAAM,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC;gBACzC,IAAI,GAAG,GAAG,GAAG,CAAC,QAAQ,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aACrE;iBAAM,IAAI,QAAQ,KAAK,WAAW,EAAE;gBACnC,MAAM,IAAI,GAAG,SAAS,CAAC,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,IAAI,CAAC,CAAC;gBAC1D,IAAI,GAAG,GAAG,OAAO,CAAC,SAAS,CAAC,QAAQ,CAAE,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;aACxD;YACD,IAAI,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,KAAK,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;YACjE,GAAG,CAAC,IAAI,CAAC,yBAAyB,IAAI,KAAK,IAAI,SAAS,CAAC,CAAC;SAC3D;QACD,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;KACpB;IAED,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnB,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IACnB,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;AACtB,CAAC;AAED,SAAS,UAAU,CAAC,GAAW;IAC7B,OAAO,CAAC,GAAG;SACR,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC;SACtB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,MAAM,CAAC;SACrB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;SACvB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;SACxB,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC;AAC/B,CAAC;AAED,SAAS,KAAK,CAAC,OAAgB;IAC7B,MAAM,KAAK,GAAG,GAAG,OAAO,CAAC,EAAE,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,EAAE,CAAC;IAClD,MAAM,KAAK,GAAG,OAAO,CAAC,EAAE,GAAG,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;IAC5C,IAAI,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC;IACrC,IAAI,CAAC,OAAO,KAAK,GAAG,CAAC,IAAI,CAAC,KAAK,GAAG,GAAG,CAAC,EAAE;QACtC,OAAO,GAAG,EAAE,CAAC;KACd;IACD,MAAM,KAAK,GAAG,CAAC,OAAO,CAAC,EAAE,KAAK,CAAC,IAAI,OAAO,CAAC,KAAK,CAAC,EAAE,GAAG,EAAE,CAAC;QACvD,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG;QACrB,CAAC,CAAC,eAAe,CAAC,CAAC,CAAC,QAAQ,KAAK,mBAAmB,CAAC;IACzD,MAAM,KAAK,GAAG,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,QAAQ,CAAC;IACtE,OAAO,EAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,OAAgB;IACrC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAO,CAAC;IAC7D,IAAI,CAAC,GAAG,EAAE,CAAC;IACX,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK;QAAE,CAAC,IAAI,UAAU,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;IACxE,IAAI,OAAO,CAAC,MAAM,KAAK,KAAK,IAAI,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE;QACxD,CAAC,IAAI,UAAU,OAAO,CAAC,UAAU,CAAC,KAAK,EAAE,CAAC;KAC3C;IACD,IAAI,CAAC;QAAE,CAAC,GAAG,UAAU,CAAC,GAAG,CAAC;IAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,OAAO,CAAC,MAAO,CAAC;IAC5D,OAAO,uBAAuB,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC;AACtD,CAAC;AAED,SAAS,WAAW,CAAC,IAAY,EAAE,KAAa;IAC9C,IAAI,CAAC,KAAK;QAAE,OAAO,GAAG,IAAI,EAAE,CAAC;IAC7B,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,sBAAsB,IAAI,MAAM,KAAK,UAAU,CAAC;IACtE,OAAO,qBAAqB,IAAI,KAAK,KAAK,UAAU,CAAC;AACvD,CAAC;AAED,SAAS,YAAY,CAAC,KAAa;IACjC,IAAI,KAAK,GAAG,CAAC;QAAE,OAAO,uBAAuB,KAAK,SAAS,CAAC;IAC5D,OAAO,qBAAqB,KAAK,SAAS,CAAC;AAC7C,CAAC;AAED,SAAS,IAAI,CAAC,IAAiB,EAAE,OAAgB;IAC/C,MAAM,OAAO,GAAG,OAAO,CAAC,EAAE,KAAK,CAAC,CAAC;IACjC,MAAM,IAAI,GAAG,WAAK,CAAC,UAAU,CAAC,OAAO,CAAC,MAAM,CAAC,OAAO,EAAE,EAAC,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAC,CAAC,CAAC;IAC1F,OAAO,gBAAgB,IAAI,CAAC,KAAK,WAAW,CAAC;AAC/C,CAAC;AAED,SAAS,MAAM,CAAC,QAAiB,EAAE,OAAW,EAAE,OAAgB;IAC9D,MAAM,CAAC,GAAG,aAAO,CAAC,UAAU,CAAC,OAAO,EAAE,EAAC,GAAG,EAAE,QAAQ,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,QAAQ,EAAC,CAAC,CAAC;IAC3E,IAAI,KAAK,GAAG,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,6BAA6B,CAAC,CAAC,CAAC,EAAE,CAAC;IAC7D,IAAI,OAAO;QAAE,KAAK,IAAI,uDAAuD,CAAC;IAC9E,OAAO,4BAA4B,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC;AACjG,CAAC;AAED,SAAS,OAAO,CAAC,IAAc;IAC7B,MAAM,CAAC,GAAG,WAAK,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;IAC9B,MAAM,KAAK,GAAG,6BAA6B,CAAC;IAC5C,OAAO,0BAA0B,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,YAAY,KAAK,MAAM,CAAC;AAC/F,CAAC"}
|
|
1
|
+
{"version":3,"file":"display.js","sourceRoot":"","sources":["../../src/test/display.ts"],"names":[],"mappings":"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"}
|
package/build.zig
CHANGED
|
@@ -27,7 +27,6 @@ pub fn build(b: *std.Build) !void {
|
|
|
27
27
|
const dynamic = b.option(bool, "dynamic", "Build a dynamic library") orelse false;
|
|
28
28
|
const strip = b.option(bool, "strip", "Strip debugging symbols from binary") orelse false;
|
|
29
29
|
const pic = b.option(bool, "pic", "Force position independent code") orelse false;
|
|
30
|
-
const emit_asm = b.option(bool, "emit-asm", "Output .s (assembly code)") orelse false;
|
|
31
30
|
|
|
32
31
|
const cmd = b.findProgram(&.{"strip"}, &.{}) catch null;
|
|
33
32
|
|
|
@@ -80,7 +79,7 @@ pub fn build(b: *std.Build) !void {
|
|
|
80
79
|
//
|
|
81
80
|
// But ziglang/zig#14647 broke this so we now need to do an install() and then manually
|
|
82
81
|
// rename the file ourself in install-pkmn-engine
|
|
83
|
-
|
|
82
|
+
lib.install();
|
|
84
83
|
} else if (wasm) {
|
|
85
84
|
const lib = b.addSharedLibrary(.{
|
|
86
85
|
.name = name,
|
|
@@ -106,7 +105,7 @@ pub fn build(b: *std.Build) !void {
|
|
|
106
105
|
sh.addFileSourceArg(.{ .path = out });
|
|
107
106
|
b.getInstallStep().dependOn(&sh.step);
|
|
108
107
|
}
|
|
109
|
-
|
|
108
|
+
lib.install();
|
|
110
109
|
} else if (dynamic) {
|
|
111
110
|
const lib = b.addSharedLibrary(.{
|
|
112
111
|
.name = name,
|
|
@@ -120,7 +119,7 @@ pub fn build(b: *std.Build) !void {
|
|
|
120
119
|
lib.addIncludePath("src/include");
|
|
121
120
|
maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
|
|
122
121
|
if (pic) lib.force_pic = pic;
|
|
123
|
-
|
|
122
|
+
lib.install();
|
|
124
123
|
c = true;
|
|
125
124
|
} else {
|
|
126
125
|
const lib = b.addStaticLibrary(.{
|
|
@@ -135,8 +134,7 @@ pub fn build(b: *std.Build) !void {
|
|
|
135
134
|
lib.bundle_compiler_rt = true;
|
|
136
135
|
maybeStrip(b, lib, b.getInstallStep(), strip, cmd);
|
|
137
136
|
if (pic) lib.force_pic = pic;
|
|
138
|
-
|
|
139
|
-
b.installArtifact(lib);
|
|
137
|
+
lib.install();
|
|
140
138
|
c = true;
|
|
141
139
|
}
|
|
142
140
|
|
|
@@ -207,7 +205,7 @@ pub fn build(b: *std.Build) !void {
|
|
|
207
205
|
const lint_exe =
|
|
208
206
|
b.addExecutable(.{ .name = "lint", .root_source_file = .{ .path = "src/tools/lint.zig" } });
|
|
209
207
|
if (tests.build) tests.step.dependOn(&lint_exe.step);
|
|
210
|
-
const lint =
|
|
208
|
+
const lint = lint_exe.run();
|
|
211
209
|
|
|
212
210
|
b.step("benchmark", "Run benchmark code").dependOn(&benchmark.step);
|
|
213
211
|
b.step("fuzz", "Run fuzz tester").dependOn(&fuzz.step);
|
|
@@ -258,8 +256,11 @@ const TestStep = struct {
|
|
|
258
256
|
pub fn create(b: *std.Build, options: *std.Build.OptionsStep, config: Config) *TestStep {
|
|
259
257
|
const coverage = b.option([]const u8, "test-coverage", "Generate test coverage");
|
|
260
258
|
const test_file = b.option([]const u8, "test-file", "Input file for test");
|
|
259
|
+
const test_bin = b.option([]const u8, "test-bin", "Emit test binary to");
|
|
261
260
|
const test_filter =
|
|
262
261
|
b.option([]const u8, "test-filter", "Skip tests that do not match filter");
|
|
262
|
+
const test_no_exec =
|
|
263
|
+
b.option(bool, "test-no-exec", "Compiles test binary without running it") orelse false;
|
|
263
264
|
|
|
264
265
|
const self = b.allocator.create(TestStep) catch @panic("OOM");
|
|
265
266
|
const step = std.Build.Step.init(.{ .id = .custom, .name = "Run all tests", .owner = b });
|
|
@@ -273,17 +274,21 @@ const TestStep = struct {
|
|
|
273
274
|
.root_source_file = .{ .path = path },
|
|
274
275
|
.optimize = config.optimize,
|
|
275
276
|
.target = config.target,
|
|
276
|
-
.filter = test_filter,
|
|
277
277
|
});
|
|
278
278
|
tests.setMainPkgPath("./");
|
|
279
|
+
tests.setFilter(test_filter);
|
|
279
280
|
tests.addOptions("build_options", options);
|
|
280
281
|
tests.single_threaded = true;
|
|
281
282
|
maybeStrip(b, tests, &tests.step, config.strip, config.cmd);
|
|
282
283
|
if (config.pic) tests.force_pic = config.pic;
|
|
284
|
+
if (test_bin) |bin| {
|
|
285
|
+
tests.name = std.fs.path.basename(bin);
|
|
286
|
+
if (std.fs.path.dirname(bin)) |dir| tests.setOutputDir(dir);
|
|
287
|
+
}
|
|
283
288
|
if (coverage) |c| {
|
|
284
289
|
tests.setExecCmd(&.{ "kcov", "--include-pattern=src/lib", c, null });
|
|
285
290
|
}
|
|
286
|
-
self.step.dependOn(&
|
|
291
|
+
self.step.dependOn(if (test_no_exec) &tests.step else &tests.run().step);
|
|
287
292
|
}
|
|
288
293
|
return self;
|
|
289
294
|
}
|
|
@@ -321,7 +326,7 @@ fn tool(b: *std.Build, path: []const u8, config: ToolConfig) *std.Build.RunStep
|
|
|
321
326
|
if (config.tool.tests) |ts| ts.step.dependOn(&exe.step);
|
|
322
327
|
config.tool.exes.append(exe) catch @panic("OOM");
|
|
323
328
|
|
|
324
|
-
const run =
|
|
329
|
+
const run = exe.run();
|
|
325
330
|
maybeStrip(b, exe, &run.step, config.general.strip, config.general.cmd);
|
|
326
331
|
if (b.args) |args| run.addArgs(args);
|
|
327
332
|
|
package/package.json
CHANGED
|
@@ -10,7 +10,7 @@ const path = require('path');
|
|
|
10
10
|
const {pipeline} = require('stream/promises');
|
|
11
11
|
const tty = require('tty');
|
|
12
12
|
|
|
13
|
-
const ZIG_VERSION = {major: 0, minor: 11, patch: 0, dev:
|
|
13
|
+
const ZIG_VERSION = {major: 0, minor: 11, patch: 0, dev: 2168};
|
|
14
14
|
const DEV = ZIG_VERSION.dev ? `-dev.${ZIG_VERSION.dev}` : '';
|
|
15
15
|
const VERSION = `${ZIG_VERSION.major}.${ZIG_VERSION.minor}.${ZIG_VERSION.patch}${DEV}`;
|
|
16
16
|
const INDEX = 'https://ziglang.org/download/index.json';
|
package/src/bin/pkmn-debug
CHANGED
|
@@ -8,54 +8,31 @@ try {
|
|
|
8
8
|
}
|
|
9
9
|
|
|
10
10
|
const {execFileSync} = require('child_process');
|
|
11
|
-
const {readFileSync} = require('fs');
|
|
12
|
-
const {join, resolve} = require('path');
|
|
13
11
|
|
|
14
|
-
const
|
|
15
|
-
const packageJSON = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf8'));
|
|
12
|
+
const {Generations} = require('@pkmn/data');
|
|
16
13
|
|
|
17
|
-
const
|
|
18
|
-
for (const dep of ['@pkmn/img', 'html-minifier', 'mustache']) {
|
|
19
|
-
try {
|
|
20
|
-
require.resolve(dep);
|
|
21
|
-
} catch (e) {
|
|
22
|
-
if (e.code !== 'MODULE_NOT_FOUND') throw e;
|
|
23
|
-
missing.push(`${dep}@${packageJSON.devDependencies[dep]}`);
|
|
24
|
-
}
|
|
25
|
-
}
|
|
14
|
+
const {run} = require('../../build/tools/debug');
|
|
26
15
|
|
|
27
|
-
let Dex
|
|
16
|
+
let Dex;
|
|
28
17
|
try {
|
|
29
18
|
Dex = require('@pkmn/sim').Dex;
|
|
30
19
|
} catch (err) {
|
|
31
20
|
if (err.code !== 'MODULE_NOT_FOUND') throw err;
|
|
32
21
|
try {
|
|
33
|
-
|
|
22
|
+
require.resolve('@pkmn/dex');
|
|
34
23
|
} catch (e) {
|
|
35
24
|
if (e.code !== 'MODULE_NOT_FOUND') throw e;
|
|
36
|
-
|
|
25
|
+
execFileSync('npm', ['install', '@pkmn/dex', '--global', '--silent']);
|
|
37
26
|
}
|
|
38
|
-
}
|
|
39
27
|
|
|
40
|
-
if (missing.length) {
|
|
41
28
|
if (+/^v(\d+)/.exec(process.version)[1] < 16) {
|
|
42
29
|
console.error('pkmn-debug requires Node v16+');
|
|
43
30
|
process.exit(1);
|
|
44
31
|
}
|
|
45
32
|
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
const node_modules = execFileSync('npm', ['root', '--global'], {encoding: 'utf8'}).trim();
|
|
49
|
-
if (!process.env.NODE_PATH || !process.env.NODE_PATH.includes(node_modules)) {
|
|
50
|
-
console.error(`NODE_PATH must include npm's global node_modules directory: '${node_modules}'`);
|
|
51
|
-
process.exit(1);
|
|
52
|
-
}
|
|
33
|
+
Dex = require('@pkmn/dex').Dex;
|
|
53
34
|
}
|
|
54
35
|
|
|
55
|
-
const {Generations} = require('@pkmn/data');
|
|
56
|
-
|
|
57
|
-
const {run} = require('../../build/tools/debug');
|
|
58
|
-
|
|
59
36
|
run(new Generations(Dex)).catch(err => {
|
|
60
37
|
console.error(err.message);
|
|
61
38
|
process.exit(1);
|
package/src/lib/binding/node.zig
CHANGED
|
@@ -34,11 +34,11 @@ fn bindings(env: c.napi_env) c.napi_value {
|
|
|
34
34
|
}
|
|
35
35
|
|
|
36
36
|
fn bind(env: c.napi_env, gen: anytype) c.napi_value {
|
|
37
|
-
const
|
|
37
|
+
const options_size = @intCast(u32, gen.OPTIONS_SIZE);
|
|
38
38
|
const logs_size = @intCast(u32, gen.LOGS_SIZE);
|
|
39
39
|
var object = Object.init(env);
|
|
40
40
|
const properties = [_]c.napi_property_descriptor{
|
|
41
|
-
Property.init("
|
|
41
|
+
Property.init("OPTIONS_SIZE", .{ .value = Number.init(env, options_size) }),
|
|
42
42
|
Property.init("LOGS_SIZE", .{ .value = Number.init(env, logs_size) }),
|
|
43
43
|
Property.init("update", .{ .method = update(gen) }),
|
|
44
44
|
Property.init("choices", .{ .method = choices(gen) }),
|
|
@@ -108,10 +108,10 @@ fn choices(gen: anytype) c.napi_callback {
|
|
|
108
108
|
const request = @intToEnum(pkmn.Choice.Type, Number.get(env, argv[2], u8));
|
|
109
109
|
|
|
110
110
|
assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
|
|
111
|
-
assert(len == gen.
|
|
111
|
+
assert(len == gen.OPTIONS_SIZE);
|
|
112
112
|
assert(data != null);
|
|
113
113
|
|
|
114
|
-
var out = @ptrCast([*]pkmn.Choice, data.?)[0..gen.
|
|
114
|
+
var out = @ptrCast([*]pkmn.Choice, data.?)[0..gen.OPTIONS_SIZE];
|
|
115
115
|
const n = battle.choices(player, request, out);
|
|
116
116
|
return Number.init(env, @bitCast(u8, n));
|
|
117
117
|
}
|
package/src/lib/binding/wasm.zig
CHANGED
|
@@ -4,7 +4,7 @@ const pkmn = @import("../pkmn.zig");
|
|
|
4
4
|
export const SHOWDOWN = pkmn.options.showdown;
|
|
5
5
|
export const TRACE = pkmn.options.trace;
|
|
6
6
|
|
|
7
|
-
export const
|
|
8
|
-
std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.
|
|
7
|
+
export const GEN1_OPTIONS_SIZE =
|
|
8
|
+
std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.OPTIONS_SIZE)) catch unreachable;
|
|
9
9
|
export const GEN1_LOGS_SIZE =
|
|
10
10
|
std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.LOGS_SIZE)) catch unreachable;
|
package/src/lib/gen1/README.md
CHANGED
|
@@ -478,8 +478,7 @@ Smogon](https://www.smogon.com/forums/posts/5933177/show):
|
|
|
478
478
|
- Confusion self-hits use the wrong damage formula resulting in off-by-one errors (and also fail to
|
|
479
479
|
account for an opponent's Reflect). Furthermore, the confusion self-hit damage will erroneously be
|
|
480
480
|
inflicted to the confused user's substitute if the confused user had been attempting to use a
|
|
481
|
-
self-targeting move.
|
|
482
|
-
damage for the purposes of tracking the battle's last damage.
|
|
481
|
+
self-targeting move.
|
|
483
482
|
|
|
484
483
|
Beyond the general bugs listed above, several move effects are implemented incorrectly by Pokémon
|
|
485
484
|
Showdown. Some of these moves are [too fundamentally broken to be implemented](#unimplementable) by
|
|
@@ -489,8 +488,7 @@ the pkmn engine, but the following moves have their broken behavior preserved in
|
|
|
489
488
|
incorrectly still gets applied to Bide's user.
|
|
490
489
|
- **Leech Seed**: Leech Seed fails to heal its source side if a seeded target faints due to
|
|
491
490
|
recoil/crash damage on Pokémon Showdown. Pokémon Showdown also updates the battle's last damage
|
|
492
|
-
field with the uncapped Leech Seed damage
|
|
493
|
-
for Bide and Counter.
|
|
491
|
+
field with the uncapped Leech Seed damage which has consequences for Bide and Counter.
|
|
494
492
|
- **Pay Day**: Pay Day should still scatter coins if it hits (but doesn't break) and opponent's
|
|
495
493
|
Substitute but doesn't on Pokémon Showdown.
|
|
496
494
|
- **Flinch**: Flinching does not get cleared during move selection on Pokémon Showdown and is
|
|
@@ -500,14 +498,10 @@ the pkmn engine, but the following moves have their broken behavior preserved in
|
|
|
500
498
|
- **Rage**: Rage boosts should still result in burn/paralysis [stat modification
|
|
501
499
|
errors](https://pkmn.cc/bulba-glitch-1#Stat_modification_errors) but don't on Pokémon Showdown.
|
|
502
500
|
Furthermore, Pokémon Showdown only builds Rage for Disable/Explosion (hit/miss) when attacking
|
|
503
|
-
into a Substitute instead of all moves.
|
|
504
|
-
Petal Dance accuracy bug]( https://www.youtube.com/watch?v=NC5gbJeExbs) incorrectly, as the
|
|
505
|
-
accuracy only gets written when the volatile is present which can lead to incorrect accuracy
|
|
506
|
-
values on turns where Rage is used on the same turn as a move which modifies accuracy or evasion.
|
|
501
|
+
into a Substitute instead of all moves.
|
|
507
502
|
- **Thrash** / **Petal Dance**: once a Pokémon is locked into a thrashing move they will lose all
|
|
508
503
|
speed ties on Pokémon Showdown (due to the fact that if they win the speed tie their action will
|
|
509
|
-
then get "changed" and inserted back into the queue after their opponent's action).
|
|
510
|
-
Showdown also implements accuracy incorrectly, as covered above.
|
|
504
|
+
then get "changed" and inserted back into the queue after their opponent's action).
|
|
511
505
|
- **Freeze** / **Sleep**: Pokémon Showdown requires a move to be selected when a Pokémon is frozen
|
|
512
506
|
or sleeping and uses that in the event that the status is removed while on the cartridge no
|
|
513
507
|
selection is possible and no turn exists for the thawed/woken Pokémon to act except in the case of
|
|
@@ -532,8 +526,7 @@ the pkmn engine, but the following moves have their broken behavior preserved in
|
|
|
532
526
|
Pokémon Showdown implementing the health check based on floating point division instead of integer
|
|
533
527
|
divison like on the cartridge (meaning the Substitute 1/4 glitch will only occur if the Pokémon's
|
|
534
528
|
maximum HP is evenly divisible by 4). Finally, Substitute also incorrectly blocks Dream Eater on
|
|
535
|
-
Pokémon Showdown
|
|
536
|
-
damage.
|
|
529
|
+
Pokémon Showdown.
|
|
537
530
|
|
|
538
531
|
In addition to numerous cases where Pokémon Showdown uses the wrong type of message (e.g. `|-fail`
|
|
539
532
|
vs. `|-miss|` vs. `|-immune|`, e.g. in the case of Leech Seed) which are not documented here, Pokémon
|
package/src/lib/gen1/data.zig
CHANGED
|
@@ -17,16 +17,16 @@ const expectEqual = std.testing.expectEqual;
|
|
|
17
17
|
const expect = std.testing.expect;
|
|
18
18
|
|
|
19
19
|
/// The minimum size in bytes required to hold all Generation I choice options.
|
|
20
|
-
pub const
|
|
20
|
+
pub const MAX_OPTIONS: usize = 9; // move 1..4, switch 2..6
|
|
21
21
|
/// The optimal size in bytes required to hold all Generation I choice options.
|
|
22
|
-
/// At least as large as
|
|
22
|
+
/// At least as large as MAX_OPTIONS.
|
|
23
23
|
pub const MAX_LOGS: usize = 180;
|
|
24
24
|
|
|
25
25
|
/// The maximum number of bytes possibly logged by a single Generation I update.
|
|
26
|
-
pub const
|
|
27
|
-
|
|
26
|
+
pub const OPTIONS_SIZE = if (builtin.mode == .ReleaseSmall)
|
|
27
|
+
MAX_OPTIONS
|
|
28
28
|
else
|
|
29
|
-
std.math.ceilPowerOfTwo(usize,
|
|
29
|
+
std.math.ceilPowerOfTwo(usize, MAX_OPTIONS) catch unreachable;
|
|
30
30
|
/// The optimal size in bytes required to hold the largest amount of log data possible from a
|
|
31
31
|
/// single Generation I update. At least as large as MAX_LOGS.
|
|
32
32
|
pub const LOGS_SIZE = if (builtin.mode == .ReleaseSmall)
|
|
@@ -56,8 +56,6 @@ const BOOSTS = &[_][2]u8{
|
|
|
56
56
|
|
|
57
57
|
const MAX_STAT_VALUE = 999;
|
|
58
58
|
|
|
59
|
-
const DISTRIBUTION = [_]u3{ 2, 2, 2, 3, 3, 3, 4, 5 };
|
|
60
|
-
|
|
61
59
|
pub fn update(battle: anytype, c1: Choice, c2: Choice, log: anytype) !Result {
|
|
62
60
|
assert(c1.type != .Pass or c2.type != .Pass or battle.turn == 0);
|
|
63
61
|
if (battle.turn == 0) return start(battle, log);
|
|
@@ -187,7 +185,6 @@ fn selectMove(
|
|
|
187
185
|
}
|
|
188
186
|
|
|
189
187
|
// move select
|
|
190
|
-
volatiles.state = 0;
|
|
191
188
|
if (choice.data == 0) {
|
|
192
189
|
const struggle = ok: {
|
|
193
190
|
for (side.active.moves, 0..) |move, i| {
|
|
@@ -304,7 +301,11 @@ fn turnOrder(battle: anytype, c1: Choice, c2: Choice) Player {
|
|
|
304
301
|
// Pokémon Showdown's beforeTurnCallback shenanigans
|
|
305
302
|
if (showdown and m1 == .Counter and m2 == .Counter) battle.rng.advance(1);
|
|
306
303
|
|
|
307
|
-
const p1 =
|
|
304
|
+
const p1 = if (showdown)
|
|
305
|
+
battle.rng.range(u8, 0, 2) == 0
|
|
306
|
+
else
|
|
307
|
+
battle.rng.next() < Gen12.percent(50) + 1;
|
|
308
|
+
|
|
308
309
|
if (!showdown) return if (p1) .P1 else .P2;
|
|
309
310
|
|
|
310
311
|
// Pokémon Showdown's "lockedmove" volatile's onBeforeTurn uses BattleQueue#changeAction,
|
|
@@ -314,7 +315,7 @@ fn turnOrder(battle: anytype, c1: Choice, c2: Choice) Player {
|
|
|
314
315
|
const t1 = battle.side(.P1).active.volatiles.Thrashing;
|
|
315
316
|
const t2 = battle.side(.P2).active.volatiles.Thrashing;
|
|
316
317
|
// If *both* sides are thrashing it really should be another speed tie, but we've patched
|
|
317
|
-
// that out and enforce host ordering of events, so P1 just goes first
|
|
318
|
+
// that out and enforce host ordering of events, so P1 just goes first reqgardless of who
|
|
318
319
|
// won the original coin flip
|
|
319
320
|
if (t1 and t2) return .P1;
|
|
320
321
|
return if (p1) if (t1 and !t2) .P2 else .P1 else if (t2 and !t1) .P1 else .P2;
|
|
@@ -449,7 +450,7 @@ fn executeMove(
|
|
|
449
450
|
return doMove(battle, player, mslot, auto, residual, log);
|
|
450
451
|
}
|
|
451
452
|
|
|
452
|
-
const BeforeMove = enum { done, skip_can, skip_pp, ok, err };
|
|
453
|
+
const BeforeMove = union(enum) { done, skip_can, skip_pp, ok, err };
|
|
453
454
|
|
|
454
455
|
fn beforeMove(
|
|
455
456
|
battle: anytype,
|
|
@@ -512,10 +513,9 @@ fn beforeMove(
|
|
|
512
513
|
// Pokémon Showdown's disable condition has a single onBeforeMove handler
|
|
513
514
|
if (showdown and try disabled(side, ident, log)) return .done;
|
|
514
515
|
|
|
515
|
-
// Pokémon Showdown checks for Flinch *after* instead of before
|
|
516
|
-
// until its imaginary "residual" phase, meaning Pokémon can sometimes flinch multiple times
|
|
517
|
-
// from the same original hit
|
|
516
|
+
// Pokémon Showdown checks for Flinch *after* instead of before
|
|
518
517
|
if (showdown and volatiles.Flinch) {
|
|
518
|
+
volatiles.Flinch = false;
|
|
519
519
|
try log.cant(ident, .Flinch);
|
|
520
520
|
return .done;
|
|
521
521
|
}
|
|
@@ -537,7 +537,12 @@ fn beforeMove(
|
|
|
537
537
|
} else {
|
|
538
538
|
try log.activate(ident, .Confusion);
|
|
539
539
|
|
|
540
|
-
if (
|
|
540
|
+
const confused = if (showdown)
|
|
541
|
+
!battle.rng.chance(u8, 128, 256)
|
|
542
|
+
else
|
|
543
|
+
battle.rng.next() >= Gen12.percent(50) + 1;
|
|
544
|
+
|
|
545
|
+
if (confused) {
|
|
541
546
|
assert(!volatiles.MultiHit);
|
|
542
547
|
if (!volatiles.Rage) volatiles.state = 0;
|
|
543
548
|
volatiles.Bide = false;
|
|
@@ -563,12 +568,8 @@ fn beforeMove(
|
|
|
563
568
|
player
|
|
564
569
|
else
|
|
565
570
|
player.foe();
|
|
566
|
-
|
|
567
|
-
const uncapped = battle.last_damage;
|
|
568
571
|
// Skipping adjustDamage / randomizeDamage / checkHit
|
|
569
572
|
_ = try applyDamage(battle, player, target, .Confusion, log);
|
|
570
|
-
// Pokémon Showdown thinks that confusion damage is uncapped ¯\_(ツ)_/¯
|
|
571
|
-
if (showdown) battle.last_damage = uncapped;
|
|
572
573
|
|
|
573
574
|
return .done;
|
|
574
575
|
}
|
|
@@ -577,15 +578,22 @@ fn beforeMove(
|
|
|
577
578
|
|
|
578
579
|
if (!showdown and try disabled(side, ident, log)) return .done;
|
|
579
580
|
|
|
580
|
-
if (Status.is(stored.status, .PAR)
|
|
581
|
-
if (
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
581
|
+
if (Status.is(stored.status, .PAR)) {
|
|
582
|
+
const paralyzed = if (showdown)
|
|
583
|
+
battle.rng.chance(u8, 63, 256)
|
|
584
|
+
else
|
|
585
|
+
battle.rng.next() < Gen12.percent(25);
|
|
586
|
+
|
|
587
|
+
if (paralyzed) {
|
|
588
|
+
if (!volatiles.Rage) volatiles.state = 0;
|
|
589
|
+
volatiles.Bide = false;
|
|
590
|
+
volatiles.Thrashing = false;
|
|
591
|
+
volatiles.Charging = false;
|
|
592
|
+
volatiles.Binding = false;
|
|
593
|
+
// GLITCH: Invulnerable is not cleared, resulting in permanent Fly/Dig invulnerability
|
|
594
|
+
try log.cant(ident, .Paralysis);
|
|
595
|
+
return .done;
|
|
596
|
+
}
|
|
589
597
|
}
|
|
590
598
|
|
|
591
599
|
if (volatiles.Bide) {
|
|
@@ -788,7 +796,7 @@ fn doMove(
|
|
|
788
796
|
};
|
|
789
797
|
assert(!immune or miss or (showdown and move.effect == .Binding));
|
|
790
798
|
|
|
791
|
-
var late = showdown
|
|
799
|
+
var late = showdown;
|
|
792
800
|
const skip = status or immune;
|
|
793
801
|
if ((!showdown or (!skip or counter)) and !miss) blk: {
|
|
794
802
|
if (showdown and move.effect.isMulti()) {
|
|
@@ -908,7 +916,7 @@ fn doMove(
|
|
|
908
916
|
if (hit == 0 and ohko) try log.ohko();
|
|
909
917
|
hit += 1;
|
|
910
918
|
if (foe.stored().hp == 0) break;
|
|
911
|
-
if (!late and
|
|
919
|
+
if (!late and !sub) try buildRage(battle, player.foe(), log);
|
|
912
920
|
// If the substitute breaks during a multi-hit attack, the attack ends
|
|
913
921
|
if (nullified) break;
|
|
914
922
|
}
|
|
@@ -979,7 +987,8 @@ fn checkCriticalHit(battle: anytype, player: Player, move: Move.Data) bool {
|
|
|
979
987
|
chance = if (side.active.volatiles.FocusEnergy) chance / 2 else @min(chance * 2, 255);
|
|
980
988
|
chance = if (move.effect == .HighCritical) @min(chance * 4, 255) else chance / 2;
|
|
981
989
|
|
|
982
|
-
return
|
|
990
|
+
if (showdown) return battle.rng.chance(u8, @intCast(u8, chance), 256);
|
|
991
|
+
return std.math.rotl(u8, battle.rng.next(), 3) < chance;
|
|
983
992
|
}
|
|
984
993
|
|
|
985
994
|
fn calcDamage(
|
|
@@ -1083,7 +1092,16 @@ fn adjustDamage(battle: anytype, player: Player) u16 {
|
|
|
1083
1092
|
|
|
1084
1093
|
fn randomizeDamage(battle: anytype) void {
|
|
1085
1094
|
if (battle.last_damage <= 1) return;
|
|
1086
|
-
|
|
1095
|
+
|
|
1096
|
+
const random = if (showdown)
|
|
1097
|
+
battle.rng.range(u8, 217, 256)
|
|
1098
|
+
else loop: {
|
|
1099
|
+
while (true) {
|
|
1100
|
+
const r = std.math.rotr(u8, battle.rng.next(), 1);
|
|
1101
|
+
if (r >= 217) break :loop r;
|
|
1102
|
+
}
|
|
1103
|
+
};
|
|
1104
|
+
|
|
1087
1105
|
battle.last_damage = @intCast(u16, @as(u32, battle.last_damage) *% random / 255);
|
|
1088
1106
|
}
|
|
1089
1107
|
|
|
@@ -1101,9 +1119,16 @@ fn specialDamage(battle: anytype, player: Player, move: Move.Data, log: anytype)
|
|
|
1101
1119
|
// GLITCH: if power = 0 then a desync occurs (or a miss on Pokémon Showdown)
|
|
1102
1120
|
.Psywave => power: {
|
|
1103
1121
|
const max = @intCast(u8, @as(u16, side.stored().level) * 3 / 2);
|
|
1104
|
-
|
|
1105
|
-
|
|
1106
|
-
|
|
1122
|
+
if (showdown) {
|
|
1123
|
+
break :power battle.rng.range(u8, 0, max);
|
|
1124
|
+
} else {
|
|
1125
|
+
// GLITCH: Psywave infinite glitch loop
|
|
1126
|
+
if (max <= 1) return Result.Error;
|
|
1127
|
+
while (true) {
|
|
1128
|
+
const r = battle.rng.next();
|
|
1129
|
+
if (r < max) break :power r;
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1107
1132
|
},
|
|
1108
1133
|
else => unreachable,
|
|
1109
1134
|
};
|
|
@@ -1235,7 +1260,19 @@ fn metronome(
|
|
|
1235
1260
|
) !?Result {
|
|
1236
1261
|
var side = battle.side(player);
|
|
1237
1262
|
|
|
1238
|
-
side.last_selected_move =
|
|
1263
|
+
side.last_selected_move = if (showdown) blk: {
|
|
1264
|
+
const r = battle.rng.range(u8, 0, @enumToInt(Move.Struggle) - 2);
|
|
1265
|
+
const mod = @as(u2, (if (r < @enumToInt(Move.Metronome) - 1) 1 else 2));
|
|
1266
|
+
break :blk @intToEnum(Move, r + mod);
|
|
1267
|
+
} else loop: {
|
|
1268
|
+
while (true) {
|
|
1269
|
+
const r = battle.rng.next();
|
|
1270
|
+
if (r == 0 or r == @enumToInt(Move.Metronome)) continue;
|
|
1271
|
+
if (r >= @enumToInt(Move.Struggle)) continue;
|
|
1272
|
+
break :loop @intToEnum(Move, r);
|
|
1273
|
+
}
|
|
1274
|
+
};
|
|
1275
|
+
|
|
1239
1276
|
incrementPP(side, mslot);
|
|
1240
1277
|
|
|
1241
1278
|
if (!try canMove(battle, player, mslot, auto, false, .Metronome, residual, log)) return null;
|
|
@@ -1293,24 +1330,23 @@ fn moveHit(battle: anytype, player: Player, move: Move.Data, immune: *bool, mist
|
|
|
1293
1330
|
}
|
|
1294
1331
|
|
|
1295
1332
|
// GLITCH: Thrash / Petal Dance / Rage get their accuracy overwritten on subsequent hits
|
|
1296
|
-
|
|
1297
|
-
|
|
1298
|
-
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
var accuracy = if (overwritten) state else @as(u16, Gen12.percent(move.accuracy));
|
|
1333
|
+
var state = &side.active.volatiles.state;
|
|
1334
|
+
const overwritten = (move.effect == .Thrashing or move.effect == .Rage) and state.* > 0;
|
|
1335
|
+
assert(!overwritten or (0 < state.* and state.* <= 255 and !side.active.volatiles.Bide));
|
|
1336
|
+
var accuracy = if (overwritten) state.* else @as(u16, Gen12.percent(move.accuracy));
|
|
1302
1337
|
var boost = BOOSTS[@intCast(u4, @as(i8, side.active.boosts.accuracy) + 6)];
|
|
1303
1338
|
accuracy = accuracy * boost[0] / boost[1];
|
|
1304
1339
|
boost = BOOSTS[@intCast(u4, @as(i8, -foe.active.boosts.evasion) + 6)];
|
|
1305
1340
|
accuracy = accuracy * boost[0] / boost[1];
|
|
1306
1341
|
accuracy = @min(255, @max(1, accuracy));
|
|
1307
1342
|
|
|
1308
|
-
|
|
1309
|
-
if (showdown) overwrite = side.active.volatiles.Rage or side.active.volatiles.Thrashing;
|
|
1310
|
-
if (overwrite) side.active.volatiles.state = accuracy;
|
|
1343
|
+
if (move.effect == .Thrashing or move.effect == .Rage) state.* = accuracy;
|
|
1311
1344
|
|
|
1312
1345
|
// GLITCH: max accuracy is 255 so 1/256 chance of miss
|
|
1313
|
-
break :miss
|
|
1346
|
+
break :miss if (showdown)
|
|
1347
|
+
!battle.rng.chance(u8, @intCast(u8, accuracy), 256)
|
|
1348
|
+
else
|
|
1349
|
+
battle.rng.next() >= accuracy;
|
|
1314
1350
|
};
|
|
1315
1351
|
|
|
1316
1352
|
// Pokémon Showdown reports miss instead of fail for moves blocked by Mist that 1/256 miss
|
|
@@ -1442,15 +1478,14 @@ fn handleResidual(battle: anytype, player: Player, log: anytype) !void {
|
|
|
1442
1478
|
damage *= volatiles.toxic;
|
|
1443
1479
|
}
|
|
1444
1480
|
|
|
1481
|
+
// Pokémon Showdown erroneously updates last damage with uncapped Leech Seed damage
|
|
1482
|
+
if (showdown) battle.last_damage = damage;
|
|
1483
|
+
|
|
1445
1484
|
const amount = @min(damage, stored.hp);
|
|
1446
1485
|
stored.hp -= amount;
|
|
1447
1486
|
|
|
1448
1487
|
// As above, Pokémon Showdown uses damageOf but its not relevant
|
|
1449
|
-
if (amount > 0)
|
|
1450
|
-
try log.damage(ident, stored, .LeechSeed);
|
|
1451
|
-
// Pokémon Showdown erroneously updates last damage with uncapped Leech Seed damage
|
|
1452
|
-
if (showdown) battle.last_damage = damage;
|
|
1453
|
-
}
|
|
1488
|
+
if (amount > 0) try log.damage(ident, stored, .LeechSeed);
|
|
1454
1489
|
|
|
1455
1490
|
const before = foe_stored.hp;
|
|
1456
1491
|
// Uncapped damage is added back to the foe
|
|
@@ -1537,42 +1572,6 @@ fn checkEBC(battle: anytype) bool {
|
|
|
1537
1572
|
return false;
|
|
1538
1573
|
}
|
|
1539
1574
|
|
|
1540
|
-
fn disabled(side: *Side, ident: ID, log: anytype) !bool {
|
|
1541
|
-
if (side.active.volatiles.disabled_move != 0) {
|
|
1542
|
-
// A Pokémon that transforms after being disabled may end up with less move slots
|
|
1543
|
-
const m = side.active.moves[side.active.volatiles.disabled_move - 1].id;
|
|
1544
|
-
// side.last_selected_move can be Struggle here on Pokemon Showdown we need an extra check
|
|
1545
|
-
const last = if (showdown and m == .Bide and side.active.volatiles.Bide)
|
|
1546
|
-
m
|
|
1547
|
-
else
|
|
1548
|
-
side.last_selected_move;
|
|
1549
|
-
if (m != .None and m == last) {
|
|
1550
|
-
side.active.volatiles.Charging = false;
|
|
1551
|
-
try log.disabled(ident, last);
|
|
1552
|
-
return true;
|
|
1553
|
-
}
|
|
1554
|
-
}
|
|
1555
|
-
return false;
|
|
1556
|
-
}
|
|
1557
|
-
|
|
1558
|
-
inline fn buildRage(battle: anytype, who: Player, log: anytype) !void {
|
|
1559
|
-
const side = battle.side(who);
|
|
1560
|
-
if (side.active.volatiles.Rage and side.active.boosts.atk < 6) {
|
|
1561
|
-
try Effects.boost(battle, who, Move.get(.Rage), log);
|
|
1562
|
-
}
|
|
1563
|
-
}
|
|
1564
|
-
|
|
1565
|
-
fn handleThrashing(battle: anytype, active: *ActivePokemon) bool {
|
|
1566
|
-
var volatiles = &active.volatiles;
|
|
1567
|
-
assert(volatiles.Thrashing);
|
|
1568
|
-
if (volatiles.attacks > 0) return false;
|
|
1569
|
-
|
|
1570
|
-
volatiles.Thrashing = false;
|
|
1571
|
-
volatiles.Confusion = true;
|
|
1572
|
-
volatiles.confusion = Rolls.confusionDuration(battle);
|
|
1573
|
-
return true;
|
|
1574
|
-
}
|
|
1575
|
-
|
|
1576
1575
|
inline fn onBegin(
|
|
1577
1576
|
battle: anytype,
|
|
1578
1577
|
player: Player,
|
|
@@ -1663,7 +1662,10 @@ pub const Effects = struct {
|
|
|
1663
1662
|
side.active.volatiles.Bide = true;
|
|
1664
1663
|
assert(!side.active.volatiles.Thrashing and !side.active.volatiles.Rage);
|
|
1665
1664
|
side.active.volatiles.state = 0;
|
|
1666
|
-
side.active.volatiles.attacks =
|
|
1665
|
+
side.active.volatiles.attacks = @intCast(u3, if (showdown)
|
|
1666
|
+
battle.rng.range(u4, 2, 4)
|
|
1667
|
+
else
|
|
1668
|
+
(battle.rng.next() & 1) + 2);
|
|
1667
1669
|
|
|
1668
1670
|
try log.start(battle.active(player), .Bide);
|
|
1669
1671
|
}
|
|
@@ -1685,8 +1687,14 @@ pub const Effects = struct {
|
|
|
1685
1687
|
return;
|
|
1686
1688
|
}
|
|
1687
1689
|
|
|
1688
|
-
|
|
1689
|
-
|
|
1690
|
+
const chance = !foe.active.types.includes(move.type) and if (showdown)
|
|
1691
|
+
battle.rng.chance(u8, @as(u8, if (move.effect == .BurnChance1) 26 else 77), 256)
|
|
1692
|
+
else
|
|
1693
|
+
battle.rng.next() < 1 + (if (move.effect == .BurnChance1)
|
|
1694
|
+
Gen12.percent(10)
|
|
1695
|
+
else
|
|
1696
|
+
Gen12.percent(30));
|
|
1697
|
+
if (!chance) return;
|
|
1690
1698
|
|
|
1691
1699
|
foe_stored.status = Status.init(.BRN);
|
|
1692
1700
|
foe.active.stats.atk = @max(foe.active.stats.atk / 2, 1);
|
|
@@ -1710,7 +1718,11 @@ pub const Effects = struct {
|
|
|
1710
1718
|
const sub = foe.active.volatiles.Substitute;
|
|
1711
1719
|
|
|
1712
1720
|
if (move.effect == .ConfusionChance) {
|
|
1713
|
-
if (
|
|
1721
|
+
const chance = if (showdown)
|
|
1722
|
+
battle.rng.chance(u8, 25, 256)
|
|
1723
|
+
else
|
|
1724
|
+
battle.rng.next() < Gen12.percent(10);
|
|
1725
|
+
if (!chance) return;
|
|
1714
1726
|
} else {
|
|
1715
1727
|
if (showdown) {
|
|
1716
1728
|
if (!try checkHit(battle, player, move, log)) {
|
|
@@ -1729,7 +1741,10 @@ pub const Effects = struct {
|
|
|
1729
1741
|
|
|
1730
1742
|
if (foe.active.volatiles.Confusion) return;
|
|
1731
1743
|
foe.active.volatiles.Confusion = true;
|
|
1732
|
-
foe.active.volatiles.confusion =
|
|
1744
|
+
foe.active.volatiles.confusion = @intCast(u3, if (showdown)
|
|
1745
|
+
battle.rng.range(u8, 2, 6)
|
|
1746
|
+
else
|
|
1747
|
+
(battle.rng.next() & 3) + 2);
|
|
1733
1748
|
|
|
1734
1749
|
try log.start(battle.active(player.foe()), .Confusion);
|
|
1735
1750
|
}
|
|
@@ -1779,8 +1794,11 @@ pub const Effects = struct {
|
|
|
1779
1794
|
return Result.Error;
|
|
1780
1795
|
}
|
|
1781
1796
|
|
|
1782
|
-
volatiles.disabled_move = @intCast(u3,
|
|
1783
|
-
volatiles.disabled_duration =
|
|
1797
|
+
volatiles.disabled_move = @intCast(u3, randomMoveSlot(&battle.rng, &foe.active.moves, n));
|
|
1798
|
+
volatiles.disabled_duration = @intCast(u4, if (showdown)
|
|
1799
|
+
battle.rng.range(u8, 1, 9)
|
|
1800
|
+
else
|
|
1801
|
+
(battle.rng.next() & 7) + 1);
|
|
1784
1802
|
|
|
1785
1803
|
try log.startEffect(foe_ident, .Disable, foe.active.move(volatiles.disabled_move).id);
|
|
1786
1804
|
return null;
|
|
@@ -1792,7 +1810,7 @@ pub const Effects = struct {
|
|
|
1792
1810
|
|
|
1793
1811
|
if (battle.last_damage == 0) {
|
|
1794
1812
|
assert(showdown);
|
|
1795
|
-
|
|
1813
|
+
return;
|
|
1796
1814
|
}
|
|
1797
1815
|
|
|
1798
1816
|
const drain = @max(battle.last_damage / 2, 1);
|
|
@@ -1819,7 +1837,15 @@ pub const Effects = struct {
|
|
|
1819
1837
|
var volatiles = &battle.foe(player).active.volatiles;
|
|
1820
1838
|
|
|
1821
1839
|
if (volatiles.Substitute) return;
|
|
1822
|
-
|
|
1840
|
+
|
|
1841
|
+
const chance = if (showdown)
|
|
1842
|
+
battle.rng.chance(u8, @as(u8, if (move.effect == .FlinchChance1) 26 else 77), 256)
|
|
1843
|
+
else
|
|
1844
|
+
battle.rng.next() < 1 + (if (move.effect == .FlinchChance1)
|
|
1845
|
+
Gen12.percent(10)
|
|
1846
|
+
else
|
|
1847
|
+
Gen12.percent(30));
|
|
1848
|
+
if (!chance) return;
|
|
1823
1849
|
|
|
1824
1850
|
volatiles.Flinch = true;
|
|
1825
1851
|
volatiles.Recharging = false;
|
|
@@ -1845,8 +1871,12 @@ pub const Effects = struct {
|
|
|
1845
1871
|
return if (showdown and !foe.active.types.includes(move.type)) battle.rng.advance(1);
|
|
1846
1872
|
}
|
|
1847
1873
|
|
|
1848
|
-
|
|
1849
|
-
|
|
1874
|
+
const chance = !foe.active.types.includes(move.type) and if (showdown)
|
|
1875
|
+
battle.rng.chance(u8, 26, 256)
|
|
1876
|
+
else
|
|
1877
|
+
battle.rng.next() < 1 + Gen12.percent(10);
|
|
1878
|
+
if (!chance) return;
|
|
1879
|
+
|
|
1850
1880
|
// Freeze Clause Mod
|
|
1851
1881
|
if (showdown) for (foe.pokemon) |p| if (Status.is(p.status, .FRZ)) return;
|
|
1852
1882
|
|
|
@@ -1991,7 +2021,7 @@ pub const Effects = struct {
|
|
|
1991
2021
|
}
|
|
1992
2022
|
if (!try checkHit(battle, player, move, log)) return;
|
|
1993
2023
|
|
|
1994
|
-
const rslot =
|
|
2024
|
+
const rslot = randomMoveSlot(&battle.rng, &foe.active.moves, 0);
|
|
1995
2025
|
side.active.move(oslot).id = foe.active.move(rslot).id;
|
|
1996
2026
|
|
|
1997
2027
|
try log.startEffect(battle.active(player), .Mimic, side.active.move(oslot).id);
|
|
@@ -2012,8 +2042,7 @@ pub const Effects = struct {
|
|
|
2012
2042
|
assert(!side.active.volatiles.MultiHit);
|
|
2013
2043
|
side.active.volatiles.MultiHit = true;
|
|
2014
2044
|
|
|
2015
|
-
side.active.volatiles.attacks =
|
|
2016
|
-
if (move.effect == .MultiHit) Rolls.distribution(battle) else 2;
|
|
2045
|
+
side.active.volatiles.attacks = if (move.effect == .MultiHit) distribution(battle) else 2;
|
|
2017
2046
|
}
|
|
2018
2047
|
|
|
2019
2048
|
fn paralyze(battle: anytype, player: Player, move: Move.Data, log: anytype) !void {
|
|
@@ -2057,8 +2086,14 @@ pub const Effects = struct {
|
|
|
2057
2086
|
}
|
|
2058
2087
|
|
|
2059
2088
|
// Body Slam can't paralyze a Normal type Pokémon
|
|
2060
|
-
|
|
2061
|
-
|
|
2089
|
+
const chance = !foe.active.types.includes(move.type) and if (showdown)
|
|
2090
|
+
battle.rng.chance(u8, @as(u8, if (move.effect == .ParalyzeChance1) 26 else 77), 256)
|
|
2091
|
+
else
|
|
2092
|
+
battle.rng.next() < 1 + (if (move.effect == .ParalyzeChance1)
|
|
2093
|
+
Gen12.percent(10)
|
|
2094
|
+
else
|
|
2095
|
+
Gen12.percent(30));
|
|
2096
|
+
if (!chance) return;
|
|
2062
2097
|
|
|
2063
2098
|
foe_stored.status = Status.init(.PAR);
|
|
2064
2099
|
foe.active.stats.spe = @max(foe.active.stats.spe / 4, 1);
|
|
@@ -2101,7 +2136,16 @@ pub const Effects = struct {
|
|
|
2101
2136
|
|
|
2102
2137
|
if (move.effect == .Poison) {
|
|
2103
2138
|
if (!showdown and !try checkHit(battle, player, move, log)) return;
|
|
2104
|
-
} else
|
|
2139
|
+
} else {
|
|
2140
|
+
const chance = if (showdown)
|
|
2141
|
+
battle.rng.chance(u8, @as(u8, if (move.effect == .PoisonChance1) 52 else 103), 256)
|
|
2142
|
+
else
|
|
2143
|
+
battle.rng.next() < 1 + (if (move.effect == .PoisonChance1)
|
|
2144
|
+
Gen12.percent(20)
|
|
2145
|
+
else
|
|
2146
|
+
Gen12.percent(40));
|
|
2147
|
+
if (!chance) return;
|
|
2148
|
+
}
|
|
2105
2149
|
|
|
2106
2150
|
foe_stored.status = Status.init(.PSN);
|
|
2107
2151
|
if (toxic) {
|
|
@@ -2115,8 +2159,10 @@ pub const Effects = struct {
|
|
|
2115
2159
|
|
|
2116
2160
|
fn rage(battle: anytype, player: Player) !void {
|
|
2117
2161
|
var volatiles = &battle.side(player).active.volatiles;
|
|
2118
|
-
|
|
2162
|
+
if (volatiles.Rage) return;
|
|
2119
2163
|
volatiles.Rage = true;
|
|
2164
|
+
assert(!volatiles.Bide);
|
|
2165
|
+
volatiles.state = 0;
|
|
2120
2166
|
}
|
|
2121
2167
|
|
|
2122
2168
|
fn recoil(battle: anytype, player: Player, residual: *bool, log: anytype) !void {
|
|
@@ -2168,7 +2214,16 @@ pub const Effects = struct {
|
|
|
2168
2214
|
}
|
|
2169
2215
|
foe.active.volatiles.Recharging = false;
|
|
2170
2216
|
|
|
2171
|
-
|
|
2217
|
+
const duration = @intCast(u3, if (showdown)
|
|
2218
|
+
battle.rng.range(u8, 1, 8)
|
|
2219
|
+
else loop: {
|
|
2220
|
+
while (true) {
|
|
2221
|
+
const r = battle.rng.next() & 7;
|
|
2222
|
+
if (r != 0) break :loop r;
|
|
2223
|
+
}
|
|
2224
|
+
});
|
|
2225
|
+
|
|
2226
|
+
foe_stored.status = Status.slp(duration);
|
|
2172
2227
|
try log.statusFrom(foe_ident, foe_stored.status, battle.side(player).last_selected_move);
|
|
2173
2228
|
}
|
|
2174
2229
|
|
|
@@ -2221,7 +2276,11 @@ pub const Effects = struct {
|
|
|
2221
2276
|
assert(!volatiles.Bide);
|
|
2222
2277
|
|
|
2223
2278
|
volatiles.Thrashing = true;
|
|
2224
|
-
volatiles.
|
|
2279
|
+
volatiles.state = 0;
|
|
2280
|
+
volatiles.attacks = @intCast(u3, if (showdown)
|
|
2281
|
+
battle.rng.range(u8, 2, 4)
|
|
2282
|
+
else
|
|
2283
|
+
(battle.rng.next() & 1) + 2);
|
|
2225
2284
|
}
|
|
2226
2285
|
|
|
2227
2286
|
fn transform(battle: anytype, player: Player, log: anytype) !void {
|
|
@@ -2263,7 +2322,7 @@ pub const Effects = struct {
|
|
|
2263
2322
|
// (Pokémon Showdown unitentionally patches this glitch, preventing automatic selection)
|
|
2264
2323
|
if (!showdown) foe.active.volatiles.Recharging = false;
|
|
2265
2324
|
|
|
2266
|
-
side.active.volatiles.attacks =
|
|
2325
|
+
side.active.volatiles.attacks = distribution(battle) - 1;
|
|
2267
2326
|
}
|
|
2268
2327
|
|
|
2269
2328
|
fn boost(battle: anytype, player: Player, move: Move.Data, log: anytype) !void {
|
|
@@ -2290,7 +2349,7 @@ pub const Effects = struct {
|
|
|
2290
2349
|
return try log.fail(ident, .None);
|
|
2291
2350
|
}
|
|
2292
2351
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.atk) + 6)];
|
|
2293
|
-
const stat = unmodifiedStats(battle,
|
|
2352
|
+
const stat = unmodifiedStats(battle, player).atk;
|
|
2294
2353
|
stats.atk = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
|
|
2295
2354
|
try log.boost(ident, reason, n);
|
|
2296
2355
|
// Pokémon Showdown doesn't re-apply status modifiers after Rage boosts
|
|
@@ -2310,7 +2369,7 @@ pub const Effects = struct {
|
|
|
2310
2369
|
return try log.fail(ident, .None);
|
|
2311
2370
|
}
|
|
2312
2371
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.def) + 6)];
|
|
2313
|
-
const stat = unmodifiedStats(battle,
|
|
2372
|
+
const stat = unmodifiedStats(battle, player).def;
|
|
2314
2373
|
stats.def = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
|
|
2315
2374
|
try log.boost(ident, .Defense, n);
|
|
2316
2375
|
},
|
|
@@ -2327,7 +2386,7 @@ pub const Effects = struct {
|
|
|
2327
2386
|
return try log.fail(ident, .None);
|
|
2328
2387
|
}
|
|
2329
2388
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spe) + 6)];
|
|
2330
|
-
const stat = unmodifiedStats(battle,
|
|
2389
|
+
const stat = unmodifiedStats(battle, player).spe;
|
|
2331
2390
|
stats.spe = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
|
|
2332
2391
|
try log.boost(ident, .Speed, 2);
|
|
2333
2392
|
},
|
|
@@ -2347,7 +2406,7 @@ pub const Effects = struct {
|
|
|
2347
2406
|
return try log.fail(ident, .None);
|
|
2348
2407
|
}
|
|
2349
2408
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spc) + 6)];
|
|
2350
|
-
const stat = unmodifiedStats(battle,
|
|
2409
|
+
const stat = unmodifiedStats(battle, player).spc;
|
|
2351
2410
|
stats.spc = @min(MAX_STAT_VALUE, stat * mod[0] / mod[1]);
|
|
2352
2411
|
try log.boost(ident, .SpecialAttack, n);
|
|
2353
2412
|
try log.boost(ident, .SpecialDefense, n);
|
|
@@ -2374,7 +2433,11 @@ pub const Effects = struct {
|
|
|
2374
2433
|
}
|
|
2375
2434
|
|
|
2376
2435
|
if (move.effect.isStatDownChance()) {
|
|
2377
|
-
if (
|
|
2436
|
+
const chance = if (showdown)
|
|
2437
|
+
battle.rng.chance(u8, 85, 256)
|
|
2438
|
+
else
|
|
2439
|
+
battle.rng.next() < Gen12.percent(33) + 1;
|
|
2440
|
+
if (!chance or foe.active.volatiles.Invulnerable) return;
|
|
2378
2441
|
} else if (!showdown and !try checkHit(battle, player, move, log)) {
|
|
2379
2442
|
return; // checkHit already checks for Invulnerable
|
|
2380
2443
|
}
|
|
@@ -2396,7 +2459,7 @@ pub const Effects = struct {
|
|
|
2396
2459
|
return try log.fail(foe_ident, .None);
|
|
2397
2460
|
}
|
|
2398
2461
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.atk) + 6)];
|
|
2399
|
-
const stat = unmodifiedStats(battle, foe).atk;
|
|
2462
|
+
const stat = unmodifiedStats(battle, player.foe()).atk;
|
|
2400
2463
|
stats.atk = @max(1, stat * mod[0] / mod[1]);
|
|
2401
2464
|
try log.boost(foe_ident, .Attack, -1);
|
|
2402
2465
|
},
|
|
@@ -2414,7 +2477,7 @@ pub const Effects = struct {
|
|
|
2414
2477
|
return try log.fail(foe_ident, .None);
|
|
2415
2478
|
}
|
|
2416
2479
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.def) + 6)];
|
|
2417
|
-
const stat = unmodifiedStats(battle, foe).def;
|
|
2480
|
+
const stat = unmodifiedStats(battle, player.foe()).def;
|
|
2418
2481
|
stats.def = @max(1, stat * mod[0] / mod[1]);
|
|
2419
2482
|
try log.boost(foe_ident, .Defense, -@as(i8, n));
|
|
2420
2483
|
},
|
|
@@ -2431,7 +2494,7 @@ pub const Effects = struct {
|
|
|
2431
2494
|
return try log.fail(foe_ident, .None);
|
|
2432
2495
|
}
|
|
2433
2496
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spe) + 6)];
|
|
2434
|
-
const stat = unmodifiedStats(battle, foe).spe;
|
|
2497
|
+
const stat = unmodifiedStats(battle, player.foe()).spe;
|
|
2435
2498
|
stats.spe = @max(1, stat * mod[0] / mod[1]);
|
|
2436
2499
|
try log.boost(foe_ident, .Speed, -1);
|
|
2437
2500
|
assert(boosts.spe >= -6);
|
|
@@ -2451,7 +2514,7 @@ pub const Effects = struct {
|
|
|
2451
2514
|
return try log.fail(foe_ident, .None);
|
|
2452
2515
|
}
|
|
2453
2516
|
var mod = BOOSTS[@intCast(u4, @as(i8, boosts.spc) + 6)];
|
|
2454
|
-
const stat = unmodifiedStats(battle, foe).spc;
|
|
2517
|
+
const stat = unmodifiedStats(battle, player.foe()).spc;
|
|
2455
2518
|
stats.spc = @max(1, stat * mod[0] / mod[1]);
|
|
2456
2519
|
try log.boost(foe_ident, .SpecialAttack, -1);
|
|
2457
2520
|
try log.boost(foe_ident, .SpecialDefense, -1);
|
|
@@ -2470,7 +2533,8 @@ pub const Effects = struct {
|
|
|
2470
2533
|
}
|
|
2471
2534
|
};
|
|
2472
2535
|
|
|
2473
|
-
fn unmodifiedStats(battle: anytype,
|
|
2536
|
+
fn unmodifiedStats(battle: anytype, who: Player) *Stats(u16) {
|
|
2537
|
+
const side = battle.side(who);
|
|
2474
2538
|
if (!side.active.volatiles.Transform) return &side.stored().stats;
|
|
2475
2539
|
const id = ID.from(side.active.volatiles.transform);
|
|
2476
2540
|
return &battle.side(id.player).pokemon[id.id - 1].stats;
|
|
@@ -2536,140 +2600,80 @@ fn clearVolatiles(battle: anytype, who: Player, log: anytype) !void {
|
|
|
2536
2600
|
}
|
|
2537
2601
|
}
|
|
2538
2602
|
|
|
2539
|
-
|
|
2540
|
-
|
|
2541
|
-
|
|
2542
|
-
|
|
2543
|
-
|
|
2544
|
-
|
|
2545
|
-
|
|
2546
|
-
|
|
2547
|
-
|
|
2548
|
-
|
|
2549
|
-
|
|
2550
|
-
|
|
2551
|
-
|
|
2552
|
-
while (true) {
|
|
2553
|
-
const r = std.math.rotr(u8, battle.rng.next(), 1);
|
|
2554
|
-
if (r >= 217) return r;
|
|
2603
|
+
fn disabled(side: *Side, ident: ID, log: anytype) !bool {
|
|
2604
|
+
if (side.active.volatiles.disabled_move != 0) {
|
|
2605
|
+
// A Pokémon that transforms after being disabled may end up with less move slots
|
|
2606
|
+
const m = side.active.moves[side.active.volatiles.disabled_move - 1].id;
|
|
2607
|
+
// side.last_selected_move can be Struggle here on Pokemon Showdown we need an extra check
|
|
2608
|
+
const last = if (showdown and m == .Bide and side.active.volatiles.Bide)
|
|
2609
|
+
m
|
|
2610
|
+
else
|
|
2611
|
+
side.last_selected_move;
|
|
2612
|
+
if (m != .None and m == last) {
|
|
2613
|
+
side.active.volatiles.Charging = false;
|
|
2614
|
+
try log.disabled(ident, last);
|
|
2615
|
+
return true;
|
|
2555
2616
|
}
|
|
2556
2617
|
}
|
|
2618
|
+
return false;
|
|
2619
|
+
}
|
|
2557
2620
|
|
|
2558
|
-
|
|
2559
|
-
|
|
2560
|
-
|
|
2561
|
-
|
|
2562
|
-
|
|
2563
|
-
inline fn confusionDuration(battle: anytype) u3 {
|
|
2564
|
-
if (showdown) return @intCast(u3, battle.rng.range(u8, 2, 6));
|
|
2565
|
-
return @intCast(u3, (battle.rng.next() & 3) + 2);
|
|
2566
|
-
}
|
|
2567
|
-
|
|
2568
|
-
inline fn confused(battle: anytype) bool {
|
|
2569
|
-
if (showdown) return !battle.rng.chance(u8, 128, 256);
|
|
2570
|
-
return battle.rng.next() >= Gen12.percent(50) + 1;
|
|
2571
|
-
}
|
|
2572
|
-
|
|
2573
|
-
inline fn paralyzed(battle: anytype) bool {
|
|
2574
|
-
if (showdown) return battle.rng.chance(u8, 63, 256);
|
|
2575
|
-
return battle.rng.next() < Gen12.percent(25);
|
|
2621
|
+
inline fn buildRage(battle: anytype, who: Player, log: anytype) !void {
|
|
2622
|
+
const side = battle.side(who);
|
|
2623
|
+
if (side.active.volatiles.Rage and side.active.boosts.atk < 6) {
|
|
2624
|
+
try Effects.boost(battle, who, Move.get(.Rage), log);
|
|
2576
2625
|
}
|
|
2626
|
+
}
|
|
2577
2627
|
|
|
2578
|
-
|
|
2579
|
-
|
|
2580
|
-
|
|
2581
|
-
|
|
2628
|
+
fn handleThrashing(battle: anytype, active: *ActivePokemon) bool {
|
|
2629
|
+
var volatiles = &active.volatiles;
|
|
2630
|
+
assert(volatiles.Thrashing);
|
|
2631
|
+
if (volatiles.attacks > 0) return false;
|
|
2582
2632
|
|
|
2583
|
-
|
|
2584
|
-
|
|
2585
|
-
|
|
2586
|
-
|
|
2633
|
+
volatiles.Thrashing = false;
|
|
2634
|
+
volatiles.Confusion = true;
|
|
2635
|
+
volatiles.confusion = @intCast(u3, if (showdown)
|
|
2636
|
+
battle.rng.range(u8, 2, 6)
|
|
2637
|
+
else
|
|
2638
|
+
(battle.rng.next() & 3) + 2);
|
|
2587
2639
|
|
|
2588
|
-
|
|
2589
|
-
|
|
2590
|
-
return battle.rng.next() < 1 + (if (low) Gen12.percent(20) else Gen12.percent(40));
|
|
2591
|
-
}
|
|
2640
|
+
return true;
|
|
2641
|
+
}
|
|
2592
2642
|
|
|
2593
|
-
|
|
2594
|
-
if (showdown) return @intCast(u3, battle.rng.range(u8, 1, 8));
|
|
2595
|
-
while (true) {
|
|
2596
|
-
const r = battle.rng.next() & 7;
|
|
2597
|
-
if (r != 0) return @intCast(u3, r);
|
|
2598
|
-
}
|
|
2599
|
-
}
|
|
2643
|
+
const DISTRIBUTION = [_]u3{ 2, 2, 2, 3, 3, 3, 4, 5 };
|
|
2600
2644
|
|
|
2601
|
-
|
|
2602
|
-
|
|
2603
|
-
|
|
2604
|
-
|
|
2645
|
+
fn distribution(battle: anytype) u3 {
|
|
2646
|
+
if (showdown) return DISTRIBUTION[battle.rng.range(u8, 0, DISTRIBUTION.len)];
|
|
2647
|
+
const r = (battle.rng.next() & 3);
|
|
2648
|
+
return @intCast(u3, (if (r < 2) r else battle.rng.next() & 3) + 2);
|
|
2649
|
+
}
|
|
2605
2650
|
|
|
2606
|
-
|
|
2607
|
-
|
|
2608
|
-
|
|
2609
|
-
|
|
2610
|
-
|
|
2611
|
-
|
|
2612
|
-
|
|
2613
|
-
|
|
2614
|
-
|
|
2615
|
-
|
|
2616
|
-
|
|
2617
|
-
|
|
2618
|
-
|
|
2619
|
-
|
|
2620
|
-
if (
|
|
2621
|
-
r -= 1;
|
|
2622
|
-
if (r == 0) break;
|
|
2623
|
-
}
|
|
2651
|
+
fn randomMoveSlot(rand: anytype, moves: []MoveSlot, check_pp: u4) u4 {
|
|
2652
|
+
if (showdown) {
|
|
2653
|
+
if (check_pp == 0) {
|
|
2654
|
+
var i: usize = moves.len;
|
|
2655
|
+
while (i > 0) {
|
|
2656
|
+
i -= 1;
|
|
2657
|
+
if (moves[i].id != .None) return rand.range(u4, 0, @intCast(u4, i + 1)) + 1;
|
|
2658
|
+
}
|
|
2659
|
+
} else {
|
|
2660
|
+
var r = rand.range(u4, 0, @intCast(u4, check_pp)) + 1;
|
|
2661
|
+
var i: usize = 0;
|
|
2662
|
+
while (i < moves.len and r > 0) : (i += 1) {
|
|
2663
|
+
if (moves[i].pp > 0) {
|
|
2664
|
+
r -= 1;
|
|
2665
|
+
if (r == 0) break;
|
|
2624
2666
|
}
|
|
2625
|
-
return @intCast(u4, i + 1);
|
|
2626
2667
|
}
|
|
2627
|
-
|
|
2628
|
-
|
|
2629
|
-
while (true) {
|
|
2630
|
-
const r = @intCast(u4, battle.rng.next() & 3);
|
|
2631
|
-
if (moves[r].id != .None and (check_pp == 0 or moves[r].pp > 0)) return r + 1;
|
|
2632
|
-
}
|
|
2633
|
-
}
|
|
2634
|
-
|
|
2635
|
-
inline fn disableDuration(battle: anytype) u4 {
|
|
2636
|
-
if (showdown) return @intCast(u4, battle.rng.range(u8, 1, 9));
|
|
2637
|
-
return @intCast(u4, (battle.rng.next() & 7) + 1);
|
|
2638
|
-
}
|
|
2639
|
-
|
|
2640
|
-
inline fn metronome(battle: anytype) Move {
|
|
2641
|
-
if (showdown) {
|
|
2642
|
-
const r = battle.rng.range(u8, 0, @enumToInt(Move.Struggle) - 2);
|
|
2643
|
-
const mod = @as(u2, (if (r < @enumToInt(Move.Metronome) - 1) 1 else 2));
|
|
2644
|
-
return @intToEnum(Move, r + mod);
|
|
2645
|
-
}
|
|
2646
|
-
while (true) {
|
|
2647
|
-
const r = battle.rng.next();
|
|
2648
|
-
if (r == 0 or r == @enumToInt(Move.Metronome)) continue;
|
|
2649
|
-
if (r >= @enumToInt(Move.Struggle)) continue;
|
|
2650
|
-
return @intToEnum(Move, r);
|
|
2668
|
+
return @intCast(u4, i + 1);
|
|
2651
2669
|
}
|
|
2652
2670
|
}
|
|
2653
2671
|
|
|
2654
|
-
|
|
2655
|
-
|
|
2656
|
-
|
|
2657
|
-
const r = battle.rng.next();
|
|
2658
|
-
if (r < max) return r;
|
|
2659
|
-
}
|
|
2672
|
+
while (true) {
|
|
2673
|
+
const r = @intCast(u4, rand.next() & 3);
|
|
2674
|
+
if (moves[r].id != .None and (check_pp == 0 or moves[r].pp > 0)) return r + 1;
|
|
2660
2675
|
}
|
|
2661
|
-
|
|
2662
|
-
inline fn distribution(battle: anytype) u3 {
|
|
2663
|
-
if (showdown) return DISTRIBUTION[battle.rng.range(u8, 0, DISTRIBUTION.len)];
|
|
2664
|
-
const r = (battle.rng.next() & 3);
|
|
2665
|
-
return @intCast(u3, (if (r < 2) r else battle.rng.next() & 3) + 2);
|
|
2666
|
-
}
|
|
2667
|
-
|
|
2668
|
-
inline fn unboost(battle: anytype) bool {
|
|
2669
|
-
if (showdown) return battle.rng.chance(u8, 85, 256);
|
|
2670
|
-
return battle.rng.next() < Gen12.percent(33) + 1;
|
|
2671
|
-
}
|
|
2672
|
-
};
|
|
2676
|
+
}
|
|
2673
2677
|
|
|
2674
2678
|
test "RNG agreement" {
|
|
2675
2679
|
if (!showdown) return;
|
package/src/lib/gen2/data.zig
CHANGED
|
@@ -19,13 +19,13 @@ const assert = std.debug.assert;
|
|
|
19
19
|
const expectEqual = std.testing.expectEqual;
|
|
20
20
|
const expect = std.testing.expect;
|
|
21
21
|
|
|
22
|
-
pub const
|
|
22
|
+
pub const MAX_OPTIONS: usize = 9; // move 1..4, switch 2..6
|
|
23
23
|
pub const MAX_LOGS: usize = 180; // TODO
|
|
24
24
|
|
|
25
|
-
pub const
|
|
26
|
-
|
|
25
|
+
pub const OPTIONS_SIZE = if (builtin.mode == .ReleaseSmall)
|
|
26
|
+
MAX_OPTIONS
|
|
27
27
|
else
|
|
28
|
-
std.math.ceilPowerOfTwo(usize,
|
|
28
|
+
std.math.ceilPowerOfTwo(usize, MAX_OPTIONS) catch unreachable;
|
|
29
29
|
pub const LOGS_SIZE = if (builtin.mode == .ReleaseSmall)
|
|
30
30
|
MAX_LOGS
|
|
31
31
|
else
|
package/src/lib/pkmn.zig
CHANGED
|
@@ -4,10 +4,10 @@ pub const options = @import("common/options.zig");
|
|
|
4
4
|
pub const Options = options.Options;
|
|
5
5
|
|
|
6
6
|
/// The minimum size in bytes required to hold all choice options.
|
|
7
|
-
pub const
|
|
7
|
+
pub const MAX_OPTIONS = gen1.MAX_OPTIONS;
|
|
8
8
|
/// The optimal size in bytes required to hold all choice options.
|
|
9
|
-
/// At least as large as `
|
|
10
|
-
pub const
|
|
9
|
+
/// At least as large as `MAX_OPTIONS`.
|
|
10
|
+
pub const OPTIONS_SIZE = gen1.OPTIONS_SIZE;
|
|
11
11
|
/// The maximum number of bytes possibly logged by a single update.
|
|
12
12
|
pub const MAX_LOGS = gen1.MAX_LOGS;
|
|
13
13
|
/// The optimal size in bytes required to hold the largest amount of log data
|