shogiops 0.2.8 → 0.5.0

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 (115) hide show
  1. package/attacks.js +32 -48
  2. package/attacks.js.map +1 -1
  3. package/board.d.ts +3 -0
  4. package/board.js +60 -33
  5. package/board.js.map +1 -1
  6. package/compat.d.ts +6 -24
  7. package/compat.js +20 -185
  8. package/compat.js.map +1 -1
  9. package/debug.js +37 -72
  10. package/debug.js.map +1 -1
  11. package/hand.d.ts +38 -0
  12. package/hand.js +69 -0
  13. package/hand.js.map +1 -0
  14. package/hash.d.ts +4 -3
  15. package/hash.js +12 -20
  16. package/hash.js.map +1 -1
  17. package/index.d.ts +13 -10
  18. package/index.js +22 -64
  19. package/index.js.map +1 -1
  20. package/{csa.d.ts → notation/csa/csa.d.ts} +9 -9
  21. package/notation/csa/csa.js +213 -0
  22. package/notation/csa/csa.js.map +1 -0
  23. package/notation/japanese.d.ts +3 -0
  24. package/notation/japanese.js +61 -0
  25. package/notation/japanese.js.map +1 -0
  26. package/{kif.d.ts → notation/kif/kif.d.ts} +10 -9
  27. package/notation/kif/kif.js +232 -0
  28. package/notation/kif/kif.js.map +1 -0
  29. package/{kifHandicaps.d.ts → notation/kif/kifHandicaps.d.ts} +0 -0
  30. package/{kifHandicaps.js → notation/kif/kifHandicaps.js} +7 -7
  31. package/notation/kif/kifHandicaps.js.map +1 -0
  32. package/notation/kitaoKawasaki.d.ts +3 -0
  33. package/notation/kitaoKawasaki.js +26 -0
  34. package/notation/kitaoKawasaki.js.map +1 -0
  35. package/notation/kitaokawasaki.d.ts +0 -0
  36. package/notation/kitaokawasaki.js +2 -0
  37. package/notation/kitaokawasaki.js.map +1 -0
  38. package/notation/notationUtil.d.ts +12 -0
  39. package/{kifUtil.js → notation/notationUtil.js} +39 -40
  40. package/notation/notationUtil.js.map +1 -0
  41. package/notation/western.d.ts +3 -0
  42. package/notation/western.js +23 -0
  43. package/notation/western.js.map +1 -0
  44. package/notation/westernEngine.d.ts +3 -0
  45. package/notation/westernEngine.js +23 -0
  46. package/notation/westernEngine.js.map +1 -0
  47. package/package.json +54 -37
  48. package/setup.d.ts +2 -32
  49. package/setup.js +5 -80
  50. package/setup.js.map +1 -1
  51. package/sfen.d.ts +33 -0
  52. package/sfen.js +188 -0
  53. package/sfen.js.map +1 -0
  54. package/shogi.d.ts +14 -7
  55. package/shogi.js +138 -141
  56. package/shogi.js.map +1 -1
  57. package/squareSet.d.ts +1 -5
  58. package/squareSet.js +1 -18
  59. package/squareSet.js.map +1 -1
  60. package/src/board.ts +34 -0
  61. package/src/compat.ts +18 -197
  62. package/src/debug.ts +26 -56
  63. package/src/hand.ts +94 -0
  64. package/src/hash.ts +8 -7
  65. package/src/index.ts +16 -12
  66. package/src/{csa.ts → notation/csa/csa.ts} +53 -52
  67. package/src/notation/japanese.ts +74 -0
  68. package/src/{kif.ts → notation/kif/kif.ts} +77 -78
  69. package/src/{kifHandicaps.ts → notation/kif/kifHandicaps.ts} +5 -0
  70. package/src/notation/kitaoKawasaki.ts +24 -0
  71. package/src/{kifUtil.ts → notation/notationUtil.ts} +37 -28
  72. package/src/notation/western.ts +21 -0
  73. package/src/notation/westernEngine.ts +21 -0
  74. package/src/setup.ts +4 -91
  75. package/src/sfen.ts +190 -0
  76. package/src/shogi.ts +75 -75
  77. package/src/squareSet.ts +1 -18
  78. package/src/transform.ts +3 -1
  79. package/src/types.ts +13 -16
  80. package/src/util.ts +8 -73
  81. package/src/variant.ts +44 -3
  82. package/src/variantUtil.ts +160 -0
  83. package/transform.js +18 -24
  84. package/transform.js.map +1 -1
  85. package/types.d.ts +3 -7
  86. package/types.js +18 -24
  87. package/types.js.map +1 -1
  88. package/util.d.ts +4 -7
  89. package/util.js +24 -96
  90. package/util.js.map +1 -1
  91. package/variant.d.ts +12 -1
  92. package/variant.js +42 -16
  93. package/variant.js.map +1 -1
  94. package/variantUtil.d.ts +13 -0
  95. package/variantUtil.js +147 -0
  96. package/variantUtil.js.map +1 -0
  97. package/csa.js +0 -229
  98. package/csa.js.map +0 -1
  99. package/csaUtil.d.ts +0 -3
  100. package/csaUtil.js +0 -21
  101. package/csaUtil.js.map +0 -1
  102. package/fen.d.ts +0 -32
  103. package/fen.js +0 -197
  104. package/fen.js.map +0 -1
  105. package/kif.js +0 -247
  106. package/kif.js.map +0 -1
  107. package/kifHandicaps.js.map +0 -1
  108. package/kifUtil.d.ts +0 -9
  109. package/kifUtil.js.map +0 -1
  110. package/san.d.ts +0 -6
  111. package/san.js +0 -135
  112. package/san.js.map +0 -1
  113. package/src/csaUtil.ts +0 -15
  114. package/src/fen.ts +0 -183
  115. package/src/san.ts +0 -136
