@konoui/mjimage 0.0.26 → 0.0.27
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.
- package/dist/mjs/lib/calculator/calc.d.ts +19 -7
- package/dist/mjs/lib/calculator/calc.js +56 -37
- package/dist/mjs/lib/calculator/efficiency.d.ts +5 -0
- package/dist/mjs/lib/calculator/helper.d.ts +6 -0
- package/dist/mjs/lib/calculator/helper.js +21 -0
- package/dist/mjs/lib/calculator/index.d.ts +1 -0
- package/dist/mjs/lib/calculator/index.js +1 -0
- package/dist/mjs/lib/controller/controller.d.ts +2 -2
- package/dist/mjs/lib/controller/controller.js +60 -43
- package/dist/mjs/lib/controller/events.d.ts +28 -28
- package/dist/mjs/lib/controller/managers.d.ts +0 -6
- package/dist/mjs/lib/controller/managers.js +6 -21
- package/dist/mjs/lib/controller/player.js +2 -2
- package/dist/mjs/lib/controller/state-machine.js +72 -34
- package/dist/mjs/lib/controller/wall.d.ts +6 -12
- package/dist/mjs/lib/controller/wall.js +17 -15
- package/dist/mjs/lib/core/constants.d.ts +4 -4
- package/dist/mjs/lib/core/constants.js +4 -4
- package/dist/mjs/lib/core/parser.d.ts +15 -5
- package/dist/mjs/lib/core/parser.js +26 -14
- package/dist/mjs/lib/image/image.js +2 -2
- package/dist/mjs/lib/table/table.js +1 -1
- package/package.json +1 -1
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { TYPE, Round, Wind } from "../core/constants";
|
|
2
|
-
import { Tile, BlockPon, BlockChi, BlockShoKan, BlockAnKan, BlockDaiKan, Type, Block } from "../core/parser";
|
|
2
|
+
import { Tile, BlockPon, BlockChi, BlockShoKan, BlockAnKan, BlockDaiKan, Type, Block, SerializedBlock } from "../core/parser";
|
|
3
3
|
export type TupleOfSize<T, N extends number, R extends unknown[] = []> = R["length"] extends N ? R : TupleOfSize<T, N, [T, ...R]>;
|
|
4
4
|
export interface HandData {
|
|
5
5
|
[TYPE.M]: TupleOfSize<number, 10>;
|
|
@@ -7,7 +7,7 @@ export interface HandData {
|
|
|
7
7
|
[TYPE.P]: TupleOfSize<number, 10>;
|
|
8
8
|
[TYPE.Z]: TupleOfSize<number, 8>;
|
|
9
9
|
[TYPE.BACK]: [string, number];
|
|
10
|
-
called: (BlockChi | BlockPon | BlockAnKan | BlockDaiKan | BlockShoKan)[];
|
|
10
|
+
called: readonly (BlockChi | BlockPon | BlockAnKan | BlockDaiKan | BlockShoKan)[];
|
|
11
11
|
tsumo: Tile | null;
|
|
12
12
|
reached: boolean;
|
|
13
13
|
}
|
|
@@ -17,7 +17,7 @@ export declare class Hand {
|
|
|
17
17
|
private init;
|
|
18
18
|
get hands(): Tile[];
|
|
19
19
|
toString(): string;
|
|
20
|
-
get called(): (BlockChi | BlockPon | BlockAnKan | BlockDaiKan | BlockShoKan)[];
|
|
20
|
+
get called(): readonly (BlockChi | BlockPon | BlockAnKan | BlockDaiKan | BlockShoKan)[];
|
|
21
21
|
get reached(): boolean;
|
|
22
22
|
get drawn(): Tile | null;
|
|
23
23
|
get menzen(): boolean;
|
|
@@ -56,7 +56,18 @@ export declare class BlockCalculator {
|
|
|
56
56
|
private commonAll;
|
|
57
57
|
private commonByType;
|
|
58
58
|
}
|
|
59
|
-
export
|
|
59
|
+
export declare const NZ: readonly number[];
|
|
60
|
+
export declare const N19: readonly number[];
|
|
61
|
+
export declare const deserializeWinResult: (ret: SerializedWinResult) => WinResult;
|
|
62
|
+
type SerializedBoardContext = Omit<BoardContext, "doraMarkers" | "blindDoraMarkers"> & {
|
|
63
|
+
doraMarkers: string[];
|
|
64
|
+
blindDoraMarkers?: string[];
|
|
65
|
+
};
|
|
66
|
+
export type SerializedWinResult = Omit<WinResult, "hand" | "boardContext"> & {
|
|
67
|
+
hand: SerializedBlock[];
|
|
68
|
+
boardContext: SerializedBoardContext;
|
|
69
|
+
};
|
|
70
|
+
export interface BoardContext {
|
|
60
71
|
doraMarkers: Tile[];
|
|
61
72
|
blindDoraMarkers?: Tile[];
|
|
62
73
|
round: Round;
|
|
@@ -85,7 +96,7 @@ export interface WinResult {
|
|
|
85
96
|
}[];
|
|
86
97
|
point: number;
|
|
87
98
|
hand: Block[];
|
|
88
|
-
|
|
99
|
+
boardContext: BoardContext;
|
|
89
100
|
}
|
|
90
101
|
export declare class DoubleCalculator {
|
|
91
102
|
hand: Hand;
|
|
@@ -104,9 +115,9 @@ export declare class DoubleCalculator {
|
|
|
104
115
|
finalWallWin: boolean;
|
|
105
116
|
finalDiscardWin: boolean;
|
|
106
117
|
oneShotWin: boolean;
|
|
107
|
-
orig:
|
|
118
|
+
orig: BoardContext;
|
|
108
119
|
};
|
|
109
|
-
constructor(hand: Hand, params:
|
|
120
|
+
constructor(hand: Hand, params: BoardContext);
|
|
110
121
|
calc(hands: Block[][]): WinResult | false;
|
|
111
122
|
calcPatterns(hands: Block[][]): {
|
|
112
123
|
points: {
|
|
@@ -261,3 +272,4 @@ export declare class DoubleCalculator {
|
|
|
261
272
|
dK13(h: Block[]): never[];
|
|
262
273
|
calcFu(h: Block[]): number;
|
|
263
274
|
}
|
|
275
|
+
export {};
|
|
@@ -1,4 +1,15 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __assign = (this && this.__assign) || function () {
|
|
3
|
+
__assign = Object.assign || function(t) {
|
|
4
|
+
for (var s, i = 1, n = arguments.length; i < n; i++) {
|
|
5
|
+
s = arguments[i];
|
|
6
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
|
|
7
|
+
t[p] = s[p];
|
|
8
|
+
}
|
|
9
|
+
return t;
|
|
10
|
+
};
|
|
11
|
+
return __assign.apply(this, arguments);
|
|
12
|
+
};
|
|
2
13
|
var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
3
14
|
if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {
|
|
4
15
|
if (ar || !(i in from)) {
|
|
@@ -9,8 +20,9 @@ var __spreadArray = (this && this.__spreadArray) || function (to, from, pack) {
|
|
|
9
20
|
return to.concat(ar || Array.prototype.slice.call(from));
|
|
10
21
|
};
|
|
11
22
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.DoubleCalculator = exports.BlockCalculator = exports.ShantenCalculator = exports.Hand = void 0;
|
|
23
|
+
exports.DoubleCalculator = exports.deserializeWinResult = exports.N19 = exports.NZ = exports.BlockCalculator = exports.ShantenCalculator = exports.Hand = void 0;
|
|
13
24
|
var constants_1 = require("../core/constants");
|
|
25
|
+
var helper_1 = require("./helper");
|
|
14
26
|
var parser_1 = require("../core/parser");
|
|
15
27
|
var Hand = (function () {
|
|
16
28
|
function Hand(input, allowBackBlock) {
|
|
@@ -33,7 +45,7 @@ var Hand = (function () {
|
|
|
33
45
|
for (var _i = 0, blocks_1 = blocks; _i < blocks_1.length; _i++) {
|
|
34
46
|
var b = blocks_1[_i];
|
|
35
47
|
if (b.isCalled()) {
|
|
36
|
-
this.data.called.
|
|
48
|
+
this.data.called = __spreadArray(__spreadArray([], this.called, true), [b], false);
|
|
37
49
|
continue;
|
|
38
50
|
}
|
|
39
51
|
else if (b.is(constants_1.BLOCK.TSUMO)) {
|
|
@@ -89,18 +101,21 @@ var Hand = (function () {
|
|
|
89
101
|
configurable: true
|
|
90
102
|
});
|
|
91
103
|
Hand.prototype.toString = function () {
|
|
92
|
-
var
|
|
104
|
+
var called = "";
|
|
93
105
|
for (var _i = 0, _a = this.called; _i < _a.length; _i++) {
|
|
94
106
|
var b_1 = _a[_i];
|
|
95
|
-
|
|
107
|
+
called = "".concat(called, ",").concat(b_1.toString());
|
|
96
108
|
}
|
|
97
|
-
var
|
|
109
|
+
var tsumo = "";
|
|
110
|
+
if (this.drawn)
|
|
111
|
+
tsumo = ",".concat(this.drawn.toString());
|
|
112
|
+
var tiles = this.hands.filter(function (v) { return !v.has(constants_1.OPERATOR.TSUMO); });
|
|
98
113
|
var b = new parser_1.BlockHand(tiles).toString();
|
|
99
|
-
return "".concat(b).concat(
|
|
114
|
+
return "".concat(b).concat(tsumo).concat(called);
|
|
100
115
|
};
|
|
101
116
|
Object.defineProperty(Hand.prototype, "called", {
|
|
102
117
|
get: function () {
|
|
103
|
-
return this.data.called
|
|
118
|
+
return this.data.called;
|
|
104
119
|
},
|
|
105
120
|
enumerable: false,
|
|
106
121
|
configurable: true
|
|
@@ -215,15 +230,17 @@ var Hand = (function () {
|
|
|
215
230
|
if (toRemove.length != b.tiles.length - 1)
|
|
216
231
|
throw new Error("removal: ".concat(toRemove, " block: ").concat(b));
|
|
217
232
|
this.dec(toRemove);
|
|
218
|
-
this.data.called.
|
|
233
|
+
this.data.called = __spreadArray(__spreadArray([], this.called, true), [b], false);
|
|
219
234
|
this.data.tsumo = null;
|
|
220
235
|
return;
|
|
221
236
|
};
|
|
222
237
|
Hand.prototype.kan = function (b) {
|
|
223
238
|
if (b instanceof parser_1.BlockAnKan) {
|
|
224
239
|
var t = b.tiles[0];
|
|
240
|
+
if ((0, parser_1.isNum0)(t))
|
|
241
|
+
t = new parser_1.Tile(t.t, 5);
|
|
225
242
|
this.dec([t, t, t, t]);
|
|
226
|
-
this.data.called.
|
|
243
|
+
this.data.called = __spreadArray(__spreadArray([], this.called, true), [b], false);
|
|
227
244
|
this.data.tsumo = null;
|
|
228
245
|
return;
|
|
229
246
|
}
|
|
@@ -232,12 +249,12 @@ var Hand = (function () {
|
|
|
232
249
|
if (idx == -1)
|
|
233
250
|
throw new Error("unable to find ".concat(b.tiles[0]));
|
|
234
251
|
var t = b.tiles[0];
|
|
235
|
-
if ((0, parser_1.isNum0)(t))
|
|
252
|
+
if ((0, parser_1.isNum0)(t))
|
|
236
253
|
t = new parser_1.Tile(t.t, 5);
|
|
237
|
-
}
|
|
238
|
-
this.data.called.splice(idx, 1);
|
|
239
254
|
this.dec([t]);
|
|
240
|
-
this.data.called.
|
|
255
|
+
this.data.called = __spreadArray(__spreadArray(__spreadArray([], this.called.slice(0, idx), true), this.called.slice(idx + 1), true), [
|
|
256
|
+
b,
|
|
257
|
+
], false);
|
|
241
258
|
this.data.tsumo = null;
|
|
242
259
|
return;
|
|
243
260
|
}
|
|
@@ -245,9 +262,7 @@ var Hand = (function () {
|
|
|
245
262
|
};
|
|
246
263
|
Hand.prototype.clone = function () {
|
|
247
264
|
var c = new Hand(this.toString());
|
|
248
|
-
c.data.called = this.called.map(function (b) { return b.clone(); });
|
|
249
265
|
c.data.reached = this.data.reached;
|
|
250
|
-
c.data.tsumo = this.data.tsumo == null ? null : this.data.tsumo;
|
|
251
266
|
return c;
|
|
252
267
|
};
|
|
253
268
|
return Hand;
|
|
@@ -291,7 +306,7 @@ var ShantenCalculator = (function () {
|
|
|
291
306
|
var t = _a[_i];
|
|
292
307
|
if (t == constants_1.TYPE.BACK)
|
|
293
308
|
continue;
|
|
294
|
-
var nn = t == constants_1.TYPE.Z ?
|
|
309
|
+
var nn = t == constants_1.TYPE.Z ? exports.NZ : exports.N19;
|
|
295
310
|
for (var _b = 0, nn_1 = nn; _b < nn_1.length; _b++) {
|
|
296
311
|
var n = nn_1[_b];
|
|
297
312
|
if (this.hand.get(t, n) >= 1)
|
|
@@ -529,7 +544,7 @@ var BlockCalculator = (function () {
|
|
|
529
544
|
var t = _a[_i];
|
|
530
545
|
if (t == constants_1.TYPE.BACK)
|
|
531
546
|
continue;
|
|
532
|
-
var nn = t == constants_1.TYPE.Z ?
|
|
547
|
+
var nn = t == constants_1.TYPE.Z ? exports.NZ : exports.N19;
|
|
533
548
|
for (var _b = 0, nn_2 = nn; _b < nn_2.length; _b++) {
|
|
534
549
|
var n = nn_2[_b];
|
|
535
550
|
if (this.hand.get(t, n) == 1)
|
|
@@ -626,7 +641,7 @@ var BlockCalculator = (function () {
|
|
|
626
641
|
this.commonByType(constants_1.TYPE.S),
|
|
627
642
|
handleZ(),
|
|
628
643
|
handleBack(),
|
|
629
|
-
[this.hand.called],
|
|
644
|
+
[this.hand.called.concat()],
|
|
630
645
|
].sort(function (a, b) { return b.length - a.length; });
|
|
631
646
|
var ret = vvv[0].concat();
|
|
632
647
|
for (var i = 0; i < ret.length; i++) {
|
|
@@ -686,6 +701,14 @@ var BlockCalculator = (function () {
|
|
|
686
701
|
return BlockCalculator;
|
|
687
702
|
}());
|
|
688
703
|
exports.BlockCalculator = BlockCalculator;
|
|
704
|
+
exports.NZ = [1, 2, 3, 4, 5, 6, 7];
|
|
705
|
+
exports.N19 = [1, 9];
|
|
706
|
+
var deserializeWinResult = function (ret) {
|
|
707
|
+
var _a;
|
|
708
|
+
var bc = ret.boardContext;
|
|
709
|
+
return __assign(__assign({}, ret), { hand: ret.hand.map(parser_1.Block.from), boardContext: __assign(__assign({}, bc), { doraMarkers: bc.doraMarkers.map(parser_1.Tile.from), blindDoraMarkers: (_a = bc.blindDoraMarkers) === null || _a === void 0 ? void 0 : _a.map(parser_1.Tile.from) }) });
|
|
710
|
+
};
|
|
711
|
+
exports.deserializeWinResult = deserializeWinResult;
|
|
689
712
|
var DoubleCalculator = (function () {
|
|
690
713
|
function DoubleCalculator(hand, params) {
|
|
691
714
|
var _a, _b, _c, _d, _e, _f, _g;
|
|
@@ -766,13 +789,8 @@ var DoubleCalculator = (function () {
|
|
|
766
789
|
return b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO); });
|
|
767
790
|
});
|
|
768
791
|
var myWind = this.cfg.orig.myWind;
|
|
769
|
-
var isParent = myWind ==
|
|
770
|
-
var deltas =
|
|
771
|
-
"1w": 0,
|
|
772
|
-
"2w": 0,
|
|
773
|
-
"3w": 0,
|
|
774
|
-
"4w": 0,
|
|
775
|
-
};
|
|
792
|
+
var isParent = myWind == constants_1.WIND.EAST;
|
|
793
|
+
var deltas = (0, helper_1.createWindMap)(0);
|
|
776
794
|
if (!isTsumo) {
|
|
777
795
|
var deadPoint = this.cfg.sticks.dead * 300;
|
|
778
796
|
if (this.cfg.orig.ronWind == null)
|
|
@@ -796,7 +814,7 @@ var DoubleCalculator = (function () {
|
|
|
796
814
|
var key = _a[_i];
|
|
797
815
|
if (key == myWind)
|
|
798
816
|
continue;
|
|
799
|
-
var coefficient = key ==
|
|
817
|
+
var coefficient = key == constants_1.WIND.EAST ? 2 : 1;
|
|
800
818
|
var point = ceil(base * coefficient) + deadPoint;
|
|
801
819
|
deltas[key] -= point;
|
|
802
820
|
deltas[myWind] += point;
|
|
@@ -811,7 +829,7 @@ var DoubleCalculator = (function () {
|
|
|
811
829
|
points: patterns[idx].points,
|
|
812
830
|
point: deltas[myWind],
|
|
813
831
|
hand: patterns[idx].hand,
|
|
814
|
-
|
|
832
|
+
boardContext: this.cfg.orig,
|
|
815
833
|
};
|
|
816
834
|
return v;
|
|
817
835
|
};
|
|
@@ -867,18 +885,19 @@ var DoubleCalculator = (function () {
|
|
|
867
885
|
DoubleCalculator.prototype.dC1 = function (h) {
|
|
868
886
|
if (this.minus() != 0)
|
|
869
887
|
return [];
|
|
888
|
+
var yaku = "平和";
|
|
870
889
|
var fu = this.calcFu(h);
|
|
871
890
|
if (fu == 20)
|
|
872
|
-
return [{ name:
|
|
891
|
+
return [{ name: yaku, double: 1 }];
|
|
873
892
|
if (!h.some(function (b) { return b.tiles.some(function (t) { return t.has(constants_1.OPERATOR.TSUMO); }); })) {
|
|
874
893
|
if (fu == 30)
|
|
875
|
-
return [{ name:
|
|
894
|
+
return [{ name: yaku, double: 1 }];
|
|
876
895
|
}
|
|
877
896
|
return [];
|
|
878
897
|
};
|
|
879
898
|
DoubleCalculator.prototype.dD1 = function (h) {
|
|
880
899
|
var cond = h.some(function (block) {
|
|
881
|
-
return block.tiles.some(function (t) { return t.t == constants_1.TYPE.Z ||
|
|
900
|
+
return block.tiles.some(function (t) { return t.t == constants_1.TYPE.Z || exports.N19.includes(t.n); });
|
|
882
901
|
});
|
|
883
902
|
return cond ? [] : [{ name: "断么九", double: 1 }];
|
|
884
903
|
};
|
|
@@ -1063,7 +1082,7 @@ var DoubleCalculator = (function () {
|
|
|
1063
1082
|
};
|
|
1064
1083
|
DoubleCalculator.prototype.dH2 = function (h) {
|
|
1065
1084
|
var cond = h.every(function (b) {
|
|
1066
|
-
var values = b.tiles[0].t == constants_1.TYPE.Z ?
|
|
1085
|
+
var values = b.tiles[0].t == constants_1.TYPE.Z ? exports.NZ : exports.N19;
|
|
1067
1086
|
return b.tiles.every(function (t) { return values.includes(t.n); });
|
|
1068
1087
|
});
|
|
1069
1088
|
return cond ? [{ name: "混老頭", double: 2 }] : [];
|
|
@@ -1076,7 +1095,7 @@ var DoubleCalculator = (function () {
|
|
|
1076
1095
|
if (!h.some(function (b) { return b.tiles[0].t == constants_1.TYPE.Z; }))
|
|
1077
1096
|
return [];
|
|
1078
1097
|
var cond = h.every(function (block) {
|
|
1079
|
-
var values = block.tiles[0].t == constants_1.TYPE.Z ?
|
|
1098
|
+
var values = block.tiles[0].t == constants_1.TYPE.Z ? exports.NZ : exports.N19;
|
|
1080
1099
|
return block.tiles.some(function (t) { return values.includes(t.n); });
|
|
1081
1100
|
});
|
|
1082
1101
|
return cond ? [{ name: "混全帯么九", double: 2 - this.minus() }] : [];
|
|
@@ -1139,7 +1158,7 @@ var DoubleCalculator = (function () {
|
|
|
1139
1158
|
if (h.some(function (b) { return b.tiles[0].t == constants_1.TYPE.Z; }))
|
|
1140
1159
|
return [];
|
|
1141
1160
|
var cond = h.every(function (b) {
|
|
1142
|
-
return b.tiles.some(function (t) { return
|
|
1161
|
+
return b.tiles.some(function (t) { return exports.N19.includes(t.n); });
|
|
1143
1162
|
});
|
|
1144
1163
|
return cond ? [{ name: "純全帯么九色", double: 3 - this.minus() }] : [];
|
|
1145
1164
|
};
|
|
@@ -1212,12 +1231,12 @@ var DoubleCalculator = (function () {
|
|
|
1212
1231
|
return cond ? [{ name: "大三元", double: 13 }] : [];
|
|
1213
1232
|
};
|
|
1214
1233
|
DoubleCalculator.prototype.dE13 = function (h) {
|
|
1215
|
-
var cond = h.every(function (b) { return b.tiles.
|
|
1234
|
+
var cond = h.every(function (b) { return b.tiles[0].t == constants_1.TYPE.Z; });
|
|
1216
1235
|
return cond ? [{ name: "字一色", double: 13 }] : [];
|
|
1217
1236
|
};
|
|
1218
1237
|
DoubleCalculator.prototype.dF13 = function (h) {
|
|
1219
1238
|
var cond = h.every(function (b) {
|
|
1220
|
-
return b.tiles.every(function (t) { return t.t != constants_1.TYPE.Z &&
|
|
1239
|
+
return b.tiles.every(function (t) { return t.t != constants_1.TYPE.Z && exports.N19.includes(t.n); });
|
|
1221
1240
|
});
|
|
1222
1241
|
return cond ? [{ name: "清老頭", double: 13 }] : [];
|
|
1223
1242
|
};
|
|
@@ -1282,7 +1301,7 @@ var DoubleCalculator = (function () {
|
|
|
1282
1301
|
return base * 2;
|
|
1283
1302
|
else if (tile.t == constants_1.TYPE.Z && [myWind, round].includes(tile.n))
|
|
1284
1303
|
return base * 2;
|
|
1285
|
-
else if (
|
|
1304
|
+
else if (exports.N19.includes(tile.n))
|
|
1286
1305
|
return base * 2;
|
|
1287
1306
|
else
|
|
1288
1307
|
return base;
|
|
@@ -1374,7 +1393,7 @@ var minTile = function (b) {
|
|
|
1374
1393
|
return __spreadArray([], b.tiles, true).sort(parser_1.tileSortFunc)[0];
|
|
1375
1394
|
};
|
|
1376
1395
|
var toDora = function (doraMarker) {
|
|
1377
|
-
var n =
|
|
1396
|
+
var n = (0, parser_1.isNum0)(doraMarker) ? 5 : doraMarker.n;
|
|
1378
1397
|
var t = doraMarker.t;
|
|
1379
1398
|
return new parser_1.Tile(t, (n % 9) + 1);
|
|
1380
1399
|
};
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.createWindMap = createWindMap;
|
|
4
|
+
var constants_1 = require("../core/constants");
|
|
5
|
+
function createWindMap(initial, clone) {
|
|
6
|
+
var _a;
|
|
7
|
+
if (clone === void 0) { clone = false; }
|
|
8
|
+
var m = (_a = {},
|
|
9
|
+
_a[constants_1.WIND.EAST] = initial,
|
|
10
|
+
_a[constants_1.WIND.SOUTH] = initial,
|
|
11
|
+
_a[constants_1.WIND.WEST] = initial,
|
|
12
|
+
_a[constants_1.WIND.NORTH] = initial,
|
|
13
|
+
_a);
|
|
14
|
+
if (clone) {
|
|
15
|
+
for (var _i = 0, _b = Object.values(constants_1.WIND); _i < _b.length; _i++) {
|
|
16
|
+
var w = _b[_i];
|
|
17
|
+
m[w] = structuredClone(initial);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
return m;
|
|
21
|
+
}
|
|
@@ -16,3 +16,4 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
|
|
|
16
16
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
17
17
|
__exportStar(require("./calc"), exports);
|
|
18
18
|
__exportStar(require("./efficiency"), exports);
|
|
19
|
+
__exportStar(require("./helper"), exports);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { Wind, Round } from "../core/";
|
|
2
|
-
import {
|
|
2
|
+
import { BoardContext, Hand, WinResult, Candidate } from "../calculator";
|
|
3
3
|
import { BlockAnKan, BlockChi, BlockDaiKan, BlockPon, BlockShoKan, Tile } from "../core/parser";
|
|
4
4
|
import { PlayerEvent, EventHandler, DistributeEvent } from "./events";
|
|
5
5
|
import { Wall, WallProps, River, PlaceManager, ScoreManager, Counter } from ".";
|
|
@@ -96,7 +96,7 @@ export declare class Controller {
|
|
|
96
96
|
constructor(players: PlayerProps[], params?: {
|
|
97
97
|
debug?: boolean;
|
|
98
98
|
});
|
|
99
|
-
boardParams(w: Wind):
|
|
99
|
+
boardParams(w: Wind): BoardContext;
|
|
100
100
|
hand(w: Wind): ActorHand;
|
|
101
101
|
get placeManager(): PlaceManager;
|
|
102
102
|
get scoreManager(): ScoreManager;
|
|
@@ -163,8 +163,11 @@ var Controller = (function () {
|
|
|
163
163
|
this.actor.send({
|
|
164
164
|
type: selected.type,
|
|
165
165
|
iam: e.wind,
|
|
166
|
-
ret: e.choices.RON,
|
|
167
|
-
targetInfo:
|
|
166
|
+
ret: (0, calculator_1.deserializeWinResult)(e.choices.RON),
|
|
167
|
+
targetInfo: {
|
|
168
|
+
wind: e.discarterInfo.wind,
|
|
169
|
+
tile: parser_1.Tile.from(e.discarterInfo.tile),
|
|
170
|
+
},
|
|
168
171
|
});
|
|
169
172
|
break;
|
|
170
173
|
case "DAI_KAN":
|
|
@@ -172,7 +175,7 @@ var Controller = (function () {
|
|
|
172
175
|
this.actor.send({
|
|
173
176
|
type: selected.type,
|
|
174
177
|
iam: e.wind,
|
|
175
|
-
block: e.choices.DAI_KAN,
|
|
178
|
+
block: parser_1.Block.from(e.choices.DAI_KAN),
|
|
176
179
|
});
|
|
177
180
|
break;
|
|
178
181
|
case "CHI":
|
|
@@ -183,7 +186,7 @@ var Controller = (function () {
|
|
|
183
186
|
this.actor.send({
|
|
184
187
|
type: selected.type,
|
|
185
188
|
iam: e.wind,
|
|
186
|
-
block: c[0],
|
|
189
|
+
block: parser_1.Block.from(c[0]),
|
|
187
190
|
});
|
|
188
191
|
}
|
|
189
192
|
}
|
|
@@ -197,8 +200,8 @@ var Controller = (function () {
|
|
|
197
200
|
(0, assert_1.default)(e.choices.TSUMO, "tsumo choice is none");
|
|
198
201
|
this.actor.send({
|
|
199
202
|
type: selected.type,
|
|
200
|
-
ret: e.choices.TSUMO,
|
|
201
|
-
lastTile: e.
|
|
203
|
+
ret: (0, calculator_1.deserializeWinResult)(e.choices.TSUMO),
|
|
204
|
+
lastTile: parser_1.Tile.from(e.drawerInfo.tile),
|
|
202
205
|
iam: w,
|
|
203
206
|
});
|
|
204
207
|
break;
|
|
@@ -207,7 +210,7 @@ var Controller = (function () {
|
|
|
207
210
|
(0, assert_1.default)(candidates, "".concat(selected.type, " candidates is none"));
|
|
208
211
|
this.actor.send({
|
|
209
212
|
type: selected.type,
|
|
210
|
-
tile: candidates[0].tile,
|
|
213
|
+
tile: parser_1.Tile.from(candidates[0].tile),
|
|
211
214
|
iam: w,
|
|
212
215
|
});
|
|
213
216
|
break;
|
|
@@ -216,7 +219,7 @@ var Controller = (function () {
|
|
|
216
219
|
(0, assert_1.default)(tiles, "".concat(selected.type, " choice is none"));
|
|
217
220
|
this.actor.send({
|
|
218
221
|
type: selected.type,
|
|
219
|
-
tile: tiles[0].clone({ remove: core_1.OPERATOR.TSUMO }),
|
|
222
|
+
tile: parser_1.Tile.from(tiles[0]).clone({ remove: core_1.OPERATOR.TSUMO }),
|
|
220
223
|
iam: w,
|
|
221
224
|
});
|
|
222
225
|
break;
|
|
@@ -225,7 +228,7 @@ var Controller = (function () {
|
|
|
225
228
|
(0, assert_1.default)(choices, "".concat(selected.type, " choice is none"));
|
|
226
229
|
this.actor.send({
|
|
227
230
|
type: selected.type,
|
|
228
|
-
block: choices[0],
|
|
231
|
+
block: parser_1.BlockAnKan.from(choices[0]),
|
|
229
232
|
iam: w,
|
|
230
233
|
});
|
|
231
234
|
break;
|
|
@@ -235,7 +238,7 @@ var Controller = (function () {
|
|
|
235
238
|
(0, assert_1.default)(choices, "".concat(selected.type, " choice is none"));
|
|
236
239
|
this.actor.send({
|
|
237
240
|
type: selected.type,
|
|
238
|
-
block: choices[0],
|
|
241
|
+
block: parser_1.Block.from(choices[0]),
|
|
239
242
|
iam: w,
|
|
240
243
|
});
|
|
241
244
|
break;
|
|
@@ -248,7 +251,7 @@ var Controller = (function () {
|
|
|
248
251
|
else if (sample.type == "CHOICE_AFTER_CALLED") {
|
|
249
252
|
(0, assert_1.default)(sample.choices.DISCARD, "discard candidate tile is none: ".concat(JSON.stringify(sample, null, 2), " ").concat(this.hand(sample.wind).toString()));
|
|
250
253
|
var w = sample.wind;
|
|
251
|
-
var t = sample.choices.DISCARD[0];
|
|
254
|
+
var t = parser_1.Tile.from(sample.choices.DISCARD[0]);
|
|
252
255
|
(0, assert_1.default)(t != null, "undefined tile ".concat(this.hand(w).toString()));
|
|
253
256
|
this.actor.send({ type: "DISCARD", tile: t, iam: w });
|
|
254
257
|
}
|
|
@@ -266,9 +269,12 @@ var Controller = (function () {
|
|
|
266
269
|
this.actor.send({
|
|
267
270
|
type: "RON",
|
|
268
271
|
iam: e.wind,
|
|
269
|
-
ret: e.choices.RON,
|
|
272
|
+
ret: (0, calculator_1.deserializeWinResult)(e.choices.RON),
|
|
270
273
|
quadWin: true,
|
|
271
|
-
targetInfo:
|
|
274
|
+
targetInfo: {
|
|
275
|
+
wind: e.callerInfo.wind,
|
|
276
|
+
tile: parser_1.Tile.from(e.callerInfo.tile),
|
|
277
|
+
},
|
|
272
278
|
});
|
|
273
279
|
}
|
|
274
280
|
};
|
|
@@ -329,7 +335,7 @@ var Controller = (function () {
|
|
|
329
335
|
var blindDoraMarkers = hand.reached
|
|
330
336
|
? this.wall.blindDoraMarkers
|
|
331
337
|
: undefined;
|
|
332
|
-
var final = new calculator_1.DoubleCalculator(hand, __assign(__assign({}, ret.
|
|
338
|
+
var final = new calculator_1.DoubleCalculator(hand, __assign(__assign({}, ret.boardContext), { sticks: this.placeManager.sticks, blindDoraMarkers: blindDoraMarkers })).calc([ret.hand]);
|
|
333
339
|
(0, assert_1.default)(final);
|
|
334
340
|
return final;
|
|
335
341
|
};
|
|
@@ -637,7 +643,7 @@ var Controller = (function () {
|
|
|
637
643
|
return num >= 9;
|
|
638
644
|
};
|
|
639
645
|
Controller.prototype.initialHands = function () {
|
|
640
|
-
var m = (0,
|
|
646
|
+
var m = (0, calculator_1.createWindMap)("");
|
|
641
647
|
for (var i = 0; i < 3; i++) {
|
|
642
648
|
for (var _i = 0, _a = Object.values(core_1.WIND); _i < _a.length; _i++) {
|
|
643
649
|
var w = _a[_i];
|
|
@@ -672,9 +678,7 @@ var ActorHand = (function (_super) {
|
|
|
672
678
|
};
|
|
673
679
|
ActorHand.prototype.clone = function () {
|
|
674
680
|
var c = new ActorHand(this.toString());
|
|
675
|
-
c.data.called = this.called.map(function (b) { return b.clone(); });
|
|
676
681
|
c.data.reached = this.data.reached;
|
|
677
|
-
c.data.tsumo = this.data.tsumo == null ? null : this.data.tsumo;
|
|
678
682
|
return c;
|
|
679
683
|
};
|
|
680
684
|
ActorHand.prototype.dec = function (tiles) {
|
|
@@ -691,7 +695,7 @@ var BaseActor = (function () {
|
|
|
691
695
|
this.river = new _1.River();
|
|
692
696
|
this.placeManager = new _1.PlaceManager({});
|
|
693
697
|
this.scoreManager = new _1.ScoreManager({});
|
|
694
|
-
this.hands = (0,
|
|
698
|
+
this.hands = (0, calculator_1.createWindMap)(new ActorHand(""));
|
|
695
699
|
this.counter = new _1.Counter();
|
|
696
700
|
this.doraMarkers = [];
|
|
697
701
|
this.id = id;
|
|
@@ -711,14 +715,15 @@ var BaseActor = (function () {
|
|
|
711
715
|
break;
|
|
712
716
|
case "DISTRIBUTE":
|
|
713
717
|
this.counter.reset();
|
|
718
|
+
var doraMarker = parser_1.Tile.from(e.doraMarker);
|
|
714
719
|
this.setHands(e);
|
|
715
720
|
this.placeManager = new _1.PlaceManager(structuredClone(e.places), {
|
|
716
721
|
round: structuredClone(e.round),
|
|
717
722
|
sticks: structuredClone(e.sticks),
|
|
718
723
|
});
|
|
719
724
|
this.scoreManager = new _1.ScoreManager(structuredClone(e.scores));
|
|
720
|
-
this.doraMarkers = [
|
|
721
|
-
this.counter.dec(
|
|
725
|
+
this.doraMarkers = [doraMarker];
|
|
726
|
+
this.counter.dec(doraMarker);
|
|
722
727
|
for (var _i = 0, _d = Object.values(core_1.WIND); _i < _d.length; _i++) {
|
|
723
728
|
var w = _d[_i];
|
|
724
729
|
if (w != e.wind)
|
|
@@ -726,56 +731,68 @@ var BaseActor = (function () {
|
|
|
726
731
|
(_a = this.counter).dec.apply(_a, this.hand(w).hands);
|
|
727
732
|
}
|
|
728
733
|
break;
|
|
729
|
-
case "DRAW":
|
|
730
|
-
|
|
731
|
-
this.
|
|
734
|
+
case "DRAW": {
|
|
735
|
+
var t = parser_1.Tile.from(e.tile);
|
|
736
|
+
this.hands[e.iam].draw(t);
|
|
737
|
+
this.counter.dec(t);
|
|
732
738
|
break;
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
739
|
+
}
|
|
740
|
+
case "DISCARD": {
|
|
741
|
+
var t = parser_1.Tile.from(e.tile);
|
|
742
|
+
this.river.discard(t, e.iam);
|
|
743
|
+
this.hands[e.iam].discard(t);
|
|
736
744
|
if (e.iam != e.wind) {
|
|
737
|
-
this.counter.dec(
|
|
738
|
-
this.counter.addTileToSafeMap(
|
|
745
|
+
this.counter.dec(t);
|
|
746
|
+
this.counter.addTileToSafeMap(t, e.iam);
|
|
739
747
|
for (var _e = 0, _f = Object.values(core_1.WIND); _e < _f.length; _e++) {
|
|
740
748
|
var w = _f[_e];
|
|
741
749
|
if (this.hand(w).reached)
|
|
742
|
-
this.counter.addTileToSafeMap(
|
|
750
|
+
this.counter.addTileToSafeMap(t, w);
|
|
743
751
|
}
|
|
744
752
|
}
|
|
745
753
|
break;
|
|
754
|
+
}
|
|
746
755
|
case "PON":
|
|
747
756
|
case "CHI":
|
|
748
|
-
case "DAI_KAN":
|
|
749
|
-
|
|
757
|
+
case "DAI_KAN": {
|
|
758
|
+
var block = parser_1.Block.from(e.block);
|
|
759
|
+
this.hands[e.iam].call(block);
|
|
750
760
|
this.river.markCalled();
|
|
751
761
|
if (e.iam != e.wind)
|
|
752
|
-
(_b = this.counter).dec.apply(_b,
|
|
762
|
+
(_b = this.counter).dec.apply(_b, block.tiles.filter(function (t) { return !t.has(core_1.OPERATOR.HORIZONTAL); }));
|
|
753
763
|
break;
|
|
754
|
-
|
|
755
|
-
|
|
764
|
+
}
|
|
765
|
+
case "SHO_KAN": {
|
|
766
|
+
var block = parser_1.Block.from(e.block);
|
|
767
|
+
this.hands[e.iam].kan(block);
|
|
756
768
|
if (e.iam != e.wind)
|
|
757
|
-
this.counter.dec(
|
|
769
|
+
this.counter.dec(block.tiles.filter(function (t) { return t.has(core_1.OPERATOR.HORIZONTAL); })[0]);
|
|
758
770
|
break;
|
|
759
|
-
|
|
760
|
-
|
|
771
|
+
}
|
|
772
|
+
case "AN_KAN": {
|
|
773
|
+
var block = parser_1.Block.from(e.block);
|
|
774
|
+
this.hands[e.iam].kan(block);
|
|
761
775
|
if (e.iam != e.wind)
|
|
762
|
-
(_c = this.counter).dec.apply(_c,
|
|
776
|
+
(_c = this.counter).dec.apply(_c, block.tiles.filter(function (t) { return !t.has(core_1.OPERATOR.HORIZONTAL); }));
|
|
763
777
|
break;
|
|
778
|
+
}
|
|
764
779
|
case "REACH":
|
|
765
780
|
var pid = this.placeManager.playerID(e.iam);
|
|
766
781
|
this.hands[e.iam].reach();
|
|
767
782
|
this.scoreManager.reach(pid);
|
|
768
783
|
this.placeManager.incrementReachStick();
|
|
769
784
|
break;
|
|
770
|
-
case "NEW_DORA":
|
|
771
|
-
|
|
772
|
-
this.
|
|
785
|
+
case "NEW_DORA": {
|
|
786
|
+
var doraMarker_1 = parser_1.Tile.from(e.doraMarker);
|
|
787
|
+
this.doraMarkers.push(doraMarker_1);
|
|
788
|
+
this.counter.dec(doraMarker_1);
|
|
773
789
|
break;
|
|
790
|
+
}
|
|
774
791
|
case "TSUMO":
|
|
775
792
|
break;
|
|
776
793
|
case "RON":
|
|
777
794
|
if (e.pushBackReachStick) {
|
|
778
|
-
var w = e.
|
|
795
|
+
var w = e.victimInfo.wind;
|
|
779
796
|
var id = this.placeManager.playerID(w);
|
|
780
797
|
this.scoreManager.restoreReachStick(id);
|
|
781
798
|
this.placeManager.decrementReachStick();
|
|
@@ -827,7 +844,7 @@ var Observer = (function (_super) {
|
|
|
827
844
|
var _this = _super.call(this, "observer", eventHandler) || this;
|
|
828
845
|
_this.applied = {};
|
|
829
846
|
_this.counter.disable = true;
|
|
830
|
-
_this.hands = (0,
|
|
847
|
+
_this.hands = (0, calculator_1.createWindMap)(new ActorHand("_____________"));
|
|
831
848
|
return _this;
|
|
832
849
|
}
|
|
833
850
|
Observer.prototype.setHands = function (e) {
|