@konoui/mjimage 0.0.31 → 0.0.32

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 (61) hide show
  1. package/dist/index.cjs +30 -0
  2. package/dist/index.d.cts +1386 -0
  3. package/dist/index.d.ts +1386 -0
  4. package/dist/index.js +10953 -0
  5. package/package.json +23 -14
  6. package/dist/mjs/cmd/index.d.ts +0 -1
  7. package/dist/mjs/cmd/index.js +0 -49
  8. package/dist/mjs/index.d.ts +0 -6
  9. package/dist/mjs/index.js +0 -22
  10. package/dist/mjs/lib/calculator/calc.d.ts +0 -275
  11. package/dist/mjs/lib/calculator/calc.js +0 -1397
  12. package/dist/mjs/lib/calculator/efficiency.d.ts +0 -24
  13. package/dist/mjs/lib/calculator/efficiency.js +0 -82
  14. package/dist/mjs/lib/calculator/helper.d.ts +0 -6
  15. package/dist/mjs/lib/calculator/helper.js +0 -21
  16. package/dist/mjs/lib/calculator/index.d.ts +0 -3
  17. package/dist/mjs/lib/calculator/index.js +0 -19
  18. package/dist/mjs/lib/controller/controller.d.ts +0 -168
  19. package/dist/mjs/lib/controller/controller.js +0 -897
  20. package/dist/mjs/lib/controller/events.d.ts +0 -171
  21. package/dist/mjs/lib/controller/events.js +0 -102
  22. package/dist/mjs/lib/controller/game.d.ts +0 -5
  23. package/dist/mjs/lib/controller/game.js +0 -29
  24. package/dist/mjs/lib/controller/index.d.ts +0 -10
  25. package/dist/mjs/lib/controller/index.js +0 -26
  26. package/dist/mjs/lib/controller/managers.d.ts +0 -83
  27. package/dist/mjs/lib/controller/managers.js +0 -194
  28. package/dist/mjs/lib/controller/player-efficiency.d.ts +0 -24
  29. package/dist/mjs/lib/controller/player-efficiency.js +0 -153
  30. package/dist/mjs/lib/controller/player.d.ts +0 -12
  31. package/dist/mjs/lib/controller/player.js +0 -85
  32. package/dist/mjs/lib/controller/replay.d.ts +0 -10
  33. package/dist/mjs/lib/controller/replay.js +0 -31
  34. package/dist/mjs/lib/controller/river.d.ts +0 -19
  35. package/dist/mjs/lib/controller/river.js +0 -52
  36. package/dist/mjs/lib/controller/state-machine.d.ts +0 -67
  37. package/dist/mjs/lib/controller/state-machine.js +0 -771
  38. package/dist/mjs/lib/controller/wall.d.ts +0 -24
  39. package/dist/mjs/lib/controller/wall.js +0 -117
  40. package/dist/mjs/lib/core/constants.d.ts +0 -73
  41. package/dist/mjs/lib/core/constants.js +0 -73
  42. package/dist/mjs/lib/core/index.d.ts +0 -2
  43. package/dist/mjs/lib/core/index.js +0 -18
  44. package/dist/mjs/lib/core/lexer.d.ts +0 -14
  45. package/dist/mjs/lib/core/lexer.js +0 -53
  46. package/dist/mjs/lib/core/parser.d.ts +0 -120
  47. package/dist/mjs/lib/core/parser.js +0 -612
  48. package/dist/mjs/lib/image/image.d.ts +0 -42
  49. package/dist/mjs/lib/image/image.js +0 -361
  50. package/dist/mjs/lib/image/index.d.ts +0 -1
  51. package/dist/mjs/lib/image/index.js +0 -17
  52. package/dist/mjs/lib/measure-text/index.d.ts +0 -19
  53. package/dist/mjs/lib/measure-text/index.js +0 -49
  54. package/dist/mjs/lib/myassert/index.d.ts +0 -1
  55. package/dist/mjs/lib/myassert/index.js +0 -8
  56. package/dist/mjs/lib/table/index.d.ts +0 -2
  57. package/dist/mjs/lib/table/index.js +0 -18
  58. package/dist/mjs/lib/table/table-parser.d.ts +0 -127
  59. package/dist/mjs/lib/table/table-parser.js +0 -105
  60. package/dist/mjs/lib/table/table.d.ts +0 -12
  61. package/dist/mjs/lib/table/table.js +0 -248
