@pkmn/engine 0.1.0-dev.84cc1a02 → 0.1.0-dev.8b83af6b
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 +52 -24
- package/build/pkg/addon.d.ts +7 -0
- package/build/pkg/addon.js +111 -0
- package/build/pkg/addon.js.map +1 -0
- package/build/pkg/data/layout.json +1 -1
- package/build/pkg/data.d.ts +1 -2
- package/build/pkg/data.js +3 -5
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.d.ts +5 -4
- package/build/pkg/gen1.js +43 -24
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +15 -12
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.d.ts +4 -2
- package/build/pkg/protocol.js +4 -2
- package/build/pkg/protocol.js.map +1 -1
- package/build/test/display.js +400 -0
- package/build/test/display.js.map +1 -0
- package/build/tools/debug.js +133 -0
- package/build/tools/debug.js.map +1 -0
- package/build.zig +30 -39
- package/package.json +45 -34
- package/src/bin/install-pkmn-engine +47 -28
- package/src/bin/pkmn-debug +62 -0
- package/src/lib/binding/node.zig +20 -23
- package/src/lib/binding/wasm.zig +4 -4
- package/src/lib/common/data.zig +11 -11
- package/src/lib/common/debug.zig +1 -0
- package/src/lib/common/options.zig +3 -3
- package/src/lib/common/protocol.zig +194 -178
- package/src/lib/common/rng.zig +5 -5
- package/src/lib/gen1/README.md +106 -70
- package/src/lib/gen1/data/moves.zig +10 -10
- package/src/lib/gen1/data/species.zig +2 -2
- package/src/lib/gen1/data/types.zig +3 -3
- package/src/lib/gen1/data.zig +36 -31
- package/src/lib/gen1/helpers.zig +11 -22
- package/src/lib/gen1/mechanics.zig +460 -365
- package/src/lib/gen2/data/items.zig +3 -3
- package/src/lib/gen2/data/moves.zig +1 -1
- package/src/lib/gen2/data/species.zig +1 -1
- package/src/lib/gen2/data/types.zig +3 -3
- package/src/lib/gen2/data.zig +16 -15
- package/src/lib/gen2/helpers.zig +6 -6
- package/src/lib/pkmn.zig +7 -7
- package/src/test/display/pkmn.html.tmpl +368 -0
package/src/lib/gen1/helpers.zig
CHANGED
|
@@ -55,21 +55,16 @@ pub const Battle = struct {
|
|
|
55
55
|
}
|
|
56
56
|
|
|
57
57
|
pub fn random(rand: *PSRNG, opt: Options) data.Battle(data.PRNG) {
|
|
58
|
-
|
|
59
|
-
var p2: u4 = 0;
|
|
60
|
-
var battle: data.Battle(data.PRNG) = .{
|
|
58
|
+
return .{
|
|
61
59
|
.rng = prng(rand),
|
|
62
60
|
.turn = 0,
|
|
63
61
|
.last_damage = 0,
|
|
64
62
|
.sides = .{ Side.random(rand, opt), Side.random(rand, opt) },
|
|
65
63
|
};
|
|
66
|
-
battle.last_selected_indexes.p1 = p1;
|
|
67
|
-
battle.last_selected_indexes.p2 = p2;
|
|
68
|
-
return battle;
|
|
69
64
|
}
|
|
70
65
|
};
|
|
71
66
|
|
|
72
|
-
|
|
67
|
+
fn prng(rand: *PSRNG) data.PRNG {
|
|
73
68
|
// GLITCH: initial bytes in seed can only range from 0-252, not 0-255
|
|
74
69
|
const max: u8 = 253;
|
|
75
70
|
return .{
|
|
@@ -95,7 +90,7 @@ pub const Side = struct {
|
|
|
95
90
|
|
|
96
91
|
for (0..ps.len) |i| {
|
|
97
92
|
side.pokemon[i] = Pokemon.init(ps[i]);
|
|
98
|
-
side.order[i] = @
|
|
93
|
+
side.order[i] = @as(u4, @intCast(i)) + 1;
|
|
99
94
|
}
|
|
100
95
|
return side;
|
|
101
96
|
}
|
|
@@ -106,7 +101,7 @@ pub const Side = struct {
|
|
|
106
101
|
|
|
107
102
|
for (0..n) |i| {
|
|
108
103
|
side.pokemon[i] = Pokemon.random(rand, opt);
|
|
109
|
-
side.order[i] = @
|
|
104
|
+
side.order[i] = @as(u4, @intCast(i)) + 1;
|
|
110
105
|
}
|
|
111
106
|
|
|
112
107
|
return side;
|
|
@@ -144,7 +139,7 @@ pub const Pokemon = struct {
|
|
|
144
139
|
for (p.moves, 0..) |m, j| {
|
|
145
140
|
pokemon.moves[j].id = m;
|
|
146
141
|
// NB: PP can be at most 61 legally (though can overflow to 63)
|
|
147
|
-
pokemon.moves[j].pp = @intCast(
|
|
142
|
+
pokemon.moves[j].pp = @intCast(@min(Move.pp(m) / 5 * 8, 61));
|
|
148
143
|
}
|
|
149
144
|
if (p.hp) |hp| {
|
|
150
145
|
pokemon.hp = hp;
|
|
@@ -158,7 +153,7 @@ pub const Pokemon = struct {
|
|
|
158
153
|
}
|
|
159
154
|
|
|
160
155
|
pub fn random(rand: *PSRNG, opt: Options) data.Pokemon {
|
|
161
|
-
const s = @
|
|
156
|
+
const s: Species = @enumFromInt(rand.range(u8, 1, Species.size + 1));
|
|
162
157
|
const species = Species.get(s);
|
|
163
158
|
const lvl = if (rand.chance(u8, 1, 20)) rand.range(u8, 1, 99 + 1) else 100;
|
|
164
159
|
var stats: Stats(u16) = .{};
|
|
@@ -181,15 +176,15 @@ pub const Pokemon = struct {
|
|
|
181
176
|
for (0..n) |i| {
|
|
182
177
|
var m: Move = .None;
|
|
183
178
|
sample: while (true) {
|
|
184
|
-
m = @
|
|
179
|
+
m = @enumFromInt(rand.range(u8, 1, Move.size - 1 + 1));
|
|
185
180
|
if (opt.block and blocked(m)) continue :sample;
|
|
186
181
|
for (0..i) |j| if (ms[j].id == m) continue :sample;
|
|
187
182
|
break;
|
|
188
183
|
}
|
|
189
|
-
const pp_ups =
|
|
184
|
+
const pp_ups: u8 =
|
|
190
185
|
if (!opt.cleric and rand.chance(u8, 1, 10)) rand.range(u2, 0, 2 + 1) else 3;
|
|
191
186
|
// NB: PP can be at most 61 legally (though can overflow to 63)
|
|
192
|
-
const max_pp = @intCast(
|
|
187
|
+
const max_pp: u8 = @intCast(Move.pp(m) + pp_ups * @min(Move.pp(m) / 5, 7));
|
|
193
188
|
ms[i] = .{
|
|
194
189
|
.id = m,
|
|
195
190
|
.pp = if (opt.cleric) max_pp else rand.range(u8, 0, max_pp + 1),
|
|
@@ -211,16 +206,10 @@ pub const Pokemon = struct {
|
|
|
211
206
|
}
|
|
212
207
|
};
|
|
213
208
|
|
|
214
|
-
// cat src/test/showdown/blocklist.json | jq '."1".moves'
|
|
215
209
|
fn blocked(m: Move) bool {
|
|
216
|
-
|
|
210
|
+
// Binding moves are borked but only via Mirror Move / Metronome which are already blocked
|
|
217
211
|
return switch (m) {
|
|
218
|
-
.
|
|
219
|
-
.Mimic,
|
|
220
|
-
.Metronome,
|
|
221
|
-
.MirrorMove,
|
|
222
|
-
.Transform,
|
|
223
|
-
=> true,
|
|
212
|
+
.Mimic, .Metronome, .MirrorMove, .Transform => true,
|
|
224
213
|
else => false,
|
|
225
214
|
};
|
|
226
215
|
}
|