@@ -0,0 +1,213 @@
1
+ import { Result } from '@badrap/result';
2
+ import { Board } from '../../board';
3
+ import { isDrop } from '../../types';
4
+ import { csaToRole, defined, roleToCsa } from '../../util';
5
+ import { Hands } from '../../hand';
6
+ import { allRoles, handRoles, promote } from '../../variantUtil';
7
+ import { makeNumberSquare, parseNumberSquare } from '../notationUtil';
8
+ // Olny supports standard shogi no variants
9
+ //
10
+ // CSA HEADER
11
+ //
12
+ export var InvalidCsa;
13
+ (function (InvalidCsa) {
14
+ InvalidCsa["CSA"] = "ERR_CSA";
15
+ InvalidCsa["Board"] = "ERR_BOARD";
16
+ InvalidCsa["Handicap"] = "ERR_HANDICAP";
17
+ InvalidCsa["Hands"] = "ERR_HANDS";
18
+ InvalidCsa["AdditionalInfo"] = "ERR_ADDITIONAL";
19
+ })(InvalidCsa || (InvalidCsa = {}));
20
+ export class CsaError extends Error {
21
+ }
22
+ // exporting handicaps differently is prob not worth it, so let's always go with the whole board
23
+ export function makeCsaHeader(setup) {
24
+ return [
25
+ makeCsaBoard(setup.board),
26
+ makeCsaHand(setup.hands.sente, 'P+'),
27
+ makeCsaHand(setup.hands.gote, 'P-'),
28
+ setup.turn === 'gote' ? '-' : '+',
29
+ ]
30
+ .filter(p => p.length > 0)
31
+ .join('\n');
32
+ }
33
+ export function makeCsaBoard(board) {
34
+ let csaBoard = '';
35
+ for (let rank = 8; rank >= 0; rank--) {
36
+ csaBoard += 'P' + (9 - rank);
37
+ for (let file = 0; file < 9; file++) {
38
+ const square = file + rank * 9;
39
+ const piece = board.get(square);
40
+ if (!piece)
41
+ csaBoard += ' * ';
42
+ else {
43
+ const colorSign = piece.color === 'gote' ? '-' : '+';
44
+ csaBoard += colorSign + roleToCsa(piece.role);
45
+ }
46
+ if (file === 8 && rank > 0)
47
+ csaBoard += '\n';
48
+ }
49
+ }
50
+ return csaBoard;
51
+ }
52
+ export function makeCsaHand(hand, prefix) {
53
+ if (hand.isEmpty())
54
+ return '';
55
+ return (prefix +
56
+ handRoles('shogi')
57
+ .map(role => {
58
+ const r = roleToCsa(role);
59
+ const n = hand[role];
60
+ return ('00' + r).repeat(Math.min(n, 18));
61
+ })
62
+ .filter(p => p.length > 0)
63
+ .join(''));
64
+ }
65
+ // Import
66
+ export function parseCsaHeader(csa) {
67
+ const lines = normalizedCsaLines(csa);
68
+ const handicap = lines.find(l => l.startsWith('PI'));
69
+ const isWholeBoard = lines.some(l => l.startsWith('P1'));
70
+ const baseBoard = defined(handicap) && !isWholeBoard ? parseCsaHandicap(handicap) : parseCsaBoard(lines.filter(l => /^P\d/.test(l)));
71
+ const turn = lines.some(l => l === '-') ? 'gote' : 'sente';
72
+ return baseBoard.chain(board => {
73
+ const setup = {
74
+ board: board,
75
+ hands: Hands.empty(),
76
+ turn: turn,
77
+ fullmoves: 1,
78
+ };
79
+ return parseAdditions(setup, lines.filter(l => /P[\+|-]/.test(l)));
80
+ });
81
+ }
82
+ export function parseCsaHandicap(handicap) {
83
+ const splitted = handicap.substring(2).match(/.{4}/g) || [];
84
+ const intitalBoard = Board.default();
85
+ for (const s of splitted) {
86
+ const sq = parseNumberSquare(s.substring(0, 2));
87
+ if (defined(sq)) {
88
+ intitalBoard.take(sq);
89
+ }
90
+ else {
91
+ return Result.err(new CsaError(InvalidCsa.Handicap));
92
+ }
93
+ }
94
+ return Result.ok(intitalBoard);
95
+ }
96
+ function parseCsaBoard(csaBoard) {
97
+ if (csaBoard.length !== 9)
98
+ return Result.err(new CsaError(InvalidCsa.Board));
99
+ const board = Board.empty();
100
+ let file = 0;
101
+ let rank = 9;
102
+ for (const r of csaBoard.map(r => r.substring(2))) {
103
+ file = 0;
104
+ rank--;
105
+ for (const s of r.match(/.{1,3}/g) || []) {
106
+ if (s.includes('*'))
107
+ file++;
108
+ else {
109
+ if (file >= 9 || rank < 0)
110
+ return Result.err(new CsaError(InvalidCsa.Board));
111
+ const role = csaToRole(s.substring(1));
112
+ if (defined(role) && allRoles('shogi').includes(role)) {
113
+ const square = file + rank * 9;
114
+ const piece = { role: role, color: (s.startsWith('-') ? 'gote' : 'sente') };
115
+ board.set(square, piece);
116
+ file++;
117
+ }
118
+ }
119
+ }
120
+ }
121
+ if (rank !== 0 || file !== 9)
122
+ return Result.err(new CsaError(InvalidCsa.Board));
123
+ return Result.ok(board);
124
+ }
125
+ function parseAdditions(initialSetup, additions) {
126
+ for (const line of additions) {
127
+ const color = line[1] === '+' ? 'sente' : 'gote';
128
+ for (const sp of line.substring(2).match(/.{4}/g) || []) {
129
+ const sqString = sp.substring(0, 2);
130
+ const sq = parseNumberSquare(sqString);
131
+ const role = csaToRole(sp.substring(2, 4));
132
+ if ((defined(sq) || sqString === '00') && defined(role)) {
133
+ if (!defined(sq)) {
134
+ if (!handRoles('shogi').includes(role))
135
+ return Result.err(new CsaError(InvalidCsa.Hands));
136
+ initialSetup.hands[color][role]++;
137
+ }
138
+ else {
139
+ initialSetup.board.set(sq, { role: role, color: color });
140
+ }
141
+ }
142
+ else
143
+ return Result.err(new CsaError(InvalidCsa.AdditionalInfo));
144
+ }
145
+ }
146
+ return Result.ok(initialSetup);
147
+ }
148
+ export function parseTags(csa) {
149
+ return normalizedCsaLines(csa)
150
+ .filter(l => l.startsWith('$'))
151
+ .map(l => l.substring(1).split(/:(.*)/, 2));
152
+ }
153
+ export function normalizedCsaLines(csa) {
154
+ return csa
155
+ .replace(/,/g, '\n')
156
+ .split(/[\r\n]+/)
157
+ .map(l => l.trim())
158
+ .filter(l => l);
159
+ }
160
+ //
161
+ // CSA MOVES
162
+ //
163
+ // Parsing CSA moves
164
+ export function parseCsaMove(pos, csaMove) {
165
+ var _a;
166
+ // Normal move
167
+ const match = csaMove.match(/(?:[\+-])?([1-9][1-9])([1-9][1-9])(OU|HI|RY|KA|UM|KI|GI|NG|KE|NK|KY|NY|FU|TO)/);
168
+ if (!match) {
169
+ // Drop
170
+ const match = csaMove.match(/(?:[\+-])?00([1-9][1-9])(HI|KA|KI|GI|KE|KY|FU)/);
171
+ if (!match)
172
+ return;
173
+ const drop = {
174
+ role: csaToRole(match[2]),
175
+ to: parseNumberSquare(match[1]),
176
+ };
177
+ return drop;
178
+ }
179
+ const role = csaToRole(match[3]);
180
+ const orig = parseNumberSquare(match[1]);
181
+ return {
182
+ from: orig,
183
+ to: parseNumberSquare(match[2]),
184
+ promotion: ((_a = pos.board.get(orig)) === null || _a === void 0 ? void 0 : _a.role) !== role,
185
+ };
186
+ }
187
+ export function parseCsaMoves(pos, csaMoves) {
188
+ pos = pos.clone();
189
+ const moves = [];
190
+ for (const m of csaMoves) {
191
+ const move = parseCsaMove(pos, m);
192
+ if (!move)
193
+ return moves;
194
+ pos.play(move);
195
+ moves.push(move);
196
+ }
197
+ return moves;
198
+ }
199
+ // Making CSA formatted moves
200
+ export function makeCsaMove(pos, move) {
201
+ if (isDrop(move)) {
202
+ return '00' + makeNumberSquare(move.to) + roleToCsa(move.role);
203
+ }
204
+ else {
205
+ const role = pos.board.getRole(move.from);
206
+ if (!role)
207
+ return undefined;
208
+ return (makeNumberSquare(move.from) +
209
+ makeNumberSquare(move.to) +
210
+ roleToCsa(move.promotion ? promote('shogi')(role) : role));
211
+ }
212
+ }
213
+ //# sourceMappingURL=csa.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"csa.js","sourceRoot":"","sources":["../../src/notation/csa/csa.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import { Position } from '../shogi';
2
+ import { Move, Square } from '../types';
3
+ export declare function makeJapaneseMove(pos: Position, move: Move, lastDest?: Square): string | undefined;
@@ -0,0 +1,61 @@
1
+ import { roleTo2Kanji, squareFile, squareRank } from '../util';
2
+ import { isDrop } from '../types';
3
+ import { pieceCanPromote } from '../variantUtil';
4
+ import { makeJapaneseSquare, piecesAiming } from './notationUtil';
5
+ // 7六歩
6
+ export function makeJapaneseMove(pos, move, lastDest) {
7
+ if (isDrop(move)) {
8
+ const ambStr = piecesAiming(pos, { role: move.role, color: pos.turn }, move.to).isEmpty() ? '' : '打';
9
+ return `${makeJapaneseSquare(move.to)}${roleTo2Kanji(move.role).toUpperCase()}${ambStr}`;
10
+ }
11
+ else {
12
+ const piece = pos.board.get(move.from);
13
+ if (piece) {
14
+ const destStr = lastDest === move.to ? '同 ' : makeJapaneseSquare(move.to);
15
+ const roleStr = roleTo2Kanji(piece.role).toUpperCase();
16
+ const ambPieces = piecesAiming(pos, piece, move.to).without(move.from);
17
+ const ambStr = ambPieces.isEmpty() ? '' : disambiguate(piece, move.from, move.to, ambPieces);
18
+ const promStr = move.promotion ? '成' : pieceCanPromote(pos.rules)(piece, move.from, move.to) ? '不成' : '';
19
+ return `${destStr}${roleStr}${ambStr}${promStr}`;
20
+ }
21
+ else
22
+ return undefined;
23
+ }
24
+ }
25
+ function disambiguate(piece, orig, dest, others) {
26
+ const myRank = squareRank(orig);
27
+ const myFile = squareFile(orig);
28
+ const destRank = squareRank(dest);
29
+ const destFile = squareFile(dest);
30
+ const movingUp = myRank < destRank;
31
+ const movingDown = myRank > destRank;
32
+ // special case if gold/silver like piece is moving directly forward
33
+ if (myFile === destFile &&
34
+ (piece.color === 'sente') === movingUp &&
35
+ ['gold', 'silver', 'promotedlance', 'promotedknight', 'promotedsilver', 'tokin'].includes(piece.role))
36
+ return '直';
37
+ // is this the only piece moving in certain vertical direction (up, down, horizontally)
38
+ if (![...others].map(squareRank).some(r => r > destRank === movingDown && r < destRank === movingUp))
39
+ return verticalDisambiguation(piece, movingUp, movingDown);
40
+ const othersFiles = [...others].map(squareFile);
41
+ const rightest = othersFiles.reduce((prev, cur) => (prev > cur ? prev : cur));
42
+ const leftest = othersFiles.reduce((prev, cur) => (prev < cur ? prev : cur));
43
+ // is this piece positioned most on one side, not in the middle
44
+ if (rightest < myFile || leftest > myFile || (others.size() === 2 && rightest > myFile && leftest < myFile))
45
+ return sideDisambiguation(piece, rightest < squareFile(orig), leftest > squareFile(orig));
46
+ return (sideDisambiguation(piece, rightest <= squareFile(orig), leftest >= squareFile(orig)) +
47
+ verticalDisambiguation(piece, movingUp, movingDown));
48
+ }
49
+ function verticalDisambiguation(piece, up, down) {
50
+ return up === down
51
+ ? '寄'
52
+ : (piece.color === 'sente') === up
53
+ ? ['horse', 'dragon'].includes(piece.role)
54
+ ? '行'
55
+ : '上'
56
+ : '引';
57
+ }
58
+ function sideDisambiguation(piece, right, left) {
59
+ return !left && !right ? '中' : (piece.color === 'sente') === right ? '右' : '左';
60
+ }
61
+ //# sourceMappingURL=japanese.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"japanese.js","sourceRoot":"","sources":["../src/notation/japanese.ts"],"names":[],"mappings":"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"}
@@ -1,26 +1,27 @@
1
1
  import { Result } from '@badrap/result';
