From efb20746c30ac26f258f9c5de6dfb70b91980de4 Mon Sep 17 00:00:00 2001
From: Benjamin Auder <benjamin.auder@somewhere>
Date: Tue, 27 Nov 2018 11:50:49 +0100
Subject: [PATCH] Fix captures and some moves for Grand & Wildebeest

---
 public/javascripts/base_rules.js          | 15 +++++++++------
 public/javascripts/components/game.js     |  7 ++++++-
 public/javascripts/variants/Grand.js      |  1 -
 public/javascripts/variants/Wildebeest.js |  2 ++
 4 files changed, 17 insertions(+), 8 deletions(-)

diff --git a/public/javascripts/base_rules.js b/public/javascripts/base_rules.js
index 26c74477..42775dab 100644
--- a/public/javascripts/base_rules.js
+++ b/public/javascripts/base_rules.js
@@ -284,7 +284,7 @@ class ChessRules
 				i += step[0];
 				j += step[1];
 			}
-			if (i>=0 && i<8 && j>=0 && j<8 && this.canTake([x,y], [i,j]))
+			if (i>=0 && i<sizeX && j>=0 && j<sizeY && this.canTake([x,y], [i,j]))
 				moves.push(this.getBasicMove([x,y], [i,j]));
 		}
 		return moves;
@@ -547,14 +547,15 @@ class ChessRules
 	// Is square x,y attacked by pawns of color c ?
 	isAttackedByPawn([x,y], colors)
 	{
+		const [sizeX,sizeY] = VariantRules.size;
 		for (let c of colors)
 		{
 			let pawnShift = (c=="w" ? 1 : -1);
-			if (x+pawnShift>=0 && x+pawnShift<8)
+			if (x+pawnShift>=0 && x+pawnShift<sizeX)
 			{
 				for (let i of [-1,1])
 				{
-					if (y+i>=0 && y+i<8 && this.getPiece(x+pawnShift,y+i)==VariantRules.PAWN
+					if (y+i>=0 && y+i<sizeY && this.getPiece(x+pawnShift,y+i)==VariantRules.PAWN
 						&& this.getColor(x+pawnShift,y+i)==c)
 					{
 						return true;
@@ -605,16 +606,18 @@ class ChessRules
 	// Generic method for non-pawn pieces ("sliding or jumping"): is x,y attacked by piece != color ?
 	isAttackedBySlideNJump([x,y], colors, piece, steps, oneStep)
 	{
+		const [sizeX,sizeY] = VariantRules.size;
 		for (let step of steps)
 		{
 			let rx = x+step[0], ry = y+step[1];
-			while (rx>=0 && rx<8 && ry>=0 && ry<8 && this.board[rx][ry] == VariantRules.EMPTY
-				&& !oneStep)
+			while (rx>=0 && rx<sizeX && ry>=0 && ry<sizeY
+				&& this.board[rx][ry] == VariantRules.EMPTY && !oneStep)
 			{
 				rx += step[0];
 				ry += step[1];
 			}
-			if (rx>=0 && rx<8 && ry>=0 && ry<8 && this.board[rx][ry] != VariantRules.EMPTY
+			if (rx>=0 && rx<sizeX && ry>=0 && ry<sizeY
+				&& this.board[rx][ry] != VariantRules.EMPTY
 				&& this.getPiece(rx,ry) == piece && colors.includes(this.getColor(rx,ry)))
 			{
 				return true;
diff --git a/public/javascripts/components/game.js b/public/javascripts/components/game.js
index aaef522b..86f25210 100644
--- a/public/javascripts/components/game.js
+++ b/public/javascripts/components/game.js
@@ -17,6 +17,7 @@ Vue.component('my-game', {
 			incheck: [],
 			pgnTxt: "",
 			expert: document.cookie.length>0 ? document.cookie.substr(-1)=="1" : false,
+			gameId: "", //used to limit computer moves' time
 		};
 	},
 	render(h) {
@@ -585,7 +586,6 @@ Vue.component('my-game', {
 			this.newGame("computer");
 		},
 		newGame: function(mode, fenInit, color, oppId, moves, continuation) {
-			//const fen = "1n2T1n0/p2pO2p/1s1k1s2/8/3S2p1/2U2cO1/P3PuPP/3K1BR1 0100";
 			const fen = fenInit || VariantRules.GenRandInitFen();
 			console.log(fen); //DEBUG
 			this.score = "*";
@@ -614,6 +614,8 @@ Vue.component('my-game', {
 				}
 				return;
 			}
+			// random enough (TODO: function)
+			this.gameId = (Date.now().toString(36) + Math.random().toString(36).substr(2, 7)).toUpperCase();
 			this.vr = new VariantRules(fen, moves || []);
 			this.pgnTxt = ""; //redundant with this.score = "*", but cleaner
 			this.mode = mode;
@@ -654,8 +656,11 @@ Vue.component('my-game', {
 		playComputerMove: function() {
 			const timeStart = Date.now();
 			const nbMoves = this.vr.moves.length; //using played moves to know if search finished
+			const gameId = this.gameId; //to know if game was reset before timer end
 			setTimeout(
 				() => {
+					if (gameId != this.gameId)
+						return; //game stopped
 					const L = this.vr.moves.length;
 					if (nbMoves == L || !this.vr.moves[L-1].notation) //move search didn't finish
 						this.vr.shouldReturn = true;
diff --git a/public/javascripts/variants/Grand.js b/public/javascripts/variants/Grand.js
index db0543fc..8cdf6d7d 100644
--- a/public/javascripts/variants/Grand.js
+++ b/public/javascripts/variants/Grand.js
@@ -191,7 +191,6 @@ class GrandRules extends ChessRules
 		if (move.vanish.length==2 && move.appear.length==1
 			&& move.vanish[1].p != VariantRules.PAWN)
 		{
-			// Capture: update this.captures
 			this.captures[move.vanish[1].c][move.vanish[1].p] =
 				Math.max(0, this.captures[move.vanish[1].c][move.vanish[1].p]-1);
 		}
diff --git a/public/javascripts/variants/Wildebeest.js b/public/javascripts/variants/Wildebeest.js
index 2ecc01be..f198eeb0 100644
--- a/public/javascripts/variants/Wildebeest.js
+++ b/public/javascripts/variants/Wildebeest.js
@@ -165,6 +165,8 @@ class WildebeestRules extends ChessRules
 			V.steps[V.KNIGHT].concat(V.steps[V.CAMEL]));
 	}
 
+	// TODO: stalemate is a win (?!)
+
 	static get VALUES() {
 		return Object.assign(
 			ChessRules.VALUES,
-- 
2.44.0