@konoui/mjimage 0.0.1 → 0.0.2

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 (90) hide show
  1. package/README.md +2 -2
  2. package/dist/mjs/cmd/index.d.ts +1 -0
  3. package/dist/mjs/cmd/index.js +49 -0
  4. package/dist/mjs/index.d.ts +1 -1
  5. package/dist/mjs/index.js +1 -1
  6. package/dist/mjs/lib/calculator/index.d.ts +284 -0
  7. package/dist/mjs/lib/calculator/index.js +1390 -0
  8. package/dist/mjs/lib/constants.d.ts +22 -2
  9. package/dist/mjs/lib/constants.js +28 -9
  10. package/dist/mjs/lib/controller/controller.d.ts +223 -0
  11. package/dist/mjs/lib/controller/controller.js +862 -0
  12. package/dist/mjs/lib/controller/efficiency.d.ts +36 -0
  13. package/dist/mjs/lib/controller/efficiency.js +217 -0
  14. package/dist/mjs/lib/controller/events.d.ts +172 -0
  15. package/dist/mjs/lib/controller/events.js +102 -0
  16. package/dist/mjs/lib/controller/game.d.ts +5 -0
  17. package/dist/mjs/lib/controller/game.js +29 -0
  18. package/dist/mjs/lib/controller/index.d.ts +10 -0
  19. package/dist/mjs/lib/controller/index.js +26 -0
  20. package/dist/mjs/lib/controller/managers.d.ts +89 -0
  21. package/dist/mjs/lib/controller/managers.js +212 -0
  22. package/dist/mjs/lib/controller/player.d.ts +12 -0
  23. package/dist/mjs/lib/controller/player.js +88 -0
  24. package/dist/mjs/lib/controller/replay.d.ts +10 -0
  25. package/dist/mjs/lib/controller/replay.js +34 -0
  26. package/dist/mjs/lib/controller/river.d.ts +19 -0
  27. package/dist/mjs/lib/controller/river.js +55 -0
  28. package/dist/mjs/lib/controller/state-machine.d.ts +116 -0
  29. package/dist/mjs/lib/controller/state-machine.js +733 -0
  30. package/dist/mjs/lib/controller/wall.d.ts +30 -0
  31. package/dist/mjs/lib/controller/wall.js +115 -0
  32. package/dist/mjs/lib/image.d.ts +3 -2
  33. package/dist/mjs/lib/image.js +78 -17
  34. package/dist/mjs/lib/lexer.d.ts +2 -1
  35. package/dist/mjs/lib/lexer.js +7 -0
  36. package/dist/mjs/lib/measure-text.d.ts +19 -0
  37. package/dist/mjs/lib/measure-text.js +52 -0
  38. package/dist/mjs/lib/mjai/event.d.ts +117 -0
  39. package/dist/mjs/lib/mjai/event.js +348 -0
  40. package/dist/mjs/lib/mjimage.js +3 -5
  41. package/dist/mjs/lib/parser.d.ts +51 -7
  42. package/dist/mjs/lib/parser.js +276 -42
  43. package/dist/mjs/lib/table-parser.d.ts +8 -6
  44. package/dist/mjs/lib/table-parser.js +12 -11
  45. package/dist/mjs/lib/table.d.ts +1 -1
  46. package/package.json +16 -8
  47. package/dist/index.html +0 -17763
  48. package/dist/mjs/lib/context.d.ts +0 -12
  49. package/dist/mjs/lib/context.js +0 -33
  50. package/dist/svg/_0.svg +0 -1
  51. package/dist/svg/m0.svg +0 -1
  52. package/dist/svg/m1.svg +0 -1
  53. package/dist/svg/m2.svg +0 -1
  54. package/dist/svg/m3.svg +0 -1
  55. package/dist/svg/m4.svg +0 -1
  56. package/dist/svg/m5.svg +0 -1
  57. package/dist/svg/m6.svg +0 -1
  58. package/dist/svg/m7.svg +0 -1
  59. package/dist/svg/m8.svg +0 -1
  60. package/dist/svg/m9.svg +0 -1
  61. package/dist/svg/p0.svg +0 -1
  62. package/dist/svg/p1.svg +0 -1
  63. package/dist/svg/p2.svg +0 -1
  64. package/dist/svg/p3.svg +0 -1
  65. package/dist/svg/p4.svg +0 -1
  66. package/dist/svg/p5.svg +0 -1
  67. package/dist/svg/p6.svg +0 -1
  68. package/dist/svg/p7.svg +0 -1
  69. package/dist/svg/p8.svg +0 -1
  70. package/dist/svg/p9.svg +0 -1
  71. package/dist/svg/s0.svg +0 -1
  72. package/dist/svg/s1.svg +0 -1
  73. package/dist/svg/s2.svg +0 -1
  74. package/dist/svg/s3.svg +0 -1
  75. package/dist/svg/s4.svg +0 -1
  76. package/dist/svg/s5.svg +0 -1
  77. package/dist/svg/s6.svg +0 -1
  78. package/dist/svg/s7.svg +0 -1
  79. package/dist/svg/s8.svg +0 -1
  80. package/dist/svg/s9.svg +0 -1
  81. package/dist/svg/stick100.svg +0 -1
  82. package/dist/svg/stick1000.svg +0 -1
  83. package/dist/svg/z1.svg +0 -1
  84. package/dist/svg/z2.svg +0 -1
  85. package/dist/svg/z3.svg +0 -1
  86. package/dist/svg/z4.svg +0 -1
  87. package/dist/svg/z5.svg +0 -1
  88. package/dist/svg/z6.svg +0 -1
  89. package/dist/svg/z7.svg +0 -1
  90. package/dist/tiles.1417fc37.svg +0 -1
