@pkmn/engine 0.1.0-dev.84cc1a02 → 0.1.0-dev.86ae1278

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 (78) hide show
  1. package/LICENSE +1 -3
  2. package/README.md +137 -71
  3. package/build/pkg/addon/browser.d.ts +3 -0
  4. package/build/pkg/addon/browser.js +43 -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 +96 -0
  8. package/build/pkg/addon/node.js.map +1 -0
  9. package/build/pkg/addon.d.ts +9 -0
  10. package/build/pkg/addon.js +89 -0
  11. package/build/pkg/addon.js.map +1 -0
  12. package/build/pkg/data/ids.json +12 -12
  13. package/build/pkg/data/layout.json +27 -5
  14. package/build/pkg/data/protocol.json +69 -12
  15. package/build/pkg/data.d.ts +28 -7
  16. package/build/pkg/data.js +3 -5
  17. package/build/pkg/data.js.map +1 -1
  18. package/build/pkg/gen1.d.ts +5 -4
  19. package/build/pkg/gen1.js +49 -33
  20. package/build/pkg/gen1.js.map +1 -1
  21. package/build/pkg/index.d.ts +39 -22
  22. package/build/pkg/index.js +15 -10
  23. package/build/pkg/index.js.map +1 -1
  24. package/build/pkg/protocol.d.ts +24 -3
  25. package/build/pkg/protocol.js +127 -104
  26. package/build/pkg/protocol.js.map +1 -1
  27. package/build/tools/debug.js +101 -0
  28. package/build/tools/debug.js.map +1 -0
  29. package/build/tools/display/debug.jsx +128 -0
  30. package/build/tools/display/debug.jsx.map +1 -0
  31. package/build/tools/display/index.js +132 -0
  32. package/build/tools/display/index.js.map +1 -0
  33. package/build/tools/display/ui.jsx +349 -0
  34. package/build/tools/display/ui.jsx.map +1 -0
  35. package/build/tools/display/util.js +18 -0
  36. package/build/tools/display/util.js.map +1 -0
  37. package/build.zig +300 -153
  38. package/package.json +101 -48
  39. package/src/bin/install-pkmn-engine +71 -37
  40. package/src/bin/pkmn-debug +62 -0
  41. package/src/lib/common/array.zig +77 -0
  42. package/src/lib/common/battle.zig +17 -0
  43. package/src/lib/common/data.zig +19 -31
  44. package/src/lib/common/debug.zig +51 -15
  45. package/src/lib/common/js.zig +120 -0
  46. package/src/lib/common/optional.zig +71 -0
  47. package/src/lib/common/options.zig +16 -3
  48. package/src/lib/common/protocol.zig +947 -403
  49. package/src/lib/common/rational.zig +447 -0
  50. package/src/lib/common/rng.zig +31 -22
  51. package/src/lib/common/util.zig +61 -0
  52. package/src/lib/gen1/calc.zig +959 -0
  53. package/src/lib/gen1/chance.zig +1169 -0
  54. package/src/lib/gen1/data/moves.zig +202 -190
  55. package/src/lib/gen1/data/species.zig +5 -5
  56. package/src/lib/gen1/data/types.zig +10 -10
  57. package/src/lib/gen1/data.zig +98 -83
  58. package/src/lib/gen1/helpers.zig +142 -40
  59. package/src/lib/gen1/mechanics.zig +1313 -877
  60. package/src/lib/gen2/calc.zig +161 -0
  61. package/src/lib/gen2/chance.zig +902 -0
  62. package/src/lib/gen2/data/items.zig +14 -20
  63. package/src/lib/gen2/data/moves.zig +664 -570
  64. package/src/lib/gen2/data/species.zig +2 -2
  65. package/src/lib/gen2/data/types.zig +137 -34
  66. package/src/lib/gen2/data.zig +129 -90
  67. package/src/lib/gen2/generated.zig +806 -0
  68. package/src/lib/gen2/helpers.zig +54 -32
  69. package/src/lib/gen2/mechanics.zig +3564 -15
  70. package/src/lib/node.zig +131 -0
  71. package/src/lib/pkmn.zig +88 -12
  72. package/src/lib/wasm.zig +13 -0
  73. package/src/tools/display/dom.ts +96 -0
  74. package/src/tools/display/ui.css +351 -0
  75. package/src/lib/binding/node.zig +0 -229
  76. package/src/lib/binding/wasm.zig +0 -10
  77. package/src/lib/gen1/README.md +0 -778
  78. package/src/lib/gen2/README.md +0 -309