2
- import { Board } from './board';
3
- import { MaterialSide, Setup } from './setup';
4
- import { Position } from './shogi';
5
- import { Move, Square } from './types';
2
+ import { Board } from '../../board';
3
+ import { Setup } from '../../setup';
4
+ import { Position } from '../../shogi';
5
+ import { Move, Square } from '../../types';
6
+ import { Hand } from '../../hand';
6
7
  export declare enum InvalidKif {
7
8
  Kif = "ERR_KIF",
8
9
  Board = "ERR_BOARD",
9
10
  Handicap = "ERR_HANDICAP",
10
- Pockets = "ERR_POCKETS"
11
+ Hands = "ERR_HANDS"
11
12
  }
12
13
  export declare class KifError extends Error {
13
14
  }
14
15
  export declare function makeKifHeader(setup: Setup): string;
15
16
  export declare function makeKifPositionHeader(setup: Setup): string;
16
17
  export declare function makeKifBoard(board: Board): string;
17
- export declare function makeKifPocket(material: MaterialSide): string;
18
+ export declare function makeKifHand(hand: Hand): string;
18
19
  export declare function parseKifHeader(kif: string): Result<Setup, KifError>;
19
20
  export declare function parseKifPositionHeader(kif: string): Result<Setup, KifError>;
