@pkmn/engine 0.1.0-dev.a23f64f3 → 0.1.0-dev.a5846b2d

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.
@@ -3,40 +3,49 @@ Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.toBindings = toBindings;
4
4
  const data_1 = require("../data");
5
5
  function toBindings(w) {
6
+ const memory = new Uint8Array(w.memory.buffer);
6
7
  return {
7
8
  options: {
8
- showdown: w.SHOWDOWN.valueOf(),
9
- log: w.LOG.valueOf(),
10
- chance: w.CHANCE.valueOf(),
11
- calc: w.CALC.valueOf(),
9
+ showdown: !!memory[w.SHOWDOWN.valueOf()],
10
+ log: !!memory[w.LOG.valueOf()],
11
+ chance: !!memory[w.CHANCE.valueOf()],
12
+ calc: !!memory[w.CALC.valueOf()],
12
13
  },
13
14
  bindings: [toBinding(1, w)],
14
15
  };
15
16
  }
16
17
  function toBinding(gen, w) {
17
18
  const prefix = `GEN${gen}`;
19
+ const buf = w.memory.buffer;
20
+ const constants = new Uint32Array(buf);
21
+ const CHOICES_SIZE = constants[w[`${prefix}_CHOICES_SIZE`].valueOf() / 4];
22
+ const LOGS_SIZE = constants[w[`${prefix}_LOGS_SIZE`].valueOf() / 4];
18
23
  const size = data_1.LAYOUT[gen - 1].sizes.Battle;
19
24
  const update = w[`${prefix}_update`];
20
25
  const choices = w[`${prefix}_choices`];
21
- const memory = new Uint8Array(w.memory.buffer);
26
+ const memory = new Uint8Array(buf);
22
27
  return {
23
- CHOICES_SIZE: w[`${prefix}_CHOICES_SIZE`].valueOf(),
24
- LOGS_SIZE: w[`${prefix}_LOGS_SIZE`].valueOf(),
28
+ CHOICES_SIZE,
29
+ LOGS_SIZE,
25
30
  update(battle, c1, c2, log) {
26
- memory.set(battle);
31
+ const bytes = new Uint8Array(battle);
32
+ memory.set(bytes, 0);
33
+ let result;
27
34
  if (log) {
28
- memory.set(log, size);
29
- return update(0, c1, c2, size);
35
+ result = update(0, c1, c2, size);
36
+ new Uint8Array(log).set(memory.subarray(size, size + LOGS_SIZE));
30
37
  }
31
38
  else {
32
- return update(0, c1, c2, 0);
39
+ result = update(0, c1, c2, 0);
33
40
  }
41
+ bytes.set(memory.subarray(0, size));
42
+ return result;
34
43
  },
35
44
  choices(battle, player, request, options) {
36
- memory.set(battle);
45
+ const opts = new Uint8Array(options);
46
+ memory.set(new Uint8Array(battle));
37
47
  const n = choices(0, player, request, size);
38
- for (let i = 0; i < n; i++)
39
- options[i] = memory[size + i];
48
+ opts.set(memory.subarray(size, size + n));
40
49
  return n;
41
50
  },
42
51
  };
@@ -1 +1 @@
1
- {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../src/pkg/addon/wasm.ts"],"names":[],"mappings":";;AAGA,gCAUC;AAZD,kCAA+B;AAE/B,SAAgB,UAAU,CAAoB,CAAsB;IAClE,OAAO;QACL,OAAO,EAAE;YACP,QAAQ,EAAE,CAAC,CAAC,QAAQ,CAAC,OAAO,EAAE;YAC9B,GAAG,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,EAAE;YACpB,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,OAAO,EAAE;YAC1B,IAAI,EAAE,CAAC,CAAC,IAAI,CAAC,OAAO,EAAE;SACvB;QACD,QAAQ,EAAE,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;KAC5B,CAAC;AACJ,CAAC;AAED,SAAS,SAAS,CAAC,GAAW,EAAE,CAAsB;IACpD,MAAM,MAAM,GAAG,MAAM,GAAG,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,aAAM,CAAC,GAAG,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;IAC1C,MAAM,MAAM,GAAG,CAAC,CAAC,GAAG,MAAM,SAAS,CAAqB,CAAC;IACzD,MAAM,OAAO,GAAG,CAAC,CAAC,GAAG,MAAM,UAAU,CAAqB,CAAC;IAC3D,MAAM,MAAM,GAAG,IAAI,UAAU,CAAE,CAAC,CAAC,MAA6B,CAAC,MAAM,CAAC,CAAC;IAEvE,OAAO;QACL,YAAY,EAAE,CAAC,CAAC,GAAG,MAAM,eAAe,CAAC,CAAC,OAAO,EAAE;QACnD,SAAS,EAAE,CAAC,CAAC,GAAG,MAAM,YAAY,CAAC,CAAC,OAAO,EAAE;QAC7C,MAAM,CAAC,MAAmB,EAAE,EAAU,EAAE,EAAU,EAAE,GAA4B;YAC9E,MAAM,CAAC,GAAG,CAAC,MAAa,CAAC,CAAC;YAC1B,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,CAAC,GAAG,CAAC,GAAU,EAAE,IAAI,CAAC,CAAC;gBAC7B,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,IAAI,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,OAAO,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAC,CAAC;YAC9B,CAAC;QACH,CAAC;QACD,OAAO,CAAC,MAAmB,EAAE,MAAc,EAAE,OAAe,EAAE,OAAmB;YAC/E,MAAM,CAAC,GAAG,CAAC,MAAa,CAAC,CAAC;YAC1B,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;YAC5C,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,EAAE,CAAC,EAAE;gBAAE,OAAO,CAAC,CAAC,CAAC,GAAG,MAAM,CAAC,IAAI,GAAG,CAAC,CAAC,CAAC;YAC1D,OAAO,CAAC,CAAC;QACX,CAAC;KACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"wasm.js","sourceRoot":"","sources":["../../../src/pkg/addon/wasm.ts"],"names":[],"mappings":"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"}
@@ -69,6 +69,7 @@ function render(entryPoint, json, options = {}) {
69
69
  <div id="content"></div>
70
70
  <script>
71
71
  window.DATA = ${JSON.stringify(json)};
72
+ ${options.wasm ? `window.WASM = '${options.wasm}';` : ''}
72
73
 
73
74
  ${result.outputFiles[0].text}
74
75
 
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/display/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/tools/display/index.ts"],"names":[],"mappings":"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"}
package/build.zig CHANGED
@@ -27,8 +27,14 @@ pub fn module(b: *std.Build, options: Options) *std.Build.Module {
27
27
  build_options.addOption(?bool, "chance", options.chance);
28
28
  build_options.addOption(?bool, "calc", options.calc);
29
29
 
30
- const root_source_file = .{ .cwd_relative = dirname ++ "/src/lib/pkmn.zig" };
31
- const imports = &.{.{ .name = "build_options", .module = build_options.createModule() }};
30
+ const root_source_file: std.Build.LazyPath =
31
+ .{ .cwd_relative = dirname ++ "/src/lib/pkmn.zig" };
32
+ const Import = if (@hasDecl(std.Build.Module, "Import"))
33
+ std.Build.Module.Import
34
+ else
35
+ std.Build.ModuleDependency;
36
+ const imports: []const Import =
37
+ &.{.{ .name = "build_options", .module = build_options.createModule() }};
32
38
  return b.createModule(if (@hasDecl(std.Build, "CreateModuleOptions"))
33
39
  .{ .source_file = root_source_file, .dependencies = imports }
34
40
  else
@@ -244,7 +250,7 @@ pub fn build(b: *std.Build) !void {
244
250
  b.installFile(file, b.fmt("share/pkgconfig/{s}", .{pc}));
245
251
  }
246
252
 
247
- const config = .{
253
+ const config: Config = .{
248
254
  .target = target,
249
255
  .optimize = optimize,
250
256
  .pic = pic,
@@ -317,10 +323,37 @@ fn buildWasm(
317
323
  .ReleaseFast, .ReleaseSafe => .ReleaseSmall,
318
324
  else => optimize,
319
325
  };
326
+ // https://webassembly.org/features/
327
+ var features = std.Target.wasm.featureSet(&.{
328
+ .atomics,
329
+ .bulk_memory,
330
+ // .exception_handling,
331
+ .extended_const,
332
+ // .half_precision,
333
+ // .multimemory,
334
+ .mutable_globals,
335
+ .nontrapping_fptoint,
336
+ .reference_types,
337
+ // .relaxed_simd,
338
+ .sign_ext,
339
+ .simd128,
340
+ // .tail_call,
341
+ });
342
+ if (builtin.zig_version.order(try std.SemanticVersion.parse("0.12.0")) != .lt) {
343
+ features.addFeature(@intFromEnum(std.Target.wasm.Feature.multivalue));
344
+ }
320
345
  const freestanding = if (@hasDecl(std.Build, "resolveTargetQuery"))
321
- b.resolveTargetQuery(.{ .cpu_arch = .wasm32, .os_tag = .freestanding })
346
+ b.resolveTargetQuery(.{
347
+ .cpu_arch = .wasm32,
348
+ .os_tag = .freestanding,
349
+ .cpu_features_add = features,
350
+ })
322
351
  else
323
- ResolvedTarget{ .cpu_arch = .wasm32, .os_tag = .freestanding };
352
+ ResolvedTarget{
353
+ .cpu_arch = .wasm32,
354
+ .os_tag = .freestanding,
355
+ .cpu_features_add = features,
356
+ };
324
357
  const path = if (has_path) .{ .path = root_src_file } else b.path(root_src_file);
325
358
  const bin = if (entry) bin: {
326
359
  const exe = b.addExecutable(if (force_pic) .{
@@ -357,7 +390,7 @@ fn buildWasm(
357
390
  const opt = b.findProgram(&.{"wasm-opt"}, &.{"./node_modules/.bin"}) catch null;
358
391
  if (optimize != .Debug and opt != null) {
359
392
  const out = b.fmt("build/lib/{s}.wasm", .{name});
360
- const sh = b.addSystemCommand(&.{ opt.?, "-O4" });
393
+ const sh = b.addSystemCommand(&.{ opt.?, "--enable-bulk-memory", "--enable-simd", "-O4" });
361
394
  sh.addArtifactArg(bin);
362
395
  sh.addArg("-o");
363
396
  if (@hasDecl(@TypeOf(sh.*), "addFileSourceArg")) {
@@ -371,6 +404,8 @@ fn buildWasm(
371
404
  b.getInstallStep().dependOn(&b.addInstallArtifact(bin, .{
372
405
  .dest_dir = .{ .override = std.Build.InstallDir{ .lib = {} } },
373
406
  }).step);
407
+ } else {
408
+ b.installArtifact(bin);
374
409
  }
375
410
  }
376
411
 
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@pkmn/engine",
3
- "version": "0.1.0-dev.a23f64f3",
3
+ "version": "0.1.0-dev.a5846b2d",
4
4
  "description": "A minimal, complete, Pokémon battle simulation engine optimized for performance",
5
5
  "repository": "github:pkmn/engine",
6
6
  "license": "MIT",
@@ -49,6 +49,8 @@
49
49
  "build/tools/display/ui.jsx",
50
50
  "build/tools/display/util.js.map",
51
51
  "build/tools/display/util.js",
52
+ "src/lib/bindings/node.zig",
53
+ "src/lib/bindings/wasm.zig",
52
54
  "src/lib/common/array.zig",
53
55
  "src/lib/common/battle.zig",
54
56
  "src/lib/common/data.zig",
@@ -0,0 +1,121 @@
1
+ const js = @import("../common/js.zig");
2
+ const pkmn = @import("../pkmn.zig");
3
+ const std = @import("std");
4
+
5
+ const assert = std.debug.assert;
6
+
7
+ const c = @cImport({
8
+ @cDefine("NAPI_VERSION", "8");
9
+ @cInclude("node_api.h");
10
+ });
11
+
12
+ pub fn register(env: c.napi_env) c.napi_value {
13
+ const object = js.Object.init(env);
14
+ const properties = [_]c.napi_property_descriptor{
15
+ js.Property.init("options", .{ .value = options(env) }),
16
+ js.Property.init("bindings", .{ .value = bindings(env) }),
17
+ };
18
+ assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
19
+ return object;
20
+ }
21
+
22
+ fn options(env: c.napi_env) c.napi_value {
23
+ const object = js.Object.init(env);
24
+ const properties = [_]c.napi_property_descriptor{
25
+ js.Property.init("showdown", .{ .value = js.Boolean.init(env, pkmn.options.showdown) }),
26
+ js.Property.init("log", .{ .value = js.Boolean.init(env, pkmn.options.log) }),
27
+ js.Property.init("chance", .{ .value = js.Boolean.init(env, pkmn.options.chance) }),
28
+ js.Property.init("calc", .{ .value = js.Boolean.init(env, pkmn.options.calc) }),
29
+ };
30
+ assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
31
+ return object;
32
+ }
33
+
34
+ fn bindings(env: c.napi_env) c.napi_value {
35
+ const array = js.Array.init(env, .{ .length = 1 });
36
+ js.Array.set(env, array, 0, bind(env, pkmn.gen1));
37
+ return array;
38
+ }
39
+
40
+ fn bind(env: c.napi_env, gen: anytype) c.napi_value {
41
+ const choices_size: u32 = @intCast(gen.CHOICES_SIZE);
42
+ const logs_size: u32 = @intCast(gen.LOGS_SIZE);
43
+ const object = js.Object.init(env);
44
+ const properties = [_]c.napi_property_descriptor{
45
+ js.Property.init("CHOICES_SIZE", .{ .value = js.Number.init(env, choices_size) }),
46
+ js.Property.init("LOGS_SIZE", .{ .value = js.Number.init(env, logs_size) }),
47
+ js.Property.init("update", .{ .method = update(gen) }),
48
+ js.Property.init("choices", .{ .method = choices(gen) }),
49
+ };
50
+ assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
51
+ return object;
52
+ }
53
+
54
+ fn update(gen: anytype) c.napi_callback {
55
+ return struct {
56
+ fn call(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_value {
57
+ var argc: usize = 4;
58
+ var argv: [4]c.napi_value = undefined;
59
+ assert(c.napi_get_cb_info(env, info, &argc, &argv, null, null) == c.napi_ok);
60
+ assert(argc == 4);
61
+
62
+ var data: ?*anyopaque = undefined;
63
+ var len: usize = 0;
64
+ assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
65
+ assert(len == @sizeOf(gen.Battle(gen.PRNG)));
66
+
67
+ var battle: *gen.Battle(gen.PRNG) = @alignCast(@ptrCast(data.?));
68
+ const c1: pkmn.Choice = @bitCast(js.Number.get(env, argv[1], u8));
69
+ const c2: pkmn.Choice = @bitCast(js.Number.get(env, argv[2], u8));
70
+
71
+ var vtype: c.napi_valuetype = undefined;
72
+ assert(c.napi_typeof(env, argv[3], &vtype) == c.napi_ok);
73
+ const result = switch (vtype) {
74
+ c.napi_undefined, c.napi_null => battle.update(c1, c2, &gen.NULL),
75
+ else => result: {
76
+ assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
77
+ assert(len == gen.LOGS_SIZE);
78
+
79
+ const buf = @as([*]u8, @ptrCast(data.?))[0..gen.LOGS_SIZE];
80
+ var stream: pkmn.protocol.ByteStream = .{ .buffer = buf };
81
+ // TODO: extract out
82
+ var opts = pkmn.battle.options(
83
+ pkmn.protocol.FixedLog{ .writer = stream.writer() },
84
+ gen.chance.NULL,
85
+ gen.calc.NULL,
86
+ );
87
+ break :result battle.update(c1, c2, &opts);
88
+ },
89
+ } catch unreachable;
90
+
91
+ return js.Number.init(env, @as(u8, @bitCast(result)));
92
+ }
93
+ }.call;
94
+ }
95
+
96
+ fn choices(gen: anytype) c.napi_callback {
97
+ return struct {
98
+ fn call(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_value {
99
+ var argc: usize = 4;
100
+ var argv: [4]c.napi_value = undefined;
101
+ assert(c.napi_get_cb_info(env, info, &argc, &argv, null, null) == c.napi_ok);
102
+ assert(argc == 4);
103
+
104
+ var data: ?*anyopaque = undefined;
105
+ var len: usize = 0;
106
+ assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
107
+ assert(len == @sizeOf(gen.Battle(gen.PRNG)));
108
+
109
+ var battle: *gen.Battle(gen.PRNG) = @alignCast(@ptrCast(data.?));
110
+ const player: pkmn.Player = @enumFromInt(js.Number.get(env, argv[1], u8));
111
+ const request: pkmn.Choice.Type = @enumFromInt(js.Number.get(env, argv[2], u8));
112
+
113
+ assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
114
+ assert(len == gen.CHOICES_SIZE);
115
+
116
+ const out = @as([*]pkmn.Choice, @ptrCast(data.?))[0..gen.CHOICES_SIZE];
117
+ const n = battle.choices(player, request, out);
118
+ return js.Number.init(env, @as(u8, @bitCast(n)));
119
+ }
120
+ }.call;
121
+ }
@@ -0,0 +1,59 @@
1
+ const pkmn = @import("../pkmn.zig");
2
+ const std = @import("std");
3
+
4
+ const assert = std.debug.assert;
5
+
6
+ const Enum = if (@hasField(std.builtin.Type, "enum")) .@"enum" else .Enum;
7
+ const Strong = if (@hasField(std.builtin.GlobalLinkage, "strong")) .strong else .Strong;
8
+
9
+ pub const options = pkmn.options;
10
+
11
+ pub fn gen(comptime num: comptime_int) type {
12
+ const g = @field(pkmn, "gen" ++ std.fmt.comptimePrint("{d}", .{num}));
13
+ return struct {
14
+ pub const CHOICES_SIZE = size(g.CHOICES_SIZE);
15
+ pub const LOGS_SIZE = size(g.LOGS_SIZE);
16
+
17
+ pub fn update(
18
+ battle: *g.Battle(g.PRNG),
19
+ c1: pkmn.Choice,
20
+ c2: pkmn.Choice,
21
+ options_: ?[*]u8,
22
+ ) callconv(.C) pkmn.Result {
23
+ return (if (options_) |o| result: {
24
+ const buf = @as([*]u8, @ptrCast(o))[0..g.LOGS_SIZE];
25
+ var stream: pkmn.protocol.ByteStream = .{ .buffer = buf };
26
+ // TODO: extract out
27
+ var opts = pkmn.battle.options(
28
+ pkmn.protocol.FixedLog{ .writer = stream.writer() },
29
+ g.chance.NULL,
30
+ g.calc.NULL,
31
+ );
32
+ break :result battle.update(c1, c2, &opts);
33
+ } else battle.update(c1, c2, &g.NULL)) catch unreachable;
34
+ }
35
+
36
+ pub fn choices(
37
+ battle: *g.Battle(g.PRNG),
38
+ player: u8,
39
+ request: u8,
40
+ buf: [*]u8,
41
+ ) callconv(.C) u8 {
42
+ assert(player <= @field(@typeInfo(pkmn.Player), @tagName(Enum)).fields.len);
43
+ assert(request <= @field(@typeInfo(pkmn.Choice.Type), @tagName(Enum)).fields.len);
44
+
45
+ const n = CHOICES_SIZE;
46
+ return battle.choices(@enumFromInt(player), @enumFromInt(request), @ptrCast(buf[0..n]));
47
+ }
48
+ };
49
+ }
50
+
51
+ pub fn exports() type {
52
+ @export(gen(1).update, .{ .name = "GEN1_update", .linkage = Strong });
53
+ @export(gen(1).choices, .{ .name = "GEN1_choices", .linkage = Strong });
54
+ return struct {};
55
+ }
56
+
57
+ fn size(n: usize) u32 {
58
+ return std.math.ceilPowerOfTwo(u32, @as(u32, @intCast(n))) catch unreachable;
59
+ }
@@ -11,7 +11,7 @@ const Enum = if (@hasField(std.builtin.Type, "enum")) .@"enum" else .Enum;
11
11
  pub fn Array(comptime n: comptime_int, comptime U: type) type {
12
12
  return struct {
13
13
  const size = @bitSizeOf(U);
14
- const options = .{ .signedness = .unsigned, .bits = size * n };
14
+ const options: std.builtin.Type.Int = .{ .signedness = .unsigned, .bits = size * n };
15
15
  pub const T = @Type(if (@hasField(std.builtin.Type, "int"))
16
16
  .{ .int = options }
17
17
  else
@@ -25,7 +25,7 @@ pub fn Optional(comptime T: type) type {
25
25
  };
26
26
  }
27
27
 
28
- const options = .{
28
+ const options: std.builtin.Type.Enum = .{
29
29
  .tag_type = std.math.IntFittingRange(0, fields.len),
30
30
  .fields = &enumFields,
31
31
  .decls = &decls,
@@ -44,7 +44,7 @@ fn CopyPtrAttrs(
44
44
  comptime child: type,
45
45
  ) type {
46
46
  const info = @field(@typeInfo(source), @tagName(Pointer));
47
- const args = .{
47
+ const args: std.builtin.Type.Pointer = .{
48
48
  .size = size,
49
49
  .is_const = info.is_const,
50
50
  .is_volatile = info.is_volatile,
@@ -1170,7 +1170,7 @@ fn calcDamage(
1170
1170
  // encountered so we need to make sure that in the event of a miss we commit the status of the
1171
1171
  // crit roll. The alternative to doing this extra work is to *always* commit the crit roll but
1172
1172
  // that results in counter intuitive probabilities in the common case
1173
- if (pkmn.options.chance and !pkmn.options.mod) {
1173
+ if (pkmn.options.chance and !pkmn.options.mod and move.effect != .Explode) {
1174
1174
  atk = attack(side, !crit, special);
1175
1175
  def = defense(target, !crit, special, false);
1176
1176
  if ((atk > 255 or def > 255) and (def / 4) & 255 == 0) options.chance.glitch();
package/src/lib/node.zig CHANGED
@@ -1,5 +1,5 @@
1
1
  const js = @import("common/js.zig");
2
- const pkmn = @import("pkmn.zig");
2
+ const node = @import("bindings/node.zig");
3
3
  const std = @import("std");
4
4
 
5
5
  const assert = std.debug.assert;
@@ -11,119 +11,8 @@ const c = @cImport({
11
11
 
12
12
  export fn napi_register_module_v1(env: c.napi_env, exports: c.napi_value) c.napi_value {
13
13
  const properties = [_]c.napi_property_descriptor{
14
- js.Property.init("engine", .{ .value = register(env) }),
14
+ js.Property.init("engine", .{ .value = node.register(env) }),
15
15
  };
16
16
  assert(c.napi_define_properties(env, exports, properties.len, &properties) == c.napi_ok);
17
17
  return exports;
18
18
  }
19
-
20
- pub fn register(env: c.napi_env) c.napi_value {
21
- const object = js.Object.init(env);
22
- const properties = [_]c.napi_property_descriptor{
23
- js.Property.init("options", .{ .value = options(env) }),
24
- js.Property.init("bindings", .{ .value = bindings(env) }),
25
- };
26
- assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
27
- return object;
28
- }
29
-
30
- fn options(env: c.napi_env) c.napi_value {
31
- const object = js.Object.init(env);
32
- const properties = [_]c.napi_property_descriptor{
33
- js.Property.init("showdown", .{ .value = js.Boolean.init(env, pkmn.options.showdown) }),
34
- js.Property.init("log", .{ .value = js.Boolean.init(env, pkmn.options.log) }),
35
- js.Property.init("chance", .{ .value = js.Boolean.init(env, pkmn.options.chance) }),
36
- js.Property.init("calc", .{ .value = js.Boolean.init(env, pkmn.options.calc) }),
37
- };
38
- assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
39
- return object;
40
- }
41
-
42
- fn bindings(env: c.napi_env) c.napi_value {
43
- const array = js.Array.init(env, .{ .length = 1 });
44
- js.Array.set(env, array, 0, bind(env, pkmn.gen1));
45
- return array;
46
- }
47
-
48
- fn bind(env: c.napi_env, gen: anytype) c.napi_value {
49
- const choices_size: u32 = @intCast(gen.CHOICES_SIZE);
50
- const logs_size: u32 = @intCast(gen.LOGS_SIZE);
51
- const object = js.Object.init(env);
52
- const properties = [_]c.napi_property_descriptor{
53
- js.Property.init("CHOICES_SIZE", .{ .value = js.Number.init(env, choices_size) }),
54
- js.Property.init("LOGS_SIZE", .{ .value = js.Number.init(env, logs_size) }),
55
- js.Property.init("update", .{ .method = update(gen) }),
56
- js.Property.init("choices", .{ .method = choices(gen) }),
57
- };
58
- assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
59
- return object;
60
- }
61
-
62
- fn update(gen: anytype) c.napi_callback {
63
- return struct {
64
- fn call(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_value {
65
- var argc: usize = 4;
66
- var argv: [4]c.napi_value = undefined;
67
- assert(c.napi_get_cb_info(env, info, &argc, &argv, null, null) == c.napi_ok);
68
- assert(argc == 4);
69
-
70
- var data: ?*anyopaque = undefined;
71
- var len: usize = 0;
72
- assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
73
- assert(len == @sizeOf(gen.Battle(gen.PRNG)));
74
-
75
- var battle: *gen.Battle(gen.PRNG) = @alignCast(@ptrCast(data.?));
76
- const c1: pkmn.Choice = @bitCast(js.Number.get(env, argv[1], u8));
77
- const c2: pkmn.Choice = @bitCast(js.Number.get(env, argv[2], u8));
78
-
79
- var vtype: c.napi_valuetype = undefined;
80
- assert(c.napi_typeof(env, argv[3], &vtype) == c.napi_ok);
81
- const result = switch (vtype) {
82
- c.napi_undefined, c.napi_null => battle.update(c1, c2, &gen.NULL),
83
- else => result: {
84
- assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
85
- assert(len == gen.LOGS_SIZE);
86
-
87
- const buf = @as([*]u8, @ptrCast(data.?))[0..gen.LOGS_SIZE];
88
- var stream: pkmn.protocol.ByteStream = .{ .buffer = buf };
89
- // TODO: extract out
90
- var opts = pkmn.battle.options(
91
- pkmn.protocol.FixedLog{ .writer = stream.writer() },
92
- gen.chance.NULL,
93
- gen.calc.NULL,
94
- );
95
- break :result battle.update(c1, c2, &opts);
96
- },
97
- } catch unreachable;
98
-
99
- return js.Number.init(env, @as(u8, @bitCast(result)));
100
- }
101
- }.call;
102
- }
103
-
104
- fn choices(gen: anytype) c.napi_callback {
105
- return struct {
106
- fn call(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_value {
107
- var argc: usize = 4;
108
- var argv: [4]c.napi_value = undefined;
109
- assert(c.napi_get_cb_info(env, info, &argc, &argv, null, null) == c.napi_ok);
110
- assert(argc == 4);
111
-
112
- var data: ?*anyopaque = undefined;
113
- var len: usize = 0;
114
- assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
115
- assert(len == @sizeOf(gen.Battle(gen.PRNG)));
116
-
117
- var battle: *gen.Battle(gen.PRNG) = @alignCast(@ptrCast(data.?));
118
- const player: pkmn.Player = @enumFromInt(js.Number.get(env, argv[1], u8));
119
- const request: pkmn.Choice.Type = @enumFromInt(js.Number.get(env, argv[2], u8));
120
-
121
- assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
122
- assert(len == gen.CHOICES_SIZE);
123
-
124
- const out = @as([*]pkmn.Choice, @ptrCast(data.?))[0..gen.CHOICES_SIZE];
125
- const n = battle.choices(player, request, out);
126
- return js.Number.init(env, @as(u8, @bitCast(n)));
127
- }
128
- }.call;
129
- }
package/src/lib/pkmn.zig CHANGED
@@ -129,6 +129,7 @@ pub const gen2 = struct {
129
129
  // NOTE: `pub usingnamespace struct { ... }` here results in a (false?) dependency loop
130
130
  pub const js = if (options.internal) @import("common/js.zig") else {};
131
131
  pub const bindings = if (options.internal) struct {
132
- pub const node = @import("node.zig");
133
- pub const wasm = @import("wasm.zig");
132
+ pub const c = @import("bindings/c.zig");
133
+ pub const node = @import("bindings/node.zig");
134
+ pub const wasm = @import("bindings/wasm.zig");
134
135
  } else {};
package/src/lib/wasm.zig CHANGED
@@ -1,48 +1,17 @@
1
- const pkmn = @import("pkmn.zig");
2
1
  const std = @import("std");
2
+ const wasm = @import("bindings/wasm.zig");
3
3
 
4
- const assert = std.debug.assert;
4
+ export const SHOWDOWN = wasm.options.showdown;
5
+ export const LOG = wasm.options.log;
6
+ export const CHANCE = wasm.options.chance;
7
+ export const CALC = wasm.options.calc;
5
8
 
6
- const Enum = if (@hasField(std.builtin.Type, "enum")) .@"enum" else .Enum;
9
+ export const GEN1_CHOICES_SIZE = wasm.gen(1).CHOICES_SIZE;
10
+ export const GEN1_LOGS_SIZE = wasm.gen(1).LOGS_SIZE;
7
11
 
8
- export const SHOWDOWN = pkmn.options.showdown;
9
- export const LOG = pkmn.options.log;
10
- export const CHANCE = pkmn.options.chance;
11
- export const CALC = pkmn.options.calc;
12
+ const exportable = @hasDecl(std.zig, "Zir") and !@hasField(std.zig.Zir.Inst.Tag, "export_value");
12
13
 
13
- export const GEN1_CHOICES_SIZE =
14
- std.math.ceilPowerOfTwo(u32, @as(u32, @intCast(pkmn.gen1.CHOICES_SIZE))) catch unreachable;
15
- export const GEN1_LOGS_SIZE =
16
- std.math.ceilPowerOfTwo(u32, @as(u32, @intCast(pkmn.gen1.LOGS_SIZE))) catch unreachable;
17
-
18
- export fn GEN1_update(
19
- battle: *pkmn.gen1.Battle(pkmn.gen1.PRNG),
20
- c1: pkmn.Choice,
21
- c2: pkmn.Choice,
22
- options: ?[*]u8,
23
- ) pkmn.Result {
24
- return (if (options) |o| result: {
25
- const buf = @as([*]u8, @ptrCast(o))[0..pkmn.gen1.LOGS_SIZE];
26
- var stream: pkmn.protocol.ByteStream = .{ .buffer = buf };
27
- // TODO: extract out
28
- var opts = pkmn.battle.options(
29
- pkmn.protocol.FixedLog{ .writer = stream.writer() },
30
- pkmn.gen1.chance.NULL,
31
- pkmn.gen1.calc.NULL,
32
- );
33
- break :result battle.update(c1, c2, &opts);
34
- } else battle.update(c1, c2, &pkmn.gen1.NULL)) catch unreachable;
35
- }
36
-
37
- export fn GEN1_choices(
38
- battle: *pkmn.gen1.Battle(pkmn.gen1.PRNG),
39
- player: u8,
40
- request: u8,
41
- buf: [*]u8,
42
- ) u8 {
43
- assert(player <= @field(@typeInfo(pkmn.Player), @tagName(Enum)).fields.len);
44
- assert(request <= @field(@typeInfo(pkmn.Choice.Type), @tagName(Enum)).fields.len);
45
-
46
- const len = GEN1_CHOICES_SIZE;
47
- return battle.choices(@enumFromInt(player), @enumFromInt(request), @ptrCast(buf[0..len]));
48
- }
14
+ usingnamespace if (exportable) struct {
15
+ export const GEN1_update = wasm.gen(1).update;
16
+ export const GEN1_choices = wasm.gen(1).choices;
17
+ } else wasm.exports();