shogiops 0.2.7 → 0.4.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 (91) hide show
  1. package/LICENSE.txt +0 -0
  2. package/README.md +0 -0
  3. package/attacks.d.ts +0 -0
  4. package/attacks.js +7 -7
  5. package/attacks.js.map +1 -1
  6. package/board.d.ts +3 -0
  7. package/board.js +31 -0
  8. package/board.js.map +1 -1
  9. package/compat.d.ts +6 -24
  10. package/compat.js +15 -171
  11. package/compat.js.map +1 -1
  12. package/csa.d.ts +4 -3
  13. package/csa.js +38 -33
  14. package/csa.js.map +1 -1
  15. package/csaUtil.d.ts +1 -1
  16. package/csaUtil.js +3 -3
  17. package/csaUtil.js.map +1 -1
  18. package/debug.d.ts +0 -0
  19. package/debug.js +29 -55
  20. package/debug.js.map +1 -1
  21. package/fen.d.ts +6 -5
  22. package/fen.js +53 -49
  23. package/fen.js.map +1 -1
  24. package/hand.d.ts +38 -0
  25. package/hand.js +74 -0
  26. package/hand.js.map +1 -0
  27. package/hash.d.ts +4 -3
  28. package/hash.js +9 -9
  29. package/hash.js.map +1 -1
  30. package/index.d.ts +4 -3
  31. package/index.js +3 -7
  32. package/index.js.map +1 -1
  33. package/kif.d.ts +5 -4
  34. package/kif.js +70 -65
  35. package/kif.js.map +1 -1
  36. package/kifHandicaps.d.ts +0 -0
  37. package/kifHandicaps.js +5 -0
  38. package/kifHandicaps.js.map +1 -1
  39. package/kifUtil.d.ts +0 -0
  40. package/kifUtil.js +4 -4
  41. package/kifUtil.js.map +1 -1
  42. package/package.json +9 -5
  43. package/setup.d.ts +2 -32
  44. package/setup.js +3 -74
  45. package/setup.js.map +1 -1
  46. package/shogi.d.ts +14 -7
  47. package/shogi.js +109 -106
  48. package/shogi.js.map +1 -1
  49. package/squareSet.d.ts +1 -5
  50. package/squareSet.js +0 -13
  51. package/squareSet.js.map +1 -1
  52. package/src/attacks.ts +0 -0
  53. package/src/board.ts +34 -0
  54. package/src/compat.ts +18 -197
  55. package/src/csa.ts +29 -21
  56. package/src/csaUtil.ts +3 -2
  57. package/src/debug.ts +25 -55
  58. package/src/fen.ts +42 -35
  59. package/src/hand.ts +94 -0
  60. package/src/hash.ts +8 -7
  61. package/src/index.ts +5 -5
  62. package/src/kif.ts +51 -43
  63. package/src/kifHandicaps.ts +5 -0
  64. package/src/kifUtil.ts +0 -0
  65. package/src/setup.ts +4 -91
  66. package/src/shogi.ts +75 -75
  67. package/src/squareSet.ts +1 -18
  68. package/src/transform.ts +3 -1
  69. package/src/types.ts +13 -16
  70. package/src/util.ts +2 -68
  71. package/src/variant.ts +44 -3
  72. package/src/variantUtil.ts +160 -0
  73. package/transform.d.ts +0 -0
  74. package/transform.js +3 -1
  75. package/transform.js.map +1 -1
  76. package/types.d.ts +3 -7
  77. package/types.js +13 -14
  78. package/types.js.map +1 -1
  79. package/util.d.ts +1 -4
  80. package/util.js +2 -54
  81. package/util.js.map +1 -1
  82. package/variant.d.ts +12 -1
  83. package/variant.js +38 -3
  84. package/variant.js.map +1 -1
  85. package/variantUtil.d.ts +13 -0
  86. package/variantUtil.js +160 -0
  87. package/variantUtil.js.map +1 -0
  88. package/san.d.ts +0 -6
  89. package/san.js +0 -135
  90. package/san.js.map +0 -1
  91. package/src/san.ts +0 -136