20
21
  export declare function parseKifBoard(kifBoard: string): Result<Board, KifError>;
21
- export declare function parseKifHand(pocketPart: string): Result<MaterialSide, KifError>;
22
+ export declare function parseKifHand(handPart: string): Result<Hand, KifError>;
22
23
  export declare function parseTags(kif: string): [string, string][];
24
+ export declare function normalizedKifLines(kif: string): string[];
23
25
  export declare function parseKifMove(kifMove: string, lastDest?: Square | undefined): Move | undefined;
24
26
  export declare function parseKifMoves(kifMoves: string[], lastDest?: Square | undefined): Move[];
25
- export declare function makeKifMove(pos: Position, move: Move, same?: boolean): string;
26
- export declare function makeKifVariation(pos: Position, variation: Move[], lastDest?: Square | undefined, startTurn?: number): string;
27
+ export declare function makeKifMove(pos: Position, move: Move, lastDest?: Square): string | undefined;
@@ -0,0 +1,232 @@
1
+ import { Result } from '@badrap/result';
2
+ import { Board } from '../../board';
3
+ import { INITIAL_SFEN, makeSfen, parseSfen } from '../../sfen';
4
+ import { handicapNameToSfen, sfenToHandicapName } from './kifHandicaps';
5
+ import { isDrop } from '../../types';
6
+ import { defined, kanjiToRole, roleTo1Kanji, roleTo2Kanji } from '../../util';
7
+ import { Hand, Hands } from '../../hand';
8
+ import { allRoles, handRoles, promote } from '../../variantUtil';
9
+ import { kanjiToNumber, makeJapaneseSquare, makeNumberSquare, numberToKanji, parseJapaneseSquare, } from '../notationUtil';
10
+ //
11
+ // KIF HEADER
12
+ //
13
+ export var InvalidKif;
14
+ (function (InvalidKif) {
15
+ InvalidKif["Kif"] = "ERR_KIF";
16
+ InvalidKif["Board"] = "ERR_BOARD";
17
+ InvalidKif["Handicap"] = "ERR_HANDICAP";
18
+ InvalidKif["Hands"] = "ERR_HANDS";
19
+ })(InvalidKif || (InvalidKif = {}));
20
+ export class KifError extends Error {
21
+ }
22
+ // Export
23
+ export function makeKifHeader(setup) {
24
+ const handicap = sfenToHandicapName(makeSfen(setup, { epd: true }));
25
+ if (defined(handicap))
26
+ return '手合割:' + handicap;
27
+ return makeKifPositionHeader(setup);
28
+ }
29
+ export function makeKifPositionHeader(setup) {
30
+ return [
31
+ '後手の持駒:' + makeKifHand(setup.hands.gote),
32
+ makeKifBoard(setup.board),
33
+ '先手の持駒:' + makeKifHand(setup.hands.sente),
34
+ ...(setup.turn === 'gote' ? ['後手番'] : []),
35
+ ].join('\n');
36
+ }
37
+ export function makeKifBoard(board) {
38
+ const kifFiles = ' 9 8 7 6 5 4 3 2 1'.slice(-(board.numberOfFiles * 2));
39
+ const separator = '+' + '-'.repeat(board.numberOfFiles * 3) + '+';
40
+ const offset = 9 - board.numberOfFiles;
41
+ let kifBoard = ' ' + kifFiles + `\n${separator}\n`;
42
+ for (let rank = 8; rank >= 9 - board.numberOfRanks; rank--) {
43
+ for (let file = offset; file < 9; file++) {
44
+ const square = file + rank * 9;
45
+ const piece = board.get(square);
46
+ if (file === offset) {
47
+ kifBoard += '|';
48
+ }
49
+ if (!piece)
50
+ kifBoard += ' ・';
51
+ else {
52
+ if (piece.color === 'gote')
53
+ kifBoard += 'v' + roleTo1Kanji(piece.role);
54
+ else
55
+ kifBoard += ' ' + roleTo1Kanji(piece.role);
56
+ }
57
+ if (file === 8) {
58
+ kifBoard += '|' + numberToKanji(9 - rank) + '\n';
59
+ }
60
+ }
61
+ }
62
+ kifBoard += separator;
63
+ return kifBoard;
64
+ }
65
+ export function makeKifHand(hand) {
66
+ if (hand.isEmpty())
67
+ return 'なし';
68
+ return handRoles('shogi')
69
+ .map(role => {
70
+ const r = roleTo1Kanji(role);
71
+ const n = hand[role];
72
+ return n > 1 ? r + numberToKanji(n) : n === 1 ? r : '';
73
+ })
74
+ .filter(p => p.length > 0)
75
+ .join(' ');
76
+ }
77
+ // Import
78
+ export function parseKifHeader(kif) {
79
+ const lines = normalizedKifLines(kif);
80
+ const handicap = lines.find(l => l.startsWith('手合割:'));
81
+ const hSfen = defined(handicap) ? handicapNameToSfen(handicap.split(':')[1]) : INITIAL_SFEN;
82
+ return parseKifPositionHeader(kif).unwrap(kifBoard => Result.ok(kifBoard), () => {
83
+ if (!defined(hSfen))
84
+ return Result.err(new KifError(InvalidKif.Handicap));
85
+ return parseSfen(hSfen);
86
+ });
87
+ }
88
+ export function parseKifPositionHeader(kif) {
89
+ const lines = normalizedKifLines(kif);
90
+ const goteHandStr = lines.find(l => l.startsWith('後手の持駒:'));
91
+ const senteHandStr = lines.find(l => l.startsWith('先手の持駒:'));
92
+ const turn = lines.some(l => l.startsWith('後手番')) ? 'gote' : 'sente';
93
+ const board = parseKifBoard(kif);
94
+ const goteHand = defined(goteHandStr) ? parseKifHand(goteHandStr.split(':')[1]) : Result.ok(Hand.empty());
95
+ const senteHand = defined(senteHandStr) ? parseKifHand(senteHandStr.split(':')[1]) : Result.ok(Hand.empty());
96
+ return board.chain(board => goteHand.chain(gHand => senteHand.map(sHand => {
97
+ return {
98
+ board,
99
+ hands: new Hands(gHand, sHand),
100
+ turn,
101
+ fullmoves: 1,
102
+ };
103
+ })));
104
+ }
105
+ export function parseKifBoard(kifBoard) {
106
+ const lines = normalizedKifLines(kifBoard).filter(l => l.startsWith('|'));
107
+ if (lines.length === 0)
108
+ return Result.err(new KifError(InvalidKif.Board));
109
+ const board = Board.empty();
110
+ // assuming square board
111
+ board.numberOfRanks = lines.length;
112
+ board.numberOfFiles = lines.length;
113
+ const offset = 9 - lines.length;
114
+ let file = offset;
115
+ let rank = 9;
116
+ for (const l of lines) {
117
+ file = offset;
118
+ rank--;
119
+ let gote = false;
120
+ let prom = false;
121
+ for (const c of l) {
122
+ switch (c) {
123
+ case '・':
124
+ file++;
125
+ break;
126
+ case 'v':
127
+ gote = true;
128
+ break;
129
+ case '成':
130
+ prom = true;
131
+ break;
132
+ default:
133
+ if (file > 9 || rank < 0)
134
+ return Result.err(new KifError(InvalidKif.Board));
135
+ const role = kanjiToRole(c);
136
+ if (defined(role) && allRoles('shogi').includes(role)) {
137
+ const square = file + rank * 9;
138
+ const piece = { role: prom ? promote('shogi')(role) : role, color: (gote ? 'gote' : 'sente') };
139
+ board.set(square, piece);
140
+ prom = false;
141
+ gote = false;
142
+ file++;
143
+ }
144
+ }
145
+ }
146
+ }
147
+ if (rank !== 9 - lines.length || file !== 9)
148
+ return Result.err(new KifError(InvalidKif.Board));
149
+ return Result.ok(board);
150
+ }
151
+ export function parseKifHand(handPart) {
152
+ const hand = Hand.empty();
153
+ const pieces = handPart.replace(/ /g, ' ').trim().split(' ');
154
+ if (handPart.includes('なし'))
155
+ return Result.ok(hand);
156
+ for (const piece of pieces) {
157
+ for (let i = 0; i < piece.length; i++) {
158
+ const role = kanjiToRole(piece[i++]);
159
+ if (!role || !handRoles('shogi').includes(role))
160
+ return Result.err(new KifError(InvalidKif.Hands));
161
+ let countStr = '';
162
+ while (i < piece.length && ['一', '二', '三', '四', '五', '六', '七', '八', '九', '十'].includes(piece[i]))
163
+ countStr += piece[i++];
164
+ const count = kanjiToNumber(countStr) || 1;
165
+ hand[role] += count;
166
+ }
167
+ }
168
+ return Result.ok(hand);
169
+ }
170
+ export function parseTags(kif) {
171
+ return normalizedKifLines(kif)
172
+ .filter(l => !l.startsWith('#') && !l.startsWith('*'))
173
+ .map(l => l.replace(':', ':').split(/:(.*)/, 2));
174
+ }
175
+ export function normalizedKifLines(kif) {
176
+ return kif
177
+ .replace(/:/g, ':')
178
+ .replace(/ /g, ' ') // full-width space to normal space
179
+ .split(/[\r\n]+/)
180
+ .map(l => l.trim())
181
+ .filter(l => l);
182
+ }
183
+ //
184
+ // KIF MOVES
185
+ //
186
+ // Parsing kif moves
187
+ export function parseKifMove(kifMove, lastDest = undefined) {
188
+ var _a, _b;
189
+ // Normal move
190
+ const match = kifMove.match(/((?:[123456789][一二三四五六七八九]|同\s?))(玉|飛|龍|角|馬|金|銀|成銀|桂|成桂|香|成香|歩|と)(成)?\(([1-9][1-9])\)/);
191
+ if (!match) {
192
+ // Drop
193
+ const match = kifMove.match(/((?:[123456789][一二三四五六七八九]|同\s?))(飛|角|金|銀|桂|香|歩)打/);
194
+ if (!match)
195
+ return;
196
+ const move = {
197
+ role: kanjiToRole(match[2]),
198
+ to: (_a = parseJapaneseSquare(match[1])) !== null && _a !== void 0 ? _a : lastDest,
199
+ };
200
+ return move;
201
+ }
202
+ return {
203
+ from: parseJapaneseSquare(match[4]),
204
+ to: (_b = parseJapaneseSquare(match[1])) !== null && _b !== void 0 ? _b : lastDest,
205
+ promotion: !!match[3],
206
+ };
207
+ }
208
+ export function parseKifMoves(kifMoves, lastDest = undefined) {
209
+ const moves = [];
210
+ for (const m of kifMoves) {
211
+ const move = parseKifMove(m, lastDest);
212
+ if (!move)
213
+ return moves;
214
+ lastDest = move.to;
215
+ moves.push(move);
216
+ }
217
+ return moves;
218
+ }
219
+ // Making kif formatted moves
220
+ export function makeKifMove(pos, move, lastDest) {
221
+ const moveDest = lastDest === move.to ? '同 ' : makeJapaneseSquare(move.to);
222
+ if (isDrop(move)) {
223
+ return moveDest + roleTo1Kanji(move.role) + '打';
224
+ }
225
+ else {
226
+ const role = pos.board.getRole(move.from);
227
+ if (!role)
228
+ return undefined;
229
+ return moveDest + roleTo2Kanji(role) + (move.promotion ? '成' : '') + '(' + makeNumberSquare(move.from) + ')';
230
+ }
231
+ }
232
+ //# sourceMappingURL=kif.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kif.js","sourceRoot":"","sources":["../../src/notation/kif/kif.ts"],"names":[],"mappings":"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"}
@@ -1,8 +1,5 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.handicapNameToSfen = exports.sfenToHandicapName = void 0;
4
1
  // Exporting only the most common handicaps
