@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,733 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.incrementalIDGenerator = exports.createControllerMachine = void 0;
4
+ var constants_1 = require("../constants");
5
+ var parser_1 = require("../parser");
6
+ var calculator_1 = require("./../calculator");
7
+ var managers_1 = require("./managers");
8
+ var xstate_1 = require("xstate");
9
+ var createControllerMachine = function (c) {
10
+ return (0, xstate_1.createMachine)({
11
+ id: "Untitled",
12
+ initial: "distribute",
13
+ context: {
14
+ currentWind: "1w",
15
+ oneShotMap: (0, managers_1.createWindMap)(false),
16
+ missingMap: (0, managers_1.createWindMap)(false),
17
+ controller: c,
18
+ genEventID: incrementalIDGenerator(),
19
+ },
20
+ states: {
21
+ distribute: {
22
+ on: {
23
+ NEXT: {
24
+ target: "drawn",
25
+ },
26
+ },
27
+ entry: {
28
+ type: "notify_distribution",
29
+ },
30
+ },
31
+ drawn: {
32
+ entry: {
33
+ type: "notify_draw",
34
+ },
35
+ on: {
36
+ NEXT: {
37
+ target: "waiting_user_event_after_drawn",
38
+ actions: {
39
+ type: "notify_choice_after_drawn",
40
+ },
41
+ description: "可能なアクションとその詳細を通知\\\nDISCARD の場合は捨てられる牌の一覧",
42
+ },
43
+ },
44
+ },
45
+ waiting_user_event_after_drawn: {
46
+ description: "ツモった1ユーザからのレスポンス待ち",
47
+ on: {
48
+ TSUMO: {
49
+ target: "tsumo",
50
+ guard: "canWin",
51
+ },
52
+ REACH: {
53
+ target: "discarded",
54
+ guard: "canReach",
55
+ actions: {
56
+ type: "notify_reach",
57
+ },
58
+ description: "入力に牌が必要\\\n立直直後のロンは立直棒が点数にならないので\\\n別途状態を保つ必要がある",
59
+ },
60
+ SHO_KAN: {
61
+ target: "an_sho_kaned",
62
+ },
63
+ AN_KAN: {
64
+ target: "an_sho_kaned",
65
+ },
66
+ DISCARD: {
67
+ target: "discarded",
68
+ description: "入力に牌が必須",
69
+ actions: {
70
+ type: "disable_one_shot_for_me",
71
+ },
72
+ },
73
+ DRAWN_GAME_BY_NINE_TILES: {
74
+ target: "drawn_game",
75
+ },
76
+ },
77
+ },
78
+ discarded: {
79
+ entry: {
80
+ type: "notify_discard",
81
+ },
82
+ on: {
83
+ NEXT: {
84
+ target: "waiting_user_event_after_discarded",
85
+ actions: {
86
+ type: "notify_choice_after_discarded",
87
+ },
88
+ description: "可能なアクションとその詳細を通知\\\nCHI/PON の場合は鳴ける組み合わせの一覧",
89
+ },
90
+ },
91
+ },
92
+ tsumo: {
93
+ exit: [
94
+ {
95
+ type: "notify_tsumo",
96
+ },
97
+ {
98
+ type: "notify_end",
99
+ },
100
+ ],
101
+ type: "final",
102
+ },
103
+ waiting_user_event_after_discarded: {
104
+ description: "最大 4人から choice に対するレスポンスを待つ\\\nユーザからではなく、controller が優先順位を考慮して遷移させる必要がある\\\n通知する choice がない場合、controller が\\*で遷移させる",
105
+ on: {
106
+ RON: {
107
+ target: "roned",
108
+ guard: "canWin",
109
+ },
110
+ PON: {
111
+ target: "poned",
112
+ guard: "canPon",
113
+ },
114
+ CHI: {
115
+ target: "chied",
116
+ guard: "canChi",
117
+ },
118
+ DAI_KAN: {
119
+ target: "dai_kaned",
120
+ },
121
+ "*": {
122
+ target: "wildcard_after_discarded",
123
+ },
124
+ },
125
+ },
126
+ roned: {
127
+ exit: [
128
+ {
129
+ type: "notify_ron",
130
+ },
131
+ {
132
+ type: "notify_end",
133
+ },
134
+ ],
135
+ type: "final",
136
+ },
137
+ poned: {
138
+ on: {
139
+ NEXT: {
140
+ target: "waiting_discard_event",
141
+ actions: {
142
+ type: "notify_choice_after_called",
143
+ },
144
+ },
145
+ },
146
+ entry: [
147
+ {
148
+ type: "notify_call",
149
+ },
150
+ {
151
+ type: "disable_none_shot",
152
+ },
153
+ ],
154
+ },
155
+ chied: {
156
+ on: {
157
+ NEXT: {
158
+ target: "waiting_discard_event",
159
+ actions: {
160
+ type: "notify_choice_after_called",
161
+ params: { action: "chi" },
162
+ },
163
+ },
164
+ },
165
+ entry: [
166
+ {
167
+ type: "notify_call",
168
+ },
169
+ {
170
+ type: "disable_one_shot",
171
+ },
172
+ ],
173
+ },
174
+ wildcard_after_discarded: {
175
+ exit: [],
176
+ always: [
177
+ {
178
+ target: "drawn_game",
179
+ guard: "cannotContinue",
180
+ },
181
+ {
182
+ target: "drawn",
183
+ actions: [
184
+ {
185
+ type: "updateNextWind",
186
+ },
187
+ ],
188
+ },
189
+ ],
190
+ },
191
+ waiting_discard_event: {
192
+ description: "鳴いたユーザからの DISCARD イベントを待つ",
193
+ on: {
194
+ DISCARD: {
195
+ target: "discarded",
196
+ },
197
+ },
198
+ },
199
+ dai_kaned: {
200
+ on: {
201
+ NEXT: {
202
+ target: "waiting_user_event_after_drawn",
203
+ actions: [
204
+ {
205
+ type: "notify_draw",
206
+ params: { action: "kan" },
207
+ },
208
+ {
209
+ type: "notify_choice_after_drawn",
210
+ params: { replacementWin: true },
211
+ },
212
+ ],
213
+ },
214
+ },
215
+ entry: [
216
+ {
217
+ type: "notify_call",
218
+ },
219
+ {
220
+ type: "disable_one_shot",
221
+ },
222
+ ],
223
+ },
224
+ an_sho_kaned: {
225
+ on: {
226
+ NEXT: {
227
+ target: "waiting_chankan_event",
228
+ },
229
+ },
230
+ entry: [
231
+ {
232
+ type: "notify_call",
233
+ },
234
+ {
235
+ type: "disable_one_shot",
236
+ },
237
+ {
238
+ type: "notify_new_dora_if_needed",
239
+ },
240
+ {
241
+ type: "notify_choice_for_chankan",
242
+ },
243
+ ],
244
+ },
245
+ waiting_chankan_event: {
246
+ description: "チャンカンを待つ",
247
+ exit: [
248
+ {
249
+ type: "notify_draw",
250
+ params: { action: "kan" },
251
+ },
252
+ {
253
+ type: "notify_choice_after_drawn",
254
+ params: { replacementWin: true },
255
+ },
256
+ ],
257
+ on: {
258
+ RON: {
259
+ target: "roned",
260
+ guard: "canWin",
261
+ },
262
+ "*": {
263
+ target: "waiting_user_event_after_drawn",
264
+ },
265
+ },
266
+ },
267
+ drawn_game: {
268
+ exit: {
269
+ type: "notify_end",
270
+ params: {},
271
+ },
272
+ type: "final",
273
+ },
274
+ },
275
+ types: {
276
+ events: {},
277
+ context: {},
278
+ },
279
+ }, {
280
+ actions: {
281
+ updateNextWind: function (_a) {
282
+ var context = _a.context, event = _a.event;
283
+ var cur = context.currentWind;
284
+ context.currentWind = (0, managers_1.nextWind)(cur);
285
+ },
286
+ notify_distribution: function (_a) {
287
+ var context = _a.context, event = _a.event;
288
+ var id = context.genEventID();
289
+ var initHands = context.controller.initialHands();
290
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
291
+ var w = _b[_i];
292
+ var hands = (0, managers_1.createWindMap)("_____________");
293
+ hands[w] = initHands[w].toString();
294
+ var e = {
295
+ id: id,
296
+ type: "DISTRIBUTE",
297
+ hands: hands,
298
+ wind: w,
299
+ doraMarker: context.controller.wall.doraMarkers[0],
300
+ sticks: context.controller.placeManager.sticks,
301
+ round: context.controller.placeManager.round,
302
+ players: context.controller.playerIDs,
303
+ places: context.controller.placeManager.playerMap,
304
+ scores: context.controller.scoreManager.summary,
305
+ };
306
+ context.controller.emit(e);
307
+ }
308
+ context.controller.next();
309
+ },
310
+ notify_choice_after_drawn: function (_a, params) {
311
+ var context = _a.context, event = _a.event;
312
+ var w = context.currentWind;
313
+ var drawn = context.controller.hand(w).drawn;
314
+ var id = context.genEventID();
315
+ var e = {
316
+ id: id,
317
+ type: "CHOICE_AFTER_DRAWN",
318
+ wind: w,
319
+ tileInfo: { wind: w, tile: drawn },
320
+ choices: {
321
+ TSUMO: context.controller.doWin(w, drawn, {
322
+ oneShot: context.oneShotMap[w],
323
+ replacementWin: params === null || params === void 0 ? void 0 : params.replacementWin,
324
+ }),
325
+ REACH: context.controller.doReach(w),
326
+ AN_KAN: context.controller.doAnKan(w),
327
+ SHO_KAN: context.controller.doShoKan(w),
328
+ DISCARD: context.controller.doDiscard(w),
329
+ DRAWN_GAME_BY_NINE_TILES: context.controller.canDrawnGame(w),
330
+ },
331
+ };
332
+ context.controller.emit(e);
333
+ context.controller.pollReplies(id, [w]);
334
+ },
335
+ notify_choice_after_discarded: function (_a) {
336
+ var context = _a.context, event = _a.event;
337
+ var id = context.genEventID();
338
+ var discarded = context.controller.river.lastTile;
339
+ var ltile = discarded.t.clone().add(constants_1.OPERATOR.HORIZONTAL);
340
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
341
+ var w = _b[_i];
342
+ var e = {
343
+ id: id,
344
+ type: "CHOICE_AFTER_DISCARDED",
345
+ wind: w,
346
+ tileInfo: { wind: discarded.w, tile: discarded.t },
347
+ choices: {
348
+ RON: context.controller.doWin(w, ltile, {
349
+ whoDiscarded: discarded.w,
350
+ oneShot: context.oneShotMap[w],
351
+ missingRon: context.missingMap[w],
352
+ }),
353
+ PON: context.controller.doPon(w, discarded.w, ltile),
354
+ CHI: context.controller.doChi(w, discarded.w, ltile),
355
+ DAI_KAN: context.controller.doDaiKan(w, discarded.w, ltile),
356
+ },
357
+ };
358
+ if (e.choices.RON)
359
+ context.missingMap[w] = true;
360
+ context.controller.emit(e);
361
+ }
362
+ context.controller.pollReplies(id, Object.values(constants_1.WIND));
363
+ },
364
+ notify_choice_after_called: function (_a, params) {
365
+ var context = _a.context, event = _a.event;
366
+ var id = context.genEventID();
367
+ var w = context.currentWind;
368
+ var discard = context.controller.doDiscard(w);
369
+ var called = context.controller
370
+ .hand(context.currentWind)
371
+ .called.at(-1);
372
+ if (called instanceof parser_1.BlockChi || called instanceof parser_1.BlockPon)
373
+ discard = context.controller.doDiscard(w, called);
374
+ var e = {
375
+ id: id,
376
+ type: "CHOICE_AFTER_CALLED",
377
+ wind: w,
378
+ choices: {
379
+ DISCARD: discard,
380
+ },
381
+ };
382
+ context.controller.emit(e);
383
+ context.controller.pollReplies(id, [w]);
384
+ },
385
+ notify_choice_for_chankan: function (_a) {
386
+ var context = _a.context, event = _a.event;
387
+ if (event.type != "SHO_KAN" && event.type != "AN_KAN")
388
+ throw new Error("unexpected event ".concat(event.type));
389
+ var id = context.genEventID();
390
+ var t = event.block.tiles[0].clone().remove(constants_1.OPERATOR.HORIZONTAL);
391
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
392
+ var w = _b[_i];
393
+ var ron = context.controller.doWin(w, event.block.tiles[0].clone().remove(constants_1.OPERATOR.HORIZONTAL), {
394
+ whoDiscarded: event.iam,
395
+ quadWin: true,
396
+ oneShot: context.oneShotMap[w],
397
+ missingRon: context.missingMap[event.iam],
398
+ });
399
+ var e = {
400
+ id: id,
401
+ type: "CHOICE_FOR_CHAN_KAN",
402
+ wind: w,
403
+ tileInfo: { wind: event.iam, tile: t },
404
+ choices: {
405
+ RON: event.type == "SHO_KAN" ? ron : false,
406
+ },
407
+ };
408
+ if (e.choices.RON)
409
+ context.missingMap[w] = true;
410
+ context.controller.emit(e);
411
+ }
412
+ context.controller.pollReplies(id, Object.values(constants_1.WIND));
413
+ },
414
+ notify_call: function (_a) {
415
+ var context = _a.context, event = _a.event;
416
+ if (!(event.type == "CHI" ||
417
+ event.type == "PON" ||
418
+ event.type == "DAI_KAN" ||
419
+ event.type == "AN_KAN" ||
420
+ event.type == "SHO_KAN"))
421
+ throw new Error("unexpected event ".concat(event.type));
422
+ var id = context.genEventID();
423
+ var iam = event.iam;
424
+ context.currentWind = iam;
425
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
426
+ var w = _b[_i];
427
+ var e = {
428
+ id: id,
429
+ type: event.type,
430
+ iam: iam,
431
+ wind: w,
432
+ block: event.block,
433
+ };
434
+ context.controller.emit(e);
435
+ }
436
+ context.controller.next();
437
+ },
438
+ notify_discard: function (_a) {
439
+ var context = _a.context, event = _a.event;
440
+ if (event.type != "DISCARD" && event.type != "REACH")
441
+ throw new Error("unexpected event ".concat(event.type));
442
+ var id = context.genEventID();
443
+ var iam = context.currentWind;
444
+ var t = event.tile;
445
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
446
+ var w = _b[_i];
447
+ var e = {
448
+ id: id,
449
+ type: "DISCARD",
450
+ iam: iam,
451
+ wind: w,
452
+ tile: t,
453
+ };
454
+ context.controller.emit(e);
455
+ }
456
+ context.controller.next();
457
+ },
458
+ notify_draw: function (_a, params) {
459
+ var context = _a.context, event = _a.event;
460
+ var id = context.genEventID();
461
+ var action = params === null || params === void 0 ? void 0 : params.action;
462
+ var drawn = undefined;
463
+ if (action == "kan")
464
+ drawn = context.controller.wall.kan();
465
+ else
466
+ drawn = context.controller.wall.draw();
467
+ var iam = context.currentWind;
468
+ if (!context.controller.hand(iam).reached)
469
+ context.missingMap[iam] = false;
470
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
471
+ var w = _b[_i];
472
+ var t = new parser_1.Tile(constants_1.KIND.BACK, 0);
473
+ if (w == iam)
474
+ t = drawn;
475
+ var e = {
476
+ id: id,
477
+ type: "DRAW",
478
+ subType: action,
479
+ iam: iam,
480
+ wind: w,
481
+ tile: t,
482
+ };
483
+ context.controller.emit(e);
484
+ }
485
+ context.controller.next();
486
+ },
487
+ notify_ron: function (_a) {
488
+ var context = _a.context, event = _a.event;
489
+ var id = context.genEventID();
490
+ if (event.type == "RON") {
491
+ var ronWind = event.targetInfo.wind;
492
+ var cur = context.currentWind;
493
+ var pushBackReachStick = ronWind == cur && context.oneShotMap[cur] == true;
494
+ var iam = event.iam;
495
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
496
+ var w = _b[_i];
497
+ var e = {
498
+ id: id,
499
+ type: event.type,
500
+ iam: iam,
501
+ wind: w,
502
+ targetInfo: event.targetInfo,
503
+ ret: event.ret,
504
+ pushBackReachStick: pushBackReachStick,
505
+ };
506
+ context.controller.emit(e);
507
+ }
508
+ }
509
+ },
510
+ notify_tsumo: function (_a) {
511
+ var context = _a.context, event = _a.event;
512
+ if (event.type != "TSUMO")
513
+ throw new Error("unexpected event ".concat(event.type));
514
+ var id = context.genEventID();
515
+ var iam = context.currentWind;
516
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
517
+ var w = _b[_i];
518
+ var e = {
519
+ id: id,
520
+ type: event.type,
521
+ iam: iam,
522
+ wind: w,
523
+ lastTile: context.controller.hand(iam).drawn,
524
+ ret: event.ret,
525
+ };
526
+ context.controller.emit(e);
527
+ }
528
+ },
529
+ notify_reach: function (_a) {
530
+ var context = _a.context, event = _a.event;
531
+ if (event.type != "REACH")
532
+ throw new Error("unexpected event ".concat(event.type));
533
+ var id = context.genEventID();
534
+ var iam = event.iam;
535
+ var t = event.tile.clone().add(constants_1.OPERATOR.HORIZONTAL);
536
+ context.oneShotMap[iam] = true;
537
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
538
+ var w = _b[_i];
539
+ var e = {
540
+ id: id,
541
+ type: event.type,
542
+ iam: iam,
543
+ wind: w,
544
+ tile: t,
545
+ };
546
+ context.controller.emit(e);
547
+ }
548
+ },
549
+ notify_new_dora_if_needed: function (_a) {
550
+ var context = _a.context, event = _a.event;
551
+ var id = context.genEventID();
552
+ if (event.type == "AN_KAN") {
553
+ var tile = context.controller.wall.openDoraMarker();
554
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
555
+ var w = _b[_i];
556
+ var e = {
557
+ id: id,
558
+ type: "NEW_DORA",
559
+ wind: w,
560
+ doraMarker: tile,
561
+ };
562
+ context.controller.emit(e);
563
+ }
564
+ }
565
+ if (event.type == "SHO_KAN") {
566
+ }
567
+ },
568
+ disable_one_shot: function (_a) {
569
+ var context = _a.context, event = _a.event;
570
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
571
+ var w = _b[_i];
572
+ context.oneShotMap[w] = false;
573
+ }
574
+ },
575
+ disable_one_shot_for_me: function (_a) {
576
+ var context = _a.context, event = _a.event;
577
+ context.oneShotMap[context.currentWind] = false;
578
+ },
579
+ notify_end: function (_a) {
580
+ var context = _a.context, event = _a.event;
581
+ var id = context.genEventID();
582
+ var hands = (0, managers_1.createWindMap)("");
583
+ if (event.type == "DRAWN_GAME_BY_NINE_TILES") {
584
+ hands[event.iam] = context.controller.hand(event.iam).toString();
585
+ for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
586
+ var w = _b[_i];
587
+ var e = {
588
+ id: id,
589
+ type: "END_GAME",
590
+ subType: "NINE_TILES",
591
+ wind: w,
592
+ shouldContinue: true,
593
+ sticks: context.controller.placeManager.sticks,
594
+ scores: context.controller.scoreManager.summary,
595
+ deltas: (0, managers_1.createWindMap)(0),
596
+ hands: hands,
597
+ };
598
+ context.controller.emit(e);
599
+ }
600
+ }
601
+ else if (event.type == "RON" || event.type == "TSUMO") {
602
+ var shouldContinue = event.iam == "1w";
603
+ var finalResults = context.controller.finalResult(event.ret, event.iam);
604
+ for (var _c = 0, _d = Object.values(constants_1.WIND); _c < _d.length; _c++) {
605
+ var w = _d[_c];
606
+ hands[event.iam] = context.controller.hand(event.iam).toString();
607
+ var e = {
608
+ id: id,
609
+ type: "END_GAME",
610
+ subType: "WIN_GAME",
611
+ wind: w,
612
+ shouldContinue: shouldContinue,
613
+ sticks: { reach: 0, dead: 0 },
614
+ scores: context.controller.scoreManager.summary,
615
+ deltas: finalResults.deltas,
616
+ hands: hands,
617
+ };
618
+ context.controller.emit(e);
619
+ }
620
+ }
621
+ else if (!context.controller.wall.canKan ||
622
+ context.controller.river.cannotContinue()) {
623
+ var subType = !context.controller.wall.canKan
624
+ ? "FOUR_KAN"
625
+ : "FOUR_WIND";
626
+ for (var _e = 0, _f = Object.values(constants_1.WIND); _e < _f.length; _e++) {
627
+ var w = _f[_e];
628
+ var e = {
629
+ id: id,
630
+ type: "END_GAME",
631
+ subType: subType,
632
+ wind: w,
633
+ shouldContinue: true,
634
+ sticks: context.controller.placeManager.sticks,
635
+ scores: context.controller.scoreManager.summary,
636
+ deltas: (0, managers_1.createWindMap)(0),
637
+ hands: (0, managers_1.createWindMap)(""),
638
+ };
639
+ context.controller.emit(e);
640
+ }
641
+ }
642
+ else if (!context.controller.wall.canDraw) {
643
+ var wind = [];
644
+ for (var _g = 0, _h = Object.values(constants_1.WIND); _g < _h.length; _g++) {
645
+ var w = _h[_g];
646
+ var hand = context.controller.hand(w);
647
+ var shan = new calculator_1.ShantenCalculator(hand).calc();
648
+ if (shan == 0) {
649
+ wind.push(w);
650
+ hands[w] = hand.toString();
651
+ }
652
+ }
653
+ var nothing = wind.length == 0 || wind.length == 4;
654
+ var deltas = (0, managers_1.createWindMap)(0);
655
+ for (var _j = 0, _k = Object.values(constants_1.WIND); _j < _k.length; _j++) {
656
+ var w = _k[_j];
657
+ if (wind.includes(w))
658
+ deltas[w] += nothing ? 0 : 3000 / wind.length;
659
+ else
660
+ deltas[w] -= nothing ? 0 : 3000 / (4 - wind.length);
661
+ }
662
+ var shouldContinue = wind.length == 4 || deltas["1w"] > 0;
663
+ for (var _l = 0, _m = Object.values(constants_1.WIND); _l < _m.length; _l++) {
664
+ var w = _m[_l];
665
+ var e = {
666
+ id: id,
667
+ type: "END_GAME",
668
+ subType: "DRAWN_GAME",
669
+ wind: w,
670
+ shouldContinue: shouldContinue,
671
+ sticks: context.controller.placeManager.sticks,
672
+ scores: context.controller.scoreManager.summary,
673
+ deltas: deltas,
674
+ hands: hands,
675
+ };
676
+ context.controller.emit(e);
677
+ }
678
+ }
679
+ else
680
+ throw new Error("unexpected event ".concat(event.type));
681
+ },
682
+ },
683
+ actors: {},
684
+ guards: {
685
+ canChi: function (_a, params) {
686
+ var context = _a.context, event = _a.event;
687
+ if (event.type == "CHI")
688
+ return !!context.controller.doChi(event.iam, context.controller.river.lastTile.w, context.controller.river.lastTile.t);
689
+ console.error("guards.canChi receive ".concat(event.type));
690
+ return false;
691
+ },
692
+ canPon: function (_a, params) {
693
+ var context = _a.context, event = _a.event;
694
+ if (event.type == "PON")
695
+ return !!context.controller.doPon(event.iam, context.controller.river.lastTile.w, context.controller.river.lastTile.t);
696
+ console.error("guards.canPon receive ".concat(event.type));
697
+ return false;
698
+ },
699
+ canWin: function (_a, params) {
700
+ var context = _a.context, event = _a.event;
701
+ if (event.type == "TSUMO" || event.type == "RON") {
702
+ return true;
703
+ }
704
+ console.error("guards.canWin receive ".concat(event.type));
705
+ return false;
706
+ },
707
+ canReach: function (_a, params) {
708
+ var context = _a.context, event = _a.event;
709
+ if (event.type == "REACH") {
710
+ return !!context.controller.doReach(event.iam);
711
+ }
712
+ console.error("guards.canReach receive ".concat(event.type));
713
+ return false;
714
+ },
715
+ cannotContinue: function (_a, params) {
716
+ var context = _a.context, event = _a.event;
717
+ return (!context.controller.wall.canDraw ||
718
+ !context.controller.wall.canKan ||
719
+ context.controller.river.cannotContinue());
720
+ },
721
+ },
722
+ delays: {},
723
+ });
724
+ };
725
+ exports.createControllerMachine = createControllerMachine;
726
+ function incrementalIDGenerator(start) {
727
+ if (start === void 0) { start = 0; }
728
+ var idx = start;
729
+ return function () {
730
+ return (idx++).toString();
731
+ };
732
+ }
733
+ exports.incrementalIDGenerator = incrementalIDGenerator;