package/variantUtil.js ADDED
@@ -0,0 +1,160 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.secondBackrank = exports.backrank = exports.promotionZone = exports.unpromote = exports.promote = exports.promotableRoles = exports.handRoles = exports.allRoles = exports.pieceInDeadZone = exports.pieceCanPromote = void 0;
4
+ const squareSet_1 = require("./squareSet");
5
+ function pieceCanPromote(rules) {
6
+ switch (rules) {
7
+ default:
8
+ return (piece, from, to) => promotableRoles(rules).includes(piece.role) &&
9
+ (promotionZone(rules)(piece.color).has(from) || promotionZone(rules)(piece.color).has(to));
10
+ }
11
+ }
12
+ exports.pieceCanPromote = pieceCanPromote;
13
+ function pieceInDeadZone(rules) {
14
+ switch (rules) {
15
+ default:
16
+ return (piece, sq) => {
17
+ if (piece.role === 'lance' || piece.role === 'pawn')
18
+ return backrank(rules)(piece.color).intersect(squareSet_1.SquareSet.fromSquare(sq)).nonEmpty();
19
+ if (piece.role === 'knight')
20
+ return secondBackrank(rules)(piece.color)
21
+ .union(backrank(rules)(piece.color))
22
+ .intersect(squareSet_1.SquareSet.fromSquare(sq))
23
+ .nonEmpty();
24
+ return false;
25
+ };
26
+ }
27
+ }
28
+ exports.pieceInDeadZone = pieceInDeadZone;
29
+ function allRoles(rules) {
30
+ switch (rules) {
31
+ case 'minishogi':
32
+ return ['rook', 'bishop', 'gold', 'silver', 'pawn', 'king', 'dragon', 'horse', 'promotedsilver', 'tokin'];
33
+ default:
34
+ return [
35
+ 'rook',
36
+ 'bishop',
37
+ 'gold',
38
+ 'silver',
39
+ 'knight',
40
+ 'lance',
41
+ 'pawn',
42
+ 'dragon',
43
+ 'horse',
44
+ 'tokin',
45
+ 'promotedsilver',
46
+ 'promotedknight',
47
+ 'promotedlance',
48
+ 'king',
49
+ ];
50
+ }
51
+ }
52
+ exports.allRoles = allRoles;
53
+ function handRoles(rules) {
54
+ switch (rules) {
55
+ case 'minishogi':
56
+ return ['rook', 'bishop', 'gold', 'silver', 'pawn'];
57
+ default:
58
+ return ['rook', 'bishop', 'gold', 'silver', 'knight', 'lance', 'pawn'];
59
+ }
60
+ }
61
+ exports.handRoles = handRoles;
62
+ function promotableRoles(rules) {
63
+ switch (rules) {
64
+ case 'minishogi':
65
+ return ['pawn', 'silver', 'bishop', 'rook'];
66
+ default:
67
+ return ['pawn', 'lance', 'knight', 'silver', 'bishop', 'rook'];
68
+ }
69
+ }
70
+ exports.promotableRoles = promotableRoles;
71
+ function promote(rules) {
72
+ switch (rules) {
73
+ case 'minishogi':
74
+ return standardPromote;
75
+ default:
76
+ return standardPromote;
77
+ }
78
+ }
79
+ exports.promote = promote;
80
+ function unpromote(rules) {
81
+ switch (rules) {
82
+ case 'minishogi':
83
+ return standardUnpromote;
84
+ default:
85
+ return standardUnpromote;
86
+ }
87
+ }
88
+ exports.unpromote = unpromote;
89
+ function promotionZone(rules) {
90
+ switch (rules) {
91
+ case 'minishogi':
92
+ return (color) => (color === 'sente' ? squareSet_1.SquareSet.fromRank(8) : squareSet_1.SquareSet.fromRank(4));
93
+ default:
94
+ return (color) => (color === 'sente' ? new squareSet_1.SquareSet(0, 0, 0x07ffffff) : new squareSet_1.SquareSet(0x07ffffff, 0, 0));
95
+ }
96
+ }
97
+ exports.promotionZone = promotionZone;
98
+ function backrank(rules) {
99
+ switch (rules) {
100
+ case 'minishogi':
101
+ return promotionZone(rules);
102
+ default:
103
+ return (color) => (color === 'sente' ? squareSet_1.SquareSet.fromRank(8) : squareSet_1.SquareSet.fromRank(0));
104
+ }
105
+ }
106
+ exports.backrank = backrank;
107
+ function secondBackrank(rules) {
108
+ switch (rules) {
109
+ case 'minishogi':
110
+ return (color) => (color === 'sente' ? squareSet_1.SquareSet.fromRank(7) : squareSet_1.SquareSet.fromRank(5));
111
+ default:
112
+ return (color) => (color === 'sente' ? squareSet_1.SquareSet.fromRank(7) : squareSet_1.SquareSet.fromRank(1));
113
+ }
114
+ }
115
+ exports.secondBackrank = secondBackrank;
116
+ function standardUnpromote(role) {
117
+ switch (role) {
118
+ case 'pawn':
119
+ case 'tokin':
120
+ return 'pawn';
121
+ case 'lance':
122
+ case 'promotedlance':
123
+ return 'lance';
124
+ case 'knight':
125
+ case 'promotedknight':
126
+ return 'knight';
127
+ case 'silver':
128
+ case 'promotedsilver':
129
+ return 'silver';
130
+ case 'gold':
131
+ return 'gold';
132
+ case 'bishop':
133
+ case 'horse':
134
+ return 'bishop';
135
+ case 'rook':
136
+ case 'dragon':
137
+ return 'rook';
138
+ default:
139
+ return role;
140
+ }
141
+ }
142
+ function standardPromote(role) {
143
+ switch (role) {
144
+ case 'pawn':
145
+ return 'tokin';
146
+ case 'lance':
147
+ return 'promotedlance';
148
+ case 'knight':
149
+ return 'promotedknight';
150
+ case 'silver':
151
+ return 'promotedsilver';
152
+ case 'bishop':
153
+ return 'horse';
154
+ case 'rook':
155
+ return 'dragon';
156
+ default:
157
+ return role;
158
+ }
159
+ }
160
+ //# sourceMappingURL=variantUtil.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"variantUtil.js","sourceRoot":"","sources":["src/variantUtil.ts"],"names":[],"mappings":"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"}
package/san.d.ts DELETED
@@ -1,6 +0,0 @@
1
- import { Move } from './types';
2
- import { Position } from './shogi';
3
- export declare function makeSanAndPlay(pos: Position, move: Move): string;
4
- export declare function makeSanVariation(pos: Position, variation: Move[]): string;
5
- export declare function makeSan(pos: Position, move: Move): string;
6
- export declare function parseSan(pos: Position, san: string): Move | undefined;
package/san.js DELETED
@@ -1,135 +0,0 @@
1
- "use strict";
2
- Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.parseSan = exports.makeSan = exports.makeSanVariation = exports.makeSanAndPlay = void 0;
4
- const types_1 = require("./types");
5
- const util_1 = require("./util");
6
- const squareSet_1 = require("./squareSet");
7
- const compat_1 = require("./compat");
8
- function makeSanWithoutSuffix(pos, move) {
9
- let san = '';
10
- if ((0, types_1.isDrop)(move)) {
11
- san = (0, compat_1.roleToLishogiChar)(move.role).toUpperCase() + '*' + (0, compat_1.shogiCoordToChessCord)((0, util_1.makeSquare)(move.to));
12
- }
13
- else {
14
- const role = pos.board.getRole(move.from);
15
- if (!role)
16
- return '--';
17
- const capture = pos.board.occupied.has(move.to);
18
- san = (0, compat_1.roleToLishogiChar)(role).toUpperCase();
19
- if (role !== 'pawn' && role !== 'lance' && role !== 'king') {
20
- // Disambiguation
21
- let others = squareSet_1.SquareSet.empty();
22
- for (const s of pos.board.pieces(pos.turn, role)) {
23
- if (pos.dests(s).has(move.to))
24
- others = others.union(squareSet_1.SquareSet.fromSquare(s));
25
- }
26
- others = others.without(move.from);
27
- if (others.nonEmpty()) {
28
- san += (0, compat_1.shogiCoordToChessCord)((0, util_1.makeSquare)(move.from));
29
- }
30
- }
31
- if (capture)
32
- san += 'x';
33
- san += (0, compat_1.shogiCoordToChessCord)((0, util_1.makeSquare)(move.to));
34
- if (move.promotion)
35
- san += '+';
36
- // Do we need to force promotion?
37
- else if ((role === 'knight' && squareSet_1.SquareSet.backrank2(pos.turn).has(move.to)) ||
38
- ((role === 'pawn' || role === 'lance') && squareSet_1.SquareSet.backrank(pos.turn).has(move.to)))
39
- san += '+';
40
- else if (types_1.PROMOTABLE_ROLES.includes(role) &&
41
- squareSet_1.SquareSet.promotionZone(pos.turn).has(move.to))
42
- san += '=';
43
- }
44
- return san;
45
- }
46
- function makeSanAndPlay(pos, move) {
47
- const san = makeSanWithoutSuffix(pos, move);
48
- pos.play(move);
49
- return san;
50
- }
51
- exports.makeSanAndPlay = makeSanAndPlay;
52
- function makeSanVariation(pos, variation) {
53
- var _a;
54
- pos = pos.clone();
55
- const line = [];
56
- for (let i = 0; i < variation.length; i++) {
57
- if (i !== 0)
58
- line.push(' ');
59
- line.push(pos.fullmoves, '. ');
60
- const san = makeSanWithoutSuffix(pos, variation[i]);
61
- pos.play(variation[i]);
62
- line.push(san);
63
- if (san === '--')
64
- return line.join('');
65
- if (i === variation.length - 1 && ((_a = pos.outcome()) === null || _a === void 0 ? void 0 : _a.winner))
66
- line.push('投了');
67
- }
68
- return line.join('');
69
- }
70
- exports.makeSanVariation = makeSanVariation;
71
- function makeSan(pos, move) {
72
- return makeSanAndPlay(pos.clone(), move);
73
- }
74
- exports.makeSan = makeSan;
75
- function parseSan(pos, san) {
76
- const ctx = pos.ctx();
77
- // Normal move
78
- const match = san.match(/^([PLNSGKBRTUMAHD])([a-i][1-9])?[x]?([a-i][1-9])(\+|\=)?$/);
79
- if (!match) {
80
- // Drop
81
- const match = san.match(/^([PLNSGBRplsgbr])\*([a-i][1-9])$/);
82
- if (!match)
83
- return;
84
- const move = {
85
- role: (0, compat_1.lishogiCharToRole)(match[1]),
86
- to: (0, compat_1.parseChessSquare)(match[2]),
87
- };
88
- return pos.isLegal(move, ctx) ? move : undefined;
89
- }
90
- const role = (0, compat_1.lishogiCharToRole)(match[1]);
91
- const to = (0, compat_1.parseChessSquare)(match[3]);
92
- const fromStr = match[2];
93
- let candidates = pos.board.pieces(pos.turn, role);
94
- if (fromStr)
95
- candidates = candidates.intersect(squareSet_1.SquareSet.fromSquare((0, compat_1.parseChessSquare)(fromStr)));
96
- // Check uniqueness and legality
97
- let from;
98
- for (const candidate of candidates) {
99
- if (pos.dests(candidate, ctx).has(to)) {
100
- if ((0, util_1.defined)(from))
101
- return; // Ambiguous
102
- from = candidate;
103
- }
104
- }
105
- if (!(0, util_1.defined)(from))
106
- return; // Illegal
107
- const promotionStr = match[4];
108
- let promotion;
109
- if (promotionStr === '+')
110
- promotion = true;
111
- else
112
- promotion = false;
113
- // Promotion needs to be specified in san
114
- if (!(0, util_1.defined)(promotionStr) &&
115
- types_1.PROMOTABLE_ROLES.includes(role) &&
116
- (squareSet_1.SquareSet.promotionZone(pos.turn).has(to) || squareSet_1.SquareSet.promotionZone(pos.turn).has(from)))
117
- return;
118
- // role can't be promoted/unpromoted or it isn't in/from the promotion zone
119
- if (promotionStr &&
120
- (!types_1.PROMOTABLE_ROLES.includes(role) ||
121
- (!squareSet_1.SquareSet.promotionZone(pos.turn).has(to) && !squareSet_1.SquareSet.promotionZone(pos.turn).has(from))))
122
- return;
123
- // force promotion
124
- else if (!promotion &&
125
- (((role === 'pawn' || role === 'lance') && squareSet_1.SquareSet.backrank(pos.turn).has(to)) ||
126
- (role === 'knight' && squareSet_1.SquareSet.backrank2(pos.turn).has(to))))
127
- return;
128
- return {
129
- from,
130
- to,
131
- promotion,
132
- };
133
- }
134
- exports.parseSan = parseSan;
135
- //# sourceMappingURL=san.js.map
package/san.js.map DELETED
@@ -1 +0,0 @@
1
- {"version":3,"file":"san.js","sourceRoot":"","sources":["src/san.ts"],"names":[],"mappings":"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"}
package/src/san.ts DELETED
@@ -1,136 +0,0 @@
1
- import { isDrop, Move, PocketRole, PROMOTABLE_ROLES } from './types';
2
- import { defined, makeSquare } from './util';
3
- import { SquareSet } from './squareSet';
4
- import { Position } from './shogi';
5
- import { lishogiCharToRole, roleToLishogiChar, shogiCoordToChessCord, parseChessSquare } from './compat';
6
-
7
- function makeSanWithoutSuffix(pos: Position, move: Move): string {
8
- let san = '';
9
- if (isDrop(move)) {
10
- san = roleToLishogiChar(move.role).toUpperCase() + '*' + shogiCoordToChessCord(makeSquare(move.to));
11
- } else {
12
- const role = pos.board.getRole(move.from);
13
- if (!role) return '--';
14
- const capture = pos.board.occupied.has(move.to);
15
- san = roleToLishogiChar(role).toUpperCase();
16
-
17
- if (role !== 'pawn' && role !== 'lance' && role !== 'king') {
18
- // Disambiguation
19
- let others = SquareSet.empty();
20
- for (const s of pos.board.pieces(pos.turn, role)) {
21
- if (pos.dests(s).has(move.to)) others = others.union(SquareSet.fromSquare(s));
22
- }
23
- others = others.without(move.from);
24
- if (others.nonEmpty()) {
25
- san += shogiCoordToChessCord(makeSquare(move.from));
26
- }
27
- }
28
- if (capture) san += 'x';
29
- san += shogiCoordToChessCord(makeSquare(move.to));
30
- if (move.promotion) san += '+';
31
- // Do we need to force promotion?
32
- else if (
33
- (role === 'knight' && SquareSet.backrank2(pos.turn).has(move.to)) ||
34
- ((role === 'pawn' || role === 'lance') && SquareSet.backrank(pos.turn).has(move.to))
35
- )
36
- san += '+';
37
- else if (
38
- (PROMOTABLE_ROLES as ReadonlyArray<string>).includes(role) &&
39
- SquareSet.promotionZone(pos.turn).has(move.to)
40
- )
41
- san += '=';
42
- }
43
- return san;
44
- }
45
-
46
- export function makeSanAndPlay(pos: Position, move: Move): string {
47
- const san = makeSanWithoutSuffix(pos, move);
48
- pos.play(move);
49
- return san;
50
- }
51
-
52
- export function makeSanVariation(pos: Position, variation: Move[]): string {
53
- pos = pos.clone();
54
- const line = [];
55
- for (let i = 0; i < variation.length; i++) {
56
- if (i !== 0) line.push(' ');
57
- line.push(pos.fullmoves, '. ');
58
- const san = makeSanWithoutSuffix(pos, variation[i]);
59
- pos.play(variation[i]);
60
- line.push(san);
61
- if (san === '--') return line.join('');
62
- if (i === variation.length - 1 && pos.outcome()?.winner) line.push('投了');
63
- }
64
- return line.join('');
65
- }
66
-
67
- export function makeSan(pos: Position, move: Move): string {
68
- return makeSanAndPlay(pos.clone(), move);
69
- }
70
-
71
- export function parseSan(pos: Position, san: string): Move | undefined {
72
- const ctx = pos.ctx();
73
-
74
- // Normal move
75
- const match = san.match(/^([PLNSGKBRTUMAHD])([a-i][1-9])?[x]?([a-i][1-9])(\+|\=)?$/);
76
- if (!match) {
77
- // Drop
78
- const match = san.match(/^([PLNSGBRplsgbr])\*([a-i][1-9])$/);
79
- if (!match) return;
80
- const move = {
81
- role: lishogiCharToRole(match[1]) as PocketRole,
82
- to: parseChessSquare(match[2])!,
83
- };
84
- return pos.isLegal(move, ctx) ? move : undefined;
85
- }
86
- const role = lishogiCharToRole(match[1])!;
87
- const to = parseChessSquare(match[3])!;
88
- const fromStr = match[2];
89
-
90
- let candidates = pos.board.pieces(pos.turn, role);
91
- if (fromStr) candidates = candidates.intersect(SquareSet.fromSquare(parseChessSquare(fromStr)!));
92
-
93
- // Check uniqueness and legality
94
- let from;
95
- for (const candidate of candidates) {
96
- if (pos.dests(candidate, ctx).has(to)) {
97
- if (defined(from)) return; // Ambiguous
98
- from = candidate;
99
- }
100
- }
101
- if (!defined(from)) return; // Illegal
102
-
103
- const promotionStr = match[4];
104
- let promotion: boolean;
105
- if (promotionStr === '+') promotion = true;
106
- else promotion = false;
107
-
108
- // Promotion needs to be specified in san
109
- if (
110
- !defined(promotionStr) &&
111
- (PROMOTABLE_ROLES as ReadonlyArray<string>).includes(role) &&
112
- (SquareSet.promotionZone(pos.turn).has(to) || SquareSet.promotionZone(pos.turn).has(from))
113
- )
114
- return;
115
-
116
- // role can't be promoted/unpromoted or it isn't in/from the promotion zone
117
- if (
118
- promotionStr &&
119
- (!(PROMOTABLE_ROLES as ReadonlyArray<string>).includes(role) ||
120
- (!SquareSet.promotionZone(pos.turn).has(to) && !SquareSet.promotionZone(pos.turn).has(from)))
121
- )
122
- return;
123
- // force promotion
124
- else if (
125
- !promotion &&
126
- (((role === 'pawn' || role === 'lance') && SquareSet.backrank(pos.turn).has(to)) ||
127
- (role === 'knight' && SquareSet.backrank2(pos.turn).has(to)))
128
- )
129
- return;
130
-
131
- return {
132
- from,
133
- to,
134
- promotion,
135
- };
136
- }