5
- function sfenToHandicapName(sfen) {
2
+ export function sfenToHandicapName(sfen) {
6
3
  switch (sfen.split(' ').slice(0, 3).join(' ')) {
7
4
  case 'lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b -':
8
5
  return '平手';
@@ -26,13 +23,15 @@ function sfenToHandicapName(sfen) {
26
23
  return '八枚落ち';
27
24
  case '4k4/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w -':
28
25
  return '十枚落ち';
26
+ // minishogi
27
+ case 'rbsgk/4p/5/P4/KGSBR b -':
28
+ return '五々将棋';
29
29
  default:
30
30
  return undefined;
31
31
  }
32
32
  }
33
- exports.sfenToHandicapName = sfenToHandicapName;
34
33
  // Importing more handicaps
35
- function handicapNameToSfen(name) {
34
+ export function handicapNameToSfen(name) {
36
35
  switch (name) {
37
36
  case '平手':
38
37
  return 'lnsgkgsnl/1r5b1/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL b - 1';
@@ -82,9 +81,10 @@ function handicapNameToSfen(name) {
82
81
  return '2sgkgs2/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w RB2N2L 1';
83
82
  case '八枚得':
84
83
  return '3gkg3/9/ppppppppp/9/9/9/PPPPPPPPP/1B5R1/LNSGKGSNL w RB2S2N2L 1';
84
+ case '五々将棋':
85
+ return 'rbsgk/4p/5/P4/KGSBR b - 1';
85
86
  default:
86
87
  return undefined;
87
88
  }
88
89
  }
89
- exports.handicapNameToSfen = handicapNameToSfen;
90
90
  //# sourceMappingURL=kifHandicaps.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kifHandicaps.js","sourceRoot":"","sources":["../../src/notation/kif/kifHandicaps.ts"],"names":[],"mappings":"AAAA,2CAA2C;AAC3C,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,QAAQ,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;QAC7C,KAAK,+DAA+D;YAClE,OAAO,IAAI,CAAC;QACd,KAAK,+DAA+D;YAClE,OAAO,KAAK,CAAC;QACf,KAAK,+DAA+D;YAClE,OAAO,MAAM,CAAC;QAChB,KAAK,6DAA6D;YAChE,OAAO,KAAK,CAAC;QACf,KAAK,6DAA6D;YAChE,OAAO,MAAM,CAAC;QAChB,KAAK,6DAA6D;YAChE,OAAO,MAAM,CAAC;QAChB,KAAK,2DAA2D;YAC9D,OAAO,MAAM,CAAC;QAChB,KAAK,2DAA2D;YAC9D,OAAO,MAAM,CAAC;QAChB,KAAK,yDAAyD;YAC5D,OAAO,MAAM,CAAC;QAChB,KAAK,uDAAuD;YAC1D,OAAO,MAAM,CAAC;QAChB,KAAK,qDAAqD;YACxD,OAAO,MAAM,CAAC;QAChB,YAAY;QACZ,KAAK,yBAAyB;YAC5B,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,SAAS,CAAC;KACpB;AACH,CAAC;AAED,2BAA2B;AAC3B,MAAM,UAAU,kBAAkB,CAAC,IAAY;IAC7C,QAAQ,IAAI,EAAE;QACZ,KAAK,IAAI;YACP,OAAO,iEAAiE,CAAC;QAC3E,KAAK,KAAK;YACR,OAAO,iEAAiE,CAAC;QAC3E,KAAK,MAAM;YACT,OAAO,iEAAiE,CAAC;QAC3E,KAAK,KAAK;YACR,OAAO,+DAA+D,CAAC;QACzE,KAAK,MAAM;YACT,OAAO,+DAA+D,CAAC;QACzE,KAAK,MAAM;YACT,OAAO,+DAA+D,CAAC;QACzE,KAAK,MAAM;YACT,OAAO,6DAA6D,CAAC;QACvE,KAAK,MAAM;YACT,OAAO,6DAA6D,CAAC;QACvE,KAAK,MAAM;YACT,OAAO,2DAA2D,CAAC;QACrE,KAAK,MAAM;YACT,OAAO,yDAAyD,CAAC;QACnE,KAAK,MAAM;YACT,OAAO,uDAAuD,CAAC;QACjE,KAAK,KAAK;YACR,OAAO,gDAAgD,CAAC;QAC1D,KAAK,IAAI;YACP,OAAO,+CAA+C,CAAC;QACzD,KAAK,QAAQ;YACX,OAAO,+DAA+D,CAAC;QACzE,KAAK,OAAO;YACV,OAAO,6DAA6D,CAAC;QACvE,KAAK,KAAK;YACR,OAAO,2DAA2D,CAAC;QACrE,KAAK,IAAI;YACP,OAAO,iEAAiE,CAAC;QAC3E,KAAK,IAAI;YACP,OAAO,+DAA+D,CAAC;QACzE,KAAK,KAAK;YACR,OAAO,+DAA+D,CAAC;QACzE,KAAK,KAAK;YACR,OAAO,gEAAgE,CAAC;QAC1E,KAAK,KAAK;YACR,OAAO,8DAA8D,CAAC;QACxE,KAAK,KAAK;YACR,OAAO,gEAAgE,CAAC;QAC1E,KAAK,KAAK;YACR,OAAO,gEAAgE,CAAC;QAC1E,KAAK,KAAK;YACR,OAAO,gEAAgE,CAAC;QAC1E,KAAK,MAAM;YACT,OAAO,2BAA2B,CAAC;QACrC;YACE,OAAO,SAAS,CAAC;KACpB;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { Position } from '../shogi';
2
+ import { Move, Square } from '../types';
3
+ export declare function makeKitaoKawasakiMove(pos: Position, move: Move, lastDest?: Square): string | undefined;