@lotus-tree/fg-notation 1.1.4 → 1.2.0

Sign up to get free protection for your applications and to get access to all the features.
package/README.md CHANGED
@@ -23,20 +23,21 @@ https://user-images.githubusercontent.com/19596334/149458504-baf906a3-87da-4d92-
23
23
  https://user-images.githubusercontent.com/19596334/149458508-1dcf89fb-a83e-44bb-a6a0-9549771c6082.mp4
24
24
 
25
25
  ## Available games
26
- | Game | Name |
27
- |---------------------|------|
28
- | Blazblue | bb |
29
- | Dragonball Fighterz | dbz |
30
- | DNF Duel | dnf |
31
- | Granblue Versus | gbf |
32
- | Guilty Gear | gg |
33
- | King of Fighters | kof |
34
- | Mortal Kombat | mk |
35
- | Soul Calibur | sc |
36
- | Street Fighter | sf |
37
- | Skullgirlz | sg |
38
- | Them Fighting Herds | tfh |
39
- | Tekken | tkn |
26
+ | Game | Name |
27
+ |----------------------------|-------|
28
+ | Blazblue | bb |
29
+ | Blazblue: Cross Tag Battle | bbtag |
30
+ | Dragonball Fighterz | dbz |
31
+ | DNF Duel | dnf |
32
+ | Granblue Versus | gbf |
33
+ | Guilty Gear | gg |
34
+ | King of Fighters | kof |
35
+ | Mortal Kombat | mk |
36
+ | Soul Calibur | sc |
37
+ | Street Fighter | sf |
38
+ | Skullgirlz | sg |
39
+ | Them Fighting Herds | tfh |
40
+ | Tekken | tkn |
40
41
 
41
42
  ## Add to your server
42
43
  Use [this link](https://discord.com/oauth2/authorize?client_id=928539052834177024&scope=bot&permissions=34816) to add this bot to your Discord server
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/dev/index.js CHANGED
@@ -9,10 +9,10 @@ exports["default"] = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
12
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
13
 
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
16
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
17
 
18
18
  var _sharp = _interopRequireDefault(require("sharp"));
@@ -25,6 +25,8 @@ var _sequelize = require("sequelize");
25
25
 
26
26
  var _bent = _interopRequireDefault(require("bent"));
27
27
 
28
+ var _info = require("./info.json");
29
+
28
30
  var getJSON = (0, _bent["default"])('json');
29
31
 
30
32
  var imgPath = _path["default"].join(__dirname, 'img');
@@ -77,27 +79,55 @@ _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
77
79
  }).forEach(function (p) {
78
80
  var input = p.split('/').pop().replace('.png', '');
79
81
  basicInputs.set(input, p);
80
- });
82
+ var alias = _info.aliases.inputs.basic[input];
81
83
 
82
- basicInputs.set('>>', _path["default"].join(imgPath, 'basic/doubleforward.png'));
84
+ if (alias) {
85
+ alias.forEach(function (i) {
86
+ basicInputs.set(i, p);
87
+ if (_info.sizes[input]) _info.sizes[i] = _info.sizes[input];
88
+ });
89
+ }
90
+ });
83
91
 
