cf5ae1682b74f56431b25632926c3b4b8bfaf421
1 import ChessRules
from "/base_rules.js";
2 import GiveawayRules
from "/variants/Giveaway/class.js";
3 import PiPo
from "/utils/PiPo.js";
4 import Move
from "/utils/Move.js";
6 export default class SuctionRules
extends ChessRules
{
10 select: C
.Options
.select
,
24 get pawnPromotions() {
25 return ['p']; //no promotions
32 setOtherVariables(fenParsed
) {
33 super.setOtherVariables(fenParsed
);
35 const cmove_str
= fenParsed
.cmove
;
36 if (cmove_str
!= "-") {
38 start: C
.SquareToCoords(cmove_str
.substr(0, 2)),
39 end: C
.SquareToCoords(cmove_str
.substr(2))
44 genRandInitFen(seed
) {
45 const options
= Object
.assign({mode: "suicide"}, this.options
);
46 const gr
= new GiveawayRules({options: options
, genFenOnly: true});
47 const baseFen
= gr
.genRandInitFen(seed
);
49 const fenParts
= baseFen
.split(" ");
50 let others
= JSON
.parse(fenParts
[3]);
51 others
["cmove"] = "-";
52 return fenParts
.slice(0, 3).join(" ") + " " + JSON
.stringify(others
);
56 const cmoveFen
= !this.cmove
58 : C
.CoordsToSquare(this.cmove
.start
) + C
.CoordsToSquare(this.cmove
.end
);
59 return super.getFen().slice(0, -1) + ',"cmove":"' + cmoveFen
+ '"}';
62 getBasicMove([sx
, sy
], [ex
, ey
]) {
63 let move = super.getBasicMove([sx
, sy
], [ex
, ey
]);
64 if (move.vanish
.length
== 2) {
78 return this.getPiece(x
, y
) != 'k' && super.canIplay(x
, y
);
81 // Does m2 un-do m1 ? (to disallow undoing captures)
82 oppositeMoves(m1
, m2
) {
85 m2
.vanish
.length
== 2 &&
86 m1
.start
.x
== m2
.start
.x
&&
87 m1
.end
.x
== m2
.end
.x
&&
88 m1
.start
.y
== m2
.start
.y
&&
94 return moves
.filter(m
=> !this.oppositeMoves(this.cmove
, m
));
100 (move.vanish
.length
== 2 ? {start: move.start
, end: move.end
} : null);
108 const color
= this.turn
;
109 const kingPos
= super.searchKingPos(color
);
110 if (color
== "w" && kingPos
[0][0] == 0) return "0-1";
111 if (color
== "b" && kingPos
[0][0] == this.size
.x
- 1) return "1-0";
112 // King is not on the opposite edge: game not over
116 // Better animation for swaps
117 customAnimate(move, segments
, cb
) {
118 if (move.vanish
.length
< 2)
120 super.animateMoving(move.end
, move.start
, null,
121 segments
.reverse().map(s
=> s
.reverse()), cb
);