@@ -0,0 +1,351 @@
1
+ #content {
2
+ font-family: "Roboto", "Helvetica Neue", "Helvetica", "Arial", sans-serif;
3
+ margin: 4em auto;
4
+ max-width: 1300px;
5
+ line-height: 1.4em;
6
+ --hp-bar: 151px;
7
+ --hp-text: 32px;
8
+ --radius: 10px;
9
+ }
10
+ details > summary {
11
+ list-style: none;
12
+ }
13
+ details > summary::-webkit-details-marker {
14
+ display: none;
15
+ }
16
+ .battle > .details {
17
+ background: #eee;
18
+ border-bottom: 3px solid black;
19
+ border-radius: var(--radius) var(--radius) 0 0;
20
+ padding: 0 1em;
21
+ display: flex;
22
+ justify-content: space-between;
23
+ }
24
+ .inner {
25
+ display: flex;
26
+ justify-content: center;
27
+ flex-direction: column;
28
+ }
29
+ .side > .details {
30
+ padding: 0.5em 1em;
31
+ display: flex;
32
+ justify-content: space-between;
33
+ text-align: center;
34
+ flex: 0 1 auto;
35
+ }
36
+ .active {
37
+ flex: 1 1 auto;
38
+ }
39
+ details {
40
+ flex: 0 1 auto;
41
+ }
42
+ .sides {
43
+ display: flex;
44
+ }
45
+ .side {
46
+ flex: 1;
47
+ display: flex;
48
+ flex-flow: column;
49
+ }
50
+ .side.p1 {
51
+ border-right: 1px solid black;
52
+ }
53
+ .battle {
54
+ border: 3px solid black;
55
+ border-radius: var(--radius);
56
+ }
57
+ summary {
58
+ border-top: 1px solid #eee;
59
+ text-align: center;
60
+ padding: 0.25em;
61
+ }
62
+ .good {
63
+ color: green;
64
+ }
65
+ .bad {
66
+ color: red;
67
+ }
68
+ .pokemon {
69
+ position: relative;
70
+ padding: 0.5em 1em;
71
+ border-top: 1px solid black;
72
+ display: flex;
73
+ }
74
+ .active > .pokemon {
75
+ border-top: 1px solid #eee;
76
+ }
77
+ table {
78
+ border-collapse: collapse;
79
+ border-style: hidden;
80
+ border-spacing: 0px;
81
+ line-height: 1.5em;
82
+ }
83
+ th, td {
84
+ border: 1px solid black;
85
+ padding: 0 0.5em;
86
+ }
87
+ .statbar {
88
+ display: none;
89
+ width: calc(var(--hp-bar) + var(--hp-text));
90
+ padding: 2px 0;
91
+ line-height: normal;
92
+ }
93
+ .statbar .name {
94
+ display: block;
95
+ text-align: center;
96
+ line-height: 1.25em;
97
+ }
98
+ .statbar strong {
99
+ color: #222222;
100
+ text-shadow:
101
+ #FFFFFF 1px 1px 0, #FFFFFF 1px -1px 0,
102
+ #FFFFFF -1px 1px 0, #FFFFFF -1px -1px 0;
103
+ }
104
+ .statbar strong small {
105
+ font-weight: normal;
106
+ }
107
+ .statbar .hpbar {
108
+ position: relative;
109
+ border: 1px solid #777777;
110
+ background: #FCFEFF;
111
+ padding: 1px;
112
+ height: 8px;
113
+ margin: 0 0 0 0;
114
+ width: calc(var(--hp-bar) + var(--hp-text) + 1px);
115
+ border-radius: 4px;
116
+ }
117
+ .statbar .hpbar .hp {
118
+ height: 4px;
119
+ border-top: 2px solid #00dd60;
120
+ background: #00bb51;
121
+ border-bottom: 2px solid #007734;
122
+ border-right: 1px solid #007734;
123
+ border-radius: 3px;
124
+ }
125
+ .statbar .hpbar .hp-yellow {
126
+ border-top-color: #f8e379;
127
+ background-color: #f5d538;
128
+ border-bottom-color: #be9f0a;
129
+ border-right-color: #be9f0a;
130
+ }
131
+ .statbar .hpbar .hp-red {
132
+ border-top-color: #f37f67;
133
+ background-color: #ee4928;
134
+ border-bottom-color: #a3260d;
135
+ border-right-color: #a3260d;
136
+ }
137
+ .statbar .hpbar .prevhp {
138
+ background: #BBEECC;
139
+ height: 8px;
140
+ border-radius: 3px;
141
+ }
142
+ .statbar .hpbar .prevhp-yellow {
143
+ background-color: #fcf4ca;
144
+ }
145
+ .statbar .hpbar .prevhp-red {
146
+ background-color: #facec5;
147
+ }
148
+ .statbar .hpbar .hptext {
149
+ position: absolute;
150
+ background: #777777;
151
+ color: #EEEEEE;
152
+ text-shadow: #000000 0 1px 0;
153
+ font-size: 10px;
154
+ width: 32px;
155
+ height: 12px;
156
+ top: -1px;
157
+ text-align: center;
158
+ }
159
+ .status, .volatile {
160
+ padding: 0px 1px;
161
+ border: 1px solid #FF4400;
162
+ border-radius: 3px;
163
+ }
164
+ .status {
165
+ min-height: 10px;
166
+ font-size: 7pt;
167
+ vertical-align: middle;
168
+ padding: 1px 2px;
169
+ border: 0;
170
+ border-radius: 3px;
171
+ text-transform: uppercase;
172
+ margin: 0 2px;
173
+ }
174
+ .status.brn {
175
+ background: #EE5533;
176
+ color: #FFFFFF;
177
+ }
178
+ .status.psn {
179
+ background: #A4009A;
180
+ color: #FFFFFF;
181
+ }
182
+ .status.par {
183
+ background: #9AA400;
184
+ color: #FFFFFF;
185
+ }
186
+ .status.slp {
187
+ background: #AA77AA;
188
+ color: #FFFFFF;
189
+ }
190
+ .status.frz {
191
+ background: #009AA4;
192
+ color: #FFFFFF;
193
+ }
194
+ .volatile {
195
+ display: inline-block;
196
+ padding: 0 5px;
197
+ margin: 2px
198
+ }
199
+ .volatile.bad {
200
+ background: #FFE5E0;
201
+ color: #FF4400;
202
+ border-color: #FF4400;
203
+ }
204
+ .volatile.good {
205
+ background: #E5FFE0;
206
+ color: #33AA00;
207
+ border-color: #33AA00;
208
+ }
209
+ .volatile.neutral {
210
+ background: #F0F0F0;
211
+ color: #555555;
212
+ border-color: #555555;
213
+ }
214
+ .rstatbar .hpbar .hptext {
215
+ right: 0px;
216
+ border-radius: 0 4px 4px 0;
217
+ }
218
+ .moves ul {
219
+ display: grid;
220
+ grid-template-columns: repeat(2, auto);
221
+ gap: 0 2em;
222
+ }
223
+ .left {
224
+ padding-right: 32px;
225
+ display: flex;
226
+ flex-direction: column;
227
+ align-items: center;
228
+ }
229
+ .stats {
230
+ display: flex;
231
+ padding: 0 1em;
232
+ justify-content: space-between;
233
+ text-align: center;
234
+ width: 100%;
235
+ }
236
+ .types {
237
+ display: inherit;
238
+ }
239
+ .disabled {
240
+ color: #AAAAAA;
241
+ }
242
+ .log {
243
+ display: flex;
244
+ justify-content: center;
245
+ padding-bottom: 2em;
246
+ }
247
+ .position {
248
+ position: absolute;
249
+ right: 10px;
250
+ color: #AAAAAA;
251
+ }
252
+ .left .position {
253
+ display: none;
254
+ }
255
+ .right .position {
256
+ display: block;
257
+ }
258
+ .teamicons {
259
+ display: inline-block;
260
+ }
261
+ @media(max-width: 1300px) {
262
+ #content {
263
+ font-size: 0.85em;
264
+ max-width: 95%;
265
+ margin: 2em auto;
266
+ }
267
+ }
268
+ @media(max-width: 1200px) {
269
+ .moves ul {
270
+ grid-template-columns: repeat(1, auto);
271
+ }
272
+ }
273
+ @media(max-width: 1100px) {
274
+ .pokemon {
275
+ flex-direction: column;
276
+ }
277
+ .stats {
278
+ justify-content: center;
279
+ padding: 0;
280
+ }
281
+ .boosts {
282
+ margin-left: 5px;
283
+ }
284
+ .moves ul {
285
+ grid-template-columns: repeat(2, auto);
286
+ }
287
+ .left {
288
+ padding-right: 0;
289
+ }
290
+ .right {
291
+ padding-top: 1em;
292
+ }
293
+ .volatiles {
294
+ display: flex;
295
+ justify-content: center;
296
+ flex-wrap: wrap;
297
+ }
298
+ .left .position {
299
+ display: block;
300
+ }
301
+ .right .position {
302
+ display: none;
303
+ }
304
+ }
305
+ @media(max-width: 800px) {
306
+ .moves {
307
+ display: flex;
308
+ justify-content: center;
309
+ }
310
+ .moves ul {
311
+ display: inline-block;
312
+ padding: 0;
313
+ }
314
+ }
315
+ @media(max-width: 680px) {
316
+ .stats {
317
+ flex-direction: column;
318
+ padding: 0;
319
+ }
320
+ .boosts {
321
+ display: flex;
322
+ justify-content: space-between;
323
+ margin-top: 0.5em;
324
+ }
325
+ }
326
+ @media(max-width: 550px) {
327
+ #content {
328
+ font-size: 0.65em;
329
+ max-width: 95%;
330
+ margin: 1em auto;
331
+ --hp-bar: 101px;
332
+ }
333
+ }
334
+ @media(max-width: 425px) {
335
+ .stats {
336
+ font-size: 0.9em;
337
+ }
338
+ }
339
+ h1 {
340
+ text-align: center;
341
+ }
342
+ .error {
343
+ overflow: auto;
344
+ scrollbar-width: none;
345
+ padding: 10px 20px;
346
+ border: 3px solid #DD4422;
347
+ background: #FFF8F2;
348
+ }
349
+ .error::-webkit-scrollbar {
350
+ display: none;
351
+ }
@@ -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;