@pkmn/engine 0.1.0-dev.7f37a47c → 0.1.0-dev.7feed58c

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 (84) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +145 -78
  3. package/build/pkg/addon/browser.d.ts +3 -0
  4. package/build/pkg/addon/browser.js +47 -0
  5. package/build/pkg/addon/browser.js.map +1 -0
  6. package/build/pkg/addon/node.d.ts +3 -0
  7. package/build/pkg/addon/node.js +100 -0
  8. package/build/pkg/addon/node.js.map +1 -0
  9. package/build/pkg/addon/wasm.d.ts +2 -0
  10. package/build/pkg/addon/wasm.js +53 -0
  11. package/build/pkg/addon/wasm.js.map +1 -0
  12. package/build/pkg/addon.d.ts +29 -0
  13. package/build/pkg/addon.js +80 -0
  14. package/build/pkg/addon.js.map +1 -0
  15. package/build/pkg/data/ids.json +12 -12
  16. package/build/pkg/data/layout.json +40 -5
  17. package/build/pkg/data/protocol.json +84 -13
  18. package/build/pkg/data.d.ts +28 -7
  19. package/build/pkg/data.js +3 -5
  20. package/build/pkg/data.js.map +1 -1
  21. package/build/pkg/gen1.d.ts +18 -20
  22. package/build/pkg/gen1.js +59 -44
  23. package/build/pkg/gen1.js.map +1 -1
  24. package/build/pkg/index.d.ts +57 -103
  25. package/build/pkg/index.js +6 -63
  26. package/build/pkg/index.js.map +1 -1
  27. package/build/pkg/protocol.d.ts +24 -3
  28. package/build/pkg/protocol.js +127 -104
  29. package/build/pkg/protocol.js.map +1 -1
  30. package/build/tools/debug.js +100 -0
  31. package/build/tools/debug.js.map +1 -0
  32. package/build/tools/display/debug.jsx +141 -0
  33. package/build/tools/display/debug.jsx.map +1 -0
  34. package/build/tools/display/index.js +142 -0
  35. package/build/tools/display/index.js.map +1 -0
  36. package/build/tools/display/ui.jsx +349 -0
  37. package/build/tools/display/ui.jsx.map +1 -0
  38. package/build/tools/display/util.js +33 -0
  39. package/build/tools/display/util.js.map +1 -0
  40. package/build.zig +417 -160
  41. package/package.json +92 -133
  42. package/src/bin/install-pkmn-engine +85 -42
  43. package/src/bin/pkmn-debug +62 -0
  44. package/src/lib/bindings/c.zig +255 -0
  45. package/src/lib/bindings/node.zig +121 -0
  46. package/src/lib/bindings/wasm.zig +59 -0
  47. package/src/lib/common/array.zig +77 -0
  48. package/src/lib/common/battle.zig +17 -0
  49. package/src/lib/common/data.zig +19 -31
  50. package/src/lib/common/debug.zig +58 -17
  51. package/src/lib/common/js.zig +120 -0
  52. package/src/lib/common/optional.zig +71 -0
  53. package/src/lib/common/options.zig +18 -3
  54. package/src/lib/common/protocol.zig +947 -407
  55. package/src/lib/common/rational.zig +449 -0
  56. package/src/lib/common/rng.zig +31 -24
  57. package/src/lib/common/util.zig +61 -0
  58. package/src/lib/gen1/calc.zig +953 -0
  59. package/src/lib/gen1/chance.zig +1185 -0
  60. package/src/lib/gen1/data/moves.zig +203 -193
  61. package/src/lib/gen1/data/species.zig +6 -8
  62. package/src/lib/gen1/data/types.zig +11 -12
  63. package/src/lib/gen1/data.zig +101 -90
  64. package/src/lib/gen1/helpers.zig +139 -54
  65. package/src/lib/gen1/mechanics.zig +1435 -916
  66. package/src/lib/gen2/calc.zig +153 -0
  67. package/src/lib/gen2/chance.zig +902 -0
  68. package/src/lib/gen2/data/items.zig +15 -23
  69. package/src/lib/gen2/data/moves.zig +665 -573
  70. package/src/lib/gen2/data/species.zig +3 -5
  71. package/src/lib/gen2/data/types.zig +138 -36
  72. package/src/lib/gen2/data.zig +134 -99
  73. package/src/lib/gen2/generated.zig +801 -0
  74. package/src/lib/gen2/helpers.zig +59 -44
  75. package/src/lib/gen2/mechanics.zig +3582 -30
  76. package/src/lib/node.zig +18 -0
  77. package/src/lib/pkmn.zig +93 -12
  78. package/src/lib/wasm.zig +17 -0
  79. package/src/tools/display/dom.ts +96 -0
  80. package/src/tools/display/ui.css +354 -0
  81. package/src/lib/binding/node.zig +0 -229
  82. package/src/lib/binding/wasm.zig +0 -10
  83. package/src/lib/gen1/README.md +0 -777
  84. package/src/lib/gen2/README.md +0 -309
