X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FBall.js;h=e4a0b2fa3aa729f623e82c8a0dee3bca5c71fa55;hb=af34341d92d47d14f396e7f4adb81f2a7e9d9a61;hp=734a921882fbb90787f12d25cdf87006de9de103;hpb=bfa7d9931b50c1ed54ff3c6d4ef5bc423f26de94;p=vchess.git diff --git a/client/src/variants/Ball.js b/client/src/variants/Ball.js index 734a9218..e4a0b2fa 100644 --- a/client/src/variants/Ball.js +++ b/client/src/variants/Ball.js @@ -112,14 +112,21 @@ export class BallRules extends ChessRules { } canTake([x1, y1], [x2, y2]) { - // Capture enemy or pass ball to friendly pieces + if (this.getColor(x1, y1) !== this.getColor(x2, y2)) { + // The piece holding the ball cannot capture: + return ( + !(Object.keys(V.HAS_BALL_DECODE) + .includes(this.board[x1][y1].charAt(1))) + ); + } + // Pass: possible only if one of the friendly pieces has the ball return ( - this.getColor(x1, y1) !== this.getColor(x2, y2) || - Object.keys(V.HAS_BALL_DECODE).includes(this.board[x1][y1].charAt(1)) + Object.keys(V.HAS_BALL_DECODE).includes(this.board[x1][y1].charAt(1)) || + Object.keys(V.HAS_BALL_DECODE).includes(this.board[x2][y2].charAt(1)) ); } - getCheckSquares(color) { + getCheckSquares() { return []; } @@ -238,15 +245,29 @@ export class BallRules extends ChessRules { ); } - // Post-processing: maybe the ball was taken, or a piece + ball + // Post-processing: maybe the ball was taken, or a piece + ball, + // or maybe a pass (ball <--> piece) if (mv.vanish.length == 2) { if ( // Take the ball? mv.vanish[1].c == 'a' || - // Capture a ball-holding piece? + // Capture a ball-holding piece? If friendly one, then adjust Object.keys(V.HAS_BALL_DECODE).includes(mv.vanish[1].p) ) { mv.appear[0].p = V.HAS_BALL_CODE[mv.appear[0].p]; + if (mv.vanish[1].c == mv.vanish[0].c) { + // "Capturing" self => pass + mv.appear[0].x = mv.start.x; + mv.appear[0].y = mv.start.y; + mv.appear.push( + new PiPo({ + x: mv.end.x, + y: mv.end.y, + p: V.HAS_BALL_DECODE[mv.vanish[1].p], + c: mv.vanish[0].c + }) + ); + } } else if (mv.vanish[1].c == mv.vanish[0].c) { // Pass the ball: the passing unit does not disappear mv.appear.push(JSON.parse(JSON.stringify(mv.vanish[0]))); @@ -268,7 +289,7 @@ export class BallRules extends ChessRules { return super.getPotentialMovesFrom([x, y]); } - // "Sliders": at most 2 steps + // "Sliders": at most 3 steps getSlideNJumpMoves([x, y], steps, oneStep) { let moves = []; outerLoop: for (let step of steps) { @@ -277,7 +298,7 @@ export class BallRules extends ChessRules { let stepCount = 1; while (V.OnBoard(i, j) && this.board[i][j] == V.EMPTY) { moves.push(this.getBasicMove([x, y], [i, j])); - if (oneStep || stepCount == 2) continue outerLoop; + if (oneStep || stepCount == 3) continue outerLoop; i += step[0]; j += step[1]; stepCount++;