@pkmn/engine 0.1.0-dev.44a51703 → 0.1.0-dev.44c4a618
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 +93 -57
- package/build/pkg/addon.js +9 -9
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data/ids.json +12 -12
- package/build/pkg/data/layout.json +26 -4
- package/build/pkg/data/protocol.json +69 -12
- package/build/pkg/data.d.ts +4 -4
- package/build/pkg/data.js.map +1 -1
- package/build/pkg/gen1.js +15 -18
- package/build/pkg/gen1.js.map +1 -1
- package/build/pkg/index.d.ts +2 -1
- package/build/pkg/index.js.map +1 -1
- package/build/pkg/protocol.js +61 -42
- package/build/pkg/protocol.js.map +1 -1
- package/build/test/display.js +2 -2
- package/build/test/display.js.map +1 -1
- package/build/tools/debug.js +5 -4
- package/build/tools/debug.js.map +1 -1
- package/build.zig +142 -119
- package/package.json +54 -25
- package/src/bin/install-pkmn-engine +35 -22
- package/src/lib/common/battle.zig +17 -0
- package/src/lib/common/data.zig +12 -24
- package/src/lib/common/debug.zig +22 -13
- package/src/lib/common/js.zig +118 -0
- package/src/lib/common/optional.zig +67 -0
- package/src/lib/common/options.zig +11 -0
- package/src/lib/common/protocol.zig +845 -322
- package/src/lib/common/rational.zig +357 -0
- package/src/lib/common/rng.zig +30 -21
- package/src/lib/common/util.zig +12 -0
- package/src/lib/gen1/calc.zig +507 -0
- package/src/lib/gen1/chance.zig +1063 -0
- package/src/lib/gen1/data/moves.zig +192 -180
- package/src/lib/gen1/data/species.zig +3 -3
- package/src/lib/gen1/data/types.zig +7 -7
- package/src/lib/gen1/data.zig +86 -77
- package/src/lib/gen1/helpers.zig +658 -15
- package/src/lib/gen1/mechanics.zig +940 -675
- package/src/lib/gen2/calc.zig +143 -0
- package/src/lib/gen2/chance.zig +1315 -0
- package/src/lib/gen2/data/items.zig +12 -18
- package/src/lib/gen2/data/moves.zig +663 -569
- package/src/lib/gen2/data/species.zig +1 -1
- package/src/lib/gen2/data/types.zig +134 -31
- package/src/lib/gen2/data.zig +121 -84
- package/src/lib/gen2/generated.zig +806 -0
- package/src/lib/gen2/helpers.zig +45 -21
- package/src/lib/gen2/mechanics.zig +3591 -12
- package/src/lib/node.zig +131 -0
- package/src/lib/pkmn.zig +79 -5
- package/src/lib/{binding/wasm.zig → wasm.zig} +4 -1
- package/src/lib/binding/node.zig +0 -226
- package/src/lib/gen1/README.md +0 -814
- package/src/lib/gen2/README.md +0 -309
package/src/lib/gen2/helpers.zig
CHANGED
|
@@ -48,7 +48,7 @@ pub const Battle = struct {
|
|
|
48
48
|
comptime rolls: anytype,
|
|
49
49
|
p1: []const Pokemon,
|
|
50
50
|
p2: []const Pokemon,
|
|
51
|
-
) data.Battle(rng.FixedRNG(
|
|
51
|
+
) data.Battle(rng.FixedRNG(2, rolls.len)) {
|
|
52
52
|
return .{
|
|
53
53
|
.rng = .{ .rolls = rolls },
|
|
54
54
|
.sides = .{ Side.init(p1), Side.init(p2) },
|
|
@@ -65,19 +65,47 @@ pub const Battle = struct {
|
|
|
65
65
|
};
|
|
66
66
|
|
|
67
67
|
pub fn prng(rand: *PSRNG) data.PRNG {
|
|
68
|
-
// FIXME: what is max range in gen2?
|
|
69
68
|
return .{
|
|
70
69
|
.src = .{
|
|
71
70
|
.seed = if (showdown)
|
|
72
71
|
rand.newSeed()
|
|
73
|
-
else
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
72
|
+
else seed: {
|
|
73
|
+
// GLITCH: The initial RNG seed in Gen II link battles is heavily constrained
|
|
74
|
+
// https://www.smogon.com/forums/threads/rng-in-rby-link-battles.3746779
|
|
75
|
+
var seed = [_]u8{ 0, 0, 0, 0, 0, 0, 0, 0, 0 };
|
|
76
|
+
|
|
77
|
+
// Bytes in seed can only range from 0-252, not 0-255
|
|
78
|
+
const max: u8 = 253;
|
|
79
|
+
// Instructions take multiples of 4 cycles to execute
|
|
80
|
+
var timer: u16 = 4 * rand.range(u16, 0, 16384);
|
|
81
|
+
var add: u8 = rand.range(u8, 0, 256);
|
|
82
|
+
var sub: u8 = rand.range(u8, 0, 256);
|
|
83
|
+
var carry: u8 = 0;
|
|
84
|
+
var div: u8 = 0;
|
|
85
|
+
|
|
86
|
+
var i: u8 = 0;
|
|
87
|
+
while (i < seed.len) {
|
|
88
|
+
div = @intCast(timer >> 8);
|
|
89
|
+
// This is effectively @addWithOverflow but with three operands
|
|
90
|
+
const result = @as(u16, add) + @as(u16, div) + @as(u16, carry);
|
|
91
|
+
add = @intCast(result & 255);
|
|
92
|
+
carry = @intFromBool(result > 255);
|
|
93
|
+
timer +%= 44;
|
|
94
|
+
div = @intCast(timer >> 8);
|
|
95
|
+
sub -%= div +% carry;
|
|
96
|
+
|
|
97
|
+
if (sub < max) {
|
|
98
|
+
seed[i] = sub;
|
|
99
|
+
i += 1;
|
|
100
|
+
timer +%= 152;
|
|
101
|
+
carry = 1;
|
|
102
|
+
} else {
|
|
103
|
+
timer +%= 132;
|
|
104
|
+
carry = 0;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
break :seed seed;
|
|
108
|
+
},
|
|
81
109
|
},
|
|
82
110
|
};
|
|
83
111
|
}
|
|
@@ -89,7 +117,7 @@ pub const Side = struct {
|
|
|
89
117
|
|
|
90
118
|
for (0..ps.len) |i| {
|
|
91
119
|
side.pokemon[i] = Pokemon.init(ps[i]);
|
|
92
|
-
|
|
120
|
+
side.pokemon[i].position = @as(u4, @intCast(i)) + 1;
|
|
93
121
|
}
|
|
94
122
|
return side;
|
|
95
123
|
}
|
|
@@ -100,7 +128,7 @@ pub const Side = struct {
|
|
|
100
128
|
|
|
101
129
|
for (0..n) |i| {
|
|
102
130
|
side.pokemon[i] = Pokemon.random(rand, opt);
|
|
103
|
-
side.pokemon[i].position = i + 1;
|
|
131
|
+
side.pokemon[i].position = @as(u4, @intCast(i)) + 1;
|
|
104
132
|
}
|
|
105
133
|
|
|
106
134
|
return side;
|
|
@@ -137,12 +165,9 @@ pub const Pokemon = struct {
|
|
|
137
165
|
}
|
|
138
166
|
assert(p.moves.len > 0 and p.moves.len <= 4);
|
|
139
167
|
for (p.moves, 0..) |m, j| {
|
|
140
|
-
pokemon.moves[j] =
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
// NB: PP can be at most 61 legally (though can overflow to 63)
|
|
144
|
-
.pp = @intCast(@min(Move.pp(m) / 5 * 8, 61)),
|
|
145
|
-
};
|
|
168
|
+
pokemon.moves[j].id = m;
|
|
169
|
+
// NB: PP can be at most 61 legally (though can overflow to 63)
|
|
170
|
+
pokemon.moves[j].pp = @intCast(@min(Move.pp(m) / 5 * 8, 61));
|
|
146
171
|
}
|
|
147
172
|
pokemon.item = p.item;
|
|
148
173
|
if (p.hp) |hp| {
|
|
@@ -153,7 +178,7 @@ pub const Pokemon = struct {
|
|
|
153
178
|
pokemon.status = p.status;
|
|
154
179
|
pokemon.types = species.types;
|
|
155
180
|
pokemon.level = p.level;
|
|
156
|
-
pokemon.dvs = DVs.from(p.dvs);
|
|
181
|
+
pokemon.dvs = DVs.from(p.species, p.dvs);
|
|
157
182
|
return pokemon;
|
|
158
183
|
}
|
|
159
184
|
|
|
@@ -194,14 +219,13 @@ pub const Pokemon = struct {
|
|
|
194
219
|
const max_pp: u8 = @intCast(Move.pp(m) + pp_ups * @min(Move.pp(m) / 5, 7));
|
|
195
220
|
ms[i] = .{
|
|
196
221
|
.id = m,
|
|
197
|
-
.pp_ups = pp_ups,
|
|
198
222
|
.pp = if (opt.cleric) max_pp else rand.range(u8, 0, max_pp + 1),
|
|
199
223
|
};
|
|
200
224
|
}
|
|
201
225
|
return .{
|
|
202
226
|
.species = s,
|
|
203
227
|
.types = species.types,
|
|
204
|
-
.dvs = DVs.from(dvs),
|
|
228
|
+
.dvs = DVs.from(s, dvs),
|
|
205
229
|
.level = lvl,
|
|
206
230
|
.stats = stats,
|
|
207
231
|
.hp = if (opt.cleric) stats.hp else rand.range(u16, 0, stats.hp + 1),
|