84
- _glob["default"].sync(_path["default"].join(imgPath, 'games/**'), {
85
- nodir: true
86
- }).forEach(function (p) {
92
+ _glob["default"].sync(_path["default"].join(imgPath, 'games/*')).forEach(function (p) {
87
93
  var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
88
- dir = _path$parse.dir,
89
- name = _path$parse.name;
94
+ base = _path$parse.base;
95
+
96
+ gameInputs.set(base, new Map());
90
97
 
91
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map());
92
- gameInputs.get(dir).set(name, p);
98
+ _glob["default"].sync(_path["default"].join(imgPath, 'games', base, '**'), {
99
+ nodir: true
100
+ }).forEach(function (input) {
101
+ var _path$parse2 = _path["default"].parse(input),
102
+ name = _path$parse2.name;
103
+
104
+ gameInputs.get(base).set(name, input);
105
+ });
106
+
107
+ var alias = _info.aliases.inputs.games[base];
108
+
109
+ if (alias) {
110
+ for (var _i = 0, _Object$entries = Object.entries(alias); _i < _Object$entries.length; _i++) {
111
+ var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
112
+ a = _Object$entries$_i[0],
113
+ s = _Object$entries$_i[1];
114
+
115
+ gameInputs.get(base).set(a, s);
116
+ }
117
+ }
93
118
  });
94
119
 
95
120
  function solveInput(inputs, input) {
96
- if (inputs.has(input)) return [input];
121
+ if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input);
97
122
 
98
123
  for (var i = 0; i < input.length; i++) {
99
124
  var s1 = input.slice(0, 0 - i);
100
- if (inputs.has(s1)) return [s1].concat((0, _toConsumableArray2["default"])(solveInput(inputs, input.slice(0 - i))));
125
+
126
+ if (inputs.has(s1)) {
127
+ var result = inputs.get(s1);
128
+ var remaining = solveInput(inputs, input.slice(0 - i));
129
+ return isString(result) ? [s1].concat((0, _toConsumableArray2["default"])(remaining)) : [].concat((0, _toConsumableArray2["default"])(result), (0, _toConsumableArray2["default"])(remaining));
130
+ }
101
131
  }
102
132
 
103
133
  throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
@@ -109,37 +139,61 @@ function sendInput(_x, _x2, _x3, _x4) {
109
139
 
110
140
  function _sendInput() {
111
141
  _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
112
- var canvas;
142
+ var width, images, left, canvas;
113
143
  return _regenerator["default"].wrap(function _callee7$(_context7) {
114
144
  while (1) {
115
145
  switch (_context7.prev = _context7.next) {
116
146
  case 0:
117
- _context7.next = 2;
118
- return (0, _sharp["default"])({
147
+ width = result.map(function (it) {
148
+ return _info.sizes[it] || 152;
149
+ }).reduce(function (a, b) {
150
+ return a + b;
151
+ }, 0);
152
+ images = [];
153
+ left = 0;
154
+ result.forEach(function (it, index) {
155
+ var size = _info.sizes[it] || 152;
156
+ images.push({
157
+ input: inputs.get(it),
158
+ left: left,
159
+ top: Math.floor((152 - size) / 2)
160
+ });
161
+ left += size;
162
+ });
163
+ canvas = (0, _sharp["default"])({
119
164
  create: {
120
- width: 152 * result.length,
165
+ width: width,
121
166
  height: 152,
122
167
  channels: 4,
123
168
  background: 'transparent'
124
169
  }
125
- }).composite(result.map(function (it, index) {
126
- return {
127
- input: inputs.get(it),
128
- left: index * 152,
129
- top: 0,
130
- width: 152,
131
- height: 152
132
- };
133
- })).png().toBuffer();
170
+ }).png().composite(images);
171
+ _context7.next = 7;
172
+ return canvas.toBuffer();
134
173
 
135
- case 2:
174
+ case 7:
136
175
  canvas = _context7.sent;
176
+
177
+ if (!(result.length < 12)) {
178
+ _context7.next = 12;
179
+ break;
180
+ }
181
+
182
+ _context7.next = 11;
183
+ return (0, _sharp["default"])(canvas).resize({
184
+ height: 55
185
+ }).png().toBuffer();
186
+
187
+ case 11:
188
+ canvas = _context7.sent;
189
+
190
+ case 12:
137
191
  return _context7.abrupt("return", message.reply({
138
192
  content: caption,
139
193
  files: [canvas]
140
194
  }));
141
195
 
142
- case 4:
196
+ case 13:
143
197
  case "end":
144
198
  return _context7.stop();
145
199
  }
@@ -149,13 +203,14 @@ function _sendInput() {
149
203
  return _sendInput.apply(this, arguments);
150
204
  }
151
205
 
152
- var builtin = {
153
- 37: {
154
- game: 'sf',
155
- caption: '***LETS GO JUSTIN!***',
156
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
157
- }
158
- };
206
+ function checkGame(game) {
207
+ return gameInputs.has(game) ? game : _info.aliases.games[game];
208
+ }
209
+
210
+ function isString(x) {
211
+ return Object.prototype.toString.call(x) === '[object String]';
212
+ }
213
+
159
214
  var _default = {
160
215
  name: 'fg-notation',
161
216
  about: {
@@ -207,7 +262,7 @@ var _default = {
207
262
  }
208
263
 
209
264
  name = message.content.split(' ').pop().replace(prefix, '');
210
- _context.t0 = builtin[name];
265
+ _context.t0 = _info.builtin[name];
211
266
 
212
267
  if (_context.t0) {
213
268
  _context.next = 12;
@@ -249,7 +304,7 @@ var _default = {
249
304
  example: 'fgi sf 236P 214K',
250
305
  execute: function () {
251
306
  var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
252
- var param, message, _param, game, i1, inputs, result;
307
+ var param, message, _param, gameInput, i1, game, inputs, result;
253
308
 
254
309
  return _regenerator["default"].wrap(function _callee2$(_context2) {
255
310
  while (1) {
@@ -257,9 +312,9 @@ var _default = {
257
312
  case 0:
258
313
  param = _ref.param;
259
314
  message = _ref2.message;
260
- _param = (0, _slicedToArray2["default"])(param, 3), game = _param[1], i1 = _param[2];
315
+ _param = (0, _slicedToArray2["default"])(param, 3), gameInput = _param[1], i1 = _param[2];
261
316
 
262
- if (!(!game || !i1)) {
317
+ if (!(!gameInput || !i1)) {
263
318
  _context2.next = 5;
264
319
  break;
265
320
  }
@@ -267,21 +322,27 @@ var _default = {
267
322
  return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
268
323
 
269
324
  case 5:
325
+ game = checkGame(gameInput);
326
+
270
327
  if (gameInputs.has(game)) {
271
- _context2.next = 7;
328
+ _context2.next = 8;
272
329
  break;
273
330
  }
274
331
 
275
332
  return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
276
333
 
277
- case 7:
278
- inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
279
- result = param.slice(2).map(function (i) {
280
- return solveInput(inputs, i.toLowerCase());
281
- }).flat();
282
- sendInput(inputs, result, message);
334
+ case 8:
335
+ try {
336
+ inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
337
+ result = param.slice(2).map(function (i) {
338
+ return solveInput(inputs, i.toLowerCase());
339
+ }).flat();
340
+ sendInput(inputs, result, message);
341
+ } catch (err) {
342
+ message.reply(err.message);
343
+ }
283
344
 
284
- case 10:
345
+ case 9:
285
346
  case "end":
286
347
  return _context2.stop();
287
348
  }
@@ -302,7 +363,7 @@ var _default = {
302
363
  example: 'fgi sf testName 236P 214K',
303
364
  execute: function () {
304
365
  var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
305
- var param, sequelize, message, _param2, game, name, i1, inputs, input;
366
+ var param, sequelize, message, _param2, gameInput, name, i1, game, inputs, input;
306
367
 
307
368
  return _regenerator["default"].wrap(function _callee3$(_context3) {
308
369
  while (1) {
@@ -310,9 +371,9 @@ var _default = {
310
371
  case 0:
311
372
  param = _ref3.param, sequelize = _ref3.sequelize;
312
373
  message = _ref4.message;
313
- _param2 = (0, _slicedToArray2["default"])(param, 4), game = _param2[1], name = _param2[2], i1 = _param2[3];
374
+ _param2 = (0, _slicedToArray2["default"])(param, 4), gameInput = _param2[1], name = _param2[2], i1 = _param2[3];
314
375
 
315
- if (!(!game || !name || !i1)) {
376
+ if (!(!gameInput || !name || !i1)) {
316
377
  _context3.next = 5;
317
378
  break;
318
379
  }
@@ -320,19 +381,22 @@ var _default = {
320
381
  return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
321
382
 
322
383
  case 5:
384
+ game = checkGame(gameInput);
385
+
323
386
  if (gameInputs.has(game)) {
324
- _context3.next = 7;
387
+ _context3.next = 8;
325
388
  break;
326
389
  }
327
390
 
328
391
  return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
329
392
 
330
- case 7:
393
+ case 8:
394
+ _context3.prev = 8;
331
395
  inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
332
396
  input = param.slice(3).map(function (i) {
333
397
  return solveInput(inputs, i.toLowerCase());
334
398
  }).flat().join(' ');
335
- _context3.next = 11;
399
+ _context3.next = 13;
336
400
  return sequelize.models.fginput.create({
337
401
  guild: message.guild.id,
338
402
  name: name,
@@ -341,15 +405,22 @@ var _default = {
341
405
  input: input
342
406
  });
343
407
 
344
- case 11:
408
+ case 13:
345
409
  message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
410
+ _context3.next = 19;
411
+ break;
346
412
 
347
- case 12:
413
+ case 16:
414
+ _context3.prev = 16;
415
+ _context3.t0 = _context3["catch"](8);
416
+ message.reply(_context3.t0.message);
417
+
418
+ case 19:
348
419
  case "end":
349
420
  return _context3.stop();
350
421
  }
351
422
  }
352
- }, _callee3);
423
+ }, _callee3, null, [[8, 16]]);
353
424
  }));
354
425
 
355
426
  function execute(_x7, _x8) {
@@ -488,4 +559,5 @@ var _default = {
488
559
  }
489
560
  }
490
561
  };
491
- exports["default"] = _default;
562
+ exports["default"] = _default;
563
+ //# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3NyYy9pbmRleC5qcyJdLCJuYW1lcyI6WyJnZXRKU09OIiwiaW1nUGF0aCIsInBhdGgiLCJqb2luIiwiX19kaXJuYW1lIiwiYmFzaWNJbnB1dHMiLCJNYXAiLCJnYW1lSW5wdXRzIiwiZ2xvc3NhcnkiLCJ0ZXJtcyIsImdldEdsb3NzYXJ5Iiwic2V0SW50ZXJ2YWwiLCJyZXN1bHQiLCJ0ZW1wRyIsInRlbXBUIiwiZm9yRWFjaCIsImkiLCJ0ZXJtIiwidG9Mb3dlckNhc2UiLCJwdXNoIiwiZ2xvYiIsInN5bmMiLCJub2RpciIsInAiLCJpbnB1dCIsInNwbGl0IiwicG9wIiwicmVwbGFjZSIsInNldCIsImFsaWFzIiwiYWxpYXNlcyIsImlucHV0cyIsImJhc2ljIiwic2l6ZXMiLCJwYXJzZSIsInJlbGF0aXZlIiwiYmFzZSIsIm5hbWUiLCJnZXQiLCJnYW1lcyIsIk9iamVjdCIsImVudHJpZXMiLCJhIiwicyIsInNvbHZlSW5wdXQiLCJoYXMiLCJpc1N0cmluZyIsImxlbmd0aCIsInMxIiwic2xpY2UiLCJyZW1haW5pbmciLCJFcnJvciIsInNlbmRJbnB1dCIsIm1lc3NhZ2UiLCJjYXB0aW9uIiwid2lkdGgiLCJtYXAiLCJpdCIsInJlZHVjZSIsImIiLCJpbWFnZXMiLCJsZWZ0IiwiaW5kZXgiLCJzaXplIiwidG9wIiwiTWF0aCIsImZsb29yIiwiY2FudmFzIiwiY3JlYXRlIiwiaGVpZ2h0IiwiY2hhbm5lbHMiLCJiYWNrZ3JvdW5kIiwicG5nIiwiY29tcG9zaXRlIiwidG9CdWZmZXIiLCJyZXNpemUiLCJyZXBseSIsImNvbnRlbnQiLCJmaWxlcyIsImNoZWNrR2FtZSIsImdhbWUiLCJ4IiwicHJvdG90eXBlIiwidG9TdHJpbmciLCJjYWxsIiwiYWJvdXQiLCJ2YWx1ZSIsImludGVudHMiLCJwYXJ0aWFscyIsInByZWxvYWQiLCJzZXF1ZWxpemUiLCJkZWZpbmUiLCJndWlsZCIsInR5cGUiLCJEYXRhVHlwZXMiLCJTVFJJTkciLCJwcmltYXJ5S2V5IiwiY3JlYXRlZEJ5IiwiZXZlbnRzIiwibWVzc2FnZUNyZWF0ZSIsImdsb2JhbCIsImNsaWVudCIsImNvbmZpZyIsImF1dGhvciIsImlkIiwidXNlciIsIm1lbWJlciIsImd1aWxkSWQiLCJwcmVmaXgiLCJzdGFydHNXaXRoIiwiYnVpbHRpbiIsIm1vZGVscyIsImZnaW5wdXQiLCJmaW5kT25lIiwid2hlcmUiLCJyb3ciLCJjb21tYW5kcyIsImZnaSIsInVzYWdlIiwiZGVzYyIsImV4YW1wbGUiLCJleGVjdXRlIiwicGFyYW0iLCJnYW1lSW5wdXQiLCJpMSIsIkFycmF5IiwiZnJvbSIsImtleXMiLCJmbGF0IiwiZXJyIiwiZmdzYXZlIiwiY2hhbm5lbCIsInNlbmQiLCJmZ2NhcHRpb24iLCJzYXZlIiwiZmdnbG9zc2FyeSIsInBhcmFtcyIsInNlYXJjaCIsImZpbHRlciIsImluY2x1ZGVzIiwidXJsIiwiZGVmIl0sIm1hcHBpbmdzIjoiOzs7Ozs7Ozs7Ozs7Ozs7OztBQUFBOztBQUNBOztBQUNBOztBQUNBOztBQUNBOztBQUVBOztBQUVBLElBQU1BLE9BQU8sR0FBRyxzQkFBSyxNQUFMLENBQWhCOztBQUNBLElBQU1DLE9BQU8sR0FBR0MsaUJBQUtDLElBQUwsQ0FBVUMsU0FBVixFQUFxQixLQUFyQixDQUFoQjs7QUFDQSxJQUFNQyxXQUFXLEdBQUcsSUFBSUMsR0FBSixFQUFwQjtBQUNBLElBQU1DLFVBQVUsR0FBRyxJQUFJRCxHQUFKLEVBQW5CO0FBRUEsSUFBSUUsUUFBUSxHQUFHLEVBQWY7QUFDQSxJQUFJQyxLQUFLLEdBQUcsRUFBWjtBQUVBQyxXQUFXO0FBQ1hDLFdBQVcsQ0FBQ0QsV0FBRCxFQUFjLElBQUksRUFBSixHQUFTLElBQXZCLENBQVg7O1NBRWVBLFc7Ozs7OytGQUFmO0FBQUE7QUFBQTtBQUFBO0FBQUE7QUFBQTtBQUFBO0FBQUEsbUJBQ3VCVixPQUFPLENBQUMsK0NBQUQsQ0FEOUI7O0FBQUE7QUFDUVksWUFBQUEsTUFEUjtBQUVRQyxZQUFBQSxLQUZSLEdBRWdCLEVBRmhCO0FBR1FD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QUFGOztBQUFBO0FBQUE7QUFBQTs7QUFBQTtBQUFBO0FBSkc7QUFoRUo7QUFsREcsQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCBzaGFycCBmcm9tICdzaGFycCdcclxuaW1wb3J0IHBhdGggZnJvbSAncGF0aCdcclxuaW1wb3J0IGdsb2IgZnJvbSAnZ2xvYidcclxuaW1wb3J0IHsgRGF0YVR5cGVzIH0gZnJvbSAnc2VxdWVsaXplJ1xyXG5pbXBvcnQgYmVudCBmcm9tICdiZW50J1xyXG5cclxuaW1wb3J0IHsgc2l6ZXMsIGFsaWFzZXMsIGJ1aWx0aW4gfSBmcm9tICcuL2luZm8uanNvbidcclxuXHJcbmNvbnN0IGdldEpTT04gPSBiZW50KCdqc29uJylcclxuY29uc3QgaW1nUGF0aCA9IHBhdGguam9pbihfX2Rpcm5hbWUsICdpbWcnKVxyXG5jb25zdCBiYXNpY0lucHV0cyA9IG5ldyBNYXAoKVxyXG5jb25zdCBnYW1lSW5wdXRzID0gbmV3IE1hcCgpXHJcblxyXG5sZXQgZ2xvc3NhcnkgPSB7fVxyXG5sZXQgdGVybXMgPSBbXVxyXG5cclxuZ2V0R2xvc3NhcnkoKVxyXG5zZXRJbnRlcnZhbChnZXRHbG9zc2FyeSwgNSAqIDYwICogMTAwMClcclxuXHJcbmFzeW5jIGZ1bmN0aW9uIGdldEdsb3NzYXJ5ICgpIHtcclxuICBjb25zdCByZXN1bHQgPSBhd2FpdCBnZXRKU09OKCdodHRwczovL2dsb3NzYXJ5LmluZmlsLm5ldC9qc29uL2dsb3NzYXJ5Lmpzb24nKVxyXG4gIGNvbnN0IHRlbXBHID0ge31cclxuICBjb25zdCB0ZW1wVCA9IFtdXHJcblxyXG4gIHJlc3VsdC5mb3JFYWNoKGkgPT4ge1xyXG4gICAgY29uc3QgdGVybSA9IGkudGVybS50b0xvd2VyQ2FzZSgpXHJcbiAgICB0ZW1wR1t0ZXJtXSA9IGlcclxuICAgIHRlbXBULnB1c2godGVybSlcclxuICB9KVxyXG5cclxuICBnbG9zc2FyeSA9IHRlbXBHXHJcbiAgdGVybXMgPSB0ZW1wVFxyXG59XHJcblxyXG5nbG9iLnN5bmMocGF0aC5qb2luKGltZ1BhdGgsICdiYXNpYy8qKicpLCB7IG5vZGlyOiB0cnVlIH0pXHJcbiAgLmZvckVhY2gocCA9PiB7XHJcbiAgICBjb25zdCBpbnB1dCA9IHAuc3BsaXQoJy8nKS5wb3AoKS5yZXBsYWNlKCcucG5nJywgJycpXHJcbiAgICBiYXNpY0lucHV0cy5zZXQoaW5wdXQsIHApXHJcblxyXG4gICAgY29uc3QgYWxpYXMgPSBhbGlhc2VzLmlucHV0cy5iYXNpY1tpbnB1dF1cclxuICAgIGlmIChhbGlhcykge1xyXG4gICAgICBhbGlhcy5mb3JFYWNoKGkgPT4ge1xyXG4gICAgICAgIGJhc2ljSW5wdXRzLnNldChpLCBwKVxyXG4gICAgICAgIGlmIChzaXplc1tpbnB1dF0pIHNpemVzW2ldID0gc2l6ZXNbaW5wdXRdXHJcbiAgICAgIH0pXHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbmdsb2Iuc3luYyhwYXRoLmpvaW4oaW1nUGF0aCwgJ2dhbWVzLyonKSlcclxuICAuZm9yRWFjaChwID0+IHtcclxuICAgIGNvbnN0IHsgYmFzZSB9ID0gcGF0aC5wYXJzZShwYXRoLnJlbGF0aXZlKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMnKSwgcCkpXHJcbiAgICBnYW1lSW5wdXRzLnNldChiYXNlLCBuZXcgTWFwKCkpXHJcblxyXG4gICAgZ2xvYi5zeW5jKHBhdGguam9pbihpbWdQYXRoLCAnZ2FtZXMnLCBiYXNlLCAnKionKSwgeyBub2RpcjogdHJ1ZSB9KVxyXG4gICAgICAuZm9yRWFjaChpbnB1dCA9PiB7XHJcbiAgICAgICAgY29uc3QgeyBuYW1lIH0gPSBwYXRoLnBhcnNlKGlucHV0KVxyXG4gICAgICAgIGdhbWVJbnB1dHMuZ2V0KGJhc2UpLnNldChuYW1lLCBpbnB1dClcclxuICAgICAgfSlcclxuXHJcbiAgICBjb25zdCBhbGlhcyA9IGFsaWFzZXMuaW5wdXRzLmdhbWVzW2Jhc2VdXHJcblxyXG4gICAgaWYgKGFsaWFzKSB7XHJcbiAgICAgIGZvciAoY29uc3QgW2EsIHNdIG9mIE9iamVjdC5lbnRyaWVzKGFsaWFzKSkge1xyXG4gICAgICAgIGdhbWVJbnB1dHMuZ2V0KGJhc2UpLnNldChhLCBzKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfSlcclxuXHJcbmZ1bmN0aW9uIHNvbHZlSW5wdXQgKGlucHV0cywgaW5wdXQpIHtcclxuICBpZiAoaW5wdXRzLmhhcyhpbnB1dCkpIHJldHVybiBpc1N0cmluZyhpbnB1dHMuZ2V0KGlucHV0KSkgPyBbaW5wdXRdIDogaW5wdXRzLmdldChpbnB1dClcclxuXHJcbiAgZm9yIChsZXQgaSA9IDA7IGkgPCBpbnB1dC5sZW5ndGg7IGkrKykge1xyXG4gICAgY29uc3QgczEgPSBpbnB1dC5zbGljZSgwLCAwIC0gaSlcclxuXHJcbiAgICBpZiAoaW5wdXRzLmhhcyhzMSkpIHtcclxuICAgICAgY29uc3QgcmVzdWx0ID0gaW5wdXRzLmdldChzMSlcclxuICAgICAgY29uc3QgcmVtYWluaW5nID0gc29sdmVJbnB1dChpbnB1dHMsIGlucHV0LnNsaWNlKDAgLSBpKSlcclxuXHJcbiAgICAgIHJldHVybiBpc1N0cmluZyhyZXN1bHQpID8gW3MxLCAuLi5yZW1haW5pbmddIDogWy4uLnJlc3VsdCwgLi4ucmVtYWluaW5nXVxyXG4gICAgfVxyXG4gIH1cclxuXHJcbiAgdGhyb3cgbmV3IEVycm9yKGBDYW5ub3QgZmluZCBcIiR7aW5wdXR9XCIgYXMgYSByZWNvZ25pemFibGUgaW5wdXRgKVxyXG59XHJcblxyXG5hc3luYyBmdW5jdGlvbiBzZW5kSW5wdXQgKGlucHV0cywgcmVzdWx0LCBtZXNzYWdlLCBjYXB0aW9uKSB7XHJcbiAgY29uc3Qgd2lkdGggPSByZXN1bHQubWFwKGl0ID0+IHNpemVzW2l0XSB8fCAxNTIpLnJlZHVjZSgoYSwgYikgPT4gYSArIGIsIDApXHJcbiAgY29uc3QgaW1hZ2VzID0gW11cclxuICBsZXQgbGVmdCA9IDBcclxuXHJcbiAgcmVzdWx0LmZvckVhY2goKGl0LCBpbmRleCkgPT4ge1xyXG4gICAgY29uc3Qgc2l6ZSA9IHNpemVzW2l0XSB8fCAxNTJcclxuICAgIGltYWdlcy5wdXNoKHsgaW5wdXQ6IGlucHV0cy5nZXQoaXQpLCBsZWZ0LCB0b3A6IE1hdGguZmxvb3IoKDE1MiAtIHNpemUpIC8gMikgfSlcclxuICAgIGxlZnQgKz0gc2l6ZVxyXG4gIH0pXHJcblxyXG4gIGxldCBjYW52YXMgPSBzaGFycCh7IGNyZWF0ZTogeyB3aWR0aCwgaGVpZ2h0OiAxNTIsIGNoYW5uZWxzOiA0LCBiYWNrZ3JvdW5kOiAndHJhbnNwYXJlbnQnIH0gfSlcclxuICAgIC5wbmcoKVxyXG4gICAgLmNvbXBvc2l0ZShpbWFnZXMpXHJcblxyXG4gIGNhbnZhcyA9IGF3YWl0IGNhbnZhcy50b0J1ZmZlcigpXHJcblxyXG4gIGlmIChyZXN1bHQubGVuZ3RoIDwgMTIpIGNhbnZhcyA9IGF3YWl0IHNoYXJwKGNhbnZhcykucmVzaXplKHsgaGVpZ2h0OiA1NSB9KS5wbmcoKS50b0J1ZmZlcigpXHJcblxyXG4gIHJldHVybiBtZXNzYWdlLnJlcGx5KHsgY29udGVudDogY2FwdGlvbiwgZmlsZXM6IFtjYW52YXNdIH0pXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGNoZWNrR2FtZSAoZ2FtZSkge1xyXG4gIHJldHVybiBnYW1lSW5wdXRzLmhhcyhnYW1lKSA/IGdhbWUgOiBhbGlhc2VzLmdhbWVzW2dhbWVdXHJcbn1cclxuXHJcbmZ1bmN0aW9uIGlzU3RyaW5nICh4KSB7XHJcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh4KSA9PT0gJ1tvYmplY3QgU3RyaW5nXSdcclxufVxyXG5cclxuZXhwb3J0IGRlZmF1bHQge1xyXG4gIG5hbWU6ICdmZy1ub3RhdGlvbicsXHJcbiAgYWJvdXQ6IHtcclxuICAgIG5hbWU6ICdGRyBOb3RhdGlvbicsXHJcbiAgICB2YWx1ZTogJ1tJbnN0cnVjdGlvbnMgYW5kIHNvdXJjZSBjb2RlXShodHRwczovL2xvdHVzLmNoaXRvd2FybG9jay5jb20vZmdub3RhdGlvbilcXG5bSW5maWxcXCdzIEZpZ2h0aW5nIEdhbWUgR2xvc3NhcnldKGh0dHBzOi8vZ2xvc3NhcnkuaW5maWwubmV0KVxcbltNYWdpY2lhblN0dWZmXFwncyBGaWdodGhpbmcgR2FtZSBub3RhdGlvbnMgZW1vdGVzXShodHRwczovL3R3aXR0ZXIuY29tL01hZ2ljaWFuU3R1ZmYvc3RhdHVzLzE0Nzc5MzEwNTQ0ODQ4OTM2OTcpJ1xyXG4gIH0sXHJcbiAgaW50ZW50czogWydHVUlMRF9NRVNTQUdFUyddLFxyXG4gIHBhcnRpYWxzOiBbJ01FU1NBR0UnXSxcclxuXHJcbiAgcHJlbG9hZDogc2VxdWVsaXplID0+IHtcclxuICAgIHNlcXVlbGl6ZS5kZWZpbmUoJ2ZnaW5wdXQnLCB7XHJcbiAgICAgIGd1aWxkOiB7XHJcbiAgICAgICAgdHlwZTogRGF0YVR5cGVzLlNUUklORyxcclxuICAgICAgICBwcmltYXJ5S2V5OiB0cnVlXHJcbiAgICAgIH0sXHJcbiAgICAgIG5hbWU6IHtcclxuICAgICAgICB0eXBlOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICAgIHByaW1hcnlLZXk6IHRydWVcclxuICAgICAgfSxcclxuICAgICAgY3JlYXRlZEJ5OiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBnYW1lOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBjYXB0aW9uOiBEYXRhVHlwZXMuU1RSSU5HLFxyXG4gICAgICBpbnB1dDogRGF0YVR5cGVzLlNUUklOR1xyXG4gICAgfSlcclxuICB9LFxyXG5cclxuICBldmVudHM6IHtcclxuICAgIGFzeW5jIG1lc3NhZ2VDcmVhdGUgKGdsb2JhbCwgbWVzc2FnZSkge1xyXG4gICAgICBjb25zdCB7IGNsaWVudCwgY29uZmlnLCBzZXF1ZWxpemUgfSA9IGdsb2JhbFxyXG4gICAgICBpZiAobWVzc2FnZS5hdXRob3IuaWQgPT09IGNsaWVudC51c2VyLmlkIHx8ICFtZXNzYWdlLm1lbWJlcikgcmV0dXJuXHJcblxyXG4gICAgICBjb25zdCBndWlsZElkID0gbWVzc2FnZS5ndWlsZElkXHJcbiAgICAgIGNvbnN0IHsgcHJlZml4IH0gPSBjb25maWdbZ3VpbGRJZF1cclxuXHJcbiAgICAgIGlmIChtZXNzYWdlLmNvbnRlbnQuc3RhcnRzV2l0aChwcmVmaXgpKSB7XHJcbiAgICAgICAgY29uc3QgbmFtZSA9IG1lc3NhZ2UuY29udGVudC5zcGxpdCgnICcpLnBvcCgpLnJlcGxhY2UocHJlZml4LCAnJylcclxuICAgICAgICBjb25zdCByb3cgPSBidWlsdGluW25hbWVdIHx8IChcclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5maW5kT25lKHtcclxuICAgICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgICAgfSlcclxuICAgICAgICApXHJcblxyXG4gICAgICAgIGlmIChyb3cpIHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChyb3cuZ2FtZSldKVxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcm93LmlucHV0LnNwbGl0KCcgJyksIG1lc3NhZ2UsIHJvdy5jYXB0aW9uKVxyXG4gICAgICAgIH1cclxuICAgICAgfVxyXG4gICAgfVxyXG4gIH0sXHJcblxyXG4gIGNvbW1hbmRzOiB7XHJcbiAgICBmZ2k6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2kgW2dhbWVdIFtpbnB1dHNdJyxcclxuICAgICAgZGVzYzogJ0NvbnZlcnRzIGEgbGlzdCBvZiBpbnB1dHMgaW50byBhbiBpbWFnZScsXHJcbiAgICAgIGV4YW1wbGU6ICdmZ2kgc2YgMjM2UCAyMTRLJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0gfSwgeyBtZXNzYWdlIH0pID0+IHtcclxuICAgICAgICBjb25zdCBbLCBnYW1lSW5wdXQsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXQgfHwgIWkxKSByZXR1cm4gbWVzc2FnZS5yZXBseSgnTWlzc2luZyBhcmd1bWVudHMuIEV4YW1wbGU6ID5mZ2kgc2YgMjM2UCAyMTRLJylcclxuXHJcbiAgICAgICAgY29uc3QgZ2FtZSA9IGNoZWNrR2FtZShnYW1lSW5wdXQpXHJcbiAgICAgICAgaWYgKCFnYW1lSW5wdXRzLmhhcyhnYW1lKSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFwiJHtnYW1lfVwiIGlzIG5vdCBhIHZhbGlkIGdhbWUuIEF2YWlsYWJsZSBnYW1lczogJHtBcnJheS5mcm9tKGdhbWVJbnB1dHMua2V5cygpKS5qb2luKCcgJyl9YClcclxuXHJcbiAgICAgICAgdHJ5IHtcclxuICAgICAgICAgIGNvbnN0IGlucHV0cyA9IG5ldyBNYXAoWy4uLmJhc2ljSW5wdXRzLCAuLi5nYW1lSW5wdXRzLmdldChnYW1lKV0pXHJcbiAgICAgICAgICBjb25zdCByZXN1bHQgPSBwYXJhbS5zbGljZSgyKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpXHJcblxyXG4gICAgICAgICAgc2VuZElucHV0KGlucHV0cywgcmVzdWx0LCBtZXNzYWdlKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgbWVzc2FnZS5yZXBseShlcnIubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ3NhdmU6IHtcclxuICAgICAgdXNhZ2U6ICdmZ3NhdmUgW2dhbWVdIFtuYW1lXSBbaW5wdXRzXScsXHJcbiAgICAgIGRlc2M6ICdTYXZlcyBhIGxpc3Qgb2YgaW5wdXRzIGludG8gYSBjb21tYW5kJyxcclxuICAgICAgZXhhbXBsZTogJ2ZnaSBzZiB0ZXN0TmFtZSAyMzZQIDIxNEsnLFxyXG4gICAgICBleGVjdXRlOiBhc3luYyAoeyBwYXJhbSwgc2VxdWVsaXplIH0sIHsgbWVzc2FnZSB9KSA9PiB7XHJcbiAgICAgICAgY29uc3QgWywgZ2FtZUlucHV0LCBuYW1lLCBpMV0gPSBwYXJhbVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0IHx8ICFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHNmIHRlc3ROYW1lIDIzNlAgMjE0SycpXHJcblxyXG4gICAgICAgIGNvbnN0IGdhbWUgPSBjaGVja0dhbWUoZ2FtZUlucHV0KVxyXG4gICAgICAgIGlmICghZ2FtZUlucHV0cy5oYXMoZ2FtZSkpIHJldHVybiBtZXNzYWdlLnJlcGx5KGBcIiR7Z2FtZX1cIiBpcyBub3QgYSB2YWxpZCBnYW1lLiBBdmFpbGFibGUgZ2FtZXM6ICR7QXJyYXkuZnJvbShnYW1lSW5wdXRzLmtleXMoKSkuam9pbignICcpfWApXHJcblxyXG4gICAgICAgIHRyeSB7XHJcbiAgICAgICAgICBjb25zdCBpbnB1dHMgPSBuZXcgTWFwKFsuLi5iYXNpY0lucHV0cywgLi4uZ2FtZUlucHV0cy5nZXQoZ2FtZSldKVxyXG4gICAgICAgICAgY29uc3QgaW5wdXQgPSBwYXJhbS5zbGljZSgzKS5tYXAoaSA9PiBzb2x2ZUlucHV0KGlucHV0cywgaS50b0xvd2VyQ2FzZSgpKSkuZmxhdCgpLmpvaW4oJyAnKVxyXG5cclxuICAgICAgICAgIGF3YWl0IHNlcXVlbGl6ZS5tb2RlbHMuZmdpbnB1dC5jcmVhdGUoeyBndWlsZDogbWVzc2FnZS5ndWlsZC5pZCwgbmFtZSwgY3JlYXRlZEJ5OiBtZXNzYWdlLmF1dGhvci5pZCwgZ2FtZSwgaW5wdXQgfSlcclxuXHJcbiAgICAgICAgICBtZXNzYWdlLmNoYW5uZWwuc2VuZChgU2F2ZWQgY29tbWFuZCBcIiR7aW5wdXR9XCIgYXMgXCIke25hbWV9XCJgKVxyXG4gICAgICAgIH0gY2F0Y2ggKGVycikge1xyXG4gICAgICAgICAgbWVzc2FnZS5yZXBseShlcnIubWVzc2FnZSlcclxuICAgICAgICB9XHJcbiAgICAgIH1cclxuICAgIH0sXHJcbiAgICBmZ2NhcHRpb246IHtcclxuICAgICAgdXNhZ2U6ICdmZ2NhcHRpb24gW25hbWVdIFtjYXB0aW9uXScsXHJcbiAgICAgIGRlc2M6ICdBZGRzIGEgY2FwdGlvbiB0byBhIHNhdmVkIGlucHV0IGNvbW1hbmQnLFxyXG4gICAgICBleGFtcGxlOiAnZmdjYXB0aW9uIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IFssIG5hbWUsIGkxXSA9IHBhcmFtXHJcbiAgICAgICAgaWYgKCFuYW1lIHx8ICFpMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoJ01pc3NpbmcgYXJndW1lbnRzLiBFeGFtcGxlOiA+ZmdpIHRlc3ROYW1lIFRoaXMgaXMgYSBjYXB0aW9uJylcclxuXHJcbiAgICAgICAgY29uc3Qgcm93ID0gYXdhaXQgc2VxdWVsaXplLm1vZGVscy5mZ2lucHV0LmZpbmRPbmUoe1xyXG4gICAgICAgICAgd2hlcmU6IHsgZ3VpbGQ6IG1lc3NhZ2UuZ3VpbGQuaWQsIG5hbWUgfVxyXG4gICAgICAgIH0pXHJcblxyXG4gICAgICAgIGlmICghcm93KSByZXR1cm4gbWVzc2FnZS5yZXBseShgXCIke25hbWV9XCIgaXMgbm90IGEgc2F2ZWQgaW5wdXQgbGlzdGApXHJcbiAgICAgICAgcm93LmNhcHRpb24gPSBwYXJhbS5zbGljZSgyKS5qb2luKCcgJylcclxuICAgICAgICBhd2FpdCByb3cuc2F2ZSgpXHJcblxyXG4gICAgICAgIG1lc3NhZ2UuY2hhbm5lbC5zZW5kKGBTYXZlZCBjYXB0aW9uIGZvciBpbnB1dCBsaXN0IFwiJHtuYW1lfVwiYClcclxuICAgICAgfVxyXG4gICAgfSxcclxuICAgIGZnZ2xvc3Nhcnk6IHtcclxuICAgICAgdXNhZ2U6ICdmZ2dsb3NzYXJ5IFtzZWFyY2ggdGVybV0nLFxyXG4gICAgICBkZXNjOiAnU2VhcmNoZXMgZm9yIGEgdGVybSBvbiBJbmZpbFxcJ3MgR2xvc3NhcnknLFxyXG4gICAgICBleGFtcGxlOiAnZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JyxcclxuICAgICAgZXhlY3V0ZTogYXN5bmMgKHsgcGFyYW0sIHNlcXVlbGl6ZSB9LCB7IG1lc3NhZ2UgfSkgPT4ge1xyXG4gICAgICAgIGNvbnN0IHBhcmFtcyA9IHBhcmFtLnNsaWNlKDEpXHJcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KCdNaXNzaW5nIHNlYXJjaCB0ZXJtLiBFeGFtcGxlOiA+ZmdnbG9zc2FyeSBtZXhpY2FuIHVwcGVyY3V0JylcclxuXHJcbiAgICAgICAgY29uc3Qgc2VhcmNoID0gcGFyYW1zLmpvaW4oJyAnKS50b0xvd2VyQ2FzZSgpXHJcbiAgICAgICAgY29uc3QgcmVzdWx0ID0gdGVybXMuZmlsdGVyKGkgPT4gaS5pbmNsdWRlcyhzZWFyY2gpKVxyXG4gICAgICAgIGNvbnN0IHVybCA9IGBodHRwczovL2dsb3NzYXJ5LmluZmlsLm5ldC8/dD0ke3BhcmFtcy5qb2luKCclMjAnKS50b0xvd2VyQ2FzZSgpfWBcclxuXHJcbiAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGggPT09IDApIHJldHVybiBtZXNzYWdlLnJlcGx5KGBUZXJtIFwiJHtzZWFyY2h9XCIgbm90IGZvdW5kYClcclxuICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aCA9PT0gMSkgcmV0dXJuIG1lc3NhZ2UucmVwbHkoYFxcYFxcYFxcYCR7Z2xvc3NhcnlbcmVzdWx0WzBdXS5kZWZ9XFxgXFxgXFxgU291cmNlOiA8JHt1cmx9PmApXHJcblxyXG4gICAgICAgIG1lc3NhZ2UucmVwbHkoYE11bHRpcGxlIHRlcm1zIGZvdW5kOiAke3VybH1gKVxyXG4gICAgICB9XHJcbiAgICB9XHJcbiAgfVxyXG59XHJcbiJdfQ==
package/dev/info.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "sizes": { "+": 55 },
3
+
4
+ "builtin": {
5
+ "37": {
6
+ "game": "sf",
7
+ "caption": "***LETS GO JUSTIN!***",
8
+ "input": "6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk"
9
+ }
10
+ },
11
+
12
+ "aliases": {
13
+ "games": {
14
+ "bbt": "bbtag",
15
+ "db": "dbz"
16
+ },
17
+
18
+ "inputs": {
19
+ "basic": {
20
+ "doubleforward": [">>"]
21
+ },
22
+
23
+ "games": {
24
+ "bbtag": {
25
+ "throw": ["b","+","c"],
26
+ "crb": ["d","+","p"],
27
+ "airdash": ["a","+","b"],
28
+ "reversal": ["a","+","d"]
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/lib/index.js CHANGED
@@ -9,10 +9,10 @@ exports["default"] = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
12
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
-
14
12
  var _toConsumableArray2 = _interopRequireDefault(require("@babel/runtime/helpers/toConsumableArray"));
15
13
 
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
16
  var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/asyncToGenerator"));
17
17
 
18
18
  var _sharp = _interopRequireDefault(require("sharp"));
@@ -25,6 +25,8 @@ var _sequelize = require("sequelize");
25
25
 
26
26
  var _bent = _interopRequireDefault(require("bent"));
27
27
 
28
+ var _info = require("./info.json");
29
+
28
30
  var getJSON = (0, _bent["default"])('json');
29
31
 
30
32
  var imgPath = _path["default"].join(__dirname, 'img');
@@ -77,27 +79,55 @@ _glob["default"].sync(_path["default"].join(imgPath, 'basic/**'), {
77
79
  }).forEach(function (p) {
78
80
  var input = p.split('/').pop().replace('.png', '');
79
81
  basicInputs.set(input, p);
80
- });
82
+ var alias = _info.aliases.inputs.basic[input];
81
83
 
82
- basicInputs.set('>>', _path["default"].join(imgPath, 'basic/doubleforward.png'));
84
+ if (alias) {
85
+ alias.forEach(function (i) {
86
+ basicInputs.set(i, p);
87
+ if (_info.sizes[input]) _info.sizes[i] = _info.sizes[input];
88
+ });
89
+ }
90
+ });
83
91
 
84
- _glob["default"].sync(_path["default"].join(imgPath, 'games/**'), {
85
- nodir: true
86
- }).forEach(function (p) {
92
+ _glob["default"].sync(_path["default"].join(imgPath, 'games/*')).forEach(function (p) {
87
93
  var _path$parse = _path["default"].parse(_path["default"].relative(_path["default"].join(imgPath, 'games'), p)),
88
- dir = _path$parse.dir,
89
- name = _path$parse.name;
94
+ base = _path$parse.base;
95
+
96
+ gameInputs.set(base, new Map());
90
97
 
91
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map());
92
- gameInputs.get(dir).set(name, p);
98
+ _glob["default"].sync(_path["default"].join(imgPath, 'games', base, '**'), {
99
+ nodir: true
100
+ }).forEach(function (input) {
101
+ var _path$parse2 = _path["default"].parse(input),
102
+ name = _path$parse2.name;
103
+
104
+ gameInputs.get(base).set(name, input);
105
+ });
106
+
107
+ var alias = _info.aliases.inputs.games[base];
108
+
109
+ if (alias) {
110
+ for (var _i = 0, _Object$entries = Object.entries(alias); _i < _Object$entries.length; _i++) {
111
+ var _Object$entries$_i = (0, _slicedToArray2["default"])(_Object$entries[_i], 2),
112
+ a = _Object$entries$_i[0],
113
+ s = _Object$entries$_i[1];
114
+
115
+ gameInputs.get(base).set(a, s);
116
+ }
117
+ }
93
118
  });
94
119
 
95
120
  function solveInput(inputs, input) {
96
- if (inputs.has(input)) return [input];
121
+ if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input);
97
122
 
98
123
  for (var i = 0; i < input.length; i++) {
99
124
  var s1 = input.slice(0, 0 - i);
100
- if (inputs.has(s1)) return [s1].concat((0, _toConsumableArray2["default"])(solveInput(inputs, input.slice(0 - i))));
125
+
126
+ if (inputs.has(s1)) {
127
+ var result = inputs.get(s1);
128
+ var remaining = solveInput(inputs, input.slice(0 - i));
129
+ return isString(result) ? [s1].concat((0, _toConsumableArray2["default"])(remaining)) : [].concat((0, _toConsumableArray2["default"])(result), (0, _toConsumableArray2["default"])(remaining));
130
+ }
101
131
  }
102
132
 
103
133
  throw new Error("Cannot find \"".concat(input, "\" as a recognizable input"));
@@ -109,37 +139,61 @@ function sendInput(_x, _x2, _x3, _x4) {
109
139
 
110
140
  function _sendInput() {
111
141
  _sendInput = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee7(inputs, result, message, caption) {
112
- var canvas;
142
+ var width, images, left, canvas;
113
143
  return _regenerator["default"].wrap(function _callee7$(_context7) {
114
144
  while (1) {
115
145
  switch (_context7.prev = _context7.next) {
116
146
  case 0:
117
- _context7.next = 2;
118
- return (0, _sharp["default"])({
147
+ width = result.map(function (it) {
148
+ return _info.sizes[it] || 152;
149
+ }).reduce(function (a, b) {
150
+ return a + b;
151
+ }, 0);
152
+ images = [];
153
+ left = 0;
154
+ result.forEach(function (it, index) {
155
+ var size = _info.sizes[it] || 152;
156
+ images.push({
157
+ input: inputs.get(it),
158
+ left: left,
159
+ top: Math.floor((152 - size) / 2)
160
+ });
161
+ left += size;
162
+ });
163
+ canvas = (0, _sharp["default"])({
119
164
  create: {
120
- width: 152 * result.length,
165
+ width: width,
121
166
  height: 152,
122
167
  channels: 4,
123
168
  background: 'transparent'
124
169
  }
125
- }).composite(result.map(function (it, index) {
126
- return {
127
- input: inputs.get(it),
128
- left: index * 152,
129
- top: 0,
130
- width: 152,
131
- height: 152
132
- };
133
- })).png().toBuffer();
170
+ }).png().composite(images);
171
+ _context7.next = 7;
172
+ return canvas.toBuffer();
134
173
 
135
- case 2:
174
+ case 7:
136
175
  canvas = _context7.sent;
176
+
177
+ if (!(result.length < 12)) {
178
+ _context7.next = 12;
179
+ break;
180
+ }
181
+
182
+ _context7.next = 11;
183
+ return (0, _sharp["default"])(canvas).resize({
184
+ height: 55
185
+ }).png().toBuffer();
186
+
187
+ case 11:
188
+ canvas = _context7.sent;
189
+
190
+ case 12:
137
191
  return _context7.abrupt("return", message.reply({
138
192
  content: caption,
139
193
  files: [canvas]
140
194
  }));
141
195
 
142
- case 4:
196
+ case 13:
143
197
  case "end":
144
198
  return _context7.stop();
145
199
  }
@@ -149,13 +203,14 @@ function _sendInput() {
149
203
  return _sendInput.apply(this, arguments);
150
204
  }
151
205
 
152
- var builtin = {
153
- 37: {
154
- game: 'sf',
155
- caption: '***LETS GO JUSTIN!***',
156
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
157
- }
158
- };
206
+ function checkGame(game) {
207
+ return gameInputs.has(game) ? game : _info.aliases.games[game];
208
+ }
209
+
210
+ function isString(x) {
211
+ return Object.prototype.toString.call(x) === '[object String]';
212
+ }
213
+
159
214
  var _default = {
160
215
  name: 'fg-notation',
161
216
  about: {
@@ -207,7 +262,7 @@ var _default = {
207
262
  }
208
263
 
209
264
  name = message.content.split(' ').pop().replace(prefix, '');
210
- _context.t0 = builtin[name];
265
+ _context.t0 = _info.builtin[name];
211
266
 
212
267
  if (_context.t0) {
213
268
  _context.next = 12;
@@ -249,7 +304,7 @@ var _default = {
249
304
  example: 'fgi sf 236P 214K',
250
305
  execute: function () {
251
306
  var _execute = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee2(_ref, _ref2) {
252
- var param, message, _param, game, i1, inputs, result;
307
+ var param, message, _param, gameInput, i1, game, inputs, result;
253
308
 
254
309
  return _regenerator["default"].wrap(function _callee2$(_context2) {
255
310
  while (1) {
@@ -257,9 +312,9 @@ var _default = {
257
312
  case 0:
258
313
  param = _ref.param;
259
314
  message = _ref2.message;
260
- _param = (0, _slicedToArray2["default"])(param, 3), game = _param[1], i1 = _param[2];
315
+ _param = (0, _slicedToArray2["default"])(param, 3), gameInput = _param[1], i1 = _param[2];
261
316
 
262
- if (!(!game || !i1)) {
317
+ if (!(!gameInput || !i1)) {
263
318
  _context2.next = 5;
264
319
  break;
265
320
  }
@@ -267,21 +322,27 @@ var _default = {
267
322
  return _context2.abrupt("return", message.reply('Missing arguments. Example: >fgi sf 236P 214K'));
268
323
 
269
324
  case 5:
325
+ game = checkGame(gameInput);
326
+
270
327
  if (gameInputs.has(game)) {
271
- _context2.next = 7;
328
+ _context2.next = 8;
272
329
  break;
273
330
  }
274
331
 
275
332
  return _context2.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
276
333
 
277
- case 7:
278
- inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
279
- result = param.slice(2).map(function (i) {
280
- return solveInput(inputs, i.toLowerCase());
281
- }).flat();
282
- sendInput(inputs, result, message);
334
+ case 8:
335
+ try {
336
+ inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
337
+ result = param.slice(2).map(function (i) {
338
+ return solveInput(inputs, i.toLowerCase());
339
+ }).flat();
340
+ sendInput(inputs, result, message);
341
+ } catch (err) {
342
+ message.reply(err.message);
343
+ }
283
344
 
284
- case 10:
345
+ case 9:
285
346
  case "end":
286
347
  return _context2.stop();
287
348
  }
@@ -302,7 +363,7 @@ var _default = {
302
363
  example: 'fgi sf testName 236P 214K',
303
364
  execute: function () {
304
365
  var _execute2 = (0, _asyncToGenerator2["default"])( /*#__PURE__*/_regenerator["default"].mark(function _callee3(_ref3, _ref4) {
305
- var param, sequelize, message, _param2, game, name, i1, inputs, input;
366
+ var param, sequelize, message, _param2, gameInput, name, i1, game, inputs, input;
306
367
 
307
368
  return _regenerator["default"].wrap(function _callee3$(_context3) {
308
369
  while (1) {
@@ -310,9 +371,9 @@ var _default = {
310
371
  case 0:
311
372
  param = _ref3.param, sequelize = _ref3.sequelize;
312
373
  message = _ref4.message;
313
- _param2 = (0, _slicedToArray2["default"])(param, 4), game = _param2[1], name = _param2[2], i1 = _param2[3];
374
+ _param2 = (0, _slicedToArray2["default"])(param, 4), gameInput = _param2[1], name = _param2[2], i1 = _param2[3];
314
375
 
315
- if (!(!game || !name || !i1)) {
376
+ if (!(!gameInput || !name || !i1)) {
316
377
  _context3.next = 5;
317
378
  break;
318
379
  }
@@ -320,19 +381,22 @@ var _default = {
320
381
  return _context3.abrupt("return", message.reply('Missing arguments. Example: >fgi sf testName 236P 214K'));
321
382
 
322
383
  case 5:
384
+ game = checkGame(gameInput);
385
+
323
386
  if (gameInputs.has(game)) {
324
- _context3.next = 7;
387
+ _context3.next = 8;
325
388
  break;
326
389
  }
327
390
 
328
391
  return _context3.abrupt("return", message.reply("\"".concat(game, "\" is not a valid game. Available games: ").concat(Array.from(gameInputs.keys()).join(' '))));
329
392
 
330
- case 7:
393
+ case 8:
394
+ _context3.prev = 8;
331
395
  inputs = new Map([].concat((0, _toConsumableArray2["default"])(basicInputs), (0, _toConsumableArray2["default"])(gameInputs.get(game))));
332
396
  input = param.slice(3).map(function (i) {
333
397
  return solveInput(inputs, i.toLowerCase());
334
398
  }).flat().join(' ');
335
- _context3.next = 11;
399
+ _context3.next = 13;
336
400
  return sequelize.models.fginput.create({
337
401
  guild: message.guild.id,
338
402
  name: name,
@@ -341,15 +405,22 @@ var _default = {
341
405
  input: input
342
406
  });
343
407
 
344
- case 11:
408
+ case 13:
345
409
  message.channel.send("Saved command \"".concat(input, "\" as \"").concat(name, "\""));
410
+ _context3.next = 19;
411
+ break;
346
412
 
347
- case 12:
413
+ case 16:
414
+ _context3.prev = 16;
415
+ _context3.t0 = _context3["catch"](8);
416
+ message.reply(_context3.t0.message);
417
+
418
+ case 19:
348
419
  case "end":
349
420
  return _context3.stop();
350
421
  }
351
422
  }
352
- }, _callee3);
423
+ }, _callee3, null, [[8, 16]]);
353
424
  }));
354
425
 
355
426
  function execute(_x7, _x8) {
package/lib/info.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "sizes": { "+": 55 },
3
+
4
+ "builtin": {
5
+ "37": {
6
+ "game": "sf",
7
+ "caption": "***LETS GO JUSTIN!***",
8
+ "input": "6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk"
9
+ }
10
+ },
11
+
12
+ "aliases": {
13
+ "games": {
14
+ "bbt": "bbtag",
15
+ "db": "dbz"
16
+ },
17
+
18
+ "inputs": {
19
+ "basic": {
20
+ "doubleforward": [">>"]
21
+ },
22
+
23
+ "games": {
24
+ "bbtag": {
25
+ "throw": ["b","+","c"],
26
+ "crb": ["d","+","p"],
27
+ "airdash": ["a","+","b"],
28
+ "reversal": ["a","+","d"]
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }
package/package.json CHANGED
@@ -1,20 +1,22 @@
1
1
  {
2
2
  "name": "@lotus-tree/fg-notation",
3
- "version": "1.1.4",
3
+ "version": "1.2.0",
4
4
  "main": "lib/index.js",
5
5
  "module": "src/index.js",
6
6
  "scripts": {
7
7
  "run-babel": "babel --delete-dir-on-start --copy-files src",
8
8
  "build": "yarn run run-babel --out-dir lib",
9
- "dev": "yarn run run-babel --watch --out-dir dev",
9
+ "dev": "yarn run run-babel --watch --source-maps inline --out-dir dev",
10
10
  "prepublishOnly": "yarn build"
11
11
  },
12
12
  "dependencies": {
13
- "@lotus-tree/command-handler": "^2.1.0",
14
13
  "bent": "^7.3.12",
15
14
  "glob": "^7.2.0",
16
15
  "sharp": "^0.29.3"
17
16
  },
17
+ "peerDependencies": {
18
+ "@lotus-tree/command-handler": "^2.1.0"
19
+ },
18
20
  "devDependencies": {
19
21
  "@babel/cli": "^7.16.7",
20
22
  "@babel/core": "^7.16.7",
Binary file
Binary file
Binary file
Binary file
Binary file
Binary file
package/src/index.js CHANGED
@@ -4,6 +4,8 @@ import glob from 'glob'
4
4
  import { DataTypes } from 'sequelize'
5
5
  import bent from 'bent'
6
6
 
7
+ import { sizes, aliases, builtin } from './info.json'
8
+
7
9
  const getJSON = bent('json')
8
10
  const imgPath = path.join(__dirname, 'img')
9
11
  const basicInputs = new Map()
@@ -34,46 +36,81 @@ glob.sync(path.join(imgPath, 'basic/**'), { nodir: true })
34
36
  .forEach(p => {
35
37
  const input = p.split('/').pop().replace('.png', '')
36
38
  basicInputs.set(input, p)
37
- })
38
39
 
39
- basicInputs.set('>>', path.join(imgPath, 'basic/doubleforward.png'))
40
+ const alias = aliases.inputs.basic[input]
41
+ if (alias) {
42
+ alias.forEach(i => {
43
+ basicInputs.set(i, p)
44
+ if (sizes[input]) sizes[i] = sizes[input]
45
+ })
46
+ }
47
+ })
40
48
 
41
- glob.sync(path.join(imgPath, 'games/**'), { nodir: true })
49
+ glob.sync(path.join(imgPath, 'games/*'))
42
50
  .forEach(p => {
43
- const { dir, name } = path.parse(path.relative(path.join(imgPath, 'games'), p))
51
+ const { base } = path.parse(path.relative(path.join(imgPath, 'games'), p))
52
+ gameInputs.set(base, new Map())
53
+
54
+ glob.sync(path.join(imgPath, 'games', base, '**'), { nodir: true })
55
+ .forEach(input => {
56
+ const { name } = path.parse(input)
57
+ gameInputs.get(base).set(name, input)
58
+ })
59
+
60
+ const alias = aliases.inputs.games[base]
44
61
 
45
- if (!gameInputs.has(dir)) gameInputs.set(dir, new Map())
46
- gameInputs.get(dir).set(name, p)
62
+ if (alias) {
63
+ for (const [a, s] of Object.entries(alias)) {
64
+ gameInputs.get(base).set(a, s)
65
+ }
66
+ }
47
67
  })
48
68
 
49
69
  function solveInput (inputs, input) {
50
- if (inputs.has(input)) return [input]
70
+ if (inputs.has(input)) return isString(inputs.get(input)) ? [input] : inputs.get(input)
51
71
 
52
72
  for (let i = 0; i < input.length; i++) {
53
73
  const s1 = input.slice(0, 0 - i)
54
- if (inputs.has(s1)) return [s1, ...solveInput(inputs, input.slice(0 - i))]
74
+
75
+ if (inputs.has(s1)) {
76
+ const result = inputs.get(s1)
77
+ const remaining = solveInput(inputs, input.slice(0 - i))
78
+
79
+ return isString(result) ? [s1, ...remaining] : [...result, ...remaining]
80
+ }
55
81
  }
56
82
 
57
83
  throw new Error(`Cannot find "${input}" as a recognizable input`)
58
84
  }
59
85
 
60
86
  async function sendInput (inputs, result, message, caption) {
61
- const canvas = await sharp({ create: { width: 152 * result.length, height: 152, channels: 4, background: 'transparent' } })
62
- .composite(result.map((it, index) =>
63
- ({ input: inputs.get(it), left: index * 152, top: 0, width: 152, height: 152 })
64
- ))
87
+ const width = result.map(it => sizes[it] || 152).reduce((a, b) => a + b, 0)
88
+ const images = []
89
+ let left = 0
90
+
91
+ result.forEach((it, index) => {
92
+ const size = sizes[it] || 152
93
+ images.push({ input: inputs.get(it), left, top: Math.floor((152 - size) / 2) })
94
+ left += size
95
+ })
96
+
97
+ let canvas = sharp({ create: { width, height: 152, channels: 4, background: 'transparent' } })
65
98
  .png()
66
- .toBuffer()
99
+ .composite(images)
100
+
101
+ canvas = await canvas.toBuffer()
102
+
103
+ if (result.length < 12) canvas = await sharp(canvas).resize({ height: 55 }).png().toBuffer()
67
104
 
68
105
  return message.reply({ content: caption, files: [canvas] })
69
106
  }
70
107
 
71
- const builtin = {
72
- 37: {
73
- game: 'sf',
74
- caption: '***LETS GO JUSTIN!***',
75
- input: '6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk'
76
- }
108
+ function checkGame (game) {
109
+ return gameInputs.has(game) ? game : aliases.games[game]
110
+ }
111
+
112
+ function isString (x) {
113
+ return Object.prototype.toString.call(x) === '[object String]'
77
114
  }
78
115
 
79
116
  export default {
@@ -132,14 +169,20 @@ export default {
132
169
  desc: 'Converts a list of inputs into an image',
133
170
  example: 'fgi sf 236P 214K',
134
171
  execute: async ({ param }, { message }) => {
135
- const [, game, i1] = param
136
- if (!game || !i1) return message.reply('Missing arguments. Example: >fgi sf 236P 214K')
172
+ const [, gameInput, i1] = param
173
+ if (!gameInput || !i1) return message.reply('Missing arguments. Example: >fgi sf 236P 214K')
174
+
175
+ const game = checkGame(gameInput)
137
176
  if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
138
177
 
139
- const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
140
- const result = param.slice(2).map(i => solveInput(inputs, i.toLowerCase())).flat()
178
+ try {
179
+ const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
180
+ const result = param.slice(2).map(i => solveInput(inputs, i.toLowerCase())).flat()
141
181
 
142
- sendInput(inputs, result, message)
182
+ sendInput(inputs, result, message)
183
+ } catch (err) {
184
+ message.reply(err.message)
185
+ }
143
186
  }
144
187
  },
145
188
  fgsave: {
@@ -147,16 +190,22 @@ export default {
147
190
  desc: 'Saves a list of inputs into a command',
148
191
  example: 'fgi sf testName 236P 214K',
149
192
  execute: async ({ param, sequelize }, { message }) => {
150
- const [, game, name, i1] = param
151
- if (!game || !name || !i1) return message.reply('Missing arguments. Example: >fgi sf testName 236P 214K')
193
+ const [, gameInput, name, i1] = param
194
+ if (!gameInput || !name || !i1) return message.reply('Missing arguments. Example: >fgi sf testName 236P 214K')
195
+
196
+ const game = checkGame(gameInput)
152
197
  if (!gameInputs.has(game)) return message.reply(`"${game}" is not a valid game. Available games: ${Array.from(gameInputs.keys()).join(' ')}`)
153
198
 
154
- const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
155
- const input = param.slice(3).map(i => solveInput(inputs, i.toLowerCase())).flat().join(' ')
199
+ try {
200
+ const inputs = new Map([...basicInputs, ...gameInputs.get(game)])
201
+ const input = param.slice(3).map(i => solveInput(inputs, i.toLowerCase())).flat().join(' ')
156
202
 
157
- await sequelize.models.fginput.create({ guild: message.guild.id, name, createdBy: message.author.id, game, input })
203
+ await sequelize.models.fginput.create({ guild: message.guild.id, name, createdBy: message.author.id, game, input })
158
204
 
159
- message.channel.send(`Saved command "${input}" as "${name}"`)
205
+ message.channel.send(`Saved command "${input}" as "${name}"`)
206
+ } catch (err) {
207
+ message.reply(err.message)
208
+ }
160
209
  }
161
210
  },
162
211
  fgcaption: {
package/src/info.json ADDED
@@ -0,0 +1,33 @@
1
+ {
2
+ "sizes": { "+": 55 },
3
+
4
+ "builtin": {
5
+ "37": {
6
+ "game": "sf",
7
+ "caption": "***LETS GO JUSTIN!***",
8
+ "input": "6 6 6 6 6 6 6 >> 6 6 6 6 6 6 6 >> 8 6 j. hk >> 2 mk >> 623 mp >> 236 236 lk"
9
+ }
10
+ },
11
+
12
+ "aliases": {
13
+ "games": {
14
+ "bbt": "bbtag",
15
+ "db": "dbz"
16
+ },
17
+
18
+ "inputs": {
19
+ "basic": {
20
+ "doubleforward": [">>"]
21
+ },
22
+
23
+ "games": {
24
+ "bbtag": {
25
+ "throw": ["b","+","c"],
26
+ "crb": ["d","+","p"],
27
+ "airdash": ["a","+","b"],
28
+ "reversal": ["a","+","d"]
29
+ }
30
+ }
31
+ }
32
+ }
33
+ }