// On which squares is color under check ? (for interface)
getCheckSquares(color)
{
- return this.isAttacked(this.kingPos[color], [this.getOppCol(color)])
+ return this.isAttacked(this.kingPos[color], [V.GetOppCol(color)])
? [JSON.parse(JSON.stringify(this.kingPos[color]))] //need to duplicate!
: [];
}
return pieces["b"].join("") +
"/pppppppp/8/8/8/8/PPPPPPPP/" +
pieces["w"].join("").toUpperCase() +
- " w 1111 -"; //add turn + flags + enpassant
+ " w 0 1111 -"; //add turn + flags + enpassant
}
// "Parse" FEN: just return untransformed string data
return []; //x isn't first rank, or king has moved (shortcut)
// Castling ?
- const oppCol = this.getOppCol(c);
+ const oppCol = V.GetOppCol(c);
let moves = [];
let i = 0;
const finalSquares = [ [2,3], [V.size.y-2,V.size.y-3] ]; //king, then rook
getAllValidMoves()
{
const color = this.turn;
- const oppCol = this.getOppCol(color);
+ const oppCol = V.GetOppCol(color);
let potentialMoves = [];
for (let i=0; i<V.size.x; i++)
{
atLeastOneMove()
{
const color = this.turn;
- const oppCol = this.getOppCol(color);
+ const oppCol = V.GetOppCol(color);
for (let i=0; i<V.size.x; i++)
{
for (let j=0; j<V.size.y; j++)
// Is color under check after his move ?
underCheck(color)
{
- return this.isAttacked(this.kingPos[color], [this.getOppCol(color)]);
+ return this.isAttacked(this.kingPos[color], [V.GetOppCol(color)]);
}
/////////////////
if (c == "c") //if (!["w","b"].includes(c))
{
// 'c = move.vanish[0].c' doesn't work for Checkered
- c = this.getOppCol(this.turn);
+ c = V.GetOppCol(this.turn);
}
const firstRank = (c == "w" ? V.size.x-1 : 0);
if (V.HasFlags)
{
// Update castling flags if rooks are moved
- const oppCol = this.getOppCol(c);
+ const oppCol = V.GetOppCol(c);
const oppFirstRank = (V.size.x-1) - firstRank;
if (move.start.x == firstRank //our rook moves?
&& this.INIT_COL_ROOK[c].includes(move.start.y))
if (V.HasEnpassant)
this.epSquares.push( this.getEpSquare(move) );
V.PlayOnBoard(this.board, move);
- this.turn = this.getOppCol(this.turn);
+ this.turn = V.GetOppCol(this.turn);
this.movesCount++;
this.updateVariables(move);
}
if (V.HasFlags)
this.disaggregateFlags(JSON.parse(move.flags));
V.UndoOnBoard(this.board, move);
- this.turn = this.getOppCol(this.turn);
+ this.turn = V.GetOppCol(this.turn);
this.movesCount--;
this.unupdateVariables(move);
// Game over
const color = this.turn;
// No valid move: stalemate or checkmate?
- if (!this.isAttacked(this.kingPos[color], [this.getOppCol(color)]))
+ if (!this.isAttacked(this.kingPos[color], [V.GetOppCol(color)]))
return "1/2";
// OK, checkmate
return (color == "w" ? "0-1" : "1-0");
};
},
render(h) {
+ if (!this.vr)
+ return;
const [sizeX,sizeY] = [V.size.x,V.size.y];
// Precompute hints squares to facilitate rendering
let hintSquares = doubleArray(sizeX, sizeY, false);
// Also precompute in-check squares
let incheckSq = doubleArray(sizeX, sizeY, false);
this.incheck.forEach(sq => { incheckSq[sq[0]][sq[1]] = true; });
+ const squareWidth = 40; //TODO: compute this
const choices = h(
'div',
{
let cj = (this.orientation=='w' ? j : sizeY-j-1);
let elems = [];
if (this.vr.board[ci][cj] != V.EMPTY && (variant.name!="Dark"
- || this.gameOver || this.vr.enlightened[this.userColor][ci][cj]))
+ || this.gameOver || this.mode == "analyze"
+ || this.vr.enlightened[this.userColor][ci][cj]))
{
elems.push(
h(
'dark-square': (i+j)%2==1,
[this.bcolor]: true,
'in-shadow': variant.name=="Dark" && !this.gameOver
+ && this.mode != "analyze"
&& !this.vr.enlightened[this.userColor][ci][cj],
'highlight': showLight && !!lm && _.isMatch(lm.end, {x:ci,y:cj}),
'incheck': showLight && incheckSq[ci][cj],
new Vue({
el: "#VueElement",
data: {
- display: "room", //default: main hall
+ display: "undefined", //default to main hall; see "created()" function
gameid: "undefined", //...yet
+
+ // TEMPORARY: DEBUG
+ vr: null,
+ mode: "analyze",
+ orientation: "w",
+ userColor: "w",
+ gameOver: false,
},
created: function() {
// TODO: navigation becomes a little more complex
const url = window.location.href;
const hashPos = url.indexOf("#");
- if (hashPos >= 0)
- this.setDisplay(url.substr(hashPos+1));
+ const page = (hashPos >= 0 ? url.substr(hashPos+1) : "room");
+ this.setDisplay(page);
+
+ this.vr = new VariantRules( V.GenRandInitFen() );
},
methods: {
setDisplay: function(elt) {
if (!!menuToggle)
menuToggle.checked = false;
},
+
+ // TEMPORARY: DEBUG (duplicate code)
+ play: function(move) {
+ // Not programmatic, or animation is over
+ if (!move.notation)
+ move.notation = this.vr.getNotation(move);
+ this.vr.play(move);
+ if (!move.fen)
+ move.fen = this.vr.getFen();
+ if (this.sound == 2)
+ new Audio("/sounds/move.mp3").play().catch(err => {});
+ // Is opponent in check?
+ this.incheck = this.vr.getCheckSquares(this.vr.turn);
+ const score = this.vr.getCurrentScore();
+ },
+ undo: function(move) {
+ this.vr.undo(move);
+ if (this.sound == 2)
+ new Audio("/sounds/undo.mp3").play().catch(err => {});
+ this.incheck = this.vr.getCheckSquares(this.vr.turn);
+ },
},
});
.row
//my-room(v-show="display=='room'")
//my-game-list(v-show="display=='gameList'")
- my-rules(v-show="display=='rules'")
- my-problems(v-show="display=='problems'")
+ //my-rules(v-show="display=='rules'")
+ //my-problems(v-show="display=='problems'")
//my-game(v-show="display=='game'" :gameId="gameid")
+ my-board(:vr="vr" :mode="mode" :orientation="orientation"
+ :user-color="userColor" :game-over="gameOver"
+ v-on:play-move="play")
block javascripts
script(src="/javascripts/utils/array.js")
const variant = !{JSON.stringify(variant)};
//script(src="/javascripts/components/room.js")
//script(src="/javascripts/components/gameList.js")
- script(src="/javascripts/components/rules.js")
- script(src="/javascripts/components/problemPreview.js")
- script(src="/javascripts/components/problems.js")
+ //script(src="/javascripts/components/rules.js")
+ script(src="/javascripts/components/board.js")
+ //script(src="/javascripts/components/problemPreview.js")
+ //script(src="/javascripts/components/problems.js")
//script(src="/javascripts/components/game.js")
script(src="/javascripts/variant.js")