@@ -0,0 +1,1390 @@
1
+ "use strict";
2
+ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
3
+ if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
4
+ if (ar || !(i in from)) {
5
+ if (!ar) ar = Array.prototype.slice.call(from, 0, i);
6
+ ar[i] = from[i];
7
+ }
8
+ }
9
+ return to.concat(ar || Array.prototype.slice.call(from));
10
+ };
11
+ var __importDefault = (this && this.__importDefault) || function (mod) {
12
+ return (mod && mod.__esModule) ? mod : { "default": mod };
13
+ };
14
+ Object.defineProperty(exports, "__esModule", { value: true });
15
+ exports.DoubleCalculator = exports.TileCalculator = exports.ExShantenCalculator = exports.ShantenCalculator = exports.Hand = void 0;
16
+ var assert_1 = __importDefault(require("assert"));
17
+ var constants_1 = require("../constants");
18
+ var parser_1 = require("../parser");
19
+ var Hand = (function () {
20
+ function Hand(input) {
21
+ var _a;
22
+ this.data = (_a = {},
23
+ _a[constants_1.KIND.M] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
24
+ _a[constants_1.KIND.P] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
25
+ _a[constants_1.KIND.S] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0],
26
+ _a[constants_1.KIND.Z] = [0, 0, 0, 0, 0, 0, 0, 0],
27
+ _a[constants_1.KIND.BACK] = [0],
28
+ _a.called = [],
29
+ _a.reached = false,
30
+ _a.tsumo = null,
31
+ _a);
32
+ this.init(input);
33
+ }
34
+ Hand.prototype.init = function (input) {
35
+ var blocks = new parser_1.Parser(input).parse();
36
+ for (var _i = 0, blocks_1 = blocks; _i < blocks_1.length; _i++) {
37
+ var b = blocks_1[_i];
38
+ if (b.isCalled()) {
39
+ this.data.called.push(b);
40
+ continue;
41
+ }
42
+ else if (b.is(constants_1.BLOCK.TSUMO)) {
43
+ var t = b.tiles[0];
44
+ this.inc([t]);
45
+ this.data.tsumo = t;
46
+ continue;
47
+ }
48
+ else if (b.is(constants_1.BLOCK.HAND)) {
49
+ this.inc(b.tiles);
50
+ continue;
51
+ }
52
+ else if (input.split("").every(function (v) { return v === constants_1.KIND.BACK; })) {
53
+ this.inc(b.tiles);
54
+ continue;
55
+ }
56
+ throw new Error("unexpected block ".concat(b.type, " ").concat(b.toString()));
57
+ }
58
+ };
59
+ Object.defineProperty(Hand.prototype, "hands", {
60
+ get: function () {
61
+ var tiles = [];
62
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
63
+ var k = _a[_i];
64
+ for (var n = 0; n < this.getArrayLen(k); n++) {
65
+ var count = this.get(k, n);
66
+ if (k != constants_1.KIND.Z && n == 5)
67
+ count -= this.get(k, 0);
68
+ for (var i = 0; i < count; i++) {
69
+ tiles.push(new parser_1.Tile(k, n));
70
+ }
71
+ }
72
+ }
73
+ if (this.drawn != null) {
74
+ var idx = tiles.findIndex(function (t) { return t.equals(t); });
75
+ (0, assert_1.default)(idx >= 0, "hand has drawn: ".concat(this.drawn, " but no tile in hands"));
76
+ tiles[idx].add(constants_1.OPERATOR.TSUMO);
77
+ }
78
+ (0, assert_1.default)(tiles.length > 0, "no tiles in hand ".concat(tiles.length, ", called: ").concat(this.called, ", data: ").concat(JSON.stringify(this.data, null, 2)));
79
+ return tiles;
80
+ },
81
+ enumerable: false,
82
+ configurable: true
83
+ });
84
+ Hand.prototype.toString = function () {
85
+ var c = "";
86
+ for (var _i = 0, _a = this.called; _i < _a.length; _i++) {
87
+ var b_1 = _a[_i];
88
+ c = "".concat(c, ",").concat(b_1.toString());
89
+ }
90
+ var tiles = this.hands;
91
+ var b = new parser_1.Block(tiles, constants_1.BLOCK.HAND).toString();
92
+ return "".concat(b).concat(c);
93
+ };
94
+ Object.defineProperty(Hand.prototype, "called", {
95
+ get: function () {
96
+ return this.data.called.concat();
97
+ },
98
+ enumerable: false,
99
+ configurable: true
100
+ });
101
+ Object.defineProperty(Hand.prototype, "reached", {
102
+ get: function () {
103
+ return this.data.reached;
104
+ },
105
+ enumerable: false,
106
+ configurable: true
107
+ });
108
+ Object.defineProperty(Hand.prototype, "drawn", {
109
+ get: function () {
110
+ return this.data.tsumo;
111
+ },
112
+ enumerable: false,
113
+ configurable: true
114
+ });
115
+ Object.defineProperty(Hand.prototype, "menzen", {
116
+ get: function () {
117
+ return this.called.some(function (v) { return !(v instanceof parser_1.BlockAnKan); });
118
+ },
119
+ enumerable: false,
120
+ configurable: true
121
+ });
122
+ Hand.prototype.getArrayLen = function (k) {
123
+ return this.data[k].length;
124
+ };
125
+ Hand.prototype.sum = function (k) {
126
+ var sum = 0;
127
+ for (var n = 1; n < this.getArrayLen(k); n++)
128
+ sum += this.get(k, n);
129
+ return sum;
130
+ };
131
+ Hand.prototype.get = function (k, n) {
132
+ return this.data[k][n];
133
+ };
134
+ Hand.prototype.inc = function (tiles) {
135
+ var backup = [];
136
+ for (var _i = 0, tiles_1 = tiles; _i < tiles_1.length; _i++) {
137
+ var t = tiles_1[_i];
138
+ if (t.k != constants_1.KIND.BACK && this.get(t.k, t.n) > 4) {
139
+ this.dec(backup);
140
+ throw new Error("unable to increase ".concat(t, " in ").concat(this.toString()));
141
+ }
142
+ backup.push(t);
143
+ if (!(t.k == constants_1.KIND.Z || t.k == constants_1.KIND.BACK) && t.n == 0) {
144
+ this.data[t.k][5] += 1;
145
+ }
146
+ this.data[t.k][t.n] += 1;
147
+ if (t.k != constants_1.KIND.Z &&
148
+ t.n == 5 &&
149
+ this.get(t.k, 5) == 4 &&
150
+ this.get(t.k, 0) == 0) {
151
+ this.data[t.k][0] = 1;
152
+ var c = backup.pop().clone();
153
+ c.n = 0;
154
+ backup.push(c);
155
+ }
156
+ }
157
+ return backup;
158
+ };
159
+ Hand.prototype.dec = function (tiles) {
160
+ if (this.hands.every(function (t) { return t.k == constants_1.KIND.BACK; })) {
161
+ var toRemove = tiles.map(function (v) { return new parser_1.Tile(constants_1.KIND.BACK, 0); });
162
+ this.data[constants_1.KIND.BACK][0] -= tiles.length;
163
+ return toRemove;
164
+ }
165
+ var backup = [];
166
+ for (var _i = 0, tiles_2 = tiles; _i < tiles_2.length; _i++) {
167
+ var t = tiles_2[_i];
168
+ if (this.get(t.k, t.n) < 1) {
169
+ this.inc(backup);
170
+ throw new Error("unable to decrease ".concat(t.toString(), " in ").concat(this.toString()));
171
+ }
172
+ backup.push(t);
173
+ if (!(t.k == constants_1.KIND.Z || t.k == constants_1.KIND.BACK) && t.n == 0) {
174
+ this.data[t.k][5] -= 1;
175
+ }
176
+ this.data[t.k][t.n] -= 1;
177
+ if (t.k != constants_1.KIND.Z &&
178
+ t.n == 5 &&
179
+ this.get(t.k, 5) == 0 &&
180
+ this.get(t.k, 0) > 0) {
181
+ this.data[t.k][0] = 0;
182
+ var c = backup.pop().clone();
183
+ c.n = 0;
184
+ backup.push(c);
185
+ }
186
+ }
187
+ return backup;
188
+ };
189
+ Hand.prototype.draw = function (t) {
190
+ t.add(constants_1.OPERATOR.TSUMO);
191
+ this.inc([t]);
192
+ this.data.tsumo = t;
193
+ return;
194
+ };
195
+ Hand.prototype.discard = function (t) {
196
+ this.dec([t]);
197
+ this.data.tsumo = null;
198
+ return;
199
+ };
200
+ Hand.prototype.reach = function () {
201
+ if (!this.canReach)
202
+ throw new Error("cannot reach");
203
+ if (this.data.reached)
204
+ throw new Error("already reached");
205
+ this.data.reached = true;
206
+ };
207
+ Hand.prototype.call = function (b) {
208
+ if (!(b instanceof parser_1.BlockPon ||
209
+ b instanceof parser_1.BlockChi ||
210
+ b instanceof parser_1.BlockDaiKan))
211
+ throw new Error("unexpected input ".concat(b, " ").concat(b.type));
212
+ var toRemove = b.tiles.filter(function (v) { return !v.has(constants_1.OPERATOR.HORIZONTAL); });
213
+ if (toRemove.length != b.tiles.length - 1)
214
+ throw new Error("removal: ".concat(toRemove, " block: ").concat(b));
215
+ this.dec(toRemove);
216
+ this.data.called.push(b);
217
+ this.data.tsumo = null;
218
+ return;
219
+ };
220
+ Hand.prototype.kan = function (b) {
221
+ if (b instanceof parser_1.BlockAnKan) {
222
+ var t = b.tiles.filter(function (v) { return v.k != constants_1.KIND.BACK && v.n != 0; });
223
+ this.dec([t[0], t[0], t[0], t[0]]);
224
+ this.data.called.push(b);
225
+ this.data.tsumo = null;
226
+ return;
227
+ }
228
+ if (b instanceof parser_1.BlockShoKan) {
229
+ var idx = this.data.called.findIndex(function (v) { return v.is(constants_1.BLOCK.PON) && v.tiles[0].equals(b.tiles[0], true); });
230
+ if (idx == -1)
231
+ throw new Error("unable to find ".concat(b.tiles[0]));
232
+ var t = b.tiles[0].clone();
233
+ if (t.isNum() && t.n == 0) {
234
+ t = new parser_1.Tile(t.k, 5);
235
+ }
236
+ this.data.called.splice(idx, 1);
237
+ this.dec([t]);
238
+ this.data.called.push(b);
239
+ this.data.tsumo = null;
240
+ return;
241
+ }
242
+ throw new Error("unexpected input ".concat(b));
243
+ };
244
+ Object.defineProperty(Hand.prototype, "canReach", {
245
+ get: function () {
246
+ return this.called.filter(function (b) { return !(b instanceof parser_1.BlockAnKan); }).length == 0;
247
+ },
248
+ enumerable: false,
249
+ configurable: true
250
+ });
251
+ Hand.prototype.clone = function () {
252
+ var c = new Hand(this.toString());
253
+ c.data.called = this.called.map(function (b) { return b.clone(); });
254
+ c.data.reached = this.data.reached;
255
+ c.data.tsumo = this.data.tsumo == null ? null : this.data.tsumo.clone();
256
+ return c;
257
+ };
258
+ return Hand;
259
+ }());
260
+ exports.Hand = Hand;
261
+ var ShantenCalculator = (function () {
262
+ function ShantenCalculator(hand) {
263
+ this.hand = hand;
264
+ }
265
+ ShantenCalculator.prototype.calc = function () {
266
+ return Math.min(this.sevenPairs(), this.thirteenOrphans(), this.fourSetsOnePair());
267
+ };
268
+ ShantenCalculator.prototype.sevenPairs = function () {
269
+ if (this.hand.called.length > 0)
270
+ return Infinity;
271
+ var nPairs = 0;
272
+ var nIsolated = 0;
273
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
274
+ var k = _a[_i];
275
+ for (var n = 1; n < this.hand.getArrayLen(k); n++) {
276
+ if (this.hand.get(k, n) == 2)
277
+ nPairs++;
278
+ if (this.hand.get(k, n) == 1)
279
+ nIsolated++;
280
+ }
281
+ }
282
+ if (nPairs > 7)
283
+ nPairs = 7;
284
+ if (nPairs + nIsolated >= 7)
285
+ nIsolated = 7 - nPairs;
286
+ return 13 - 2 * nPairs - nIsolated;
287
+ };
288
+ ShantenCalculator.prototype.thirteenOrphans = function () {
289
+ if (this.hand.called.length > 0)
290
+ return Infinity;
291
+ var nOrphans = 0;
292
+ var nPairs = 0;
293
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
294
+ var k = _a[_i];
295
+ if (k == constants_1.KIND.BACK)
296
+ continue;
297
+ var nn = k == constants_1.KIND.Z ? [1, 2, 3, 4, 5, 6, 7] : [1, 9];
298
+ for (var _b = 0, nn_1 = nn; _b < nn_1.length; _b++) {
299
+ var n = nn_1[_b];
300
+ if (this.hand.get(k, n) >= 1)
301
+ nOrphans++;
302
+ if (this.hand.get(k, n) >= 2)
303
+ nPairs++;
304
+ }
305
+ }
306
+ return nPairs >= 1 ? 12 - nOrphans : 13 - nOrphans;
307
+ };
308
+ ShantenCalculator.prototype.fourSetsOnePair = function () {
309
+ var _this = this;
310
+ var calc = function (hasPair) {
311
+ var z = [0, 0, 0];
312
+ var k = constants_1.KIND.Z;
313
+ for (var n = 1; n < _this.hand.getArrayLen(k); n++) {
314
+ if (_this.hand.get(k, n) >= 3)
315
+ z[0]++;
316
+ else if (_this.hand.get(k, n) == 2)
317
+ z[1]++;
318
+ else if (_this.hand.get(k, n) == 1)
319
+ z[2]++;
320
+ }
321
+ var min = 13;
322
+ var mr = _this.commonByKind(constants_1.KIND.M);
323
+ var pr = _this.commonByKind(constants_1.KIND.P);
324
+ var sr = _this.commonByKind(constants_1.KIND.S);
325
+ for (var _i = 0, _a = [mr.patternA, mr.patternB]; _i < _a.length; _i++) {
326
+ var m = _a[_i];
327
+ for (var _b = 0, _c = [pr.patternA, pr.patternB]; _b < _c.length; _b++) {
328
+ var p = _c[_b];
329
+ for (var _d = 0, _e = [sr.patternA, sr.patternB]; _d < _e.length; _d++) {
330
+ var s = _e[_d];
331
+ var v = [_this.hand.called.length, 0, 0];
332
+ for (var i = 0; i < 3; i++) {
333
+ v[i] += m[i] + p[i] + s[i] + z[i];
334
+ }
335
+ var r = _this.calcCommon(v[0], v[1], v[2], hasPair);
336
+ if (r < min) {
337
+ min = r;
338
+ }
339
+ }
340
+ }
341
+ }
342
+ return min;
343
+ };
344
+ var min = calc(false);
345
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
346
+ var k = _a[_i];
347
+ for (var n = 1; n < this.hand.getArrayLen(k); n++) {
348
+ if (this.hand.get(k, n) >= 2) {
349
+ var tiles = this.hand.dec([new parser_1.Tile(k, n), new parser_1.Tile(k, n)]);
350
+ var r = calc(true);
351
+ this.hand.inc(tiles);
352
+ if (r < min) {
353
+ min = r;
354
+ }
355
+ }
356
+ }
357
+ }
358
+ return min;
359
+ };
360
+ ShantenCalculator.prototype.commonByKind = function (k, n) {
361
+ if (n === void 0) { n = 1; }
362
+ if (n > 9)
363
+ return this.groupRemainingTiles(k);
364
+ var max = this.commonByKind(k, n + 1);
365
+ if (n <= 7 &&
366
+ this.hand.get(k, n) > 0 &&
367
+ this.hand.get(k, n + 1) > 0 &&
368
+ this.hand.get(k, n + 2) > 0) {
369
+ var tiles = this.hand.dec([
370
+ new parser_1.Tile(k, n),
371
+ new parser_1.Tile(k, n + 1),
372
+ new parser_1.Tile(k, n + 2),
373
+ ]);
374
+ var r = this.commonByKind(k, n);
375
+ this.hand.inc(tiles);
376
+ r.patternA[0]++, r.patternB[0]++;
377
+ if (r.patternA[2] < max.patternA[2] ||
378
+ (r.patternA[2] == max.patternA[2] && r.patternA[1] < max.patternA[1])) {
379
+ max.patternA = r.patternA;
380
+ }
381
+ if (r.patternB[0] > max.patternB[0] ||
382
+ (r.patternB[0] == max.patternB[0] && r.patternB[1] > max.patternB[1])) {
383
+ max.patternB = r.patternB;
384
+ }
385
+ }
386
+ if (this.hand.get(k, n) >= 3) {
387
+ var tiles = this.hand.dec([
388
+ new parser_1.Tile(k, n),
389
+ new parser_1.Tile(k, n),
390
+ new parser_1.Tile(k, n),
391
+ ]);
392
+ var r = this.commonByKind(k, n);
393
+ this.hand.inc(tiles);
394
+ r.patternA[0]++, r.patternB[0]++;
395
+ if (r.patternA[2] < max.patternA[2] ||
396
+ (r.patternA[2] == max.patternA[2] && r.patternA[1] < max.patternA[1])) {
397
+ max.patternA = r.patternA;
398
+ }
399
+ if (r.patternB[0] > max.patternB[0] ||
400
+ (r.patternB[0] == max.patternB[0] && r.patternB[1] > max.patternB[1])) {
401
+ max.patternB = r.patternB;
402
+ }
403
+ }
404
+ return max;
405
+ };
406
+ ShantenCalculator.prototype.groupRemainingTiles = function (k) {
407
+ var nSerialPairs = 0;
408
+ var nIsolated = 0;
409
+ var nTiles = 0;
410
+ for (var n = 1; n < this.hand.getArrayLen(k); n++) {
411
+ nTiles += this.hand.get(k, n);
412
+ if (n <= 7 &&
413
+ this.hand.get(k, n + 1) == 0 &&
414
+ this.hand.get(k, n + 2) == 0) {
415
+ nSerialPairs += nTiles >> 1;
416
+ nIsolated += nTiles % 2;
417
+ nTiles = 0;
418
+ }
419
+ }
420
+ nSerialPairs += nTiles >> 1;
421
+ nIsolated += nTiles % 2;
422
+ return {
423
+ patternA: [0, nSerialPairs, nIsolated],
424
+ patternB: [0, nSerialPairs, nIsolated],
425
+ };
426
+ };
427
+ ShantenCalculator.prototype.calcCommon = function (nSet, nSerialPair, nIsolated, hasPair) {
428
+ var n = hasPair ? 4 : 5;
429
+ if (nSet > 4) {
430
+ nSerialPair += nSet - 4;
431
+ nSet = 4;
432
+ }
433
+ if (nSet + nSerialPair > 4) {
434
+ nIsolated += nSet + nSerialPair - 4;
435
+ nSerialPair = 4 - nSet;
436
+ }
437
+ if (nSet + nSerialPair + nIsolated > n) {
438
+ nIsolated = n - nSet - nSerialPair;
439
+ }
440
+ if (hasPair)
441
+ nSerialPair++;
442
+ return 13 - nSet * 3 - nSerialPair * 2 - nIsolated;
443
+ };
444
+ return ShantenCalculator;
445
+ }());
446
+ exports.ShantenCalculator = ShantenCalculator;
447
+ var ExShantenCalculator = (function () {
448
+ function ExShantenCalculator(h) {
449
+ this.h = h;
450
+ this.c = new ShantenCalculator(h);
451
+ }
452
+ ExShantenCalculator.prototype.menzen = function () {
453
+ return this.h.menzen ? this.c.calc() : Number.POSITIVE_INFINITY;
454
+ };
455
+ ExShantenCalculator.prototype.yakuhai = function () {
456
+ var three = 0;
457
+ var vPon = null;
458
+ for (var _i = 0, _a = [1, 2, 3, 4, 5, 6, 7]; _i < _a.length; _i++) {
459
+ var n = _a[_i];
460
+ if (this.h.get(constants_1.KIND.Z, n) >= 3)
461
+ three++;
462
+ else if (this.h.get(constants_1.KIND.Z, n) == 2) {
463
+ var t = new parser_1.Tile(constants_1.KIND.Z, n);
464
+ vPon = new parser_1.BlockPon([t, t.clone(), t.clone()]);
465
+ }
466
+ else
467
+ for (var _b = 0, _c = this.h.called; _b < _c.length; _b++) {
468
+ var b = _c[_b];
469
+ if (b.tiles[0].k == constants_1.KIND.Z && b.tiles[0].n == n)
470
+ three++;
471
+ }
472
+ }
473
+ if (three > 0)
474
+ return this.c.calc();
475
+ if (vPon) {
476
+ var cloned = this.h.clone();
477
+ cloned.call(vPon);
478
+ return new ShantenCalculator(cloned).calc() + 1;
479
+ }
480
+ return Number.POSITIVE_INFINITY;
481
+ };
482
+ ExShantenCalculator.prototype.tanyao = function () { };
483
+ return ExShantenCalculator;
484
+ }());
485
+ exports.ExShantenCalculator = ExShantenCalculator;
486
+ var TileCalculator = (function () {
487
+ function TileCalculator(hand) {
488
+ this.hand = hand;
489
+ }
490
+ TileCalculator.prototype.calc = function (lastTile) {
491
+ if (this.hand.drawn != null)
492
+ lastTile = this.hand.drawn;
493
+ return this.markDrawn(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], this.sevenPairs(), true), this.thirteenOrphans(), true), this.nineGates(), true), this.fourSetsOnePair(), true), lastTile);
494
+ };
495
+ TileCalculator.prototype.markDrawn = function (hands, lastTile) {
496
+ if (hands.length == 0)
497
+ return [];
498
+ var op = this.hand.drawn != null
499
+ ? constants_1.OPERATOR.TSUMO
500
+ : lastTile.has(constants_1.OPERATOR.TSUMO)
501
+ ? constants_1.OPERATOR.TSUMO
502
+ : constants_1.OPERATOR.RON;
503
+ var indexes = [];
504
+ for (var i = 0; i < hands.length; i++) {
505
+ var hand = hands[i];
506
+ var m = {};
507
+ for (var j = 0; j < hand.length; j++) {
508
+ var block = hand[j];
509
+ if (block.isCalled())
510
+ continue;
511
+ var k = block.tiles.findIndex(function (t) { return t.equals(lastTile, true); });
512
+ if (k < 0)
513
+ continue;
514
+ var key = buildKey(block);
515
+ if (m[key])
516
+ continue;
517
+ m[key] = true;
518
+ indexes.push([i, j, k]);
519
+ }
520
+ }
521
+ if (indexes.length == 0)
522
+ throw new Error("found no tile ".concat(lastTile.toString(), " in hands ").concat(hands[0].toString()));
523
+ var newHands = [];
524
+ for (var _i = 0, indexes_1 = indexes; _i < indexes_1.length; _i++) {
525
+ var _a = indexes_1[_i], hidx = _a[0], bidx = _a[1], tidx = _a[2];
526
+ var hand = hands[hidx];
527
+ var newHand = hand.map(function (block) { return block.clone(); });
528
+ newHand[bidx].tiles[tidx].add(op);
529
+ newHands.push(newHand);
530
+ }
531
+ return newHands;
532
+ };
533
+ TileCalculator.prototype.sevenPairs = function () {
534
+ if (this.hand.called.length > 0)
535
+ return [];
536
+ var ret = [];
537
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
538
+ var k = _a[_i];
539
+ if (k == constants_1.KIND.BACK)
540
+ continue;
541
+ for (var n = 1; n < this.hand.getArrayLen(k); n++) {
542
+ var v = this.hand.get(k, n);
543
+ if (v == 2)
544
+ ret.push(new parser_1.BlockPair(new parser_1.Tile(k, n), new parser_1.Tile(k, n)));
545
+ else if (v == 0)
546
+ continue;
547
+ else
548
+ return [];
549
+ }
550
+ }
551
+ return [ret];
552
+ };
553
+ TileCalculator.prototype.thirteenOrphans = function () {
554
+ var ret = [];
555
+ var pairs = "";
556
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
557
+ var k = _a[_i];
558
+ if (k == constants_1.KIND.BACK)
559
+ continue;
560
+ var nn = k == constants_1.KIND.Z ? [1, 2, 3, 4, 5, 6, 7] : [1, 9];
561
+ for (var _b = 0, nn_2 = nn; _b < nn_2.length; _b++) {
562
+ var n = nn_2[_b];
563
+ if (this.hand.get(k, n) == 1)
564
+ ret.push(new parser_1.BlockIsolated(new parser_1.Tile(k, n)));
565
+ else if (this.hand.get(k, n) == 2 && pairs == "")
566
+ ret.unshift(new parser_1.BlockPair(new parser_1.Tile(k, n), new parser_1.Tile(k, n)));
567
+ else
568
+ return [];
569
+ }
570
+ }
571
+ return [ret];
572
+ };
573
+ TileCalculator.prototype.nineGates = function () {
574
+ var _this = this;
575
+ var cond = function (k, n, want) {
576
+ return want.includes(_this.hand.get(k, n));
577
+ };
578
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
579
+ var k = _a[_i];
580
+ if (k == constants_1.KIND.BACK)
581
+ continue;
582
+ if (k == constants_1.KIND.Z)
583
+ continue;
584
+ var cond1 = cond(k, 1, [3, 4]) &&
585
+ cond(k, 9, [3, 4]) &&
586
+ cond(k, 2, [1, 2]) &&
587
+ cond(k, 3, [1, 2]) &&
588
+ cond(k, 4, [1, 2]) &&
589
+ cond(k, 5, [1, 2]) &&
590
+ cond(k, 6, [1, 2]) &&
591
+ cond(k, 7, [1, 2]) &&
592
+ cond(k, 8, [1, 2]);
593
+ var cond2 = this.hand.sum(k) == 14;
594
+ if (cond1 && cond2) {
595
+ return [[new parser_1.Block(this.hand.hands, constants_1.BLOCK.HAND)]];
596
+ }
597
+ }
598
+ return [];
599
+ };
600
+ TileCalculator.prototype.fourSetsOnePair = function () {
601
+ var ret = [];
602
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
603
+ var k = _a[_i];
604
+ if (k == constants_1.KIND.BACK)
605
+ continue;
606
+ var _loop_1 = function (n) {
607
+ if (this_1.hand.get(k, n) >= 2) {
608
+ var tiles_3 = this_1.hand.dec([new parser_1.Tile(k, n), new parser_1.Tile(k, n)]);
609
+ var v = this_1.commonAll()
610
+ .filter(function (arr) { return arr.length == 4; })
611
+ .map(function (arr) {
612
+ arr.unshift(new parser_1.BlockPair(tiles_3[0], tiles_3[1]));
613
+ return arr;
614
+ });
615
+ ret = __spreadArray(__spreadArray([], ret, true), v, true);
616
+ this_1.hand.inc(tiles_3);
617
+ }
618
+ };
619
+ var this_1 = this;
620
+ for (var n = 1; n < this.hand.getArrayLen(k); n++) {
621
+ _loop_1(n);
622
+ }
623
+ }
624
+ return ret;
625
+ };
626
+ TileCalculator.prototype.commonAll = function () {
627
+ var _this = this;
628
+ var handleZ = function () {
629
+ var z = [];
630
+ var k = constants_1.KIND.Z;
631
+ for (var n = 1; n < _this.hand.getArrayLen(k); n++) {
632
+ if (_this.hand.get(k, n) == 0)
633
+ continue;
634
+ else if (_this.hand.get(k, n) != 3)
635
+ return [];
636
+ z.push(new parser_1.BlockThree([new parser_1.Tile(k, n), new parser_1.Tile(k, n), new parser_1.Tile(k, n)]));
637
+ }
638
+ return z.length == 0 ? [] : [z];
639
+ };
640
+ var vvv = [
641
+ this.commonByKind(constants_1.KIND.M),
642
+ this.commonByKind(constants_1.KIND.P),
643
+ this.commonByKind(constants_1.KIND.S),
644
+ handleZ(),
645
+ [this.hand.called],
646
+ ].sort(function (a, b) { return b.length - a.length; });
647
+ var ret = vvv[0].concat();
648
+ for (var i = 0; i < ret.length; i++) {
649
+ for (var j = 1; j < vvv.length; j++) {
650
+ for (var _i = 0, _a = vvv[j]; _i < _a.length; _i++) {
651
+ var arr = _a[_i];
652
+ ret[i] = __spreadArray(__spreadArray([], ret[i], true), arr, true);
653
+ }
654
+ }
655
+ }
656
+ return ret;
657
+ };
658
+ TileCalculator.prototype.commonByKind = function (k, n) {
659
+ if (n === void 0) { n = 1; }
660
+ if (n > 9)
661
+ return [];
662
+ if (this.hand.get(k, n) == 0)
663
+ return this.commonByKind(k, n + 1);
664
+ var ret = [];
665
+ if (n <= 7 &&
666
+ this.hand.get(k, n) > 0 &&
667
+ this.hand.get(k, n + 1) > 0 &&
668
+ this.hand.get(k, n + 2) > 0) {
669
+ var tiles = this.hand.dec([
670
+ new parser_1.Tile(k, n),
671
+ new parser_1.Tile(k, n + 1),
672
+ new parser_1.Tile(k, n + 2),
673
+ ]);
674
+ var nested = this.commonByKind(k, n);
675
+ this.hand.inc(tiles);
676
+ if (nested.length == 0)
677
+ nested.push([]);
678
+ for (var _i = 0, nested_1 = nested; _i < nested_1.length; _i++) {
679
+ var arr = nested_1[_i];
680
+ arr.unshift(new parser_1.BlockRun([tiles[0], tiles[1], tiles[2]]));
681
+ ret.push(arr);
682
+ }
683
+ }
684
+ if (this.hand.get(k, n) == 3) {
685
+ var tiles = this.hand.dec([
686
+ new parser_1.Tile(k, n),
687
+ new parser_1.Tile(k, n),
688
+ new parser_1.Tile(k, n),
689
+ ]);
690
+ var nested = this.commonByKind(k, n);
691
+ this.hand.inc(tiles);
692
+ if (nested.length == 0)
693
+ nested.push([]);
694
+ for (var _a = 0, nested_2 = nested; _a < nested_2.length; _a++) {
695
+ var arr = nested_2[_a];
696
+ arr.unshift(new parser_1.BlockThree([tiles[0], tiles[1], tiles[2]]));
697
+ ret.push(arr);
698
+ }
699
+ }
700
+ return ret;
701
+ };
702
+ return TileCalculator;
703
+ }());
704
+ exports.TileCalculator = TileCalculator;
705
+ var DoubleCalculator = (function () {
706
+ function DoubleCalculator(hand, params) {
707
+ var _a, _b, _c, _d, _e, _f, _g;
708
+ this.hand = hand;
709
+ this.cfg = {
710
+ doras: params.doraMarkers.map(function (v) { return toDora(v); }),
711
+ blindDoras: params.blindDoraMarkers == null
712
+ ? []
713
+ : params.blindDoraMarkers.map(function (v) { return toDora(v); }),
714
+ roundWind: new parser_1.Parser(params.round.substring(0, 2)).parse()[0].tiles[0],
715
+ myWind: new parser_1.Parser(params.myWind).parse()[0].tiles[0],
716
+ reached: (_a = params.reached) !== null && _a !== void 0 ? _a : 0,
717
+ sticks: (_b = params.sticks) !== null && _b !== void 0 ? _b : { dead: 0, reach: 0 },
718
+ replacementWin: (_c = params.replacementWin) !== null && _c !== void 0 ? _c : false,
719
+ quadWin: (_d = params.quadWin) !== null && _d !== void 0 ? _d : false,
720
+ finalWallWin: (_e = params.finalWallWin) !== null && _e !== void 0 ? _e : false,
721
+ finalDiscardWin: (_f = params.finalDiscardWin) !== null && _f !== void 0 ? _f : false,
722
+ oneShotWin: (_g = params.oneShotWin) !== null && _g !== void 0 ? _g : false,
723
+ orig: params,
724
+ };
725
+ }
726
+ DoubleCalculator.prototype.calc = function (hands) {
727
+ var patterns = this.calcPatterns(hands);
728
+ if (patterns.length == 0)
729
+ return false;
730
+ var max = [0, 0];
731
+ var idx = 0;
732
+ for (var i = 0; i < patterns.length; i++) {
733
+ var pt = patterns[i];
734
+ var sum_1 = pt.points.reduce(function (a, b) {
735
+ return a + b.double;
736
+ }, 0);
737
+ if (sum_1 > max[0]) {
738
+ idx = i;
739
+ max[0] = sum_1;
740
+ max[1] = pt.fu;
741
+ }
742
+ else if (sum_1 == max[0] && pt.fu > max[1]) {
743
+ idx = i;
744
+ max[0] = sum_1;
745
+ max[1] = pt.fu;
746
+ }
747
+ }
748
+ var ceil = function (v, p) {
749
+ if (p === void 0) { p = 100; }
750
+ return Math.ceil(v / p) * p;
751
+ };
752
+ var fu = max[1] != 25 ? ceil(max[1], 10) : 25;
753
+ var sum = max[0];
754
+ var base = fu * Math.pow(2, (sum + 2));
755
+ switch (sum) {
756
+ case 26:
757
+ base = 16000;
758
+ break;
759
+ case 13:
760
+ base = 8000;
761
+ break;
762
+ case 12:
763
+ case 11:
764
+ base = 6000;
765
+ break;
766
+ case 10:
767
+ case 9:
768
+ case 8:
769
+ base = 6000;
770
+ break;
771
+ case 7:
772
+ case 6:
773
+ base = 4000;
774
+ break;
775
+ case 5:
776
+ base = 2000;
777
+ break;
778
+ }
779
+ if (sum > 13 && sum < 26)
780
+ base = 8000;
781
+ var isTsumo = patterns[idx].hand.some(function (b) {
782
+ return b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO); });
783
+ });
784
+ var myWind = this.cfg.orig.myWind;
785
+ var isParent = myWind == "1w";
786
+ var deltas = {
787
+ "1w": 0,
788
+ "2w": 0,
789
+ "3w": 0,
790
+ "4w": 0,
791
+ };
792
+ if (!isTsumo) {
793
+ var deadPoint = this.cfg.sticks.dead * 300;
794
+ if (this.cfg.orig.ronWind == null)
795
+ throw new Error("ron wind is not specified in the parameters");
796
+ var coefficient = isParent ? 6 : 4;
797
+ var point = ceil(base * coefficient) + deadPoint;
798
+ deltas[myWind] += point;
799
+ deltas[this.cfg.orig.ronWind] -= point;
800
+ }
801
+ else {
802
+ var deadPoint = this.cfg.sticks.dead * 100;
803
+ if (isParent) {
804
+ var point = ceil(base * 2);
805
+ deltas["1w"] += point * 3 + deadPoint * 3;
806
+ deltas["2w"] -= point + deadPoint;
807
+ deltas["3w"] -= point + deadPoint;
808
+ deltas["4w"] -= point + deadPoint;
809
+ }
810
+ else {
811
+ for (var _i = 0, _a = Object.values(constants_1.WIND); _i < _a.length; _i++) {
812
+ var key = _a[_i];
813
+ if (key == myWind)
814
+ continue;
815
+ var coefficient = key == "1w" ? 2 : 1;
816
+ var point = ceil(base * coefficient) + deadPoint;
817
+ deltas[key] -= point;
818
+ deltas[myWind] += point;
819
+ }
820
+ }
821
+ }
822
+ deltas[myWind] += 1000 * this.cfg.sticks.reach;
823
+ var v = {
824
+ deltas: deltas,
825
+ sum: sum,
826
+ fu: fu,
827
+ points: patterns[idx].points,
828
+ point: deltas[myWind],
829
+ hand: patterns[idx].hand,
830
+ params: this.cfg.orig,
831
+ };
832
+ return v;
833
+ };
834
+ DoubleCalculator.prototype.calcPatterns = function (hands) {
835
+ var ret = [];
836
+ if (hands.length == 0)
837
+ return ret;
838
+ for (var _i = 0, hands_1 = hands; _i < hands_1.length; _i++) {
839
+ var hand = hands_1[_i];
840
+ var v = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], this.dA13(hand), true), this.dB13(hand), true), this.dC13(hand), true), this.dD13(hand), true), this.dE13(hand), true), this.dF13(hand), true), this.dG13(hand), true), this.dH13(hand), true), this.dI13(hand), true), this.dJ13(hand), true), this.dK13(hand), true);
841
+ if (v.length == 0)
842
+ continue;
843
+ ret.push({
844
+ points: v,
845
+ fu: 30,
846
+ hand: hand,
847
+ });
848
+ }
849
+ if (ret.length > 0)
850
+ return ret;
851
+ for (var _a = 0, hands_2 = hands; _a < hands_2.length; _a++) {
852
+ var hand = hands_2[_a];
853
+ var fu = this.calcFu(hand);
854
+ var v = __spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray(__spreadArray([], this.dA1(hand), true), this.dB1(hand), true), this.dC1(hand), true), this.dD1(hand), true), this.dE1(hand), true), this.dF1(hand), true), this.dG1(hand), true), this.dH1(hand), true), this.dI1(hand), true), this.dJ1(hand), true), this.dK1(hand), true), this.dA2(hand), true), this.dB2(hand), true), this.dC2(hand), true), this.dD2(hand), true), this.dE2(hand), true), this.dF2(hand), true), this.dG2(hand), true), this.dH2(hand), true), this.dI2(hand), true), this.dJ2(hand), true), this.dA3(hand), true), this.dB3(hand), true), this.dC3(hand), true), this.dA6(hand), true);
855
+ if (v.length > 0)
856
+ v.push.apply(v, this.dX1(hand));
857
+ ret.push({
858
+ points: v,
859
+ fu: fu,
860
+ hand: hand,
861
+ });
862
+ }
863
+ return ret;
864
+ };
865
+ DoubleCalculator.prototype.minus = function () {
866
+ return this.hand.canReach ? 0 : 1;
867
+ };
868
+ DoubleCalculator.prototype.dA1 = function (h) {
869
+ if (this.cfg.reached == 1)
870
+ return [{ name: "立直", double: 1 }];
871
+ if (this.cfg.reached == 2)
872
+ return [{ name: "ダブルリーチ", double: 2 }];
873
+ return [];
874
+ };
875
+ DoubleCalculator.prototype.dB1 = function (h) {
876
+ if (this.minus() != 0)
877
+ return [];
878
+ if (this.hand.drawn == null)
879
+ [];
880
+ var cond = h.some(function (b) { return b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO); }); });
881
+ return cond ? [{ name: "門前清自摸和", double: 1 }] : [];
882
+ };
883
+ DoubleCalculator.prototype.dC1 = function (h) {
884
+ if (this.minus() != 0)
885
+ return [];
886
+ var fu = this.calcFu(h);
887
+ if (fu == 20)
888
+ return [{ name: "平和", double: 1 }];
889
+ if (!h.some(function (b) { return b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO); }); })) {
890
+ if (fu == 30)
891
+ return [{ name: "平和", double: 1 }];
892
+ }
893
+ return [];
894
+ };
895
+ DoubleCalculator.prototype.dD1 = function (h) {
896
+ var cond = h.some(function (block) {
897
+ return block.tiles.some(function (t) { return t.k == constants_1.KIND.Z || [1, 9].includes(t.n); });
898
+ });
899
+ return cond ? [] : [{ name: "断么九", double: 1 }];
900
+ };
901
+ DoubleCalculator.prototype.dE1 = function (h) {
902
+ if (this.minus() != 0)
903
+ return [];
904
+ var count = countSameBlocks(h);
905
+ return count == 1 ? [{ name: "一盃口", double: 1 }] : [];
906
+ };
907
+ DoubleCalculator.prototype.dF1 = function (h) {
908
+ var _this = this;
909
+ var ret = [];
910
+ h.forEach(function (block) {
911
+ if (block instanceof parser_1.BlockPair)
912
+ return;
913
+ var tile = block.tiles[0];
914
+ if (tile.k == constants_1.KIND.Z) {
915
+ if (tile.equals(_this.cfg.myWind))
916
+ ret.push({ name: "自風", double: 1 });
917
+ if (tile.equals(_this.cfg.roundWind))
918
+ ret.push({ name: "場風", double: 1 });
919
+ if (tile.n == 5)
920
+ ret.push({ name: "白", double: 1 });
921
+ if (tile.n == 6)
922
+ ret.push({ name: "發", double: 1 });
923
+ if (tile.n == 7)
924
+ ret.push({ name: "中", double: 1 });
925
+ }
926
+ });
927
+ return ret;
928
+ };
929
+ DoubleCalculator.prototype.dG1 = function (h) {
930
+ return this.cfg.oneShotWin ? [{ name: "一発", double: 1 }] : [];
931
+ };
932
+ DoubleCalculator.prototype.dH1 = function (h) {
933
+ return this.cfg.replacementWin ? [{ name: "嶺上開花", double: 1 }] : [];
934
+ };
935
+ DoubleCalculator.prototype.dI1 = function (h) {
936
+ return this.cfg.quadWin ? [{ name: "搶槓", double: 1 }] : [];
937
+ };
938
+ DoubleCalculator.prototype.dJ1 = function (h) {
939
+ return this.cfg.finalWallWin ? [{ name: "海底摸月", double: 1 }] : [];
940
+ };
941
+ DoubleCalculator.prototype.dK1 = function (h) {
942
+ return this.cfg.finalDiscardWin ? [{ name: "河底撈魚", double: 1 }] : [];
943
+ };
944
+ DoubleCalculator.prototype.dX1 = function (h) {
945
+ var dcount = 0;
946
+ var rcount = 0;
947
+ var bcount = 0;
948
+ for (var _i = 0, h_1 = h; _i < h_1.length; _i++) {
949
+ var b = h_1[_i];
950
+ for (var _a = 0, _b = b.tiles; _a < _b.length; _a++) {
951
+ var t = _b[_a];
952
+ for (var _c = 0, _d = this.cfg.doras; _c < _d.length; _c++) {
953
+ var d = _d[_c];
954
+ if (t.equals(d, true))
955
+ dcount++;
956
+ }
957
+ for (var _e = 0, _f = this.cfg.blindDoras; _e < _f.length; _e++) {
958
+ var d = _f[_e];
959
+ if (t.equals(d, true))
960
+ bcount++;
961
+ }
962
+ if (t.n == 0)
963
+ rcount++;
964
+ }
965
+ }
966
+ var ret = [];
967
+ if (dcount > 0)
968
+ ret.push({ name: "ドラ", double: dcount });
969
+ if (rcount > 0)
970
+ ret.push({ name: "赤ドラ", double: rcount });
971
+ if (this.hand.reached && bcount > 0)
972
+ ret.push({ name: "裏ドラ", double: bcount });
973
+ return ret;
974
+ };
975
+ DoubleCalculator.prototype.dA2 = function (h) {
976
+ return h.length == 7 ? [{ name: "七対子", double: 2 }] : [];
977
+ };
978
+ DoubleCalculator.prototype.dB2 = function (h) {
979
+ var check = function (bb) {
980
+ return bb instanceof parser_1.BlockRun || bb instanceof parser_1.BlockChi;
981
+ };
982
+ var _loop_2 = function (block) {
983
+ if (!check(block))
984
+ return "continue";
985
+ var tile = block.minTile();
986
+ if (tile.k == constants_1.KIND.Z)
987
+ return "continue";
988
+ var filteredKinds = [constants_1.KIND.M, constants_1.KIND.P, constants_1.KIND.S].filter(function (v) { return v != tile.k; });
989
+ var cond1 = h.some(function (b) {
990
+ var newTile = new parser_1.Tile(filteredKinds[0], tile.n);
991
+ return check(b) && newTile.equals(b.minTile(), true);
992
+ });
993
+ var cond2 = h.some(function (b) {
994
+ var newTile = new parser_1.Tile(filteredKinds[1], tile.n);
995
+ return check(b) && newTile.equals(b.minTile(), true);
996
+ });
997
+ if (cond1 && cond2)
998
+ return { value: [{ name: "三色同順", double: 2 - this_2.minus() }] };
999
+ };
1000
+ var this_2 = this;
1001
+ for (var _i = 0, h_2 = h; _i < h_2.length; _i++) {
1002
+ var block = h_2[_i];
1003
+ var state_1 = _loop_2(block);
1004
+ if (typeof state_1 === "object")
1005
+ return state_1.value;
1006
+ }
1007
+ return [];
1008
+ };
1009
+ DoubleCalculator.prototype.dC2 = function (h) {
1010
+ if (h.length == 7)
1011
+ return [];
1012
+ var cond = h.every(function (b) {
1013
+ return b instanceof parser_1.BlockAnKan ||
1014
+ b instanceof parser_1.BlockShoKan ||
1015
+ b instanceof parser_1.BlockDaiKan ||
1016
+ b instanceof parser_1.BlockThree ||
1017
+ b instanceof parser_1.BlockPon ||
1018
+ b instanceof parser_1.BlockPair;
1019
+ });
1020
+ return cond ? [{ name: "対々和", double: 2 }] : [];
1021
+ };
1022
+ DoubleCalculator.prototype.dD2 = function (h) {
1023
+ if (this.minus() != 0)
1024
+ return [];
1025
+ var l = h.filter(function (b) {
1026
+ return ((b instanceof parser_1.BlockAnKan || b instanceof parser_1.BlockThree) &&
1027
+ !b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.RON); }));
1028
+ }).length;
1029
+ return l >= 3 ? [{ name: "三暗刻", double: 2 }] : [];
1030
+ };
1031
+ DoubleCalculator.prototype.dE2 = function (h) {
1032
+ var l = h.filter(function (b) {
1033
+ return b instanceof parser_1.BlockAnKan ||
1034
+ b instanceof parser_1.BlockShoKan ||
1035
+ b instanceof parser_1.BlockDaiKan;
1036
+ }).length;
1037
+ return l >= 3 ? [{ name: "三槓子", double: 2 }] : [];
1038
+ };
1039
+ DoubleCalculator.prototype.dF2 = function (h) {
1040
+ var check = function (b) {
1041
+ return (b instanceof parser_1.BlockAnKan ||
1042
+ b instanceof parser_1.BlockShoKan ||
1043
+ b instanceof parser_1.BlockDaiKan ||
1044
+ b instanceof parser_1.BlockThree ||
1045
+ b instanceof parser_1.BlockPon);
1046
+ };
1047
+ var _loop_3 = function (block) {
1048
+ if (!check(block))
1049
+ return "continue";
1050
+ var tile = block.minTile();
1051
+ if (tile.k == constants_1.KIND.Z)
1052
+ return "continue";
1053
+ var filteredKinds = [constants_1.KIND.M, constants_1.KIND.P, constants_1.KIND.S].filter(function (v) { return v != tile.k; });
1054
+ var cond1 = h.some(function (b) {
1055
+ var newTile = new parser_1.Tile(filteredKinds[0], tile.n);
1056
+ return check(b) && newTile.equals(b.minTile(), true);
1057
+ });
1058
+ var cond2 = h.some(function (b) {
1059
+ var newTile = new parser_1.Tile(filteredKinds[1], tile.n);
1060
+ return check(b) && newTile.equals(b.minTile(), true);
1061
+ });
1062
+ if (cond1 && cond2)
1063
+ return { value: [{ name: "三色同刻", double: 2 }] };
1064
+ };
1065
+ for (var _i = 0, h_3 = h; _i < h_3.length; _i++) {
1066
+ var block = h_3[_i];
1067
+ var state_2 = _loop_3(block);
1068
+ if (typeof state_2 === "object")
1069
+ return state_2.value;
1070
+ }
1071
+ return [];
1072
+ };
1073
+ DoubleCalculator.prototype.dG2 = function (h) {
1074
+ var l = h.filter(function (b) {
1075
+ var t = b.tiles[0];
1076
+ return t.k == constants_1.KIND.Z && [5, 6, 7].includes(t.n);
1077
+ }).length;
1078
+ return l == 3 ? [{ name: "小三元", double: 2 }] : [];
1079
+ };
1080
+ DoubleCalculator.prototype.dH2 = function (h) {
1081
+ var cond = h.every(function (b) {
1082
+ var values = b.tiles[0].k == constants_1.KIND.Z ? [1, 2, 3, 4, 5, 6, 7] : [1, 9];
1083
+ return b.tiles.every(function (t) { return values.includes(t.n); });
1084
+ });
1085
+ return cond ? [{ name: "混老頭", double: 2 }] : [];
1086
+ };
1087
+ DoubleCalculator.prototype.dI2 = function (h) {
1088
+ if (!h.some(function (b) { return b instanceof parser_1.BlockRun; }) && !(h.length == 7))
1089
+ return [];
1090
+ if (!h.some(function (b) { return b.tiles[0].k == constants_1.KIND.Z; }))
1091
+ return [];
1092
+ var cond = h.every(function (block) {
1093
+ var values = block.tiles[0].k == constants_1.KIND.Z ? [1, 2, 3, 4, 5, 6, 7] : [1, 9];
1094
+ return block.tiles.some(function (t) { return values.includes(t.n); });
1095
+ });
1096
+ return cond ? [{ name: "混全帯么九", double: 2 - this.minus() }] : [];
1097
+ };
1098
+ DoubleCalculator.prototype.dJ2 = function (h) {
1099
+ var _a;
1100
+ if (this.minus() != 0)
1101
+ return [];
1102
+ var m = (_a = {},
1103
+ _a[constants_1.KIND.M] = [0, 0, 0],
1104
+ _a[constants_1.KIND.S] = [0, 0, 0],
1105
+ _a[constants_1.KIND.P] = [0, 0, 0],
1106
+ _a);
1107
+ for (var _i = 0, h_4 = h; _i < h_4.length; _i++) {
1108
+ var block = h_4[_i];
1109
+ var tile = block.minTile();
1110
+ if (tile.k == constants_1.KIND.BACK)
1111
+ continue;
1112
+ if (tile.k == constants_1.KIND.Z)
1113
+ continue;
1114
+ if (!(block instanceof parser_1.BlockRun))
1115
+ continue;
1116
+ if (tile.n == 1)
1117
+ m[tile.k][0]++;
1118
+ if (tile.n == 4)
1119
+ m[tile.k][1]++;
1120
+ if (tile.n == 7)
1121
+ m[tile.k][2]++;
1122
+ }
1123
+ for (var _b = 0, _c = Object.values(m); _b < _c.length; _b++) {
1124
+ var v = _c[_b];
1125
+ if (v.filter(function (v) { return v > 0; }).length == v.length)
1126
+ return [{ name: "一気通貫", double: 2 - this.minus() }];
1127
+ }
1128
+ return [];
1129
+ };
1130
+ DoubleCalculator.prototype.dA3 = function (h) {
1131
+ var cond = !h.some(function (block) { return block.tiles[0].k == constants_1.KIND.Z; });
1132
+ if (cond)
1133
+ return [];
1134
+ var _loop_4 = function (k) {
1135
+ var ok = h.every(function (b) { return b.tiles[0].k == constants_1.KIND.Z || b.tiles[0].k == k; });
1136
+ if (ok)
1137
+ return { value: [{ name: "混一色", double: 3 - this_3.minus() }] };
1138
+ };
1139
+ var this_3 = this;
1140
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
1141
+ var k = _a[_i];
1142
+ var state_3 = _loop_4(k);
1143
+ if (typeof state_3 === "object")
1144
+ return state_3.value;
1145
+ }
1146
+ return [];
1147
+ };
1148
+ DoubleCalculator.prototype.dB3 = function (h) {
1149
+ if (!h.some(function (b) { return b instanceof parser_1.BlockRun; }) && !(h.length == 7))
1150
+ return [];
1151
+ if (h.some(function (b) { return b.tiles[0].k == constants_1.KIND.Z; }))
1152
+ return [];
1153
+ var cond = h.every(function (b) {
1154
+ var values = b.tiles[0].k == constants_1.KIND.Z ? [1, 2, 3, 4, 5, 6, 7] : [1, 9];
1155
+ return b.tiles.some(function (t) { return values.includes(t.n); });
1156
+ });
1157
+ return cond ? [{ name: "純全帯么九色", double: 3 - this.minus() }] : [];
1158
+ };
1159
+ DoubleCalculator.prototype.dC3 = function (h) {
1160
+ if (this.minus() != 0)
1161
+ return [];
1162
+ var count = countSameBlocks(h);
1163
+ return count == 2 ? [{ name: "ニ盃口", double: 3 }] : [];
1164
+ };
1165
+ DoubleCalculator.prototype.dA6 = function (h) {
1166
+ if (h.some(function (block) { return block.tiles[0].k == constants_1.KIND.Z; }))
1167
+ return [];
1168
+ var _loop_5 = function (k) {
1169
+ if (k == constants_1.KIND.Z)
1170
+ return "continue";
1171
+ var ok = h.every(function (v) { return v.tiles[0].k == k; });
1172
+ if (ok)
1173
+ return { value: [{ name: "清一色", double: 6 - this_4.minus() }] };
1174
+ };
1175
+ var this_4 = this;
1176
+ for (var _i = 0, _a = Object.values(constants_1.KIND); _i < _a.length; _i++) {
1177
+ var k = _a[_i];
1178
+ var state_4 = _loop_5(k);
1179
+ if (typeof state_4 === "object")
1180
+ return state_4.value;
1181
+ }
1182
+ return [];
1183
+ };
1184
+ DoubleCalculator.prototype.dA13 = function (h) {
1185
+ if (h.length != 13)
1186
+ return [];
1187
+ var double = h.some(function (b) {
1188
+ return b instanceof parser_1.BlockPair &&
1189
+ b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO) || t.has(constants_1.OPERATOR.RON); });
1190
+ });
1191
+ return double
1192
+ ? [{ name: "国士無双13面待ち", double: 26 }]
1193
+ : [{ name: "国士無双", double: 13 }];
1194
+ };
1195
+ DoubleCalculator.prototype.dB13 = function (h) {
1196
+ return h.length == 1 ? [{ name: "九蓮宝燈", double: 13 }] : [];
1197
+ };
1198
+ DoubleCalculator.prototype.dC13 = function (h) {
1199
+ if (h.length == 7)
1200
+ return [];
1201
+ var cond1 = h.every(function (b) {
1202
+ return b instanceof parser_1.BlockAnKan ||
1203
+ (b instanceof parser_1.BlockThree &&
1204
+ !b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.RON); })) ||
1205
+ b instanceof parser_1.BlockPair;
1206
+ });
1207
+ if (!cond1)
1208
+ return [];
1209
+ var cond2 = h.some(function (b) {
1210
+ return b instanceof parser_1.BlockPair &&
1211
+ b.tiles.every(function (t) { return t.has(constants_1.OPERATOR.TSUMO) || t.has(constants_1.OPERATOR.RON); });
1212
+ });
1213
+ return cond2
1214
+ ? [{ name: "四暗刻単騎待ち", double: 26 }]
1215
+ : [{ name: "四暗刻", double: 13 }];
1216
+ };
1217
+ DoubleCalculator.prototype.dD13 = function (h) {
1218
+ if (h.length == 13)
1219
+ return [];
1220
+ var z = [5, 6, 7];
1221
+ var cond = h.filter(function (b) {
1222
+ return !(b instanceof parser_1.BlockPair) &&
1223
+ b.tiles.some(function (t) { return t.k == constants_1.KIND.Z && z.includes(t.n); });
1224
+ }).length == 3;
1225
+ return cond ? [{ name: "大三元", double: 13 }] : [];
1226
+ };
1227
+ DoubleCalculator.prototype.dE13 = function (h) {
1228
+ var cond = h.every(function (b) { return b.tiles.every(function (t) { return t.k == constants_1.KIND.Z; }); });
1229
+ return cond ? [{ name: "字一色", double: 13 }] : [];
1230
+ };
1231
+ DoubleCalculator.prototype.dF13 = function (h) {
1232
+ var cond = h.every(function (b) {
1233
+ return b.tiles.every(function (t) { return t.k != constants_1.KIND.Z && [1, 9].includes(t.n); });
1234
+ });
1235
+ return cond ? [{ name: "清老頭", double: 13 }] : [];
1236
+ };
1237
+ DoubleCalculator.prototype.dG13 = function (h) {
1238
+ var cond = h.filter(function (b) {
1239
+ return b instanceof parser_1.BlockAnKan ||
1240
+ b instanceof parser_1.BlockShoKan ||
1241
+ b instanceof parser_1.BlockDaiKan;
1242
+ }).length == 4;
1243
+ return cond ? [{ name: "四槓子", double: 13 }] : [];
1244
+ };
1245
+ DoubleCalculator.prototype.dH13 = function (h) {
1246
+ if (h.length == 13)
1247
+ return [];
1248
+ if (h.length == 7)
1249
+ return [];
1250
+ var zn = [1, 2, 3, 4];
1251
+ var cond1 = h.filter(function (b) { return b.tiles.some(function (t) { return t.k == constants_1.KIND.Z && zn.includes(t.n); }); })
1252
+ .length == 4;
1253
+ if (!cond1)
1254
+ return [];
1255
+ var cond2 = h
1256
+ .find(function (b) { return b instanceof parser_1.BlockPair; })
1257
+ .tiles.some(function (t) { return t.k == constants_1.KIND.Z && zn.includes(t.n); });
1258
+ return cond2
1259
+ ? [{ name: "小四喜", double: 13 }]
1260
+ : [{ name: "大四喜", double: 13 }];
1261
+ };
1262
+ DoubleCalculator.prototype.dI13 = function (h) {
1263
+ var check = function (t) {
1264
+ if (t.equals(new parser_1.Tile(constants_1.KIND.Z, 6)))
1265
+ return true;
1266
+ if (t.k == constants_1.KIND.S && [2, 3, 4, 6, 8].includes(t.n))
1267
+ return true;
1268
+ return false;
1269
+ };
1270
+ return h.every(function (b) { return b.tiles.every(function (t) { return check(t); }); })
1271
+ ? [{ name: "緑一色", double: 13 }]
1272
+ : [];
1273
+ };
1274
+ DoubleCalculator.prototype.dJ13 = function (h) {
1275
+ return [];
1276
+ };
1277
+ DoubleCalculator.prototype.dK13 = function (h) {
1278
+ return [];
1279
+ };
1280
+ DoubleCalculator.prototype.calcFu = function (h) {
1281
+ var base = 20;
1282
+ var fu = base;
1283
+ var myWind = this.cfg.myWind.n;
1284
+ var round = this.cfg.roundWind.n;
1285
+ if (h.length == 7)
1286
+ return 25;
1287
+ var lastBlock = h.find(function (b) {
1288
+ return b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO) || t.has(constants_1.OPERATOR.RON); });
1289
+ });
1290
+ var isCalled = this.minus() == 1;
1291
+ var isTsumo = lastBlock.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO); });
1292
+ var calcTriple = function (b, base) {
1293
+ var tile = b.tiles[0];
1294
+ if (tile.k == constants_1.KIND.Z && [5, 6, 7].includes(tile.n))
1295
+ return base * 2;
1296
+ else if (tile.k == constants_1.KIND.Z && [myWind, round].includes(tile.n))
1297
+ return base * 2;
1298
+ else if ([1, 9].includes(tile.n))
1299
+ return base * 2;
1300
+ else
1301
+ return base;
1302
+ };
1303
+ for (var _i = 0, h_5 = h; _i < h_5.length; _i++) {
1304
+ var b = h_5[_i];
1305
+ switch (true) {
1306
+ case b instanceof parser_1.BlockThree:
1307
+ var v = b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.RON); }) ? 2 : 4;
1308
+ fu += calcTriple(b, v);
1309
+ break;
1310
+ case b instanceof parser_1.BlockPon:
1311
+ fu += calcTriple(b, 2);
1312
+ break;
1313
+ case b instanceof parser_1.BlockDaiKan || b instanceof parser_1.BlockShoKan:
1314
+ fu += calcTriple(b, 8);
1315
+ break;
1316
+ case b instanceof parser_1.BlockAnKan:
1317
+ fu += calcTriple(b, 16);
1318
+ break;
1319
+ }
1320
+ }
1321
+ var calcLast = function (b) {
1322
+ if (b instanceof parser_1.BlockThree)
1323
+ return 0;
1324
+ if (b instanceof parser_1.BlockPair)
1325
+ return 2;
1326
+ var tiles = b.tiles;
1327
+ var idx = tiles.findIndex(function (t) { return t.has(constants_1.OPERATOR.TSUMO) || t.has(constants_1.OPERATOR.RON); });
1328
+ if (idx == 1)
1329
+ return 2;
1330
+ else if (idx == 0 && tiles[2].n == 9)
1331
+ return 2;
1332
+ else if (idx == 2 && tiles[0].n == 1)
1333
+ return 2;
1334
+ return 0;
1335
+ };
1336
+ fu += calcLast(lastBlock);
1337
+ var pair = h.find(function (b) { return b instanceof parser_1.BlockPair; });
1338
+ var tile = pair.tiles[0];
1339
+ if (tile.k == constants_1.KIND.Z) {
1340
+ if ([5, 6, 7].includes(tile.n))
1341
+ fu += 2;
1342
+ if (tile.n == round)
1343
+ fu += 2;
1344
+ if (tile.n == myWind)
1345
+ fu += 2;
1346
+ }
1347
+ var isAllRuns = false;
1348
+ if (!isCalled && fu == base)
1349
+ isAllRuns = true;
1350
+ if (isTsumo && !isAllRuns)
1351
+ fu += 2;
1352
+ if (!isTsumo && !isCalled)
1353
+ fu += 10;
1354
+ if (!isTsumo && !isCalled && fu == 30)
1355
+ isAllRuns = true;
1356
+ if (isCalled && fu == base)
1357
+ fu = 30;
1358
+ return fu;
1359
+ };
1360
+ return DoubleCalculator;
1361
+ }());
1362
+ exports.DoubleCalculator = DoubleCalculator;
1363
+ var buildKey = function (b) {
1364
+ return b.tiles.reduce(function (a, b) { return "".concat(a).concat(b.n).concat(b.k); }, "");
1365
+ };
1366
+ var countSameBlocks = function (h) {
1367
+ var m = {};
1368
+ for (var _i = 0, h_6 = h; _i < h_6.length; _i++) {
1369
+ var b = h_6[_i];
1370
+ if (!(b instanceof parser_1.BlockRun))
1371
+ continue;
1372
+ var key = buildKey(b);
1373
+ if (m[key] == null)
1374
+ m[key] = 1;
1375
+ else
1376
+ m[key]++;
1377
+ }
1378
+ var count = 0;
1379
+ for (var key in m) {
1380
+ var v = m[key];
1381
+ if (v >= 2)
1382
+ count++;
1383
+ }
1384
+ return count;
1385
+ };
1386
+ var toDora = function (doraMarker) {
1387
+ var n = doraMarker.isNum() && doraMarker.n == 0 ? 5 : doraMarker.n;
1388
+ var k = doraMarker.k;
1389
+ return new parser_1.Tile(k, (n % 9) + 1);
1390
+ };