@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.
Files changed (46) hide show
  1. package/README.md +52 -24
  2. package/build/pkg/addon.d.ts +7 -0
  3. package/build/pkg/addon.js +111 -0
  4. package/build/pkg/addon.js.map +1 -0
  5. package/build/pkg/data/layout.json +1 -1
  6. package/build/pkg/data.d.ts +1 -2
  7. package/build/pkg/data.js +3 -5
  8. package/build/pkg/data.js.map +1 -1
  9. package/build/pkg/gen1.d.ts +5 -4
  10. package/build/pkg/gen1.js +43 -24
  11. package/build/pkg/gen1.js.map +1 -1
  12. package/build/pkg/index.d.ts +15 -12
  13. package/build/pkg/index.js.map +1 -1
  14. package/build/pkg/protocol.d.ts +4 -2
  15. package/build/pkg/protocol.js +4 -2
  16. package/build/pkg/protocol.js.map +1 -1
  17. package/build/test/display.js +400 -0
  18. package/build/test/display.js.map +1 -0
  19. package/build/tools/debug.js +133 -0
  20. package/build/tools/debug.js.map +1 -0
  21. package/build.zig +30 -39
  22. package/package.json +45 -34
  23. package/src/bin/install-pkmn-engine +47 -28
  24. package/src/bin/pkmn-debug +62 -0
  25. package/src/lib/binding/node.zig +20 -23
  26. package/src/lib/binding/wasm.zig +4 -4
  27. package/src/lib/common/data.zig +11 -11
  28. package/src/lib/common/debug.zig +1 -0
  29. package/src/lib/common/options.zig +3 -3
  30. package/src/lib/common/protocol.zig +194 -178
  31. package/src/lib/common/rng.zig +5 -5
  32. package/src/lib/gen1/README.md +106 -70
  33. package/src/lib/gen1/data/moves.zig +10 -10
  34. package/src/lib/gen1/data/species.zig +2 -2
  35. package/src/lib/gen1/data/types.zig +3 -3
  36. package/src/lib/gen1/data.zig +36 -31
  37. package/src/lib/gen1/helpers.zig +11 -22
  38. package/src/lib/gen1/mechanics.zig +460 -365
  39. package/src/lib/gen2/data/items.zig +3 -3
  40. package/src/lib/gen2/data/moves.zig +1 -1
  41. package/src/lib/gen2/data/species.zig +1 -1
  42. package/src/lib/gen2/data/types.zig +3 -3
  43. package/src/lib/gen2/data.zig +16 -15
  44. package/src/lib/gen2/helpers.zig +6 -6
  45. package/src/lib/pkmn.zig +7 -7
  46. package/src/test/display/pkmn.html.tmpl +368 -0
@@ -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
- var p1: u4 = 0;
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
- pub fn prng(rand: *PSRNG) data.PRNG {
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] = @intCast(u4, i) + 1;
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] = @intCast(u4, i) + 1;
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(u8, @min(Move.pp(m) / 5 * 8, 61));
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 = @intToEnum(Species, rand.range(u8, 1, Species.size + 1));
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 = @intToEnum(Move, rand.range(u8, 1, Move.size - 1 + 1));
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(u8, Move.pp(m) + @as(u8, pp_ups) * @min(Move.pp(m) / 5, 7));
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
- if (Move.get(m).effect == .Binding) return true;
210
+ // Binding moves are borked but only via Mirror Move / Metronome which are already blocked
217
211
  return switch (m) {
218
- .Counter,
219
- .Mimic,
220
- .Metronome,
221
- .MirrorMove,
222
- .Transform,
223
- => true,
212
+ .Mimic, .Metronome, .MirrorMove, .Transform => true,
224
213
  else => false,
225
214
  };
226
215
  }