X-Git-Url: https://git.auder.net/?a=blobdiff_plain;f=client%2Fsrc%2Fvariants%2FDynamo.js;h=cfe3737e5573c41487785b0b85b526915a7fd0ca;hb=2e29e0e3da7f9aa011c76c228a726a47e3da7c29;hp=afa9a88f51ba5035d37e21f3a1005e4d64f2c82b;hpb=becbc692c46ba04ee1bc8541c1a225c463960541;p=vchess.git diff --git a/client/src/variants/Dynamo.js b/client/src/variants/Dynamo.js index afa9a88f..cfe3737e 100644 --- a/client/src/variants/Dynamo.js +++ b/client/src/variants/Dynamo.js @@ -564,7 +564,6 @@ export class DynamoRules extends ChessRules { // Does m2 un-do m1 ? (to disallow undoing actions) oppositeMoves(m1, m2) { const isEqual = (av1, av2) => { - // Precondition: av1 and av2 length = 2 for (let av of av1) { const avInAv2 = av2.find(elt => { return ( @@ -578,11 +577,12 @@ export class DynamoRules extends ChessRules { } return true; }; + // All appear and vanish arrays must have the same length + const mL = m1.appear.length; return ( - m1.appear.length == 2 && - m2.appear.length == 2 && - m1.vanish.length == 2 && - m2.vanish.length == 2 && + m2.appear.length == mL && + m1.vanish.length == mL && + m2.vanish.length == mL && isEqual(m1.appear, m2.vanish) && isEqual(m1.vanish, m2.appear) ); @@ -598,6 +598,7 @@ export class DynamoRules extends ChessRules { filterValid(moves) { const color = this.turn; + const La = this.amoves.length; if (this.subTurn == 1) { return moves.filter(m => { // A move is valid either if it doesn't result in a check, @@ -605,13 +606,17 @@ export class DynamoRules extends ChessRules { // (not undoing a potential move + action of the opponent) this.play(m); let res = this.underCheck(color); - if (res) { + let isOpposite = La > 0 && this.oppositeMoves(this.amoves[La-1], m); + if (res || isOpposite) { const moves2 = this.getAllPotentialMoves(); for (let m2 of moves2) { this.play(m2); const res2 = this.underCheck(color); + const amove = this.getAmove(m, m2); + isOpposite = + La > 0 && this.oppositeMoves(this.amoves[La-1], amove); this.undo(m2); - if (!res2) { + if (!res2 && !isOpposite) { res = false; break; } @@ -622,7 +627,6 @@ export class DynamoRules extends ChessRules { }); } const Lf = this.firstMove.length; - const La = this.amoves.length; if (La == 0) return super.filterValid(moves); return ( super.filterValid( @@ -721,12 +725,15 @@ export class DynamoRules extends ChessRules { // For now it would then return [NaN, NaN] because surrounding squares // have no IDs in the promotion modal. TODO: improve this? if (!square[0]) return null; - // If subTurn == 2 && square is empty && !underCheck, + // If subTurn == 2 && square is empty && !underCheck && !isOpposite, // then return an empty move, allowing to "pass" subTurn2 + const La = this.amoves.length; + const Lf = this.firstMove.length; if ( this.subTurn == 2 && this.board[square[0]][square[1]] == V.EMPTY && - !this.underCheck(this.turn) + !this.underCheck(this.turn) && + (La == 0 || !this.oppositeMoves(this.amoves[La-1], this.firstMove[Lf-1])) ) { return { start: { x: -1, y: -1 }, @@ -774,6 +781,7 @@ export class DynamoRules extends ChessRules { this.disaggregateFlags(JSON.parse(move.flags)); V.UndoOnBoard(this.board, move); if (this.subTurn == 1) { + this.amoves.pop(); this.turn = V.GetOppCol(this.turn); this.movesCount--; }