@@ -1,229 +0,0 @@
1
- const std = @import("std");
2
- const pkmn = @import("../pkmn.zig");
3
-
4
- const assert = std.debug.assert;
5
-
6
- const c = @cImport({
7
- @cDefine("NAPI_VERSION", "8");
8
- @cInclude("node_api.h");
9
- });
10
-
11
- export fn napi_register_module_v1(env: c.napi_env, exports: c.napi_value) c.napi_value {
12
- const properties = [_]c.napi_property_descriptor{
13
- Property.init("options", .{ .value = options(env) }),
14
- Property.init("bindings", .{ .value = bindings(env) }),
15
- };
16
- assert(c.napi_define_properties(env, exports, properties.len, &properties) == c.napi_ok);
17
- return exports;
18
- }
19
-
20
- fn options(env: c.napi_env) c.napi_value {
21
- var object = Object.init(env);
22
- const properties = [_]c.napi_property_descriptor{
23
- Property.init("showdown", .{ .value = Boolean.init(env, pkmn.options.showdown) }),
24
- Property.init("trace", .{ .value = Boolean.init(env, pkmn.options.trace) }),
25
- };
26
- assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
27
- return object;
28
- }
29
-
30
- fn bindings(env: c.napi_env) c.napi_value {
31
- var array = Array.init(env, .{ .length = 1 });
32
- Array.set(env, array, 0, bind(env, pkmn.gen1));
33
- return array;
34
- }
35
-
36
- fn bind(env: c.napi_env, gen: anytype) c.napi_value {
37
- const options_size = @intCast(u32, gen.OPTIONS_SIZE);
38
- const logs_size = @intCast(u32, gen.LOGS_SIZE);
39
- var object = Object.init(env);
40
- const properties = [_]c.napi_property_descriptor{
41
- Property.init("OPTIONS_SIZE", .{ .value = Number.init(env, options_size) }),
42
- Property.init("LOGS_SIZE", .{ .value = Number.init(env, logs_size) }),
43
- Property.init("update", .{ .method = update(gen) }),
44
- Property.init("choices", .{ .method = choices(gen) }),
45
- };
46
- assert(c.napi_define_properties(env, object, properties.len, &properties) == c.napi_ok);
47
- return object;
48
- }
49
-
50
- fn update(gen: anytype) c.napi_callback {
51
- return struct {
52
- fn call(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_value {
53
- var argc: usize = 4;
54
- var argv: [4]c.napi_value = undefined;
55
- assert(c.napi_get_cb_info(env, info, &argc, &argv, null, null) == c.napi_ok);
56
- assert(argc == 4);
57
-
58
- var data: ?*anyopaque = undefined;
59
- var len: usize = 0;
60
- assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
61
- assert(len == @sizeOf(gen.Battle(gen.PRNG)));
62
- assert(data != null);
63
-
64
- var aligned = @alignCast(@alignOf(*gen.Battle(gen.PRNG)), data.?);
65
- var battle = @ptrCast(*gen.Battle(gen.PRNG), aligned);
66
- const c1 = @bitCast(pkmn.Choice, Number.get(env, argv[1], u8));
67
- const c2 = @bitCast(pkmn.Choice, Number.get(env, argv[2], u8));
68
-
69
- var vtype: c.napi_valuetype = undefined;
70
- assert(c.napi_typeof(env, argv[3], &vtype) == c.napi_ok);
71
- const result = switch (vtype) {
72
- c.napi_undefined, c.napi_null => battle.update(c1, c2, pkmn.protocol.NULL),
73
- else => result: {
74
- assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
75
- assert(len == gen.LOGS_SIZE);
76
- assert(data != null);
77
-
78
- var buf = @ptrCast([*]u8, data.?)[0..gen.LOGS_SIZE];
79
- var stream = pkmn.protocol.ByteStream{ .buffer = buf };
80
- var log = pkmn.protocol.FixedLog{ .writer = stream.writer() };
81
- break :result battle.update(c1, c2, log);
82
- },
83
- } catch unreachable;
84
-
85
- return Number.init(env, @bitCast(u8, result));
86
- }
87
- }.call;
88
- }
89
-
90
- fn choices(gen: anytype) c.napi_callback {
91
- return struct {
92
- fn call(env: c.napi_env, info: c.napi_callback_info) callconv(.C) c.napi_value {
93
- var argc: usize = 4;
94
- var argv: [4]c.napi_value = undefined;
95
- assert(c.napi_get_cb_info(env, info, &argc, &argv, null, null) == c.napi_ok);
96
- assert(argc == 4);
97
-
98
- var data: ?*anyopaque = undefined;
99
- var len: usize = 0;
100
- assert(c.napi_get_arraybuffer_info(env, argv[0], &data, &len) == c.napi_ok);
101
- assert(len == @sizeOf(gen.Battle(gen.PRNG)));
102
- assert(data != null);
103
-
104
- var aligned = @alignCast(@alignOf(*gen.Battle(gen.PRNG)), data.?);
105
- var battle = @ptrCast(*gen.Battle(gen.PRNG), aligned);
106
-
107
- const player = @intToEnum(pkmn.Player, Number.get(env, argv[1], u8));
108
- const request = @intToEnum(pkmn.Choice.Type, Number.get(env, argv[2], u8));
109
-
110
- assert(c.napi_get_arraybuffer_info(env, argv[3], &data, &len) == c.napi_ok);
111
- assert(len == gen.OPTIONS_SIZE);
112
- assert(data != null);
113
-
114
- var out = @ptrCast([*]pkmn.Choice, data.?)[0..gen.OPTIONS_SIZE];
115
- const n = battle.choices(player, request, out);
116
- return Number.init(env, @bitCast(u8, n));
117
- }
118
- }.call;
119
- }
120
-
121
- const Array = struct {
122
- fn init(env: c.napi_env, o: struct { length: ?usize }) c.napi_value {
123
- var result: c.napi_value = undefined;
124
- assert(c.napi_ok == if (o.length) |n|
125
- c.napi_create_array_with_length(env, n, &result)
126
- else
127
- c.napi_create_array(env, &result));
128
- return result;
129
- }
130
-
131
- fn set(env: c.napi_env, array: c.napi_value, index: u32, value: c.napi_value) void {
132
- assert(c.napi_set_element(env, array, index, value) == c.napi_ok);
133
- }
134
- };
135
-
136
- const Boolean = struct {
137
- fn init(env: c.napi_env, value: bool) c.napi_value {
138
- var result: c.napi_value = undefined;
139
- assert(c.napi_get_boolean(env, value, &result) == c.napi_ok);
140
- return result;
141
- }
142
- };
143
-
144
- const Number = struct {
145
- fn init(env: c.napi_env, value: anytype) c.napi_value {
146
- const T = @TypeOf(value);
147
- var result: c.napi_value = undefined;
148
- assert(c.napi_ok == switch (@typeInfo(T)) {
149
- .Int => |info| switch (info.bits) {
150
- 0...32 => switch (info.signedness) {
151
- .signed => c.napi_create_int32(env, @as(i32, value), &result),
152
- .unsigned => c.napi_create_uint32(env, @as(u32, value), &result),
153
- },
154
- 33...52 => c.napi_create_int64(env, @as(i64, value), &result),
155
- else => @compileError("int can't be represented as JS number"),
156
- },
157
- else => @compileError("expected number, got: " ++ @typeName(T)),
158
- });
159
- return result;
160
- }
161
-
162
- fn get(env: c.napi_env, value: c.napi_value, comptime T: type) T {
163
- switch (@typeInfo(T)) {
164
- .Int => |info| switch (info.bits) {
165
- 0...32 => switch (info.signedness) {
166
- .signed => {
167
- var result: i32 = undefined;
168
- assert(c.napi_get_value_int32(env, value, &result) == c.napi_ok);
169
- return if (info.bits == 32) result else @intCast(T, result);
170
- },
171
- .unsigned => {
172
- var result: u32 = undefined;
173
- assert(c.napi_get_value_uint32(env, value, &result) == c.napi_ok);
174
- return if (info.bits == 32) result else @intCast(T, result);
175
- },
176
- },
177
- 33...63 => {
178
- var result: i64 = undefined;
179
- assert(c.napi_get_value_int64(env, value, &result) == c.napi_ok);
180
- return @intCast(T, result);
181
- },
182
- else => {
183
- var result: i64 = undefined;
184
- assert(c.napi_get_value_int64(env, value, &result) == c.napi_ok);
185
- return switch (info.signedness) {
186
- .signed => @as(T, value),
187
- .unsigned => if (0 <= value) @intCast(T, value) else unreachable,
188
- };
189
- },
190
- },
191
- else => @compileError("expected number, got: " ++ @typeName(T)),
192
- }
193
- }
194
- };
195
-
196
- const Object = struct {
197
- fn init(env: c.napi_env) c.napi_value {
198
- var result: c.napi_value = undefined;
199
- assert(c.napi_create_object(env, &result) == c.napi_ok);
200
- return result;
201
- }
202
- };
203
-
204
- const Property = union(enum) {
205
- method: c.napi_callback,
206
- value: c.napi_value,
207
-
208
- fn init(comptime name: [:0]const u8, property: Property) c.napi_property_descriptor {
209
- return .{
210
- .utf8name = name,
211
- .name = null,
212
- .method = switch (property) {
213
- .method => |m| m,
214
- .value => null,
215
- },
216
- .getter = null,
217
- .setter = null,
218
- .value = switch (property) {
219
- .method => null,
220
- .value => |v| v,
221
- },
222
- .attributes = switch (property) {
223
- .method => c.napi_default,
224
- .value => c.napi_enumerable,
225
- },
226
- .data = null,
227
- };
228
- }
229
- };
@@ -1,10 +0,0 @@
1
- const std = @import("std");
2
- const pkmn = @import("../pkmn.zig");
3
-
4
- export const SHOWDOWN = pkmn.options.showdown;
5
- export const TRACE = pkmn.options.trace;
6
-
7
- export const GEN1_OPTIONS_SIZE =
8
- std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.OPTIONS_SIZE)) catch unreachable;
9
- export const GEN1_LOGS_SIZE =
10
- std.math.ceilPowerOfTwo(u32, @intCast(u32, pkmn.gen1.LOGS_SIZE)) catch unreachable;