@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.
Files changed (56) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +93 -57
  3. package/build/pkg/addon.js +9 -9
  4. package/build/pkg/addon.js.map +1 -1
  5. package/build/pkg/data/ids.json +12 -12
  6. package/build/pkg/data/layout.json +26 -4
  7. package/build/pkg/data/protocol.json +69 -12
  8. package/build/pkg/data.d.ts +4 -4
  9. package/build/pkg/data.js.map +1 -1
  10. package/build/pkg/gen1.js +15 -18
  11. package/build/pkg/gen1.js.map +1 -1
  12. package/build/pkg/index.d.ts +2 -1
  13. package/build/pkg/index.js.map +1 -1
  14. package/build/pkg/protocol.js +61 -42
  15. package/build/pkg/protocol.js.map +1 -1
  16. package/build/test/display.js +2 -2
  17. package/build/test/display.js.map +1 -1
  18. package/build/tools/debug.js +5 -4
  19. package/build/tools/debug.js.map +1 -1
  20. package/build.zig +142 -119
  21. package/package.json +54 -25
  22. package/src/bin/install-pkmn-engine +35 -22
  23. package/src/lib/common/battle.zig +17 -0
  24. package/src/lib/common/data.zig +12 -24
  25. package/src/lib/common/debug.zig +22 -13
  26. package/src/lib/common/js.zig +118 -0
  27. package/src/lib/common/optional.zig +67 -0
  28. package/src/lib/common/options.zig +11 -0
  29. package/src/lib/common/protocol.zig +845 -322
  30. package/src/lib/common/rational.zig +357 -0
  31. package/src/lib/common/rng.zig +30 -21
  32. package/src/lib/common/util.zig +12 -0
  33. package/src/lib/gen1/calc.zig +507 -0
  34. package/src/lib/gen1/chance.zig +1063 -0
  35. package/src/lib/gen1/data/moves.zig +192 -180
  36. package/src/lib/gen1/data/species.zig +3 -3
  37. package/src/lib/gen1/data/types.zig +7 -7
  38. package/src/lib/gen1/data.zig +86 -77
  39. package/src/lib/gen1/helpers.zig +658 -15
  40. package/src/lib/gen1/mechanics.zig +940 -675
  41. package/src/lib/gen2/calc.zig +143 -0
  42. package/src/lib/gen2/chance.zig +1315 -0
  43. package/src/lib/gen2/data/items.zig +12 -18
  44. package/src/lib/gen2/data/moves.zig +663 -569
  45. package/src/lib/gen2/data/species.zig +1 -1
  46. package/src/lib/gen2/data/types.zig +134 -31
  47. package/src/lib/gen2/data.zig +121 -84
  48. package/src/lib/gen2/generated.zig +806 -0
  49. package/src/lib/gen2/helpers.zig +45 -21
  50. package/src/lib/gen2/mechanics.zig +3591 -12
  51. package/src/lib/node.zig +131 -0
  52. package/src/lib/pkmn.zig +79 -5
  53. package/src/lib/{binding/wasm.zig → wasm.zig} +4 -1
  54. package/src/lib/binding/node.zig +0 -226
  55. package/src/lib/gen1/README.md +0 -814
  56. package/src/lib/gen2/README.md +0 -309
@@ -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(1, rolls.len)) {
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
- rand.range(u8, 0, 256), rand.range(u8, 0, 256),
76
- rand.range(u8, 0, 256), rand.range(u8, 0, 256),
77
- rand.range(u8, 0, 256), rand.range(u8, 0, 256),
78
- rand.range(u8, 0, 256), rand.range(u8, 0, 256),
79
- rand.range(u8, 0, 256), rand.range(u8, 0, 256),
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
- // FIXME side.order[i] = i + 1;
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
- .id = m,
142
- .pp_ups = 3,
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),