projects
/
vchess.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Fix SuctionChess, draft HiddenRules (unfinished)
[vchess.git]
/
client
/
src
/
base_rules.js
diff --git
a/client/src/base_rules.js
b/client/src/base_rules.js
index
42d9bdc
..
7949d7f
100644
(file)
--- a/
client/src/base_rules.js
+++ b/
client/src/base_rules.js
@@
-32,17
+32,25
@@
export const ChessRules = class ChessRules {
//////////////
// MISC UTILS
//////////////
// MISC UTILS
+ // Some variants don't have flags:
static get HasFlags() {
return true;
static get HasFlags() {
return true;
- }
//some variants don't have flags
+ }
+ // Some variants don't have en-passant
static get HasEnpassant() {
return true;
static get HasEnpassant() {
return true;
- }
//some variants don't have ep.
+ }
- // Path to pieces
- static getPpath(b) {
- return b; //usual pieces in pieces/ folder
+ // Some variants cannot have analyse mode
+ static get CanAnalyze() {
+ return true;
+ }
+
+ // Some variants show incomplete information,
+ // and thus show only a partial moves list or no list at all.
+ static get ShowMoves() {
+ return "all";
}
// Turn "wb" into "B" (for FEN)
}
// Turn "wb" into "B" (for FEN)
@@
-83,9
+91,12
@@
export const ChessRules = class ChessRules {
if (position.length == 0) return false;
const rows = position.split("/");
if (rows.length != V.size.x) return false;
if (position.length == 0) return false;
const rows = position.split("/");
if (rows.length != V.size.x) return false;
+ let kings = {};
for (let row of rows) {
let sumElts = 0;
for (let i = 0; i < row.length; i++) {
for (let row of rows) {
let sumElts = 0;
for (let i = 0; i < row.length; i++) {
+ if (['K','k'].includes(row[i]))
+ kings[row[i]] = true;
if (V.PIECES.includes(row[i].toLowerCase())) sumElts++;
else {
const num = parseInt(row[i]);
if (V.PIECES.includes(row[i].toLowerCase())) sumElts++;
else {
const num = parseInt(row[i]);
@@
-95,6
+106,9
@@
export const ChessRules = class ChessRules {
}
if (sumElts != V.size.y) return false;
}
}
if (sumElts != V.size.y) return false;
}
+ // Both kings should be on board:
+ if (Object.keys(kings).length != 2)
+ return false;
return true;
}
return true;
}
@@
-141,6
+155,11
@@
export const ChessRules = class ChessRules {
return V.CoordToColumn(coords.y) + (V.size.x - coords.x);
}
return V.CoordToColumn(coords.y) + (V.size.x - coords.x);
}
+ // Path to pieces
+ getPpath(b) {
+ return b; //usual pieces in pieces/ folder
+ }
+
// Aggregates flags into one object
aggregateFlags() {
return this.castleFlags;
// Aggregates flags into one object
aggregateFlags() {
return this.castleFlags;
@@
-360,7
+379,9
@@
export const ChessRules = class ChessRules {
// INITIALIZATION
constructor(fen) {
// INITIALIZATION
constructor(fen) {
- this.re_init(fen);
+ // In printDiagram() fen isn't supply because only getPpath() is used
+ if (fen)
+ this.re_init(fen);
}
// Fen string fully describes the game state
}
// Fen string fully describes the game state
@@
-416,7
+437,7
@@
export const ChessRules = class ChessRules {
if (V.HasEnpassant) {
const epSq =
parsedFen.enpassant != "-"
if (V.HasEnpassant) {
const epSq =
parsedFen.enpassant != "-"
- ?
V.SquareToCoords
(parsedFen.enpassant)
+ ?
this.getEpSquare
(parsedFen.enpassant)
: undefined;
this.epSquares = [epSq];
}
: undefined;
this.epSquares = [epSq];
}
@@
-703,10
+724,11
@@
export const ChessRules = class ChessRules {
const oppCol = V.GetOppCol(c);
let moves = [];
let i = 0;
const oppCol = V.GetOppCol(c);
let moves = [];
let i = 0;
+ // King, then rook:
const finalSquares = [
[2, 3],
[V.size.y - 2, V.size.y - 3]
const finalSquares = [
[2, 3],
[V.size.y - 2, V.size.y - 3]
- ];
//king, then rook
+ ];
castlingCheck: for (
let castleSide = 0;
castleSide < 2;
castlingCheck: for (
let castleSide = 0;
castleSide < 2;
@@
-948,6
+970,8
@@
export const ChessRules = class ChessRules {
// After move is played, update variables + flags
updateVariables(move) {
let piece = undefined;
// After move is played, update variables + flags
updateVariables(move) {
let piece = undefined;
+ // TODO: update variables before move is played, and just use this.turn ?
+ // (doesn't work in general, think MarseilleChess)
let c = undefined;
if (move.vanish.length >= 1) {
// Usual case, something is moved
let c = undefined;
if (move.vanish.length >= 1) {
// Usual case, something is moved
@@
-958,9
+982,8
@@
export const ChessRules = class ChessRules {
piece = move.appear[0].p;
c = move.appear[0].c;
}
piece = move.appear[0].p;
c = move.appear[0].c;
}
- if (c == "c") {
- //if (!["w","b"].includes(c))
- // 'c = move.vanish[0].c' doesn't work for Checkered
+ if (!['w','b'].includes(c)) {
+ // Checkered, for example
c = V.GetOppCol(this.turn);
}
const firstRank = c == "w" ? V.size.x - 1 : 0;
c = V.GetOppCol(this.turn);
}
const firstRank = c == "w" ? V.size.x - 1 : 0;
@@
-1003,9
+1026,9
@@
export const ChessRules = class ChessRules {
play(move) {
// DEBUG:
play(move) {
// DEBUG:
-
// if (!this.states) this.states = [];
-
// const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen();
-
// this.states.push(stateFen);
+// if (!this.states) this.states = [];
+// const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen();
+// this.states.push(stateFen);
if (V.HasFlags) move.flags = JSON.stringify(this.aggregateFlags()); //save flags (for undo)
if (V.HasEnpassant) this.epSquares.push(this.getEpSquare(move));
if (V.HasFlags) move.flags = JSON.stringify(this.aggregateFlags()); //save flags (for undo)
if (V.HasEnpassant) this.epSquares.push(this.getEpSquare(move));
@@
-1024,9
+1047,9
@@
export const ChessRules = class ChessRules {
this.unupdateVariables(move);
// DEBUG:
this.unupdateVariables(move);
// DEBUG:
-
// const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen();
-
// if (stateFen != this.states[this.states.length-1]) debugger;
-
// this.states.pop();
+// const stateFen = this.getBaseFen() + this.getTurnFen() + this.getFlagsFen();
+// if (stateFen != this.states[this.states.length-1]) debugger;
+// this.states.pop();
}
///////////////
}
///////////////
@@
-1035,7
+1058,6
@@
export const ChessRules = class ChessRules {
// What is the score ? (Interesting if game is over)
getCurrentScore() {
if (this.atLeastOneMove())
// What is the score ? (Interesting if game is over)
getCurrentScore() {
if (this.atLeastOneMove())
- // game not over
return "*";
// Game over
return "*";
// Game over
@@
-1246,10
+1268,10
@@
export const ChessRules = class ChessRules {
// Capture
const startColumn = V.CoordToColumn(move.start.y);
notation = startColumn + "x" + finalSquare;
// Capture
const startColumn = V.CoordToColumn(move.start.y);
notation = startColumn + "x" + finalSquare;
- }
//no capture
+ }
else notation = finalSquare;
if (move.appear.length > 0 && move.appear[0].p != V.PAWN)
else notation = finalSquare;
if (move.appear.length > 0 && move.appear[0].p != V.PAWN)
- //
p
romotion
+ //
P
romotion
notation += "=" + move.appear[0].p.toUpperCase();
return notation;
}
notation += "=" + move.appear[0].p.toUpperCase();
return notation;
}