@pkmn/engine 0.1.0-dev.dd5b9081 → 0.1.0-dev.deda8593
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 +44 -19
- package/build/pkg/addon.js +6 -7
- package/build/pkg/addon.js.map +1 -1
- package/build/pkg/data/ids.json +12 -12
- package/build/pkg/data/layout.json +2 -2
- 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 +2 -2
- 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 +102 -104
- package/package.json +43 -23
- package/src/bin/install-pkmn-engine +26 -18
- package/src/lib/common/data.zig +9 -9
- package/src/lib/common/debug.zig +2 -2
- package/src/lib/common/optional.zig +9 -2
- package/src/lib/common/options.zig +2 -0
- package/src/lib/common/protocol.zig +739 -318
- package/src/lib/common/rational.zig +12 -9
- package/src/lib/common/rng.zig +25 -16
- package/src/lib/gen1/calc.zig +219 -49
- package/src/lib/gen1/chance.zig +138 -115
- package/src/lib/gen1/data/moves.zig +190 -176
- package/src/lib/gen1/data/species.zig +3 -3
- package/src/lib/gen1/data/types.zig +7 -7
- package/src/lib/gen1/data.zig +44 -44
- package/src/lib/gen1/helpers.zig +148 -82
- package/src/lib/gen1/mechanics.zig +392 -406
- 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 +377 -344
- package/src/lib/gen2/data/species.zig +1 -1
- package/src/lib/gen2/data/types.zig +134 -31
- package/src/lib/gen2/data.zig +52 -44
- package/src/lib/gen2/generated.zig +806 -0
- package/src/lib/gen2/helpers.zig +37 -7
- package/src/lib/gen2/mechanics.zig +3086 -211
- package/src/lib/{binding/node.zig → node.zig} +10 -13
- package/src/lib/pkmn.zig +27 -12
- package/src/lib/{binding/wasm.zig → wasm.zig} +2 -1
- package/src/test/display/pkmn.html.tmpl +5 -5
- package/src/lib/gen1/README.md +0 -894
- package/src/lib/gen2/README.md +0 -383
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
const std = @import("std");
|
|
2
2
|
const builtin = @import("builtin");
|
|
3
3
|
|
|
4
|
-
const
|
|
5
|
-
|
|
4
|
+
const pkmn = @import("../pkmn.zig");
|
|
5
|
+
|
|
6
|
+
const data = @import("data.zig");
|
|
7
|
+
const options = @import("options.zig");
|
|
6
8
|
|
|
7
9
|
const assert = std.debug.assert;
|
|
8
10
|
const print = std.debug.print;
|
|
@@ -12,6 +14,8 @@ const enabled = options.log;
|
|
|
12
14
|
const Player = data.Player;
|
|
13
15
|
const ID = data.ID;
|
|
14
16
|
|
|
17
|
+
const endian = builtin.cpu.arch.endian();
|
|
18
|
+
|
|
15
19
|
pub const ArgType = enum(u8) {
|
|
16
20
|
None,
|
|
17
21
|
|
|
@@ -69,7 +73,7 @@ pub const ArgType = enum(u8) {
|
|
|
69
73
|
EndAbility,
|
|
70
74
|
ClearNegativeBoost,
|
|
71
75
|
FormeChange,
|
|
72
|
-
|
|
76
|
+
LastNoTarget, // FIXME
|
|
73
77
|
|
|
74
78
|
// Gen 4
|
|
75
79
|
SwapBoost,
|
|
@@ -102,6 +106,7 @@ pub const ArgType = enum(u8) {
|
|
|
102
106
|
// Gen 8
|
|
103
107
|
CanDynamax,
|
|
104
108
|
SwapSideConditions,
|
|
109
|
+
UpdatePoke,
|
|
105
110
|
|
|
106
111
|
// Gen 9
|
|
107
112
|
Terastallize,
|
|
@@ -121,12 +126,19 @@ pub const Cant = enum(u8) {
|
|
|
121
126
|
Disable,
|
|
122
127
|
Recharge,
|
|
123
128
|
PP,
|
|
129
|
+
|
|
130
|
+
Attract,
|
|
124
131
|
};
|
|
125
132
|
|
|
126
133
|
pub const Heal = enum(u8) {
|
|
127
134
|
None,
|
|
128
135
|
Silent,
|
|
129
136
|
Drain,
|
|
137
|
+
|
|
138
|
+
Leftovers,
|
|
139
|
+
Berry,
|
|
140
|
+
BerryJuice,
|
|
141
|
+
GoldBerry,
|
|
130
142
|
};
|
|
131
143
|
|
|
132
144
|
pub const Damage = enum(u8) {
|
|
@@ -137,7 +149,16 @@ pub const Damage = enum(u8) {
|
|
|
137
149
|
LeechSeed,
|
|
138
150
|
RecoilOf,
|
|
139
151
|
|
|
152
|
+
Bind,
|
|
153
|
+
Wrap,
|
|
154
|
+
FireSpin,
|
|
155
|
+
Clamp,
|
|
156
|
+
Whirlpool,
|
|
140
157
|
Spikes,
|
|
158
|
+
|
|
159
|
+
Nightmare,
|
|
160
|
+
Curse,
|
|
161
|
+
Sandstorm,
|
|
141
162
|
};
|
|
142
163
|
|
|
143
164
|
pub const Status = enum(u8) {
|
|
@@ -180,8 +201,26 @@ pub const Activate = enum(u8) {
|
|
|
180
201
|
Haze,
|
|
181
202
|
Mist,
|
|
182
203
|
Struggle,
|
|
183
|
-
Substitute,
|
|
204
|
+
Substitute, // FIXME SubstituteDamage
|
|
184
205
|
Splash,
|
|
206
|
+
|
|
207
|
+
Rage, // TODO
|
|
208
|
+
|
|
209
|
+
Attract,
|
|
210
|
+
LockOn,
|
|
211
|
+
Bind,
|
|
212
|
+
Wrap,
|
|
213
|
+
FireSpin,
|
|
214
|
+
Clamp,
|
|
215
|
+
Whirlpool,
|
|
216
|
+
SubstituteBlock,
|
|
217
|
+
|
|
218
|
+
DestinyBond,
|
|
219
|
+
|
|
220
|
+
BeatUp, // FIXME of
|
|
221
|
+
|
|
222
|
+
Magnitude,
|
|
223
|
+
Spite,
|
|
185
224
|
};
|
|
186
225
|
|
|
187
226
|
pub const Start = enum(u8) {
|
|
@@ -199,6 +238,19 @@ pub const Start = enum(u8) {
|
|
|
199
238
|
|
|
200
239
|
Disable,
|
|
201
240
|
Mimic,
|
|
241
|
+
|
|
242
|
+
Attract,
|
|
243
|
+
Nightmare,
|
|
244
|
+
Curse,
|
|
245
|
+
Foresight,
|
|
246
|
+
Encore,
|
|
247
|
+
FutureSight,
|
|
248
|
+
|
|
249
|
+
PerishSong0,
|
|
250
|
+
PerishSong1,
|
|
251
|
+
PerishSong2,
|
|
252
|
+
PerishSong3,
|
|
253
|
+
PerishSong3Silent,
|
|
202
254
|
};
|
|
203
255
|
|
|
204
256
|
pub const End = enum(u8) {
|
|
@@ -207,16 +259,30 @@ pub const End = enum(u8) {
|
|
|
207
259
|
Bide,
|
|
208
260
|
Substitute,
|
|
209
261
|
|
|
210
|
-
|
|
262
|
+
Nightmare,
|
|
263
|
+
Curse,
|
|
264
|
+
Foresight,
|
|
265
|
+
Encore,
|
|
266
|
+
FutureSight,
|
|
267
|
+
LeechSeed,
|
|
268
|
+
|
|
269
|
+
Bind,
|
|
270
|
+
Wrap,
|
|
271
|
+
FireSpin,
|
|
272
|
+
Clamp,
|
|
273
|
+
Whirlpool,
|
|
274
|
+
|
|
211
275
|
DisableSilent,
|
|
212
276
|
ConfusionSilent,
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
277
|
+
MistSilent,
|
|
278
|
+
FocusEnergySilent,
|
|
279
|
+
LeechSeedSilent,
|
|
280
|
+
ToxicSilent,
|
|
281
|
+
LightScreenSilent,
|
|
282
|
+
ReflectSilent,
|
|
283
|
+
BideSilent,
|
|
284
|
+
|
|
285
|
+
LeechSeedFrom,
|
|
220
286
|
};
|
|
221
287
|
|
|
222
288
|
pub const Immune = enum(u8) {
|
|
@@ -224,6 +290,28 @@ pub const Immune = enum(u8) {
|
|
|
224
290
|
OHKO,
|
|
225
291
|
};
|
|
226
292
|
|
|
293
|
+
pub const EndItem = enum(u8) {
|
|
294
|
+
None,
|
|
295
|
+
Eat,
|
|
296
|
+
};
|
|
297
|
+
|
|
298
|
+
pub const SetHP = enum(u8) {
|
|
299
|
+
None,
|
|
300
|
+
Silent,
|
|
301
|
+
};
|
|
302
|
+
|
|
303
|
+
pub const Side = enum(u8) {
|
|
304
|
+
Safeguard,
|
|
305
|
+
Reflect,
|
|
306
|
+
LightScreen,
|
|
307
|
+
Spikes,
|
|
308
|
+
};
|
|
309
|
+
|
|
310
|
+
pub const Weather = enum(u8) {
|
|
311
|
+
None,
|
|
312
|
+
Upkeep,
|
|
313
|
+
};
|
|
314
|
+
|
|
227
315
|
/// Null object pattern implementation of `Log` backed by a `std.io.null_writer`.
|
|
228
316
|
/// Ignores anything sent to it, though protocol logging should additionally be turned off
|
|
229
317
|
/// entirely with `options.log`.
|
|
@@ -238,370 +326,488 @@ pub fn Log(comptime Writer: type) type {
|
|
|
238
326
|
|
|
239
327
|
pub const Error = Writer.Error;
|
|
240
328
|
|
|
241
|
-
|
|
329
|
+
// source: ID, move: <Move>, target: ID, from?: <Move>
|
|
330
|
+
pub fn move(self: Self, args: anytype) Error!void {
|
|
242
331
|
if (!enabled) return;
|
|
243
332
|
|
|
244
|
-
assert(
|
|
333
|
+
assert(args[1] != .None);
|
|
245
334
|
try self.writer.writeAll(&.{
|
|
246
335
|
@intFromEnum(ArgType.Move),
|
|
247
|
-
@as(u8, @bitCast(
|
|
248
|
-
@intFromEnum(
|
|
249
|
-
@as(u8, @bitCast(
|
|
250
|
-
});
|
|
251
|
-
const none = &[_]u8{@intFromEnum(Move.None)};
|
|
252
|
-
try self.writer.writeAll(switch (@typeInfo(@TypeOf(from))) {
|
|
253
|
-
.Null => none,
|
|
254
|
-
.Optional => if (from) |f| blk: {
|
|
255
|
-
assert(@intFromEnum(f) != 0);
|
|
256
|
-
break :blk &[_]u8{ @intFromEnum(Move.From), @intFromEnum(f) };
|
|
257
|
-
} else none,
|
|
258
|
-
else => blk: {
|
|
259
|
-
assert(@intFromEnum(from) != 0);
|
|
260
|
-
break :blk &[_]u8{ @intFromEnum(Move.From), @intFromEnum(from) };
|
|
261
|
-
},
|
|
336
|
+
@as(u8, @bitCast(args[0])),
|
|
337
|
+
@intFromEnum(args[1]),
|
|
338
|
+
@as(u8, @bitCast(args[2])),
|
|
262
339
|
});
|
|
340
|
+
try self.writer.writeAll(if (args.len < 4 or @intFromEnum(args[3]) == 0)
|
|
341
|
+
&.{@intFromEnum(Move.None)}
|
|
342
|
+
else
|
|
343
|
+
&.{ @intFromEnum(Move.From), @intFromEnum(args[3]) });
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
// ident: ID, pokemon: <Pokemon>
|
|
347
|
+
pub fn switched(self: Self, args: anytype) Error!void {
|
|
348
|
+
return switchDrag(self, .Switch, args);
|
|
263
349
|
}
|
|
264
350
|
|
|
265
|
-
|
|
351
|
+
// ident: ID, pokemon: <Pokemon>
|
|
352
|
+
fn switchDrag(self: Self, arg: ArgType, args: anytype) Error!void {
|
|
266
353
|
if (!enabled) return;
|
|
267
354
|
|
|
268
|
-
try self.writer.writeAll(&.{ @intFromEnum(
|
|
269
|
-
if (@hasField(@TypeOf(
|
|
355
|
+
try self.writer.writeAll(&.{ @intFromEnum(arg), @as(u8, @bitCast(args[0])) });
|
|
356
|
+
if (@hasField(@TypeOf(args[1].*), "dvs")) {
|
|
270
357
|
try self.writer.writeAll(&.{
|
|
271
|
-
@intFromEnum(
|
|
272
|
-
@intFromEnum(
|
|
273
|
-
|
|
358
|
+
@intFromEnum(args[1].species),
|
|
359
|
+
@intFromEnum(args[1].dvs.gender),
|
|
360
|
+
args[1].level,
|
|
274
361
|
});
|
|
275
362
|
} else {
|
|
276
|
-
try self.writer.writeAll(&.{ @intFromEnum(
|
|
363
|
+
try self.writer.writeAll(&.{ @intFromEnum(args[1].species), args[1].level });
|
|
277
364
|
}
|
|
278
|
-
try self.writer.
|
|
279
|
-
try self.writer.
|
|
280
|
-
try self.writer.writeAll(&.{
|
|
281
|
-
}
|
|
282
|
-
|
|
283
|
-
pub fn cant(self: Self, ident: ID, reason: Cant) Error!void {
|
|
284
|
-
if (!enabled) return;
|
|
285
|
-
|
|
286
|
-
assert(reason != .Disable);
|
|
287
|
-
try self.writer.writeAll(&.{
|
|
288
|
-
@intFromEnum(ArgType.Cant),
|
|
289
|
-
@as(u8, @bitCast(ident)),
|
|
290
|
-
@intFromEnum(reason),
|
|
291
|
-
});
|
|
365
|
+
try self.writer.writeInt(u16, args[1].hp, endian);
|
|
366
|
+
try self.writer.writeInt(u16, args[1].stats.hp, endian);
|
|
367
|
+
try self.writer.writeAll(&.{args[1].status});
|
|
292
368
|
}
|
|
293
369
|
|
|
294
|
-
|
|
370
|
+
// ident: ID, reason: Cant
|
|
371
|
+
// ident: ID, reason: .Disable, move: <Move>
|
|
372
|
+
pub fn cant(self: Self, args: anytype) Error!void {
|
|
295
373
|
if (!enabled) return;
|
|
296
374
|
|
|
375
|
+
assert(args[1] != .Disable or args.len == 3);
|
|
297
376
|
try self.writer.writeAll(&.{
|
|
298
377
|
@intFromEnum(ArgType.Cant),
|
|
299
|
-
@as(u8, @bitCast(
|
|
300
|
-
@intFromEnum(Cant
|
|
301
|
-
@intFromEnum(m),
|
|
378
|
+
@as(u8, @bitCast(args[0])),
|
|
379
|
+
@intFromEnum(@as(Cant, args[1])),
|
|
302
380
|
});
|
|
381
|
+
if (args.len == 3) try self.writer.writeByte(@intFromEnum(args[2]));
|
|
303
382
|
}
|
|
304
383
|
|
|
305
|
-
|
|
384
|
+
// ident: ID, done: bool
|
|
385
|
+
pub fn faint(self: Self, args: anytype) Error!void {
|
|
306
386
|
if (!enabled) return;
|
|
307
387
|
|
|
308
|
-
try self.writer.writeAll(&.{ @intFromEnum(ArgType.Faint), @as(u8, @bitCast(
|
|
309
|
-
if (
|
|
388
|
+
try self.writer.writeAll(&.{ @intFromEnum(ArgType.Faint), @as(u8, @bitCast(args[0])) });
|
|
389
|
+
if (args[1]) try self.writer.writeByte(@intFromEnum(ArgType.None));
|
|
310
390
|
}
|
|
311
391
|
|
|
312
|
-
|
|
392
|
+
// num: u16
|
|
393
|
+
pub fn turn(self: Self, args: anytype) Error!void {
|
|
313
394
|
if (!enabled) return;
|
|
314
395
|
|
|
315
396
|
try self.writer.writeByte(@intFromEnum(ArgType.Turn));
|
|
316
|
-
try self.writer.
|
|
397
|
+
try self.writer.writeInt(u16, args[0], endian);
|
|
317
398
|
try self.writer.writeByte(@intFromEnum(ArgType.None));
|
|
318
399
|
}
|
|
319
400
|
|
|
320
|
-
|
|
401
|
+
// player: Player
|
|
402
|
+
pub fn win(self: Self, args: anytype) Error!void {
|
|
321
403
|
if (!enabled) return;
|
|
322
404
|
|
|
323
405
|
try self.writer.writeAll(&.{
|
|
324
406
|
@intFromEnum(ArgType.Win),
|
|
325
|
-
@intFromEnum(
|
|
407
|
+
@intFromEnum(@as(Player, args[0])),
|
|
326
408
|
@intFromEnum(ArgType.None),
|
|
327
409
|
});
|
|
328
410
|
}
|
|
329
411
|
|
|
330
|
-
|
|
412
|
+
// -
|
|
413
|
+
pub fn tie(self: Self, _: anytype) Error!void {
|
|
331
414
|
if (!enabled) return;
|
|
332
415
|
|
|
333
416
|
try self.writer.writeAll(&.{ @intFromEnum(ArgType.Tie), @intFromEnum(ArgType.None) });
|
|
334
417
|
}
|
|
335
418
|
|
|
336
|
-
|
|
419
|
+
// ident: ID, pokemon: <Pokemon>, reason: Damage
|
|
420
|
+
// ident: ID, pokemon: <Pokemon>, reason: .RecoilOf, source: ID
|
|
421
|
+
pub fn damage(self: Self, args: anytype) Error!void {
|
|
337
422
|
if (!enabled) return;
|
|
338
423
|
|
|
339
|
-
assert(
|
|
340
|
-
try self.writer.writeAll(&.{
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
424
|
+
assert(args[2] != .RecoilOf or args.len == 4);
|
|
425
|
+
try self.writer.writeAll(&.{
|
|
426
|
+
@intFromEnum(ArgType.Damage),
|
|
427
|
+
@as(u8, @bitCast(args[0])),
|
|
428
|
+
});
|
|
429
|
+
try self.writer.writeInt(u16, args[1].hp, endian);
|
|
430
|
+
try self.writer.writeInt(u16, args[1].stats.hp, endian);
|
|
431
|
+
try self.writer.writeAll(&.{ args[1].status, @intFromEnum(@as(Damage, args[2])) });
|
|
432
|
+
if (args.len == 4) try self.writer.writeByte(@as(u8, @bitCast(args[3])));
|
|
344
433
|
}
|
|
345
434
|
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
pokemon: anytype,
|
|
350
|
-
reason: Damage,
|
|
351
|
-
source: ID,
|
|
352
|
-
) Error!void {
|
|
435
|
+
// ident: ID, pokemon: <Pokemon>, reason: Heal
|
|
436
|
+
// ident: ID, pokemon: <Pokemon>, reason: .Drain, target: ID
|
|
437
|
+
pub fn heal(self: Self, args: anytype) Error!void {
|
|
353
438
|
if (!enabled) return;
|
|
354
439
|
|
|
355
|
-
assert(
|
|
356
|
-
try self.writer.writeAll(&.{ @intFromEnum(ArgType.
|
|
357
|
-
try self.writer.
|
|
358
|
-
try self.writer.
|
|
359
|
-
try self.writer.writeAll(&.{
|
|
360
|
-
|
|
361
|
-
@intFromEnum(reason),
|
|
362
|
-
@as(u8, @bitCast(source)),
|
|
363
|
-
});
|
|
440
|
+
assert(args[2] != .Drain or args.len == 4);
|
|
441
|
+
try self.writer.writeAll(&.{ @intFromEnum(ArgType.Heal), @as(u8, @bitCast(args[0])) });
|
|
442
|
+
try self.writer.writeInt(u16, args[1].hp, endian);
|
|
443
|
+
try self.writer.writeInt(u16, args[1].stats.hp, endian);
|
|
444
|
+
try self.writer.writeAll(&.{ args[1].status, @intFromEnum(@as(Heal, args[2])) });
|
|
445
|
+
if (args.len == 4) try self.writer.writeByte(@as(u8, @bitCast(args[3])));
|
|
364
446
|
}
|
|
365
447
|
|
|
366
|
-
|
|
448
|
+
// ident: ID, value: u8, reason: Status
|
|
449
|
+
// ident: ID, value: u8, reason: .From, m: <Move>
|
|
450
|
+
pub fn status(self: Self, args: anytype) Error!void {
|
|
367
451
|
if (!enabled) return;
|
|
368
452
|
|
|
369
|
-
assert(
|
|
370
|
-
try self.writer.writeAll(&.{
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
453
|
+
assert(args[2] != .From or args.len == 4);
|
|
454
|
+
try self.writer.writeAll(&.{
|
|
455
|
+
@intFromEnum(ArgType.Status),
|
|
456
|
+
@as(u8, @bitCast(args[0])),
|
|
457
|
+
args[1],
|
|
458
|
+
@intFromEnum(@as(Status, args[2])),
|
|
459
|
+
});
|
|
460
|
+
if (args.len == 4) try self.writer.writeByte(@intFromEnum(args[3]));
|
|
374
461
|
}
|
|
375
462
|
|
|
376
|
-
|
|
463
|
+
// ident: ID, value: u8, reason: CureStatus
|
|
464
|
+
pub fn curestatus(self: Self, args: anytype) Error!void {
|
|
377
465
|
if (!enabled) return;
|
|
378
466
|
|
|
379
|
-
try self.writer.writeAll(&.{ @intFromEnum(ArgType.Heal), @as(u8, @bitCast(source)) });
|
|
380
|
-
try self.writer.writeIntNative(u16, pokemon.hp);
|
|
381
|
-
try self.writer.writeIntNative(u16, pokemon.stats.hp);
|
|
382
467
|
try self.writer.writeAll(&.{
|
|
383
|
-
|
|
384
|
-
@
|
|
385
|
-
|
|
468
|
+
@intFromEnum(ArgType.CureStatus),
|
|
469
|
+
@as(u8, @bitCast(args[0])),
|
|
470
|
+
args[1],
|
|
471
|
+
@intFromEnum(@as(CureStatus, args[2])),
|
|
386
472
|
});
|
|
387
473
|
}
|
|
388
474
|
|
|
389
|
-
|
|
475
|
+
// ident: ID, reason: Boost, num: i8
|
|
476
|
+
pub fn boost(self: Self, args: anytype) Error!void {
|
|
390
477
|
if (!enabled) return;
|
|
391
478
|
|
|
392
|
-
assert(
|
|
479
|
+
assert(args[2] != 0 and (args[1] != .Rage or args[2] > 0));
|
|
393
480
|
try self.writer.writeAll(&.{
|
|
394
|
-
@intFromEnum(ArgType.
|
|
395
|
-
@as(u8, @bitCast(
|
|
396
|
-
|
|
397
|
-
@
|
|
481
|
+
@intFromEnum(ArgType.Boost),
|
|
482
|
+
@as(u8, @bitCast(args[0])),
|
|
483
|
+
@intFromEnum(@as(Boost, args[1])),
|
|
484
|
+
@as(u8, @intCast(@as(i8, args[2]) + 6)),
|
|
398
485
|
});
|
|
399
486
|
}
|
|
400
487
|
|
|
401
|
-
|
|
488
|
+
// -
|
|
489
|
+
pub fn clearallboost(self: Self, _: anytype) Error!void {
|
|
490
|
+
if (!enabled) return;
|
|
491
|
+
|
|
492
|
+
try self.writer.writeAll(&.{@intFromEnum(ArgType.ClearAllBoost)});
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
// ident: ID, reason: Fail
|
|
496
|
+
pub fn fail(self: Self, args: anytype) Error!void {
|
|
402
497
|
if (!enabled) return;
|
|
403
498
|
|
|
404
499
|
try self.writer.writeAll(&.{
|
|
405
|
-
@intFromEnum(ArgType.
|
|
406
|
-
@as(u8, @bitCast(
|
|
407
|
-
|
|
408
|
-
@intFromEnum(Status.From),
|
|
409
|
-
@intFromEnum(m),
|
|
500
|
+
@intFromEnum(ArgType.Fail),
|
|
501
|
+
@as(u8, @bitCast(args[0])),
|
|
502
|
+
@intFromEnum(@as(Fail, args[1])),
|
|
410
503
|
});
|
|
411
504
|
}
|
|
412
505
|
|
|
413
|
-
|
|
506
|
+
// source: ID
|
|
507
|
+
pub fn miss(self: Self, args: anytype) Error!void {
|
|
508
|
+
if (!enabled) return;
|
|
509
|
+
|
|
510
|
+
try self.writer.writeAll(&.{ @intFromEnum(ArgType.Miss), @as(u8, @bitCast(args[0])) });
|
|
511
|
+
}
|
|
512
|
+
|
|
513
|
+
// ident: ID, num: u8
|
|
514
|
+
pub fn hitcount(self: Self, args: anytype) Error!void {
|
|
414
515
|
if (!enabled) return;
|
|
415
516
|
|
|
416
517
|
try self.writer.writeAll(&.{
|
|
417
|
-
@intFromEnum(ArgType.
|
|
418
|
-
@as(u8, @bitCast(
|
|
419
|
-
|
|
420
|
-
@intFromEnum(reason),
|
|
518
|
+
@intFromEnum(ArgType.HitCount),
|
|
519
|
+
@as(u8, @bitCast(args[0])),
|
|
520
|
+
args[1],
|
|
421
521
|
});
|
|
422
522
|
}
|
|
423
523
|
|
|
424
|
-
|
|
524
|
+
// source: ID, m: <Move>
|
|
525
|
+
pub fn prepare(self: Self, args: anytype) Error!void {
|
|
425
526
|
if (!enabled) return;
|
|
426
527
|
|
|
427
|
-
assert(num != 0 and (reason != .Rage or num > 0));
|
|
428
528
|
try self.writer.writeAll(&.{
|
|
429
|
-
@intFromEnum(ArgType.
|
|
430
|
-
@as(u8, @bitCast(
|
|
431
|
-
@intFromEnum(
|
|
432
|
-
@as(u8, @intCast(num + 6)),
|
|
529
|
+
@intFromEnum(ArgType.Prepare),
|
|
530
|
+
@as(u8, @bitCast(args[0])),
|
|
531
|
+
@intFromEnum(args[1]),
|
|
433
532
|
});
|
|
434
533
|
}
|
|
435
534
|
|
|
436
|
-
|
|
535
|
+
// ident: ID
|
|
536
|
+
pub fn mustrecharge(self: Self, args: anytype) Error!void {
|
|
437
537
|
if (!enabled) return;
|
|
438
538
|
|
|
439
|
-
try self.writer.writeAll(&.{
|
|
539
|
+
try self.writer.writeAll(&.{
|
|
540
|
+
@intFromEnum(ArgType.MustRecharge),
|
|
541
|
+
@as(u8, @bitCast(args[0])),
|
|
542
|
+
});
|
|
440
543
|
}
|
|
441
544
|
|
|
442
|
-
|
|
545
|
+
// ident: ID, reason: Activate
|
|
546
|
+
// ident: ID, reason: .SubstituteBlock, m: <Move>
|
|
547
|
+
// ident: ID, reason: .Magnitude, num: u8
|
|
548
|
+
// ident: ID, reason: .Spite, m: <Move>, num: u8
|
|
549
|
+
pub fn activate(self: Self, args: anytype) Error!void {
|
|
443
550
|
if (!enabled) return;
|
|
444
551
|
|
|
552
|
+
assert(args.len <= 4);
|
|
553
|
+
const reason: Activate = args[1];
|
|
445
554
|
try self.writer.writeAll(&.{
|
|
446
|
-
@intFromEnum(ArgType.
|
|
447
|
-
@as(u8, @bitCast(
|
|
555
|
+
@intFromEnum(ArgType.Activate),
|
|
556
|
+
@as(u8, @bitCast(args[0])),
|
|
448
557
|
@intFromEnum(reason),
|
|
449
558
|
});
|
|
559
|
+
if (args.len == 3) {
|
|
560
|
+
if (reason == .SubstituteBlock) {
|
|
561
|
+
try self.writer.writeByte(@intFromEnum(args[2]));
|
|
562
|
+
} else {
|
|
563
|
+
assert(reason == .Magnitude);
|
|
564
|
+
try self.writer.writeByte(args[2]);
|
|
565
|
+
}
|
|
566
|
+
} else if (args.len == 4) {
|
|
567
|
+
assert(reason == .Spite);
|
|
568
|
+
try self.writer.writeAll(&.{ @intFromEnum(args[2]), args[3] });
|
|
569
|
+
}
|
|
450
570
|
}
|
|
451
571
|
|
|
452
|
-
|
|
572
|
+
// -
|
|
573
|
+
pub fn fieldactivate(self: Self, _: anytype) Error!void {
|
|
453
574
|
if (!enabled) return;
|
|
454
575
|
|
|
455
|
-
try self.writer.writeAll(&.{
|
|
576
|
+
try self.writer.writeAll(&.{@intFromEnum(ArgType.FieldActivate)});
|
|
456
577
|
}
|
|
457
578
|
|
|
458
|
-
|
|
579
|
+
// ident: ID, reason: Start
|
|
580
|
+
// ident: ID, reason: .Disable | .Mimic | .Encore, m: <Move>
|
|
581
|
+
// ident: ID, reason: .TypeChange, types: <Types>, target: ID
|
|
582
|
+
pub fn start(self: Self, args: anytype) Error!void {
|
|
459
583
|
if (!enabled) return;
|
|
460
584
|
|
|
585
|
+
assert(args.len <= 4);
|
|
586
|
+
const reason: Start = args[1];
|
|
461
587
|
try self.writer.writeAll(&.{
|
|
462
|
-
@intFromEnum(ArgType.
|
|
463
|
-
@as(u8, @bitCast(
|
|
464
|
-
|
|
588
|
+
@intFromEnum(ArgType.Start),
|
|
589
|
+
@as(u8, @bitCast(args[0])),
|
|
590
|
+
@intFromEnum(reason),
|
|
465
591
|
});
|
|
592
|
+
if (args.len == 3) {
|
|
593
|
+
assert(reason == .Disable or reason == .Mimic or reason == .Encore);
|
|
594
|
+
try self.writer.writeByte(@intFromEnum(args[2]));
|
|
595
|
+
} else if (args.len == 4) {
|
|
596
|
+
assert(reason == .TypeChange);
|
|
597
|
+
// FIXME: u16 types in Generation II
|
|
598
|
+
try self.writer.writeAll(&.{
|
|
599
|
+
@as(u8, @bitCast(args[2])),
|
|
600
|
+
@as(u8, @bitCast(args[3])),
|
|
601
|
+
});
|
|
602
|
+
}
|
|
466
603
|
}
|
|
467
604
|
|
|
468
|
-
|
|
605
|
+
// ident: ID, reason: End
|
|
606
|
+
pub fn end(self: Self, args: anytype) Error!void {
|
|
469
607
|
if (!enabled) return;
|
|
470
608
|
|
|
471
609
|
try self.writer.writeAll(&.{
|
|
472
|
-
@intFromEnum(ArgType.
|
|
473
|
-
@as(u8, @bitCast(
|
|
474
|
-
@intFromEnum(
|
|
610
|
+
@intFromEnum(ArgType.End),
|
|
611
|
+
@as(u8, @bitCast(args[0])),
|
|
612
|
+
@intFromEnum(@as(End, args[1])),
|
|
475
613
|
});
|
|
476
614
|
}
|
|
477
615
|
|
|
478
|
-
|
|
616
|
+
// -
|
|
617
|
+
pub fn ohko(self: Self, _: anytype) Error!void {
|
|
618
|
+
if (!enabled) return;
|
|
619
|
+
|
|
620
|
+
try self.writer.writeAll(&.{@intFromEnum(ArgType.OHKO)});
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// ident: ID
|
|
624
|
+
pub fn crit(self: Self, args: anytype) Error!void {
|
|
625
|
+
if (!enabled) return;
|
|
626
|
+
|
|
627
|
+
try self.writer.writeAll(&.{ @intFromEnum(ArgType.Crit), @as(u8, @bitCast(args[0])) });
|
|
628
|
+
}
|
|
629
|
+
|
|
630
|
+
// ident: ID
|
|
631
|
+
pub fn supereffective(self: Self, args: anytype) Error!void {
|
|
479
632
|
if (!enabled) return;
|
|
480
633
|
|
|
481
634
|
try self.writer.writeAll(&.{
|
|
482
|
-
@intFromEnum(ArgType.
|
|
483
|
-
@as(u8, @bitCast(
|
|
635
|
+
@intFromEnum(ArgType.SuperEffective),
|
|
636
|
+
@as(u8, @bitCast(args[0])),
|
|
484
637
|
});
|
|
485
638
|
}
|
|
486
639
|
|
|
487
|
-
|
|
640
|
+
// ident: ID
|
|
641
|
+
pub fn resisted(self: Self, args: anytype) Error!void {
|
|
488
642
|
if (!enabled) return;
|
|
489
643
|
|
|
490
644
|
try self.writer.writeAll(&.{
|
|
491
|
-
@intFromEnum(ArgType.
|
|
492
|
-
@as(u8, @bitCast(
|
|
493
|
-
@intFromEnum(reason),
|
|
645
|
+
@intFromEnum(ArgType.Resisted),
|
|
646
|
+
@as(u8, @bitCast(args[0])),
|
|
494
647
|
});
|
|
495
648
|
}
|
|
496
649
|
|
|
497
|
-
|
|
650
|
+
// ident: ID, reason: Immune
|
|
651
|
+
pub fn immune(self: Self, args: anytype) Error!void {
|
|
498
652
|
if (!enabled) return;
|
|
499
653
|
|
|
500
|
-
try self.writer.writeAll(&.{
|
|
654
|
+
try self.writer.writeAll(&.{
|
|
655
|
+
@intFromEnum(ArgType.Immune),
|
|
656
|
+
@as(u8, @bitCast(args[0])),
|
|
657
|
+
@intFromEnum(@as(Immune, args[1])),
|
|
658
|
+
});
|
|
501
659
|
}
|
|
502
660
|
|
|
503
|
-
|
|
661
|
+
// source: ID, target: ID
|
|
662
|
+
pub fn transform(self: Self, args: anytype) Error!void {
|
|
504
663
|
if (!enabled) return;
|
|
505
664
|
|
|
506
|
-
assert(@intFromEnum(reason) < @intFromEnum(Start.TypeChange));
|
|
507
665
|
try self.writer.writeAll(&.{
|
|
508
|
-
@intFromEnum(ArgType.
|
|
509
|
-
@as(u8, @bitCast(
|
|
510
|
-
@
|
|
666
|
+
@intFromEnum(ArgType.Transform),
|
|
667
|
+
@as(u8, @bitCast(args[0])),
|
|
668
|
+
@as(u8, @bitCast(args[1])),
|
|
511
669
|
});
|
|
512
670
|
}
|
|
513
671
|
|
|
514
|
-
|
|
672
|
+
// ident: ID, pokemon: <Pokemon>
|
|
673
|
+
pub fn drag(self: Self, args: anytype) Error!void {
|
|
674
|
+
return switchDrag(self, .Drag, args);
|
|
675
|
+
}
|
|
676
|
+
|
|
677
|
+
// target: ID, item: <Item>, source: ID
|
|
678
|
+
pub fn item(self: Self, args: anytype) Error!void {
|
|
515
679
|
if (!enabled) return;
|
|
516
680
|
|
|
517
681
|
try self.writer.writeAll(&.{
|
|
518
|
-
@intFromEnum(ArgType.
|
|
519
|
-
@as(u8, @bitCast(
|
|
520
|
-
@intFromEnum(
|
|
521
|
-
@as(u8, @bitCast(
|
|
522
|
-
@as(u8, @bitCast(target)),
|
|
682
|
+
@intFromEnum(ArgType.Item),
|
|
683
|
+
@as(u8, @bitCast(args[0])),
|
|
684
|
+
@intFromEnum(args[1]),
|
|
685
|
+
@as(u8, @bitCast(args[2])),
|
|
523
686
|
});
|
|
524
687
|
}
|
|
525
688
|
|
|
526
|
-
|
|
689
|
+
// ident: ID, item: <Item>, reason: EndItem
|
|
690
|
+
pub fn enditem(self: Self, args: anytype) Error!void {
|
|
527
691
|
if (!enabled) return;
|
|
528
692
|
|
|
529
|
-
assert(@intFromEnum(reason) > @intFromEnum(Start.TypeChange));
|
|
530
693
|
try self.writer.writeAll(&.{
|
|
531
|
-
@intFromEnum(ArgType.
|
|
532
|
-
@as(u8, @bitCast(
|
|
533
|
-
@intFromEnum(
|
|
534
|
-
@intFromEnum(
|
|
694
|
+
@intFromEnum(ArgType.EndItem),
|
|
695
|
+
@as(u8, @bitCast(args[0])),
|
|
696
|
+
@intFromEnum(args[1]),
|
|
697
|
+
@intFromEnum(@as(EndItem, args[2])),
|
|
535
698
|
});
|
|
536
699
|
}
|
|
537
700
|
|
|
538
|
-
|
|
701
|
+
// source: ID
|
|
702
|
+
pub fn cureteam(self: Self, args: anytype) Error!void {
|
|
539
703
|
if (!enabled) return;
|
|
540
704
|
|
|
541
705
|
try self.writer.writeAll(&.{
|
|
542
|
-
@intFromEnum(ArgType.
|
|
543
|
-
@as(u8, @bitCast(
|
|
544
|
-
@intFromEnum(reason),
|
|
706
|
+
@intFromEnum(ArgType.CureTeam),
|
|
707
|
+
@as(u8, @bitCast(args[0])),
|
|
545
708
|
});
|
|
546
709
|
}
|
|
547
710
|
|
|
548
|
-
|
|
711
|
+
// ident: ID, pokemon: <Pokemon>, reason: SetHP
|
|
712
|
+
pub fn sethp(self: Self, args: anytype) Error!void {
|
|
549
713
|
if (!enabled) return;
|
|
550
714
|
|
|
551
|
-
try self.writer.writeAll(&.{@intFromEnum(ArgType.
|
|
715
|
+
try self.writer.writeAll(&.{ @intFromEnum(ArgType.SetHP), @as(u8, @bitCast(args[0])) });
|
|
716
|
+
try self.writer.writeInt(u16, args[1].hp, endian);
|
|
717
|
+
try self.writer.writeInt(u16, args[1].stats.hp, endian);
|
|
718
|
+
try self.writer.writeAll(&.{args[1].status});
|
|
719
|
+
try self.writer.writeByte(@intFromEnum(@as(SetHP, args[2])));
|
|
552
720
|
}
|
|
553
721
|
|
|
554
|
-
|
|
722
|
+
// ident: ID, num: i8
|
|
723
|
+
pub fn setboost(self: Self, args: anytype) Error!void {
|
|
555
724
|
if (!enabled) return;
|
|
556
725
|
|
|
557
|
-
try self.writer.writeAll(&.{
|
|
726
|
+
try self.writer.writeAll(&.{
|
|
727
|
+
@intFromEnum(ArgType.SetBoost),
|
|
728
|
+
@as(u8, @bitCast(args[0])),
|
|
729
|
+
@as(u8, @intCast(args[1] + 6)),
|
|
730
|
+
});
|
|
558
731
|
}
|
|
559
732
|
|
|
560
|
-
|
|
733
|
+
// source: ID, target: ID
|
|
734
|
+
pub fn copyboost(self: Self, args: anytype) Error!void {
|
|
561
735
|
if (!enabled) return;
|
|
562
736
|
|
|
563
737
|
try self.writer.writeAll(&.{
|
|
564
|
-
@intFromEnum(ArgType.
|
|
565
|
-
@as(u8, @bitCast(
|
|
738
|
+
@intFromEnum(ArgType.CopyBoost),
|
|
739
|
+
@as(u8, @bitCast(args[0])),
|
|
740
|
+
@as(u8, @bitCast(args[1])),
|
|
566
741
|
});
|
|
567
742
|
}
|
|
568
743
|
|
|
569
|
-
|
|
744
|
+
// player: Player, reason: Side
|
|
745
|
+
pub fn sidestart(self: Self, args: anytype) Error!void {
|
|
570
746
|
if (!enabled) return;
|
|
571
747
|
|
|
572
748
|
try self.writer.writeAll(&.{
|
|
573
|
-
@intFromEnum(ArgType.
|
|
574
|
-
@as(
|
|
749
|
+
@intFromEnum(ArgType.SideStart),
|
|
750
|
+
@intFromEnum(@as(Player, args[0])),
|
|
751
|
+
@intFromEnum(@as(Side, args[1])),
|
|
575
752
|
});
|
|
576
753
|
}
|
|
577
754
|
|
|
578
|
-
|
|
755
|
+
// player: Player, reason: Side
|
|
756
|
+
// player: Player, reason: .Spikes, source: ID
|
|
757
|
+
pub fn sideend(self: Self, args: anytype) Error!void {
|
|
579
758
|
if (!enabled) return;
|
|
580
759
|
|
|
760
|
+
assert(args[1] != .Spikes or args.len == 3);
|
|
581
761
|
try self.writer.writeAll(&.{
|
|
582
|
-
@intFromEnum(ArgType.
|
|
583
|
-
@as(
|
|
584
|
-
@intFromEnum(
|
|
762
|
+
@intFromEnum(ArgType.SideEnd),
|
|
763
|
+
@intFromEnum(@as(Player, args[0])),
|
|
764
|
+
@intFromEnum(@as(Side, args[1])),
|
|
585
765
|
});
|
|
766
|
+
if (args.len == 3) try self.writer.writeByte(@as(u8, @bitCast(args[2])));
|
|
767
|
+
}
|
|
768
|
+
|
|
769
|
+
// ident: ID, move: <Move>
|
|
770
|
+
pub fn singlemove(self: Self, args: anytype) Error!void {
|
|
771
|
+
return single(self, .SingleMove, args);
|
|
772
|
+
}
|
|
773
|
+
|
|
774
|
+
// ident: ID, move: <Move>
|
|
775
|
+
pub fn singleturn(self: Self, args: anytype) Error!void {
|
|
776
|
+
return single(self, .SingleTurn, args);
|
|
586
777
|
}
|
|
587
778
|
|
|
588
|
-
|
|
779
|
+
// ident: ID, move: <Move>
|
|
780
|
+
fn single(self: Self, arg: ArgType, args: anytype) Error!void {
|
|
589
781
|
if (!enabled) return;
|
|
590
782
|
|
|
591
783
|
try self.writer.writeAll(&.{
|
|
592
|
-
@intFromEnum(
|
|
593
|
-
@as(u8, @bitCast(
|
|
594
|
-
@
|
|
784
|
+
@intFromEnum(arg),
|
|
785
|
+
@as(u8, @bitCast(args[0])),
|
|
786
|
+
@intFromEnum(args[1]),
|
|
595
787
|
});
|
|
596
788
|
}
|
|
597
789
|
|
|
598
|
-
|
|
790
|
+
// weather: <Weather>, reason: Weather
|
|
791
|
+
pub fn weather(self: Self, args: anytype) Error!void {
|
|
792
|
+
if (!enabled) return;
|
|
793
|
+
|
|
794
|
+
assert(!(args[0] == .None and args[1] == .Upkeep));
|
|
795
|
+
try self.writer.writeAll(&.{
|
|
796
|
+
@intFromEnum(ArgType.Weather),
|
|
797
|
+
@intFromEnum(args[0]),
|
|
798
|
+
@intFromEnum(@as(Weather, args[1])),
|
|
799
|
+
});
|
|
800
|
+
}
|
|
801
|
+
|
|
802
|
+
// -
|
|
803
|
+
pub fn laststill(self: Self, _: anytype) Error!void {
|
|
599
804
|
if (!enabled) return;
|
|
600
805
|
|
|
601
806
|
try self.writer.writeAll(&.{@intFromEnum(ArgType.LastStill)});
|
|
602
807
|
}
|
|
603
808
|
|
|
604
|
-
|
|
809
|
+
// -
|
|
810
|
+
pub fn lastmiss(self: Self, _: anytype) Error!void {
|
|
605
811
|
if (!enabled) return;
|
|
606
812
|
|
|
607
813
|
try self.writer.writeAll(&.{@intFromEnum(ArgType.LastMiss)});
|
|
@@ -632,10 +838,10 @@ pub const ByteStream = struct {
|
|
|
632
838
|
try self.stream.writeByte(byte);
|
|
633
839
|
}
|
|
634
840
|
|
|
635
|
-
pub fn
|
|
841
|
+
pub fn writeInt(self: Writer, comptime T: type, v: T, end: std.builtin.Endian) Error!void {
|
|
636
842
|
// TODO: rework this to write directly to the buffer?
|
|
637
|
-
var bytes: [(@typeInfo(T).Int.bits
|
|
638
|
-
std.mem.
|
|
843
|
+
var bytes: [@divExact(@typeInfo(T).Int.bits, 8)]u8 = undefined;
|
|
844
|
+
std.mem.writeInt(std.math.ByteAlignedInt(@TypeOf(v)), &bytes, v, end);
|
|
639
845
|
return self.writeAll(&bytes);
|
|
640
846
|
}
|
|
641
847
|
};
|
|
@@ -655,7 +861,7 @@ pub const ByteStream = struct {
|
|
|
655
861
|
}
|
|
656
862
|
};
|
|
657
863
|
|
|
658
|
-
pub const Kind = enum { Move, Species, Type, Status };
|
|
864
|
+
pub const Kind = enum { Move, Species, Type, Status, Item, Weather };
|
|
659
865
|
|
|
660
866
|
pub fn format(
|
|
661
867
|
comptime gen: anytype,
|
|
@@ -700,6 +906,18 @@ pub fn format(
|
|
|
700
906
|
.Resisted => "|-resisted|",
|
|
701
907
|
.Immune => "|-immune|",
|
|
702
908
|
.Transform => "|-transform|",
|
|
909
|
+
.Drag => "|drag|",
|
|
910
|
+
.Item => "|-item|",
|
|
911
|
+
.EndItem => "|-enditem|",
|
|
912
|
+
.CureTeam => "|-cureteam|",
|
|
913
|
+
.SetHP => "|-sethp|",
|
|
914
|
+
.SetBoost => "|-setboost|",
|
|
915
|
+
.CopyBoost => "|-copyboost|",
|
|
916
|
+
.SideStart => "|-sidestart|",
|
|
917
|
+
.SideEnd => "|-sideend|",
|
|
918
|
+
.SingleMove => "|-singlemove|",
|
|
919
|
+
.SingleTurn => "|-singleturn|",
|
|
920
|
+
.Weather => "|-weather|",
|
|
703
921
|
else => unreachable,
|
|
704
922
|
};
|
|
705
923
|
printc("{s}", .{name}, a, b, &i, 1, color);
|
|
@@ -724,7 +942,7 @@ pub fn format(
|
|
|
724
942
|
printc(" {s}", .{formatter(gen, .Move, a[i])}, a, b, &i, 1, color);
|
|
725
943
|
}
|
|
726
944
|
},
|
|
727
|
-
.Switch => {
|
|
945
|
+
.Switch, .Drag => {
|
|
728
946
|
const id = ID.from(@intCast(a[i]));
|
|
729
947
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
730
948
|
printc(" {s}", .{formatter(gen, .Species, a[i])}, a, b, &i, 1, color);
|
|
@@ -732,19 +950,19 @@ pub fn format(
|
|
|
732
950
|
if (a[i] == N(gen.Gender.Unknown)) {
|
|
733
951
|
i += 1;
|
|
734
952
|
} else {
|
|
735
|
-
|
|
953
|
+
const gender = if (a[i] == N(gen.Gender.Male)) "M" else "F";
|
|
736
954
|
printc(", {s}", .{gender}, a, b, &i, 1, color);
|
|
737
955
|
}
|
|
738
956
|
}
|
|
739
957
|
printc(" L{d}", .{a[i]}, a, b, &i, 1, color);
|
|
740
958
|
switch (endian) {
|
|
741
|
-
.
|
|
959
|
+
.big => {
|
|
742
960
|
var hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
|
|
743
961
|
printc(" {d}", .{hp}, a, b, &i, 2, color);
|
|
744
962
|
hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
|
|
745
963
|
printc("/{d}", .{hp}, a, b, &i, 2, color);
|
|
746
964
|
},
|
|
747
|
-
.
|
|
965
|
+
.little => {
|
|
748
966
|
var hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
|
|
749
967
|
printc(" {d}", .{hp}, a, b, &i, 2, color);
|
|
750
968
|
hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
|
|
@@ -768,14 +986,15 @@ pub fn format(
|
|
|
768
986
|
.Crit,
|
|
769
987
|
.SuperEffective,
|
|
770
988
|
.Resisted,
|
|
989
|
+
.CureTeam,
|
|
771
990
|
=> {
|
|
772
991
|
const id = ID.from(@intCast(a[i]));
|
|
773
992
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
774
993
|
},
|
|
775
994
|
.Turn => {
|
|
776
995
|
const turn = switch (endian) {
|
|
777
|
-
.
|
|
778
|
-
.
|
|
996
|
+
.big => @as(u16, a[i]) << 8 | @as(u16, a[i + 1]),
|
|
997
|
+
.little => @as(u16, a[i + 1]) << 8 | @as(u16, a[i]),
|
|
779
998
|
};
|
|
780
999
|
printc(" {d}", .{turn}, a, b, &i, 2, color);
|
|
781
1000
|
},
|
|
@@ -786,13 +1005,13 @@ pub fn format(
|
|
|
786
1005
|
var id = ID.from(@intCast(a[i]));
|
|
787
1006
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
788
1007
|
switch (endian) {
|
|
789
|
-
.
|
|
1008
|
+
.big => {
|
|
790
1009
|
var hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
|
|
791
1010
|
printc(" {d}", .{hp}, a, b, &i, 2, color);
|
|
792
1011
|
hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
|
|
793
1012
|
printc("/{d}", .{hp}, a, b, &i, 2, color);
|
|
794
1013
|
},
|
|
795
|
-
.
|
|
1014
|
+
.little => {
|
|
796
1015
|
var hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
|
|
797
1016
|
printc(" {d}", .{hp}, a, b, &i, 2, color);
|
|
798
1017
|
hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
|
|
@@ -844,12 +1063,12 @@ pub fn format(
|
|
|
844
1063
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
845
1064
|
printc(" {s}", .{@tagName(@as(Fail, @enumFromInt(a[i])))}, a, b, &i, 1, color);
|
|
846
1065
|
},
|
|
847
|
-
.HitCount => {
|
|
1066
|
+
.HitCount, .SetBoost => {
|
|
848
1067
|
const id = ID.from(@intCast(a[i]));
|
|
849
1068
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
850
1069
|
printc(" {d}", .{a[i]}, a, b, &i, 1, color);
|
|
851
1070
|
},
|
|
852
|
-
.Prepare => {
|
|
1071
|
+
.Prepare, .SingleMove, .SingleTurn => {
|
|
853
1072
|
const id = ID.from(@intCast(a[i]));
|
|
854
1073
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
855
1074
|
printc(" {s}", .{formatter(gen, .Move, a[i])}, a, b, &i, 1, color);
|
|
@@ -857,7 +1076,13 @@ pub fn format(
|
|
|
857
1076
|
.Activate => {
|
|
858
1077
|
const id = ID.from(@intCast(a[i]));
|
|
859
1078
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
860
|
-
|
|
1079
|
+
const reason: Activate = @enumFromInt(a[i]);
|
|
1080
|
+
printc(" {s}", .{@tagName(reason)}, a, b, &i, 1, color);
|
|
1081
|
+
if (reason == .SubstituteBlock) {
|
|
1082
|
+
printc(" {s}", .{formatter(gen, .Move, a[i])}, a, b, &i, 1, color);
|
|
1083
|
+
} else if (reason == .Magnitude) {
|
|
1084
|
+
printc(" {d}", .{a[i]}, a, b, &i, 1, color);
|
|
1085
|
+
}
|
|
861
1086
|
},
|
|
862
1087
|
.Start => {
|
|
863
1088
|
const id = ID.from(@intCast(a[i]));
|
|
@@ -865,6 +1090,7 @@ pub fn format(
|
|
|
865
1090
|
const reason = a[i];
|
|
866
1091
|
printc(" {s}", .{@tagName(@as(Start, @enumFromInt(reason)))}, a, b, &i, 1, color);
|
|
867
1092
|
if (@as(Start, @enumFromInt(reason)) == .TypeChange) {
|
|
1093
|
+
// FIXME
|
|
868
1094
|
const types = @as(gen1.Types, @bitCast(a[i]));
|
|
869
1095
|
const args = .{
|
|
870
1096
|
formatter(gen, .Type, @intFromEnum(types.type1)),
|
|
@@ -885,12 +1111,64 @@ pub fn format(
|
|
|
885
1111
|
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
886
1112
|
printc(" {s}", .{@tagName(@as(Immune, @enumFromInt(a[i])))}, a, b, &i, 1, color);
|
|
887
1113
|
},
|
|
888
|
-
.Transform => {
|
|
1114
|
+
.Transform, .CopyBoost => {
|
|
889
1115
|
const source = ID.from(@intCast(a[i]));
|
|
890
1116
|
printc(" {s}({d})", .{ @tagName(source.player), source.id }, a, b, &i, 1, color);
|
|
891
1117
|
const target = ID.from(@intCast(a[i]));
|
|
892
1118
|
printc(" {s}({d})", .{ @tagName(target.player), target.id }, a, b, &i, 1, color);
|
|
893
1119
|
},
|
|
1120
|
+
.Item, .EndItem => {
|
|
1121
|
+
var id = ID.from(@intCast(a[i]));
|
|
1122
|
+
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
1123
|
+
printc(" {s}", .{formatter(gen, .Item, a[i])}, a, b, &i, 1, color);
|
|
1124
|
+
if (arg == .Item) {
|
|
1125
|
+
id = ID.from(@intCast(a[i]));
|
|
1126
|
+
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
1127
|
+
} else {
|
|
1128
|
+
const reason: EndItem = @enumFromInt(a[i]);
|
|
1129
|
+
printc(" {s}", .{@tagName(reason)}, a, b, &i, 1, color);
|
|
1130
|
+
}
|
|
1131
|
+
},
|
|
1132
|
+
.SetHP => {
|
|
1133
|
+
const id = ID.from(@intCast(a[i]));
|
|
1134
|
+
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
1135
|
+
switch (endian) {
|
|
1136
|
+
.big => {
|
|
1137
|
+
var hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
|
|
1138
|
+
printc(" {d}", .{hp}, a, b, &i, 2, color);
|
|
1139
|
+
hp = @as(u16, a[i]) << 8 | @as(u16, a[i + 1]);
|
|
1140
|
+
printc("/{d}", .{hp}, a, b, &i, 2, color);
|
|
1141
|
+
},
|
|
1142
|
+
.little => {
|
|
1143
|
+
var hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
|
|
1144
|
+
printc(" {d}", .{hp}, a, b, &i, 2, color);
|
|
1145
|
+
hp = @as(u16, a[i + 1]) << 8 | @as(u16, a[i]);
|
|
1146
|
+
printc("/{d}", .{hp}, a, b, &i, 2, color);
|
|
1147
|
+
},
|
|
1148
|
+
}
|
|
1149
|
+
printc(" {s}", .{formatter(gen, .Status, a[i])}, a, b, &i, 1, color);
|
|
1150
|
+
printc(" {s}", .{@tagName(@as(SetHP, @enumFromInt(a[i])))}, a, b, &i, 1, color);
|
|
1151
|
+
},
|
|
1152
|
+
.SideStart => {
|
|
1153
|
+
const id = ID.from(@intCast(a[i]));
|
|
1154
|
+
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
1155
|
+
printc(" {s}", .{@tagName(@as(Side, @enumFromInt(a[i])))}, a, b, &i, 1, color);
|
|
1156
|
+
},
|
|
1157
|
+
.SideEnd => {
|
|
1158
|
+
var id = ID.from(@intCast(a[i]));
|
|
1159
|
+
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
1160
|
+
const reason: Side = @enumFromInt(a[i]);
|
|
1161
|
+
printc(" {s}", .{@tagName(reason)}, a, b, &i, 1, color);
|
|
1162
|
+
if (reason == .Spikes) {
|
|
1163
|
+
printc(" {s}", .{formatter(gen, .Move, a[i])}, a, b, &i, 1, color);
|
|
1164
|
+
id = ID.from(@intCast(a[i]));
|
|
1165
|
+
printc(" {s}({d})", .{ @tagName(id.player), id.id }, a, b, &i, 1, color);
|
|
1166
|
+
}
|
|
1167
|
+
},
|
|
1168
|
+
.Weather => {
|
|
1169
|
+
printc(" {s}", .{formatter(gen, .Weather, a[i])}, a, b, &i, 1, color);
|
|
1170
|
+
printc(" {s}", .{@tagName(@as(Weather, @enumFromInt(a[i])))}, a, b, &i, 1, color);
|
|
1171
|
+
},
|
|
894
1172
|
else => unreachable,
|
|
895
1173
|
}
|
|
896
1174
|
print("\n", .{});
|
|
@@ -929,14 +1207,11 @@ pub fn expectLog(
|
|
|
929
1207
|
) !void {
|
|
930
1208
|
if (!enabled) return;
|
|
931
1209
|
|
|
932
|
-
const color =
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
} else {
|
|
938
|
-
break :color std.io.getStdErr().supportsAnsiEscapeCodes();
|
|
939
|
-
}
|
|
1210
|
+
const color = if (std.process.hasEnvVarConstant("ZIG_DEBUG_COLOR"))
|
|
1211
|
+
true
|
|
1212
|
+
else switch (std.io.tty.detectConfig(std.io.getStdErr())) {
|
|
1213
|
+
.escape_codes => true,
|
|
1214
|
+
else => false,
|
|
940
1215
|
};
|
|
941
1216
|
|
|
942
1217
|
expectEqualBytes(expected, actual, offset) catch |err| switch (err) {
|
|
@@ -968,8 +1243,6 @@ fn expectEqualBytes(expected: []const u8, actual: []const u8, offset: usize) !vo
|
|
|
968
1243
|
}
|
|
969
1244
|
}
|
|
970
1245
|
|
|
971
|
-
const endian = builtin.target.cpu.arch.endian();
|
|
972
|
-
|
|
973
1246
|
fn N(e: anytype) u8 {
|
|
974
1247
|
return @intFromEnum(e);
|
|
975
1248
|
}
|
|
@@ -977,22 +1250,20 @@ fn N(e: anytype) u8 {
|
|
|
977
1250
|
const p1 = Player.P1;
|
|
978
1251
|
const p2 = Player.P2;
|
|
979
1252
|
|
|
980
|
-
|
|
981
|
-
|
|
982
|
-
|
|
983
|
-
};
|
|
1253
|
+
var buf: [pkmn.LOGS_SIZE]u8 = undefined;
|
|
1254
|
+
var stream: ByteStream = .{ .buffer = &buf };
|
|
1255
|
+
var log: FixedLog = .{ .writer = stream.writer() };
|
|
984
1256
|
|
|
985
|
-
const
|
|
986
|
-
|
|
987
|
-
pub const helpers = @import("../gen2/helpers.zig");
|
|
988
|
-
};
|
|
1257
|
+
const gen1 = pkmn.gen1;
|
|
1258
|
+
const gen2 = pkmn.gen2;
|
|
989
1259
|
|
|
990
|
-
|
|
991
|
-
|
|
992
|
-
var log: FixedLog = .{ .writer = stream.writer() };
|
|
1260
|
+
const M1 = gen1.Move;
|
|
1261
|
+
const S1 = gen1.Species;
|
|
993
1262
|
|
|
994
|
-
const
|
|
995
|
-
const
|
|
1263
|
+
const M2 = gen2.Move;
|
|
1264
|
+
const S2 = gen2.Species;
|
|
1265
|
+
const I2 = gen2.Item;
|
|
1266
|
+
const W2 = gen2.Weather;
|
|
996
1267
|
|
|
997
1268
|
fn expectLog1(expected: []const u8, actual: []const u8) !void {
|
|
998
1269
|
return expectLog(gen1, expected, actual, 0);
|
|
@@ -1008,32 +1279,39 @@ fn formatter(comptime gen: anytype, kind: Kind, byte: u8) []const u8 {
|
|
|
1008
1279
|
.Species => @tagName(@as(gen.Species, @enumFromInt(byte))),
|
|
1009
1280
|
.Type => @tagName(@as(gen.Type, @enumFromInt(byte))),
|
|
1010
1281
|
.Status => gen.Status.name(byte),
|
|
1282
|
+
.Item => if (@hasDecl(gen, "Item"))
|
|
1283
|
+
@tagName(@as(gen.Item, @enumFromInt(byte)))
|
|
1284
|
+
else
|
|
1285
|
+
unreachable,
|
|
1286
|
+
.Weather => if (@hasDecl(gen, "Weather"))
|
|
1287
|
+
@tagName(@as(gen.Weather, @enumFromInt(byte)))
|
|
1288
|
+
else
|
|
1289
|
+
unreachable,
|
|
1011
1290
|
};
|
|
1012
1291
|
}
|
|
1013
1292
|
|
|
1014
1293
|
test "|move|" {
|
|
1015
|
-
try log.move(p2.ident(4),
|
|
1294
|
+
try log.move(.{ p2.ident(4), M1.Thunderbolt, p1.ident(5) });
|
|
1016
1295
|
try expectLog1(
|
|
1017
|
-
&.{ N(ArgType.Move), 0b1100, N(
|
|
1296
|
+
&.{ N(ArgType.Move), 0b1100, N(M1.Thunderbolt), 0b0101, N(Move.None) },
|
|
1018
1297
|
buf[0..5],
|
|
1019
1298
|
);
|
|
1020
1299
|
stream.reset();
|
|
1021
1300
|
|
|
1022
|
-
try log.move(p2.ident(4),
|
|
1023
|
-
const wrap = N(M.Wrap);
|
|
1301
|
+
try log.move(.{ p2.ident(4), M1.Pound, p1.ident(5), M1.Metronome });
|
|
1024
1302
|
try expectLog1(
|
|
1025
|
-
&.{ N(ArgType.Move), 0b1100,
|
|
1303
|
+
&.{ N(ArgType.Move), 0b1100, N(M1.Pound), 0b0101, N(Move.From), N(M1.Metronome) },
|
|
1026
1304
|
buf[0..6],
|
|
1027
1305
|
);
|
|
1028
1306
|
stream.reset();
|
|
1029
1307
|
|
|
1030
|
-
try log.move(p2.ident(4),
|
|
1031
|
-
try log.laststill();
|
|
1308
|
+
try log.move(.{ p2.ident(4), M1.SkullBash, ID{} });
|
|
1309
|
+
try log.laststill(.{});
|
|
1032
1310
|
try expectLog1(
|
|
1033
1311
|
&.{
|
|
1034
1312
|
N(ArgType.Move),
|
|
1035
1313
|
0b1100,
|
|
1036
|
-
N(
|
|
1314
|
+
N(M1.SkullBash),
|
|
1037
1315
|
0,
|
|
1038
1316
|
N(Move.None),
|
|
1039
1317
|
N(ArgType.LastStill),
|
|
@@ -1042,13 +1320,13 @@ test "|move|" {
|
|
|
1042
1320
|
);
|
|
1043
1321
|
stream.reset();
|
|
1044
1322
|
|
|
1045
|
-
try log.move(p2.ident(4),
|
|
1046
|
-
try log.lastmiss();
|
|
1323
|
+
try log.move(.{ p2.ident(4), M1.Tackle, p1.ident(5) });
|
|
1324
|
+
try log.lastmiss(.{});
|
|
1047
1325
|
try expectLog1(
|
|
1048
1326
|
&.{
|
|
1049
1327
|
N(ArgType.Move),
|
|
1050
1328
|
0b1100,
|
|
1051
|
-
N(
|
|
1329
|
+
N(M1.Tackle),
|
|
1052
1330
|
0b0101,
|
|
1053
1331
|
N(Move.None),
|
|
1054
1332
|
N(ArgType.LastMiss),
|
|
@@ -1064,11 +1342,11 @@ test "|switch|" {
|
|
|
1064
1342
|
snorlax.hp = 200;
|
|
1065
1343
|
snorlax.stats.hp = 400;
|
|
1066
1344
|
snorlax.status = gen1.Status.init(.PAR);
|
|
1067
|
-
try log.switched(p2.ident(3), &snorlax);
|
|
1345
|
+
try log.switched(.{ p2.ident(3), &snorlax });
|
|
1068
1346
|
const par = 0b1000000;
|
|
1069
1347
|
var expected: []const u8 = switch (endian) {
|
|
1070
|
-
.
|
|
1071
|
-
.
|
|
1348
|
+
.big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 91, 0, 200, 1, 144, par },
|
|
1349
|
+
.little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 91, 200, 0, 144, 1, par },
|
|
1072
1350
|
};
|
|
1073
1351
|
try expectLog1(expected, buf[0..9]);
|
|
1074
1352
|
stream.reset();
|
|
@@ -1076,19 +1354,19 @@ test "|switch|" {
|
|
|
1076
1354
|
snorlax.level = 100;
|
|
1077
1355
|
snorlax.hp = 0;
|
|
1078
1356
|
snorlax.status = 0;
|
|
1079
|
-
try log.switched(p2.ident(3), &snorlax);
|
|
1357
|
+
try log.switched(.{ p2.ident(3), &snorlax });
|
|
1080
1358
|
expected = switch (endian) {
|
|
1081
|
-
.
|
|
1082
|
-
.
|
|
1359
|
+
.big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 0, 0, 1, 144, 0 },
|
|
1360
|
+
.little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 0, 0, 144, 1, 0 },
|
|
1083
1361
|
};
|
|
1084
1362
|
try expectLog1(expected, buf[0..9]);
|
|
1085
1363
|
stream.reset();
|
|
1086
1364
|
|
|
1087
1365
|
snorlax.hp = 400;
|
|
1088
|
-
try log.switched(p2.ident(3), &snorlax);
|
|
1366
|
+
try log.switched(.{ p2.ident(3), &snorlax });
|
|
1089
1367
|
expected = switch (endian) {
|
|
1090
|
-
.
|
|
1091
|
-
.
|
|
1368
|
+
.big => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 1, 144, 1, 144, 0 },
|
|
1369
|
+
.little => &.{ N(ArgType.Switch), 0b1011, N(S1.Snorlax), 100, 144, 1, 144, 1, 0 },
|
|
1092
1370
|
};
|
|
1093
1371
|
try expectLog1(expected, buf[0..9]);
|
|
1094
1372
|
stream.reset();
|
|
@@ -1098,59 +1376,59 @@ test "|switch|" {
|
|
|
1098
1376
|
blissey.hp = 200;
|
|
1099
1377
|
blissey.stats.hp = 400;
|
|
1100
1378
|
blissey.status = gen2.Status.init(.PAR);
|
|
1101
|
-
try log.switched(p2.ident(3), &blissey);
|
|
1379
|
+
try log.switched(.{ p2.ident(3), &blissey });
|
|
1102
1380
|
expected = &(.{
|
|
1103
1381
|
N(ArgType.Switch),
|
|
1104
1382
|
0b1011,
|
|
1105
|
-
N(
|
|
1383
|
+
N(S2.Blissey),
|
|
1106
1384
|
N(gen2.Gender.Female),
|
|
1107
1385
|
91,
|
|
1108
1386
|
} ++ switch (endian) {
|
|
1109
|
-
.
|
|
1110
|
-
.
|
|
1387
|
+
.big => .{ 0, 200, 1, 144, par },
|
|
1388
|
+
.little => .{ 200, 0, 144, 1, par },
|
|
1111
1389
|
});
|
|
1112
1390
|
try expectLog2(expected, buf[0..10]);
|
|
1113
1391
|
stream.reset();
|
|
1114
1392
|
}
|
|
1115
1393
|
|
|
1116
1394
|
test "|cant|" {
|
|
1117
|
-
try log.cant(p2.ident(6), .Bound);
|
|
1395
|
+
try log.cant(.{ p2.ident(6), .Bound });
|
|
1118
1396
|
try expectLog1(&.{ N(ArgType.Cant), 0b1110, N(Cant.Bound) }, buf[0..3]);
|
|
1119
1397
|
stream.reset();
|
|
1120
1398
|
|
|
1121
|
-
try log.
|
|
1122
|
-
try expectLog1(&.{ N(ArgType.Cant), 2, N(Cant.Disable), N(
|
|
1399
|
+
try log.cant(.{ p1.ident(2), .Disable, M1.Earthquake });
|
|
1400
|
+
try expectLog1(&.{ N(ArgType.Cant), 2, N(Cant.Disable), N(M1.Earthquake) }, buf[0..4]);
|
|
1123
1401
|
stream.reset();
|
|
1124
1402
|
}
|
|
1125
1403
|
|
|
1126
1404
|
test "|faint|" {
|
|
1127
|
-
try log.faint(p2.ident(2), false);
|
|
1405
|
+
try log.faint(.{ p2.ident(2), false });
|
|
1128
1406
|
try expectLog1(&.{ N(ArgType.Faint), 0b1010 }, buf[0..2]);
|
|
1129
1407
|
stream.reset();
|
|
1130
1408
|
|
|
1131
|
-
try log.faint(p2.ident(2), true);
|
|
1409
|
+
try log.faint(.{ p2.ident(2), true });
|
|
1132
1410
|
try expectLog1(&.{ N(ArgType.Faint), 0b1010, N(ArgType.None) }, buf[0..3]);
|
|
1133
1411
|
stream.reset();
|
|
1134
1412
|
}
|
|
1135
1413
|
|
|
1136
1414
|
test "|turn|" {
|
|
1137
|
-
try log.turn(42);
|
|
1138
|
-
|
|
1139
|
-
.
|
|
1140
|
-
.
|
|
1415
|
+
try log.turn(.{42});
|
|
1416
|
+
const expected = switch (endian) {
|
|
1417
|
+
.big => &.{ N(ArgType.Turn), 0, 42, N(ArgType.None) },
|
|
1418
|
+
.little => &.{ N(ArgType.Turn), 42, 0, N(ArgType.None) },
|
|
1141
1419
|
};
|
|
1142
1420
|
try expectLog1(expected, buf[0..4]);
|
|
1143
1421
|
stream.reset();
|
|
1144
1422
|
}
|
|
1145
1423
|
|
|
1146
1424
|
test "|win|" {
|
|
1147
|
-
try log.win(.P2);
|
|
1425
|
+
try log.win(.{.P2});
|
|
1148
1426
|
try expectLog1(&.{ N(ArgType.Win), 1, N(ArgType.None) }, buf[0..3]);
|
|
1149
1427
|
stream.reset();
|
|
1150
1428
|
}
|
|
1151
1429
|
|
|
1152
1430
|
test "|tie|" {
|
|
1153
|
-
try log.tie();
|
|
1431
|
+
try log.tie(.{});
|
|
1154
1432
|
try expectLog1(&.{ N(ArgType.Tie), N(ArgType.None) }, buf[0..2]);
|
|
1155
1433
|
stream.reset();
|
|
1156
1434
|
}
|
|
@@ -1159,10 +1437,10 @@ test "|-damage|" {
|
|
|
1159
1437
|
var chansey = gen1.helpers.Pokemon.init(.{ .species = .Chansey, .moves = &.{.Splash} });
|
|
1160
1438
|
chansey.hp = 612;
|
|
1161
1439
|
chansey.status = gen1.Status.slp(1);
|
|
1162
|
-
try log.damage(p2.ident(2), &chansey, .None);
|
|
1440
|
+
try log.damage(.{ p2.ident(2), &chansey, .None });
|
|
1163
1441
|
var expected: []const u8 = switch (endian) {
|
|
1164
|
-
.
|
|
1165
|
-
.
|
|
1442
|
+
.big => &.{ N(ArgType.Damage), 0b1010, 2, 100, 2, 191, 1, N(Damage.None) },
|
|
1443
|
+
.little => &.{ N(ArgType.Damage), 0b1010, 100, 2, 191, 2, 1, N(Damage.None) },
|
|
1166
1444
|
};
|
|
1167
1445
|
try expectLog1(expected, buf[0..8]);
|
|
1168
1446
|
stream.reset();
|
|
@@ -1170,19 +1448,19 @@ test "|-damage|" {
|
|
|
1170
1448
|
chansey.hp = 100;
|
|
1171
1449
|
chansey.stats.hp = 256;
|
|
1172
1450
|
chansey.status = 0;
|
|
1173
|
-
try log.damage(p2.ident(2), &chansey, .Confusion);
|
|
1451
|
+
try log.damage(.{ p2.ident(2), &chansey, .Confusion });
|
|
1174
1452
|
expected = switch (endian) {
|
|
1175
|
-
.
|
|
1176
|
-
.
|
|
1453
|
+
.big => &.{ N(ArgType.Damage), 0b1010, 0, 100, 1, 0, 0, N(Damage.Confusion) },
|
|
1454
|
+
.little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0, N(Damage.Confusion) },
|
|
1177
1455
|
};
|
|
1178
1456
|
try expectLog1(expected, buf[0..8]);
|
|
1179
1457
|
stream.reset();
|
|
1180
1458
|
|
|
1181
1459
|
chansey.status = gen1.Status.init(.PSN);
|
|
1182
|
-
try log.
|
|
1460
|
+
try log.damage(.{ p2.ident(2), &chansey, .RecoilOf, p1.ident(1) });
|
|
1183
1461
|
expected = switch (endian) {
|
|
1184
|
-
.
|
|
1185
|
-
.
|
|
1462
|
+
.big => &.{ N(ArgType.Damage), 0b1010, 0, 100, 1, 0, 0b1000, N(Damage.RecoilOf), 1 },
|
|
1463
|
+
.little => &.{ N(ArgType.Damage), 0b1010, 100, 0, 0, 1, 0b1000, N(Damage.RecoilOf), 1 },
|
|
1186
1464
|
};
|
|
1187
1465
|
try expectLog1(expected, buf[0..9]);
|
|
1188
1466
|
stream.reset();
|
|
@@ -1192,10 +1470,10 @@ test "|-heal|" {
|
|
|
1192
1470
|
var chansey = gen1.helpers.Pokemon.init(.{ .species = .Chansey, .moves = &.{.Splash} });
|
|
1193
1471
|
chansey.hp = 612;
|
|
1194
1472
|
chansey.status = gen1.Status.slp(1);
|
|
1195
|
-
try log.heal(p2.ident(2), &chansey, .None);
|
|
1473
|
+
try log.heal(.{ p2.ident(2), &chansey, .None });
|
|
1196
1474
|
var expected: []const u8 = switch (endian) {
|
|
1197
|
-
.
|
|
1198
|
-
.
|
|
1475
|
+
.big => &.{ N(ArgType.Heal), 0b1010, 2, 100, 2, 191, 1, N(Heal.None) },
|
|
1476
|
+
.little => &.{ N(ArgType.Heal), 0b1010, 100, 2, 191, 2, 1, N(Heal.None) },
|
|
1199
1477
|
};
|
|
1200
1478
|
try expectLog1(expected, buf[0..8]);
|
|
1201
1479
|
stream.reset();
|
|
@@ -1203,46 +1481,46 @@ test "|-heal|" {
|
|
|
1203
1481
|
chansey.hp = 100;
|
|
1204
1482
|
chansey.stats.hp = 256;
|
|
1205
1483
|
chansey.status = 0;
|
|
1206
|
-
try log.heal(p2.ident(2), &chansey, .Silent);
|
|
1484
|
+
try log.heal(.{ p2.ident(2), &chansey, .Silent });
|
|
1207
1485
|
expected = switch (endian) {
|
|
1208
|
-
.
|
|
1209
|
-
.
|
|
1486
|
+
.big => &.{ N(ArgType.Heal), 0b1010, 0, 100, 1, 0, 0, N(Heal.Silent) },
|
|
1487
|
+
.little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Silent) },
|
|
1210
1488
|
};
|
|
1211
1489
|
try expectLog1(expected, buf[0..8]);
|
|
1212
1490
|
stream.reset();
|
|
1213
1491
|
|
|
1214
|
-
try log.
|
|
1492
|
+
try log.heal(.{ p2.ident(2), &chansey, .Drain, p1.ident(1) });
|
|
1215
1493
|
expected = switch (endian) {
|
|
1216
|
-
.
|
|
1217
|
-
.
|
|
1494
|
+
.big => &.{ N(ArgType.Heal), 0b1010, 0, 100, 1, 0, 0, N(Heal.Drain), 1 },
|
|
1495
|
+
.little => &.{ N(ArgType.Heal), 0b1010, 100, 0, 0, 1, 0, N(Heal.Drain), 1 },
|
|
1218
1496
|
};
|
|
1219
1497
|
try expectLog1(expected, buf[0..9]);
|
|
1220
1498
|
stream.reset();
|
|
1221
1499
|
}
|
|
1222
1500
|
|
|
1223
1501
|
test "|-status|" {
|
|
1224
|
-
try log.status(p2.ident(6), gen1.Status.init(.BRN), .None);
|
|
1502
|
+
try log.status(.{ p2.ident(6), gen1.Status.init(.BRN), .None });
|
|
1225
1503
|
try expectLog1(&.{ N(ArgType.Status), 0b1110, 0b10000, N(Status.None) }, buf[0..4]);
|
|
1226
1504
|
stream.reset();
|
|
1227
1505
|
|
|
1228
|
-
try log.status(p2.ident(2), gen1.Status.init(.PSN), .Silent);
|
|
1506
|
+
try log.status(.{ p2.ident(2), gen1.Status.init(.PSN), .Silent });
|
|
1229
1507
|
try expectLog1(&.{ N(ArgType.Status), 0b1010, 0b1000, N(Status.Silent) }, buf[0..4]);
|
|
1230
1508
|
stream.reset();
|
|
1231
1509
|
|
|
1232
|
-
try log.
|
|
1510
|
+
try log.status(.{ p1.ident(1), gen1.Status.init(.PAR), .From, M1.BodySlam });
|
|
1233
1511
|
try expectLog1(
|
|
1234
|
-
&.{ N(ArgType.Status), 0b0001, 0b1000000, N(Status.From), N(
|
|
1512
|
+
&.{ N(ArgType.Status), 0b0001, 0b1000000, N(Status.From), N(M1.BodySlam) },
|
|
1235
1513
|
buf[0..5],
|
|
1236
1514
|
);
|
|
1237
1515
|
stream.reset();
|
|
1238
1516
|
}
|
|
1239
1517
|
|
|
1240
1518
|
test "|-curestatus|" {
|
|
1241
|
-
try log.curestatus(p2.ident(6), gen1.Status.slp(7), .Message);
|
|
1519
|
+
try log.curestatus(.{ p2.ident(6), gen1.Status.slp(7), .Message });
|
|
1242
1520
|
try expectLog1(&.{ N(ArgType.CureStatus), 0b1110, 0b111, N(CureStatus.Message) }, buf[0..4]);
|
|
1243
1521
|
stream.reset();
|
|
1244
1522
|
|
|
1245
|
-
try log.curestatus(p1.ident(2), gen1.Status.TOX, .Silent);
|
|
1523
|
+
try log.curestatus(.{ p1.ident(2), gen1.Status.TOX, .Silent });
|
|
1246
1524
|
try expectLog1(&.{
|
|
1247
1525
|
N(ArgType.CureStatus),
|
|
1248
1526
|
0b0010,
|
|
@@ -1253,163 +1531,306 @@ test "|-curestatus|" {
|
|
|
1253
1531
|
}
|
|
1254
1532
|
|
|
1255
1533
|
test "|-boost|" {
|
|
1256
|
-
try log.boost(p2.ident(6), .Speed, 2);
|
|
1534
|
+
try log.boost(.{ p2.ident(6), .Speed, 2 });
|
|
1257
1535
|
try expectLog1(&.{ N(ArgType.Boost), 0b1110, N(Boost.Speed), 8 }, buf[0..4]);
|
|
1258
1536
|
stream.reset();
|
|
1259
1537
|
|
|
1260
|
-
try log.boost(p1.ident(2), .Rage, 1);
|
|
1538
|
+
try log.boost(.{ p1.ident(2), .Rage, 1 });
|
|
1261
1539
|
try expectLog1(&.{ N(ArgType.Boost), 0b0010, N(Boost.Rage), 7 }, buf[0..4]);
|
|
1262
1540
|
stream.reset();
|
|
1263
1541
|
|
|
1264
|
-
try log.boost(p2.ident(3), .Defense, -2);
|
|
1542
|
+
try log.boost(.{ p2.ident(3), .Defense, -2 });
|
|
1265
1543
|
try expectLog1(&.{ N(ArgType.Boost), 0b1011, N(Boost.Defense), 4 }, buf[0..4]);
|
|
1266
1544
|
stream.reset();
|
|
1267
1545
|
}
|
|
1268
1546
|
|
|
1269
1547
|
test "|-clearallboost|" {
|
|
1270
|
-
try log.clearallboost();
|
|
1548
|
+
try log.clearallboost(.{});
|
|
1271
1549
|
try expectLog1(&.{N(ArgType.ClearAllBoost)}, buf[0..1]);
|
|
1272
1550
|
stream.reset();
|
|
1273
1551
|
}
|
|
1274
1552
|
|
|
1275
1553
|
test "|-fail|" {
|
|
1276
|
-
try log.fail(p2.ident(6), .None);
|
|
1554
|
+
try log.fail(.{ p2.ident(6), .None });
|
|
1277
1555
|
try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.None) }, buf[0..3]);
|
|
1278
1556
|
stream.reset();
|
|
1279
1557
|
|
|
1280
|
-
try log.fail(p2.ident(6), .Sleep);
|
|
1558
|
+
try log.fail(.{ p2.ident(6), .Sleep });
|
|
1281
1559
|
try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.Sleep) }, buf[0..3]);
|
|
1282
1560
|
stream.reset();
|
|
1283
1561
|
|
|
1284
|
-
try log.fail(p2.ident(6), .Substitute);
|
|
1562
|
+
try log.fail(.{ p2.ident(6), .Substitute });
|
|
1285
1563
|
try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.Substitute) }, buf[0..3]);
|
|
1286
1564
|
stream.reset();
|
|
1287
1565
|
|
|
1288
|
-
try log.fail(p2.ident(6), .Weak);
|
|
1566
|
+
try log.fail(.{ p2.ident(6), .Weak });
|
|
1289
1567
|
try expectLog1(&.{ N(ArgType.Fail), 0b1110, N(Fail.Weak) }, buf[0..3]);
|
|
1290
1568
|
stream.reset();
|
|
1291
1569
|
}
|
|
1292
1570
|
|
|
1293
1571
|
test "|-miss|" {
|
|
1294
|
-
try log.miss(p2.ident(4));
|
|
1572
|
+
try log.miss(.{p2.ident(4)});
|
|
1295
1573
|
try expectLog1(&.{ N(ArgType.Miss), 0b1100 }, buf[0..2]);
|
|
1296
1574
|
stream.reset();
|
|
1297
1575
|
}
|
|
1298
1576
|
test "|-hitcount|" {
|
|
1299
|
-
try log.hitcount(p2.ident(1), 5);
|
|
1577
|
+
try log.hitcount(.{ p2.ident(1), 5 });
|
|
1300
1578
|
try expectLog1(&.{ N(ArgType.HitCount), 0b1001, 5 }, buf[0..3]);
|
|
1301
1579
|
stream.reset();
|
|
1302
1580
|
}
|
|
1303
1581
|
|
|
1304
1582
|
test "|-prepare|" {
|
|
1305
|
-
try log.prepare(p2.ident(2),
|
|
1306
|
-
try expectLog1(&.{ N(ArgType.Prepare), 0b1010, N(
|
|
1583
|
+
try log.prepare(.{ p2.ident(2), M1.Dig });
|
|
1584
|
+
try expectLog1(&.{ N(ArgType.Prepare), 0b1010, N(M1.Dig) }, buf[0..3]);
|
|
1307
1585
|
stream.reset();
|
|
1308
1586
|
}
|
|
1309
1587
|
|
|
1310
1588
|
test "|-mustrecharge|" {
|
|
1311
|
-
try log.mustrecharge(p1.ident(6));
|
|
1589
|
+
try log.mustrecharge(.{p1.ident(6)});
|
|
1312
1590
|
try expectLog1(&.{ N(ArgType.MustRecharge), 0b0110 }, buf[0..2]);
|
|
1313
1591
|
stream.reset();
|
|
1314
1592
|
}
|
|
1315
1593
|
|
|
1316
1594
|
test "|-activate|" {
|
|
1317
|
-
try log.activate(p1.ident(2), .Struggle);
|
|
1595
|
+
try log.activate(.{ p1.ident(2), .Struggle });
|
|
1318
1596
|
try expectLog1(&.{ N(ArgType.Activate), 0b0010, N(Activate.Struggle) }, buf[0..3]);
|
|
1319
1597
|
stream.reset();
|
|
1320
1598
|
|
|
1321
|
-
try log.activate(p2.ident(4), .Mist);
|
|
1599
|
+
try log.activate(.{ p2.ident(4), .Mist });
|
|
1322
1600
|
try expectLog1(&.{ N(ArgType.Activate), 0b1100, N(Activate.Mist) }, buf[0..3]);
|
|
1323
1601
|
stream.reset();
|
|
1324
1602
|
|
|
1325
|
-
try log.activate(p2.ident(6), .Substitute);
|
|
1603
|
+
try log.activate(.{ p2.ident(6), .Substitute });
|
|
1326
1604
|
try expectLog1(&.{ N(ArgType.Activate), 0b1110, N(Activate.Substitute) }, buf[0..3]);
|
|
1327
1605
|
stream.reset();
|
|
1328
1606
|
|
|
1329
|
-
try log.activate(p1.ident(2), .Splash);
|
|
1607
|
+
try log.activate(.{ p1.ident(2), .Splash });
|
|
1330
1608
|
try expectLog1(&.{ N(ArgType.Activate), 0b0010, N(Activate.Splash) }, buf[0..3]);
|
|
1331
1609
|
stream.reset();
|
|
1610
|
+
|
|
1611
|
+
try log.activate(.{ p1.ident(4), .SubstituteBlock, M2.Spite });
|
|
1612
|
+
try expectLog1(&.{
|
|
1613
|
+
N(ArgType.Activate),
|
|
1614
|
+
0b0100,
|
|
1615
|
+
N(Activate.SubstituteBlock),
|
|
1616
|
+
N(M2.Spite),
|
|
1617
|
+
}, buf[0..4]);
|
|
1618
|
+
stream.reset();
|
|
1619
|
+
|
|
1620
|
+
try log.activate(.{ p1.ident(3), .Magnitude, 5 });
|
|
1621
|
+
try expectLog1(&.{ N(ArgType.Activate), 0b0011, N(Activate.Magnitude), 5 }, buf[0..4]);
|
|
1622
|
+
stream.reset();
|
|
1332
1623
|
}
|
|
1333
1624
|
|
|
1334
1625
|
test "|-fieldactivate|" {
|
|
1335
|
-
try log.fieldactivate();
|
|
1626
|
+
try log.fieldactivate(.{});
|
|
1336
1627
|
try expectLog1(&.{N(ArgType.FieldActivate)}, buf[0..1]);
|
|
1337
1628
|
stream.reset();
|
|
1338
1629
|
}
|
|
1339
1630
|
|
|
1340
1631
|
test "|-start|" {
|
|
1341
|
-
try log.start(p2.ident(6), .Bide);
|
|
1632
|
+
try log.start(.{ p2.ident(6), .Bide });
|
|
1342
1633
|
try expectLog1(&.{ N(ArgType.Start), 0b1110, N(Start.Bide) }, buf[0..3]);
|
|
1343
1634
|
stream.reset();
|
|
1344
1635
|
|
|
1345
|
-
try log.start(p1.ident(2), .ConfusionSilent);
|
|
1636
|
+
try log.start(.{ p1.ident(2), .ConfusionSilent });
|
|
1346
1637
|
try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.ConfusionSilent) }, buf[0..3]);
|
|
1347
1638
|
stream.reset();
|
|
1348
1639
|
|
|
1349
|
-
try log.
|
|
1640
|
+
try log.start(.{
|
|
1641
|
+
p2.ident(6),
|
|
1642
|
+
.TypeChange,
|
|
1643
|
+
gen1.Types{ .type1 = .Fire, .type2 = .Fire },
|
|
1644
|
+
p2.ident(5),
|
|
1645
|
+
});
|
|
1350
1646
|
try expectLog1(
|
|
1351
1647
|
&.{ N(ArgType.Start), 0b1110, N(Start.TypeChange), 0b1000_1000, 0b1101 },
|
|
1352
1648
|
buf[0..5],
|
|
1353
1649
|
);
|
|
1354
1650
|
stream.reset();
|
|
1355
1651
|
|
|
1356
|
-
try log.
|
|
1652
|
+
try log.start(.{
|
|
1653
|
+
p1.ident(2),
|
|
1654
|
+
.TypeChange,
|
|
1655
|
+
gen1.Types{ .type1 = .Bug, .type2 = .Poison },
|
|
1656
|
+
p2.ident(4),
|
|
1657
|
+
});
|
|
1357
1658
|
try expectLog1(
|
|
1358
1659
|
&.{ N(ArgType.Start), 0b0010, N(Start.TypeChange), 0b0011_0110, 0b1100 },
|
|
1359
1660
|
buf[0..5],
|
|
1360
1661
|
);
|
|
1361
1662
|
stream.reset();
|
|
1362
1663
|
|
|
1363
|
-
try log.
|
|
1364
|
-
try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.Disable), N(
|
|
1664
|
+
try log.start(.{ p1.ident(2), .Disable, M1.Surf });
|
|
1665
|
+
try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.Disable), N(M1.Surf) }, buf[0..4]);
|
|
1365
1666
|
stream.reset();
|
|
1366
1667
|
|
|
1367
|
-
try log.
|
|
1368
|
-
try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.Mimic), N(
|
|
1668
|
+
try log.start(.{ p1.ident(2), .Mimic, M1.Surf });
|
|
1669
|
+
try expectLog1(&.{ N(ArgType.Start), 0b0010, N(Start.Mimic), N(M1.Surf) }, buf[0..4]);
|
|
1369
1670
|
stream.reset();
|
|
1370
1671
|
}
|
|
1371
1672
|
|
|
1372
1673
|
test "|-end|" {
|
|
1373
|
-
try log.end(p2.ident(6), .Bide);
|
|
1674
|
+
try log.end(.{ p2.ident(6), .Bide });
|
|
1374
1675
|
try expectLog1(&.{ N(ArgType.End), 0b1110, N(End.Bide) }, buf[0..3]);
|
|
1375
1676
|
stream.reset();
|
|
1376
1677
|
|
|
1377
|
-
try log.end(p1.ident(2), .ConfusionSilent);
|
|
1678
|
+
try log.end(.{ p1.ident(2), .ConfusionSilent });
|
|
1378
1679
|
try expectLog1(&.{ N(ArgType.End), 0b0010, N(End.ConfusionSilent) }, buf[0..3]);
|
|
1379
1680
|
stream.reset();
|
|
1380
1681
|
}
|
|
1381
1682
|
|
|
1382
1683
|
test "|-ohko|" {
|
|
1383
|
-
try log.ohko();
|
|
1684
|
+
try log.ohko(.{});
|
|
1384
1685
|
try expectLog1(&.{N(ArgType.OHKO)}, buf[0..1]);
|
|
1385
1686
|
stream.reset();
|
|
1386
1687
|
}
|
|
1688
|
+
|
|
1387
1689
|
test "|-crit|" {
|
|
1388
|
-
try log.crit(p2.ident(5));
|
|
1690
|
+
try log.crit(.{p2.ident(5)});
|
|
1389
1691
|
try expectLog1(&.{ N(ArgType.Crit), 0b1101 }, buf[0..2]);
|
|
1390
1692
|
stream.reset();
|
|
1391
1693
|
}
|
|
1694
|
+
|
|
1392
1695
|
test "|-supereffective|" {
|
|
1393
|
-
try log.supereffective(p1.ident(1));
|
|
1696
|
+
try log.supereffective(.{p1.ident(1)});
|
|
1394
1697
|
try expectLog1(&.{ N(ArgType.SuperEffective), 0b0001 }, buf[0..2]);
|
|
1395
1698
|
stream.reset();
|
|
1396
1699
|
}
|
|
1700
|
+
|
|
1397
1701
|
test "|-resisted|" {
|
|
1398
|
-
try log.resisted(p2.ident(2));
|
|
1702
|
+
try log.resisted(.{p2.ident(2)});
|
|
1399
1703
|
try expectLog1(&.{ N(ArgType.Resisted), 0b1010 }, buf[0..2]);
|
|
1400
1704
|
stream.reset();
|
|
1401
1705
|
}
|
|
1706
|
+
|
|
1402
1707
|
test "|-immune|" {
|
|
1403
|
-
try log.immune(p1.ident(3), .None);
|
|
1708
|
+
try log.immune(.{ p1.ident(3), .None });
|
|
1404
1709
|
try expectLog1(&.{ N(ArgType.Immune), 0b0011, N(Immune.None) }, buf[0..3]);
|
|
1405
1710
|
stream.reset();
|
|
1406
1711
|
|
|
1407
|
-
try log.immune(p2.ident(2), .OHKO);
|
|
1712
|
+
try log.immune(.{ p2.ident(2), .OHKO });
|
|
1408
1713
|
try expectLog1(&.{ N(ArgType.Immune), 0b1010, N(Immune.OHKO) }, buf[0..3]);
|
|
1409
1714
|
stream.reset();
|
|
1410
1715
|
}
|
|
1716
|
+
|
|
1411
1717
|
test "|-transform|" {
|
|
1412
|
-
try log.transform(p2.ident(4), p1.ident(5));
|
|
1718
|
+
try log.transform(.{ p2.ident(4), p1.ident(5) });
|
|
1413
1719
|
try expectLog1(&.{ N(ArgType.Transform), 0b1100, 0b0101 }, buf[0..3]);
|
|
1414
1720
|
stream.reset();
|
|
1415
1721
|
}
|
|
1722
|
+
|
|
1723
|
+
test "|drag|" {
|
|
1724
|
+
var blissey = gen2.helpers.Pokemon.init(.{ .species = .Blissey, .moves = &.{.Splash} });
|
|
1725
|
+
blissey.level = 91;
|
|
1726
|
+
blissey.hp = 200;
|
|
1727
|
+
blissey.stats.hp = 400;
|
|
1728
|
+
blissey.status = gen2.Status.init(.PAR);
|
|
1729
|
+
try log.drag(.{ p2.ident(3), &blissey });
|
|
1730
|
+
const par = 0b1000000;
|
|
1731
|
+
const expected = &(.{
|
|
1732
|
+
N(ArgType.Drag),
|
|
1733
|
+
0b1011,
|
|
1734
|
+
N(S2.Blissey),
|
|
1735
|
+
N(gen2.Gender.Female),
|
|
1736
|
+
91,
|
|
1737
|
+
} ++ switch (endian) {
|
|
1738
|
+
.big => .{ 0, 200, 1, 144, par },
|
|
1739
|
+
.little => .{ 200, 0, 144, 1, par },
|
|
1740
|
+
});
|
|
1741
|
+
try expectLog2(expected, buf[0..10]);
|
|
1742
|
+
stream.reset();
|
|
1743
|
+
}
|
|
1744
|
+
|
|
1745
|
+
test "|-item|" {
|
|
1746
|
+
try log.item(.{ p2.ident(2), I2.GoldBerry, p1.ident(4) });
|
|
1747
|
+
try expectLog2(&.{ N(ArgType.Item), 0b1010, N(I2.GoldBerry), 0b0100 }, buf[0..4]);
|
|
1748
|
+
stream.reset();
|
|
1749
|
+
}
|
|
1750
|
+
|
|
1751
|
+
test "|-enditem|" {
|
|
1752
|
+
try log.enditem(.{ p1.ident(1), I2.BerserkGene, .None });
|
|
1753
|
+
try expectLog2(&.{ N(ArgType.EndItem), 0b0001, N(I2.BerserkGene), N(EndItem.None) }, buf[0..4]);
|
|
1754
|
+
stream.reset();
|
|
1755
|
+
|
|
1756
|
+
try log.enditem(.{ p2.ident(4), I2.PRZCureBerry, .Eat });
|
|
1757
|
+
try expectLog2(&.{ N(ArgType.EndItem), 0b1100, N(I2.PRZCureBerry), N(EndItem.Eat) }, buf[0..4]);
|
|
1758
|
+
stream.reset();
|
|
1759
|
+
}
|
|
1760
|
+
|
|
1761
|
+
test "|-cureteam|" {
|
|
1762
|
+
try log.cureteam(.{p2.ident(5)});
|
|
1763
|
+
try expectLog2(&.{ N(ArgType.CureTeam), 0b1101 }, buf[0..2]);
|
|
1764
|
+
stream.reset();
|
|
1765
|
+
}
|
|
1766
|
+
|
|
1767
|
+
test "|-sethp|" {
|
|
1768
|
+
var blissey = gen2.helpers.Pokemon.init(.{ .species = .Blissey, .moves = &.{.PainSplit} });
|
|
1769
|
+
blissey.hp = 612;
|
|
1770
|
+
try log.sethp(.{ p2.ident(2), &blissey, .Silent });
|
|
1771
|
+
const expected: []const u8 = switch (endian) {
|
|
1772
|
+
.big => &.{ N(ArgType.SetHP), 0b1010, 2, 100, 2, 201, 0, N(SetHP.Silent) },
|
|
1773
|
+
.little => &.{ N(ArgType.SetHP), 0b1010, 100, 2, 201, 2, 0, N(SetHP.Silent) },
|
|
1774
|
+
};
|
|
1775
|
+
try expectLog2(expected, buf[0..8]);
|
|
1776
|
+
stream.reset();
|
|
1777
|
+
}
|
|
1778
|
+
|
|
1779
|
+
test "|-setboost|" {
|
|
1780
|
+
try log.setboost(.{ p2.ident(6), 6 });
|
|
1781
|
+
try expectLog2(&.{ N(ArgType.SetBoost), 0b1110, 12 }, buf[0..3]);
|
|
1782
|
+
stream.reset();
|
|
1783
|
+
|
|
1784
|
+
try log.setboost(.{ p2.ident(3), 2 });
|
|
1785
|
+
try expectLog2(&.{ N(ArgType.SetBoost), 0b1011, 8 }, buf[0..3]);
|
|
1786
|
+
stream.reset();
|
|
1787
|
+
}
|
|
1788
|
+
|
|
1789
|
+
test "|-copyboost|" {
|
|
1790
|
+
try log.copyboost(.{ p2.ident(3), p1.ident(6) });
|
|
1791
|
+
try expectLog2(&.{ N(ArgType.CopyBoost), 0b1011, 0b0110 }, buf[0..3]);
|
|
1792
|
+
stream.reset();
|
|
1793
|
+
}
|
|
1794
|
+
|
|
1795
|
+
test "|-sidestart|" {
|
|
1796
|
+
try log.sidestart(.{ .P2, .Reflect });
|
|
1797
|
+
try expectLog2(&.{ N(ArgType.SideStart), 1, N(Side.Reflect) }, buf[0..3]);
|
|
1798
|
+
stream.reset();
|
|
1799
|
+
}
|
|
1800
|
+
|
|
1801
|
+
test "|-sideend|" {
|
|
1802
|
+
try log.sideend(.{ .P2, .LightScreen });
|
|
1803
|
+
try expectLog2(&.{ N(ArgType.SideEnd), 1, N(Side.LightScreen) }, buf[0..3]);
|
|
1804
|
+
stream.reset();
|
|
1805
|
+
|
|
1806
|
+
try log.sideend(.{ .P1, .Spikes, p1.ident(3) });
|
|
1807
|
+
try expectLog2(&.{
|
|
1808
|
+
N(ArgType.SideEnd),
|
|
1809
|
+
0,
|
|
1810
|
+
N(Side.Spikes),
|
|
1811
|
+
0b0011,
|
|
1812
|
+
}, buf[0..4]);
|
|
1813
|
+
stream.reset();
|
|
1814
|
+
}
|
|
1815
|
+
|
|
1816
|
+
test "|-singlemove|" {
|
|
1817
|
+
try log.singlemove(.{ p2.ident(2), M2.DestinyBond });
|
|
1818
|
+
try expectLog2(&.{ N(ArgType.SingleMove), 0b1010, N(M2.DestinyBond) }, buf[0..3]);
|
|
1819
|
+
stream.reset();
|
|
1820
|
+
}
|
|
1821
|
+
|
|
1822
|
+
test "|-singleturn|" {
|
|
1823
|
+
try log.singleturn(.{ p1.ident(3), M2.Protect });
|
|
1824
|
+
try expectLog2(&.{ N(ArgType.SingleTurn), 0b0011, N(M2.Protect) }, buf[0..3]);
|
|
1825
|
+
stream.reset();
|
|
1826
|
+
}
|
|
1827
|
+
|
|
1828
|
+
test "|-weather|" {
|
|
1829
|
+
try log.weather(.{ W2.Rain, .Upkeep });
|
|
1830
|
+
try expectLog2(&.{ N(ArgType.Weather), N(W2.Rain), N(Weather.Upkeep) }, buf[0..3]);
|
|
1831
|
+
stream.reset();
|
|
1832
|
+
|
|
1833
|
+
try log.weather(.{ W2.None, .None });
|
|
1834
|
+
try expectLog2(&.{ N(ArgType.Weather), N(W2.None), N(Weather.None) }, buf[0..3]);
|
|
1835
|
+
stream.reset();
|
|
1836
|
+
}
|