@@ -1,897 +0,0 @@
1
- "use strict";
2
- var __extends = (this && this.__extends) || (function () {
3
- var extendStatics = function (d, b) {
4
- extendStatics = Object.setPrototypeOf ||
5
- ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
6
- function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };
7
- return extendStatics(d, b);
8
- };
9
- return function (d, b) {
10
- if (typeof b !== "function" && b !== null)
11
- throw new TypeError("Class extends value " + String(b) + " is not a constructor or null");
12
- extendStatics(d, b);
13
- function __() { this.constructor = d; }
14
- d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
15
- };
16
- })();
17
- var __assign = (this && this.__assign) || function () {
18
- __assign = Object.assign || function(t) {
19
- for (var s, i = 1, n = arguments.length; i < n; i++) {
20
- s = arguments[i];
21
- for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
22
- t[p] = s[p];
23
- }
24
- return t;
25
- };
26
- return __assign.apply(this, arguments);
27
- };
28
- var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
29
- if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
30
- if (ar || !(i in from)) {
31
- if (!ar) ar = Array.prototype.slice.call(from, 0, i);
32
- ar[i] = from[i];
33
- }
34
- }
35
- return to.concat(ar || Array.prototype.slice.call(from));
36
- };
37
- Object.defineProperty(exports, "__esModule", { value: true });
38
- exports.Observer = exports.BaseActor = exports.ActorHand = exports.Controller = void 0;
39
- var xstate_1 = require("xstate");
40
- var myassert_1 = require("../myassert");
41
- var core_1 = require("../core/");
42
- var calculator_1 = require("../calculator");
43
- var parser_1 = require("../core/parser");
44
- var state_machine_1 = require("./state-machine");
45
- var events_1 = require("./events");
46
- var _1 = require(".");
47
- var Controller = (function () {
48
- function Controller(players, params) {
49
- var _a;
50
- var _this = this;
51
- var _b;
52
- this.wall = new _1.Wall();
53
- this.actor = (0, xstate_1.createActor)((0, state_machine_1.createControllerMachine)(this), {});
54
- this.handlers = {};
55
- this.mailBox = {};
56
- this.histories = [];
57
- this.debugMode = (_b = params === null || params === void 0 ? void 0 : params.debug) !== null && _b !== void 0 ? _b : false;
58
- this.handlers = players.reduce(function (m, obj) {
59
- m[obj.id] = obj.handler;
60
- return m;
61
- }, {});
62
- this.playerIDs = players.map(function (v) { return v.id; });
63
- players.forEach(function (p) { return p.handler.on(function (e) { return _this.enqueue(e); }); });
64
- var handler = (0, events_1.createEventEmitter)();
65
- this.observer = new Observer(handler);
66
- this.observer.eventHandler.on(function (e) { return _this.observer.handleEvent(e); });
67
- var initial = Object.fromEntries(this.playerIDs.map(function (i) { return [i, 25000]; }));
68
- this.observer.scoreManager = new _1.ScoreManager(initial);
69
- var shuffled = (0, _1.shuffle)(this.playerIDs.concat());
70
- this.observer.placeManager = new _1.PlaceManager((_a = {},
71
- _a[shuffled[0]] = "1w",
72
- _a[shuffled[1]] = "2w",
73
- _a[shuffled[2]] = "3w",
74
- _a[shuffled[3]] = "4w",
75
- _a));
76
- }
77
- Controller.prototype.boardParams = function (w) {
78
- var hand = this.hand(w);
79
- return {
80
- doraMarkers: this.observer.doraMarkers,
81
- round: this.placeManager.round,
82
- myWind: w,
83
- sticks: this.observer.placeManager.sticks,
84
- reached: !hand.reached
85
- ? undefined
86
- : this.river.discards(w).length != 0
87
- ? 1
88
- : 2,
89
- };
90
- };
91
- Controller.prototype.hand = function (w) {
92
- return this.observer.hand(w);
93
- };
94
- Object.defineProperty(Controller.prototype, "placeManager", {
95
- get: function () {
96
- return this.observer.placeManager;
97
- },
98
- enumerable: false,
99
- configurable: true
100
- });
101
- Object.defineProperty(Controller.prototype, "scoreManager", {
102
- get: function () {
103
- return this.observer.scoreManager;
104
- },
105
- enumerable: false,
106
- configurable: true
107
- });
108
- Object.defineProperty(Controller.prototype, "river", {
109
- get: function () {
110
- return this.observer.river;
111
- },
112
- enumerable: false,
113
- configurable: true
114
- });
115
- Controller.prototype.next = function (force) {
116
- if (!this.debugMode || force)
117
- this.actor.send({ type: "NEXT" });
118
- };
119
- Controller.prototype.emit = function (e) {
120
- var id = this.observer.placeManager.playerID(e.wind);
121
- this.handlers[id].emit(e);
122
- var iam = e.iam;
123
- if (e.wind == iam)
124
- this.observer.eventHandler.emit(e);
125
- else if (iam == null) {
126
- if (!this.observer.applied[e.id] || e.type == "DISTRIBUTE") {
127
- this.observer.eventHandler.emit(e);
128
- this.observer.applied[e.id] = true;
129
- }
130
- }
131
- };
132
- Controller.prototype.enqueue = function (event) {
133
- if (this.mailBox[event.id] == null)
134
- this.mailBox[event.id] = [];
135
- this.mailBox[event.id].push(event);
136
- };
137
- Controller.prototype.pollReplies = function (eventID, wind) {
138
- var events = this.mailBox[eventID];
139
- if (events == null) {
140
- throw new Error("not enqueued ".concat(eventID, " at ").concat(this.actor.getSnapshot().value));
141
- }
142
- if (events.length != wind.length) {
143
- throw new Error("".concat(eventID, ": num of event: got: ").concat(wind.length, ", want: ").concat(events.length));
144
- }
145
- if (wind.length == 0) {
146
- console.warn("no events to handle");
147
- return;
148
- }
149
- var sample = events[0];
150
- if (sample.type == "CHOICE_AFTER_DISCARDED") {
151
- var selected = (0, events_1.prioritizeDiscardedEvents)(events);
152
- if (selected.events.length == 0) {
153
- this.actor.send({ type: "" });
154
- return;
155
- }
156
- var e = selected.events[0];
157
- switch (selected.type) {
158
- case "RON":
159
- (0, myassert_1.assert)(e.choices.RON, "ron choice is none");
160
- this.actor.send({
161
- type: selected.type,
162
- iam: e.wind,
163
- ret: (0, calculator_1.deserializeWinResult)(e.choices.RON),
164
- targetInfo: {
165
- wind: e.discarterInfo.wind,
166
- tile: parser_1.Tile.from(e.discarterInfo.tile),
167
- },
168
- });
169
- break;
170
- case "DAI_KAN":
171
- (0, myassert_1.assert)(e.choices.DAI_KAN, "daikan choice is none");
172
- this.actor.send({
173
- type: selected.type,
174
- iam: e.wind,
175
- block: parser_1.Block.from(e.choices.DAI_KAN),
176
- });
177
- break;
178
- case "CHI":
179
- case "PON":
180
- var c = e.choices[selected.type];
181
- (0, myassert_1.assert)(c, "".concat(selected.type, " choice is none"));
182
- (0, myassert_1.assert)(selected.events.length == 1, "found more than one selected: ".concat(JSON.stringify(selected, null, 2)));
183
- this.actor.send({
184
- type: selected.type,
185
- iam: e.wind,
186
- block: parser_1.Block.from(c[0]),
187
- });
188
- }
189
- }
190
- else if (sample.type == "CHOICE_AFTER_DRAWN") {
191
- var selected = (0, events_1.prioritizeDrawnEvents)(events);
192
- (0, myassert_1.assert)(selected.events.length == 1, "found more than one selected: ".concat(JSON.stringify(selected, null, 2)));
193
- var e = selected.events[0];
194
- var w = e.wind;
195
- switch (selected.type) {
196
- case "TSUMO":
197
- (0, myassert_1.assert)(e.choices.TSUMO, "tsumo choice is none");
198
- this.actor.send({
199
- type: selected.type,
200
- ret: (0, calculator_1.deserializeWinResult)(e.choices.TSUMO),
201
- lastTile: parser_1.Tile.from(e.drawerInfo.tile),
202
- iam: w,
203
- });
204
- break;
205
- case "REACH":
206
- var candidates = e.choices[selected.type];
207
- (0, myassert_1.assert)(candidates, "".concat(selected.type, " candidates is none"));
208
- this.actor.send({
209
- type: selected.type,
210
- tile: parser_1.Tile.from(candidates[0].tile),
211
- iam: w,
212
- });
213
- break;
214
- case "DISCARD":
215
- var tiles = e.choices[selected.type];
216
- (0, myassert_1.assert)(tiles, "".concat(selected.type, " choice is none"));
217
- this.actor.send({
218
- type: selected.type,
219
- tile: parser_1.Tile.from(tiles[0]).clone({ remove: core_1.OPERATOR.TSUMO }),
220
- iam: w,
221
- });
222
- break;
223
- case "AN_KAN": {
224
- var choices = e.choices[selected.type];
225
- (0, myassert_1.assert)(choices, "".concat(selected.type, " choice is none"));
226
- this.actor.send({
227
- type: selected.type,
228
- block: parser_1.BlockAnKan.from(choices[0]),
229
- iam: w,
230
- });
231
- break;
232
- }
233
- case "SHO_KAN": {
234
- var choices = e.choices[selected.type];
235
- (0, myassert_1.assert)(choices, "".concat(selected.type, " choice is none"));
236
- this.actor.send({
237
- type: selected.type,
238
- block: parser_1.Block.from(choices[0]),
239
- iam: w,
240
- });
241
- break;
242
- }
243
- case "DRAWN_GAME_BY_NINE_TILES":
244
- this.actor.send({ type: "DRAWN_GAME_BY_NINE_TILES", iam: w });
245
- break;
246
- }
247
- }
248
- else if (sample.type == "CHOICE_AFTER_CALLED") {
249
- (0, myassert_1.assert)(sample.choices.DISCARD, "discard candidate tile is none: ".concat(JSON.stringify(sample, null, 2), " ").concat(this.hand(sample.wind).toString()));
250
- var w = sample.wind;
251
- var t = parser_1.Tile.from(sample.choices.DISCARD[0]);
252
- (0, myassert_1.assert)(t != null, "undefined tile ".concat(this.hand(w).toString()));
253
- this.actor.send({ type: "DISCARD", tile: t, iam: w });
254
- }
255
- else if (sample.type == "CHOICE_FOR_CHAN_KAN") {
256
- var selected = events.filter(function (e) {
257
- var ce = e;
258
- return ce.choices.RON;
259
- });
260
- if (selected.length == 0) {
261
- this.actor.send({ type: "" });
262
- return;
263
- }
264
- var e = selected[0];
265
- (0, myassert_1.assert)(e.choices.RON, "ron choice is none");
266
- this.actor.send({
267
- type: "RON",
268
- iam: e.wind,
269
- ret: (0, calculator_1.deserializeWinResult)(e.choices.RON),
270
- quadWin: true,
271
- targetInfo: {
272
- wind: e.callerInfo.wind,
273
- tile: parser_1.Tile.from(e.callerInfo.tile),
274
- },
275
- });
276
- }
277
- };
278
- Controller.prototype.export = function () {
279
- return this.histories.concat();
280
- };
281
- Controller.load = function (h) {
282
- var events = h.choiceEvents;
283
- var playerIDs = Object.keys(h.players);
284
- var empty = {
285
- emit: function (_) { },
286
- on: function (_) { },
287
- };
288
- var props = playerIDs.map(function (id) {
289
- return { id: id, handler: empty };
290
- });
291
- var c = new Controller(props);
292
- c.playerIDs = playerIDs;
293
- c.mailBox = events;
294
- c.observer.placeManager = new _1.PlaceManager(h.players, {
295
- round: structuredClone(h.round),
296
- sticks: structuredClone(h.sticks),
297
- });
298
- c.observer.scoreManager = new _1.ScoreManager(h.scores);
299
- c.wall = new _1.Wall(h.wall);
300
- return c;
301
- };
302
- Controller.prototype.start = function () {
303
- this.actor.subscribe(function (snapshot) {
304
- console.debug("State:", snapshot.value);
305
- });
306
- var ent = {
307
- scores: this.scoreManager.summary,
308
- round: this.placeManager.round,
309
- players: this.placeManager.playerMap,
310
- wall: this.wall.export(),
311
- choiceEvents: this.mailBox,
312
- sticks: this.placeManager.sticks,
313
- };
314
- this.actor.start();
315
- this.histories.push(ent);
316
- var v = this.actor.getSnapshot().status;
317
- };
318
- Controller.prototype.startGame = function () {
319
- for (;;) {
320
- console.debug("start========".concat(this.placeManager.round, "============="));
321
- this.start();
322
- this.wall = new _1.Wall();
323
- this.observer.applied = {};
324
- this.mailBox = {};
325
- this.actor = (0, xstate_1.createActor)((0, state_machine_1.createControllerMachine)(this));
326
- if (this.placeManager.is("3w1"))
327
- break;
328
- }
329
- };
330
- Controller.prototype.finalResult = function (ret, iam) {
331
- var hand = this.hand(iam);
332
- var blindDoraMarkers = hand.reached
333
- ? this.wall.blindDoraMarkers
334
- : undefined;
335
- var final = new calculator_1.DoubleCalculator(hand, __assign(__assign({}, ret.boardContext), { sticks: this.placeManager.sticks, blindDoraMarkers: blindDoraMarkers })).calc([ret.hand]);
336
- (0, myassert_1.assert)(final);
337
- return final;
338
- };
339
- Controller.prototype.doWin = function (w, t, params) {
340
- if (t == null)
341
- return false;
342
- var hand = this.hand(w);
343
- var env = this.boardParams(w);
344
- if (hand.drawn == null) {
345
- if (params == null)
346
- throw new Error("should ron but params == null");
347
- if (params.whoDiscarded == w)
348
- return false;
349
- if (params.missingRon)
350
- return false;
351
- hand = hand.clone();
352
- env.ronWind = params.whoDiscarded;
353
- env.finalDiscardWin = !this.wall.canDraw;
354
- env.quadWin = params.quadWin;
355
- hand.inc([t]);
356
- }
357
- else {
358
- env.finalWallWin = !this.wall.canDraw;
359
- env.replacementWin = params === null || params === void 0 ? void 0 : params.replacementWin;
360
- }
361
- env.oneShotWin = params === null || params === void 0 ? void 0 : params.oneShot;
362
- var tc = new calculator_1.BlockCalculator(hand);
363
- var dc = new calculator_1.DoubleCalculator(hand, env);
364
- var hands = tc.calc(t);
365
- var ret = dc.calc(hands);
366
- if (!ret)
367
- return false;
368
- if (ret.points.length == 0)
369
- return false;
370
- if (hand.draw == null) {
371
- var c_1 = calculator_1.Efficiency.candidateTiles(this.hand(w)).candidates;
372
- var tiles = this.river.discards(w).map(function (v) { return v.t; });
373
- if (tiles.some(function (t) { return c_1.some(function (ct) { return ct.equals(t, true); }); }))
374
- return false;
375
- }
376
- return ret;
377
- };
378
- Controller.prototype.doPon = function (w, whoDiscarded, t) {
379
- if (t == null)
380
- return false;
381
- if (w == whoDiscarded)
382
- return false;
383
- var hand = this.hand(w);
384
- if (hand.reached)
385
- return false;
386
- if (hand.hands.length < 3)
387
- return false;
388
- var fake = t.clone({ remove: core_1.OPERATOR.HORIZONTAL });
389
- if ((0, parser_1.isNum0)(t))
390
- fake = fake.clone({ n: 5 });
391
- if (hand.get(t.t, fake.n) < 2)
392
- return false;
393
- var blocks = [];
394
- var idx = Math.abs(Number(w[0]) - Number(whoDiscarded[0]));
395
- if (idx == 3)
396
- idx = 0;
397
- if (idx == 2)
398
- idx = 1;
399
- if (idx == 1)
400
- idx = 2;
401
- var b = new parser_1.BlockPon([fake, fake, fake]);
402
- b = b.clone({
403
- replace: { idx: idx, tile: t.clone({ add: core_1.OPERATOR.HORIZONTAL }) },
404
- });
405
- var ridx = (idx % 2) + 1;
406
- var rt = b.tiles[ridx];
407
- if ((0, parser_1.isNum5)(t) && hand.get(t.t, 0) > 0)
408
- b = b.clone({ replace: { idx: ridx, tile: rt.clone({ n: 0 }) } });
409
- blocks.push(b);
410
- if ((0, parser_1.isNum5)(t) && hand.get(t.t, fake.n) == 3) {
411
- var red = b.clone({ replace: { idx: ridx, tile: rt.clone({ n: 5 }) } });
412
- blocks.push(red);
413
- }
414
- return blocks;
415
- };
416
- Controller.prototype.doChi = function (w, whoDiscarded, t) {
417
- if (t == null)
418
- return false;
419
- if (!t.isNum())
420
- return false;
421
- if ((0, _1.nextWind)(whoDiscarded) != w)
422
- return false;
423
- var hand = this.hand(w);
424
- if (hand.reached)
425
- return false;
426
- if (hand.hands.length < 3)
427
- return false;
428
- var fake = t;
429
- if ((0, parser_1.isNum0)(fake))
430
- fake = t.clone({ n: 5 });
431
- var blocks = [];
432
- var left = fake.n - 2 >= 1 &&
433
- hand.get(t.t, fake.n - 2) > 0 &&
434
- hand.get(t.t, fake.n - 1) > 0;
435
- var cloned = t.clone({
436
- add: core_1.OPERATOR.HORIZONTAL,
437
- remove: core_1.OPERATOR.TSUMO,
438
- });
439
- if (left)
440
- blocks.push(new parser_1.BlockChi([
441
- cloned,
442
- new parser_1.Tile(t.t, fake.n - 1),
443
- new parser_1.Tile(t.t, fake.n - 2),
444
- ]));
445
- var right = fake.n + 2 <= 9 &&
446
- hand.get(t.t, fake.n + 1) > 0 &&
447
- hand.get(t.t, fake.n + 2) > 0;
448
- if (right)
449
- blocks.push(new parser_1.BlockChi([
450
- cloned,
451
- new parser_1.Tile(t.t, fake.n + 1),
452
- new parser_1.Tile(t.t, fake.n + 2),
453
- ]));
454
- var center = fake.n - 1 >= 1 &&
455
- fake.n + 1 <= 9 &&
456
- hand.get(t.t, fake.n - 1) > 0 &&
457
- hand.get(t.t, fake.n + 1) > 0;
458
- if (center)
459
- blocks.push(new parser_1.BlockChi([
460
- cloned,
461
- new parser_1.Tile(t.t, fake.n - 1),
462
- new parser_1.Tile(t.t, fake.n + 1),
463
- ]));
464
- if (blocks.length == 0)
465
- return false;
466
- if (hand.hands.length == 4) {
467
- var b = blocks[0];
468
- var tiles = this.cannotDiscardTile(blocks[0]);
469
- var ltiles = hand.dec([b.tiles[1], b.tiles[2]]);
470
- var cannotCall = tiles.reduce(function (acc, e) { return acc + hand.get(e.t, e.n); }, 0) ==
471
- 2;
472
- hand.inc(ltiles);
473
- if (cannotCall)
474
- return false;
475
- }
476
- var hasRed = hand.get(t.t, 0) > 0;
477
- var reds = this.redPattern(blocks, hasRed);
478
- if (reds.length > 0 && hand.get(t.t, 5) == 1)
479
- return reds;
480
- return blocks.concat(reds);
481
- };
482
- Controller.prototype.redPattern = function (blocks, hasRed) {
483
- if (blocks.length == 0)
484
- return [];
485
- if (!hasRed)
486
- return [];
487
- var filtered = blocks.filter(function (b) { return (0, parser_1.isNum5)(b.tiles[1]) || (0, parser_1.isNum5)(b.tiles[2]); });
488
- return filtered
489
- .map(function (b) {
490
- if ((0, parser_1.isNum5)(b.tiles[1])) {
491
- var rt = b.tiles[1].clone({ n: 0 });
492
- var n = b.clone({ replace: { idx: 1, tile: rt } });
493
- return n;
494
- }
495
- else if ((0, parser_1.isNum5)(b.tiles[2])) {
496
- var rt = b.tiles[2].clone({ n: 0 });
497
- var n = b.clone({ replace: { idx: 2, tile: rt } });
498
- return n;
499
- }
500
- })
501
- .filter(function (b) { return b != null; });
502
- };
503
- Controller.prototype.doReach = function (w) {
504
- var hand = this.hand(w);
505
- if (hand.reached)
506
- return false;
507
- if (!hand.menzen)
508
- return false;
509
- var s = new calculator_1.ShantenCalculator(hand).calc();
510
- if (s > 0)
511
- return false;
512
- var r = calculator_1.Efficiency.calcCandidates(hand, hand.hands);
513
- return r;
514
- };
515
- Controller.prototype.doDiscard = function (w, called) {
516
- if (this.hand(w).reached)
517
- return [this.hand(w).drawn];
518
- var hand = this.hand(w).hands;
519
- if (called == null)
520
- return hand;
521
- if (called instanceof parser_1.BlockPon) {
522
- return hand.filter(function (v) { return !v.equals(called.tiles[0], true); });
523
- }
524
- var tiles = this.cannotDiscardTile(called);
525
- var ret = hand.filter(function (v) { return !tiles.some(function (t) { return v.equals(t, true); }); });
526
- (0, myassert_1.assert)(ret.length > 0, "no tiles to discard. hand: ".concat(this.hand(w), ", suji: ").concat(tiles, ", block-chi: ").concat(called));
527
- return ret;
528
- };
529
- Controller.prototype.cannotDiscardTile = function (called) {
530
- var h = called.tiles[0].n;
531
- var h1 = called.tiles[1].n;
532
- var t = called.tiles[0].t;
533
- if (h == 0)
534
- h = 5;
535
- if (h1 == 0)
536
- h1 = 5;
537
- if (h - 2 == h1)
538
- return [new parser_1.Tile(t, h - 3), new parser_1.Tile(t, h)];
539
- if (h + 1 == h1)
540
- return [new parser_1.Tile(t, h + 3), new parser_1.Tile(t, h)];
541
- return [];
542
- };
543
- Controller.prototype.doAnKan = function (w) {
544
- var hand = this.hand(w);
545
- var blocks = [];
546
- if (hand.reached)
547
- return false;
548
- for (var _i = 0, _a = Object.values(core_1.TYPE); _i < _a.length; _i++) {
549
- var t = _a[_i];
550
- for (var n = 1; n < hand.getArrayLen(t); n++) {
551
- if (hand.get(t, n) == 4) {
552
- var tiles = [
553
- new parser_1.Tile(t, n),
554
- new parser_1.Tile(t, n),
555
- new parser_1.Tile(t, n),
556
- new parser_1.Tile(t, n),
557
- ];
558
- if (t != core_1.TYPE.Z && n == 5)
559
- tiles[0] = tiles[0].clone({ n: 0 });
560
- blocks.push(new parser_1.BlockAnKan(tiles));
561
- }
562
- }
563
- }
564
- if (blocks.length == 0)
565
- return false;
566
- for (var _b = 0, blocks_1 = blocks; _b < blocks_1.length; _b++) {
567
- var b = blocks_1[_b];
568
- (0, myassert_1.assert)(b.tiles.filter(function (t) { return t.has(core_1.OPERATOR.HORIZONTAL); }).length == 0, "h op ".concat(b.toString()));
569
- }
570
- return blocks;
571
- };
572
- Controller.prototype.doShoKan = function (w) {
573
- var hand = this.hand(w);
574
- if (hand.reached)
575
- return false;
576
- var called = hand.called.filter(function (b) { return b instanceof parser_1.BlockPon; });
577
- if (called.length == 0)
578
- return false;
579
- var blocks = [];
580
- for (var _i = 0, called_1 = called; _i < called_1.length; _i++) {
581
- var cb = called_1[_i];
582
- var pick = cb.tiles[0];
583
- if (hand.get(pick.t, pick.n) == 1) {
584
- var tiles = __spreadArray(__spreadArray([], cb.tiles, true), [
585
- new parser_1.Tile(pick.t, pick.n, [core_1.OPERATOR.HORIZONTAL]),
586
- ], false);
587
- if ((0, parser_1.isNum5)(pick) && hand.get(pick.t, 0) == 1)
588
- tiles[3].n == 0;
589
- blocks.push(new parser_1.BlockShoKan(tiles));
590
- }
591
- }
592
- if (blocks.length == 0)
593
- return false;
594
- for (var _a = 0, blocks_2 = blocks; _a < blocks_2.length; _a++) {
595
- var b = blocks_2[_a];
596
- (0, myassert_1.assert)(b.tiles.filter(function (t) { return t.has(core_1.OPERATOR.HORIZONTAL); }).length == 2, "h op ".concat(b.toString()));
597
- }
598
- return blocks;
599
- };
600
- Controller.prototype.doDaiKan = function (w, whoDiscarded, t) {
601
- var hand = this.hand(w);
602
- if (hand.reached)
603
- return false;
604
- if (w == whoDiscarded)
605
- return false;
606
- var fake = t.clone({ remove: core_1.OPERATOR.HORIZONTAL });
607
- if ((0, parser_1.isNum0)(fake))
608
- fake = fake.clone({ n: 5 });
609
- if (hand.get(fake.t, fake.n) != 3)
610
- return false;
611
- var base = new parser_1.BlockDaiKan([fake, fake, fake, fake]);
612
- var idx = Math.abs(Number(w[0]) - Number(whoDiscarded[0]));
613
- if (idx == 3)
614
- idx = 0;
615
- if (idx == 1)
616
- idx = 3;
617
- var b = base.clone({
618
- replace: { idx: idx, tile: t.clone({ add: core_1.OPERATOR.HORIZONTAL }) },
619
- });
620
- if ((0, parser_1.isNum5)(fake) && (0, parser_1.isNum5)(t)) {
621
- var ridx = (idx % 3) + 1;
622
- var rt = b.tiles[ridx].clone({ n: 0 });
623
- b = b.clone({ replace: { idx: ridx, tile: rt } });
624
- }
625
- (0, myassert_1.assert)(b.tiles.filter(function (t) { return t.has(core_1.OPERATOR.HORIZONTAL); }).length == 1, "h op ".concat(b.toString()));
626
- return b;
627
- };
628
- Controller.prototype.canDrawnGame = function (w) {
629
- if (this.river.discards(w).length != 0)
630
- return false;
631
- var h = this.hand(w);
632
- var num = h.get(core_1.TYPE.M, 1) +
633
- h.get(core_1.TYPE.M, 9) +
634
- h.get(core_1.TYPE.S, 1) +
635
- h.get(core_1.TYPE.S, 9) +
636
- h.get(core_1.TYPE.P, 1) +
637
- h.get(core_1.TYPE.P, 9);
638
- for (var i = 0; i < h.getArrayLen(core_1.TYPE.Z); i++)
639
- num += h.get(core_1.TYPE.Z, i);
640
- return num >= 9;
641
- };
642
- Controller.prototype.initialHands = function () {
643
- var m = (0, calculator_1.createWindMap)("");
644
- for (var i = 0; i < 3; i++) {
645
- for (var _i = 0, _a = Object.values(core_1.WIND); _i < _a.length; _i++) {
646
- var w = _a[_i];
647
- for (var j = 0; j < 4; j++) {
648
- m[w] += this.wall.draw().toString();
649
- }
650
- }
651
- }
652
- for (var _b = 0, _c = Object.values(core_1.WIND); _b < _c.length; _b++) {
653
- var w = _c[_b];
654
- m[w] += this.wall.draw().toString();
655
- }
656
- return m;
657
- };
658
- return Controller;
659
- }());
660
- exports.Controller = Controller;
661
- var ActorHand = (function (_super) {
662
- __extends(ActorHand, _super);
663
- function ActorHand() {
664
- return _super !== null && _super.apply(this, arguments) || this;
665
- }
666
- ActorHand.prototype.isBackHand = function () {
667
- for (var _i = 0, _a = Object.values(core_1.TYPE); _i < _a.length; _i++) {
668
- var t = _a[_i];
669
- if (t == core_1.TYPE.BACK)
670
- continue;
671
- if (this.sum(t) > 0)
672
- return false;
673
- }
674
- return this.sum(core_1.TYPE.BACK) > 0;
675
- };
676
- ActorHand.prototype.clone = function () {
677
- var c = new ActorHand(this.toString());
678
- c.data.reached = this.data.reached;
679
- return c;
680
- };
681
- ActorHand.prototype.dec = function (tiles) {
682
- if (!this.isBackHand())
683
- return _super.prototype.dec.call(this, tiles);
684
- _super.prototype.dec.call(this, tiles.map(function () { return new parser_1.Tile(core_1.TYPE.BACK, 0); }));
685
- return __spreadArray([], tiles, true);
686
- };
687
- return ActorHand;
688
- }(calculator_1.Hand));
689
- exports.ActorHand = ActorHand;
690
- var BaseActor = (function () {
691
- function BaseActor(id, eventHandler) {
692
- this.river = new _1.River();
693
- this.placeManager = new _1.PlaceManager({});
694
- this.scoreManager = new _1.ScoreManager({});
695
- this.hands = (0, calculator_1.createWindMap)(new ActorHand(""));
696
- this.counter = new _1.Counter();
697
- this.doraMarkers = [];
698
- this.id = id;
699
- this.eventHandler = eventHandler;
700
- }
701
- BaseActor.prototype.hand = function (w) {
702
- return this.hands[w];
703
- };
704
- BaseActor.prototype.handleEvent = function (e) {
705
- var _a, _b, _c;
706
- try {
707
- switch (e.type) {
708
- case "CHOICE_AFTER_CALLED":
709
- case "CHOICE_AFTER_DISCARDED":
710
- case "CHOICE_AFTER_DRAWN":
711
- case "CHOICE_FOR_CHAN_KAN":
712
- break;
713
- case "DISTRIBUTE":
714
- this.counter.reset();
715
- var doraMarker = parser_1.Tile.from(e.doraMarker);
716
- this.setHands(e);
717
- this.placeManager = new _1.PlaceManager(structuredClone(e.places), {
718
- round: structuredClone(e.round),
719
- sticks: structuredClone(e.sticks),
720
- });
721
- this.scoreManager = new _1.ScoreManager(structuredClone(e.scores));
722
- this.doraMarkers = [doraMarker];
723
- this.counter.dec(doraMarker);
724
- for (var _i = 0, _d = Object.values(core_1.WIND); _i < _d.length; _i++) {
725
- var w = _d[_i];
726
- if (w != e.wind)
727
- continue;
728
- (_a = this.counter).dec.apply(_a, this.hand(w).hands);
729
- }
730
- break;
731
- case "DRAW": {
732
- var t = parser_1.Tile.from(e.tile);
733
- this.hands[e.iam].draw(t);
734
- this.counter.dec(t);
735
- break;
736
- }
737
- case "DISCARD": {
738
- var t = parser_1.Tile.from(e.tile);
739
- this.river.discard(t, e.iam);
740
- this.hands[e.iam].discard(t);
741
- if (e.iam != e.wind) {
742
- this.counter.dec(t);
743
- this.counter.addTileToSafeMap(t, e.iam);
744
- for (var _e = 0, _f = Object.values(core_1.WIND); _e < _f.length; _e++) {
745
- var w = _f[_e];
746
- if (this.hand(w).reached)
747
- this.counter.addTileToSafeMap(t, w);
748
- }
749
- }
750
- break;
751
- }
752
- case "PON":
753
- case "CHI":
754
- case "DAI_KAN": {
755
- var block = parser_1.Block.from(e.block);
756
- this.hands[e.iam].call(block);
757
- this.river.markCalled();
758
- if (e.iam != e.wind)
759
- (_b = this.counter).dec.apply(_b, block.tiles.filter(function (t) { return !t.has(core_1.OPERATOR.HORIZONTAL); }));
760
- break;
761
- }
762
- case "SHO_KAN": {
763
- var block = parser_1.Block.from(e.block);
764
- this.hands[e.iam].kan(block);
765
- if (e.iam != e.wind)
766
- this.counter.dec(block.tiles.filter(function (t) { return t.has(core_1.OPERATOR.HORIZONTAL); })[0]);
767
- break;
768
- }
769
- case "AN_KAN": {
770
- var block = parser_1.Block.from(e.block);
771
- this.hands[e.iam].kan(block);
772
- if (e.iam != e.wind)
773
- (_c = this.counter).dec.apply(_c, block.tiles.filter(function (t) { return !t.has(core_1.OPERATOR.HORIZONTAL); }));
774
- break;
775
- }
776
- case "REACH":
777
- var pid = this.placeManager.playerID(e.iam);
778
- this.hands[e.iam].reach();
779
- this.scoreManager.reach(pid);
780
- this.placeManager.incrementReachStick();
781
- break;
782
- case "NEW_DORA": {
783
- var doraMarker_1 = parser_1.Tile.from(e.doraMarker);
784
- this.doraMarkers.push(doraMarker_1);
785
- this.counter.dec(doraMarker_1);
786
- break;
787
- }
788
- case "TSUMO":
789
- break;
790
- case "RON":
791
- if (e.pushBackReachStick) {
792
- var w = e.victimInfo.wind;
793
- var id = this.placeManager.playerID(w);
794
- this.scoreManager.restoreReachStick(id);
795
- this.placeManager.decrementReachStick();
796
- }
797
- break;
798
- case "END_GAME":
799
- switch (e.subType) {
800
- case "NINE_TILES":
801
- case "FOUR_KAN":
802
- case "FOUR_WIND":
803
- this.placeManager.incrementDeadStick();
804
- break;
805
- case "DRAWN_GAME": {
806
- var pm = this.placeManager.playerMap;
807
- this.scoreManager.update(e.deltas, pm);
808
- this.placeManager.incrementDeadStick();
809
- if (!e.shouldContinue)
810
- this.placeManager.nextRound();
811
- break;
812
- }
813
- case "WIN_GAME": {
814
- var pm = this.placeManager.playerMap;
815
- this.scoreManager.update(e.deltas, pm);
816
- if (e.shouldContinue)
817
- this.placeManager.incrementDeadStick();
818
- else {
819
- this.placeManager.nextRound();
820
- this.placeManager.resetDeadStick();
821
- }
822
- this.placeManager.resetReachStick();
823
- break;
824
- }
825
- }
826
- break;
827
- default:
828
- throw new Error("unexpected event ".concat(JSON.stringify(e, null, 2)));
829
- }
830
- }
831
- catch (error) {
832
- throw new Error("".concat(this.id, " ").concat(e.type, " ").concat(error));
833
- }
834
- };
835
- return BaseActor;
836
- }());
837
- exports.BaseActor = BaseActor;
838
- var Observer = (function (_super) {
839
- __extends(Observer, _super);
840
- function Observer(eventHandler) {
841
- var _this = _super.call(this, "observer", eventHandler) || this;
842
- _this.applied = {};
843
- _this.counter.disable = true;
844
- _this.hands = (0, calculator_1.createWindMap)(new ActorHand("_____________"));
845
- return _this;
846
- }
847
- Observer.prototype.setHands = function (e) {
848
- this.hands[e.wind] = new ActorHand(e.hands[e.wind]);
849
- };
850
- Observer.prototype.handleEvent = function (e) {
851
- _super.prototype.handleEvent.call(this, e);
852
- switch (e.type) {
853
- case "DISTRIBUTE":
854
- var ready = true;
855
- for (var _i = 0, _a = Object.values(core_1.WIND); _i < _a.length; _i++) {
856
- var w = _a[_i];
857
- ready && (ready = this.hand(w).get(core_1.TYPE.BACK, 0) == 0);
858
- }
859
- if (!ready)
860
- break;
861
- console.debug("DISTRIBUTE:", "round: ".concat(this.placeManager.round), "scores: ".concat(JSON.stringify(this.scoreManager.summary, null, 2)), "map: ".concat(JSON.stringify(this.placeManager.playerMap, null, 2)), "sticks: ".concat(JSON.stringify(this.placeManager.sticks, null, 2)));
862
- for (var _b = 0, _c = Object.values(core_1.WIND); _b < _c.length; _b++) {
863
- var w = _c[_b];
864
- console.debug(this.placeManager.playerID(w), "init hand: ".concat(this.hand(w).toString()));
865
- }
866
- break;
867
- case "DRAW":
868
- console.debug(this.placeManager.playerID(e.iam), "draw: ".concat(this.hand(e.iam).drawn), "hand: ".concat(this.hand(e.iam).toString()));
869
- break;
870
- case "DISCARD":
871
- console.debug(this.placeManager.playerID(e.iam), "discard: ".concat(e.tile.toString()), "hand: ".concat(this.hand(e.iam).toString()));
872
- break;
873
- case "CHI":
874
- case "PON":
875
- case "DAI_KAN":
876
- case "AN_KAN":
877
- case "SHO_KAN":
878
- console.debug(this.placeManager.playerID(e.iam), "call: ".concat(e.block.toString()), "hand: ".concat(this.hand(e.iam).toString()));
879
- break;
880
- case "REACH":
881
- console.debug(this.placeManager.playerID(e.iam), "reach: ".concat(this.hand(e.iam).toString()), "tile: ".concat(e.tile));
882
- break;
883
- case "TSUMO":
884
- case "RON":
885
- console.debug(this.placeManager.playerID(e.iam), "ron/tsumo: ".concat(JSON.stringify(e.ret, null, 2)), "hand: ".concat(this.hand(e.iam).toString()));
886
- break;
887
- case "END_GAME":
888
- for (var _d = 0, _e = Object.values(core_1.WIND); _d < _e.length; _d++) {
889
- var w = _e[_d];
890
- console.debug(this.placeManager.playerID(w), "end hand: ".concat(this.hand(w).toString()));
891
- }
892
- console.debug("END_GAME", e.subType, "scores", JSON.stringify(this.scoreManager.summary, null, 2), "sticks: ".concat(JSON.stringify(this.placeManager.sticks, null, 2)));
893
- }
894
- };
895
- return Observer;
896
- }(BaseActor));
897
- exports.Observer = Observer;