incheck: [],
pgnTxt: "",
hints: (!localStorage["hints"] ? true : localStorage["hints"] === "1"),
- color: localStorage["color"] || "lichess", //lichess, chesscom or chesstempo
+ bcolor: localStorage["bcolor"] || "lichess", //lichess, chesscom or chesstempo
// sound level: 0 = no sound, 1 = sound only on newgame, 2 = always
sound: parseInt(localStorage["sound"] || "2"),
// Web worker to play computer moves without freezing interface:
},
[h('i', { 'class': { "material-icons": true } }, "accessibility")])
);
- if (["idle","chat","computer"].includes(this.mode))
+ if (variant!="Dark" && ["idle","chat","computer"].includes(this.mode))
{
actionArray.push(
h('button',
[h('i', { 'class': { "material-icons": true } }, "computer")])
);
}
- if (["idle","chat","friend"].includes(this.mode))
+ if (variant!="Dark" && ["idle","chat","friend"].includes(this.mode))
{
actionArray.push(
h('button',
);
// Create board element (+ reserves if needed by variant or mode)
const lm = this.vr.lastMove;
- const showLight = this.hints &&
+ const showLight = this.hints && variant!="Dark" &&
(!["idle","chat"].includes(this.mode) || this.cursor==this.vr.moves.length);
const gameDiv = h('div',
{
_.range(sizeY).map(j => {
let cj = (this.mycolor=='w' ? j : sizeY-j-1);
let elems = [];
- if (this.vr.board[ci][cj] != VariantRules.EMPTY)
+ if (this.vr.board[ci][cj] != VariantRules.EMPTY && (variant!="Dark"
+ || this.score!="*" || this.vr.enlightened[this.mycolor][ci][cj]))
{
elems.push(
h(
['board'+sizeY]: true,
'light-square': (i+j)%2==0,
'dark-square': (i+j)%2==1,
- [this.color]: true,
+ [this.bcolor]: true,
+ 'in-shadow': variant=="Dark" && this.score=="*"
+ && !this.vr.enlightened[this.mycolor][ci][cj],
'highlight': showLight && !!lm && _.isMatch(lm.end, {x:ci,y:cj}),
'incheck': showLight && incheckSq[ci][cj],
},
h('button',
{
on: { click: () => { this.mycolor = this.vr.getOppCol(this.mycolor) } },
- attrs: { "aria-label": translations['Flip'] },
+ attrs: { "aria-label": translations['Flip board'] },
"class": {
"play": true,
"spaceleft": true,
{
attrs: { "id": "titleFenedit" },
"class": { "section": true },
- domProps: { innerHTML: translations["Position + flags (FEN):"] },
+ domProps: { innerHTML: translations["Game state (FEN):"] },
}
),
h('input',
h("select",
{
attrs: { "id": "selectColor" },
- on: { "change": this.setColor },
+ on: { "change": this.setBoardColor },
},
[
h("option",
)
);
}
- // Show current FEN
- elementArray.push(
- h('div',
- {
- attrs: { id: "fen-div" },
- "class": { "section-content": true },
- },
- [
- h('p',
- {
- attrs: { id: "fen-string" },
- domProps: { innerHTML: this.vr.getBaseFen() },
- "class": { "text-center": true },
- }
- )
- ]
- )
- );
+ if (variant != "Dark" || this.score!="*")
+ {
+ // Show current FEN
+ elementArray.push(
+ h('div',
+ {
+ attrs: { id: "fen-div" },
+ "class": { "section-content": true },
+ },
+ [
+ h('p',
+ {
+ attrs: { id: "fen-string" },
+ domProps: { innerHTML: this.vr.getBaseFen() },
+ "class": { "text-center": true },
+ }
+ )
+ ]
+ )
+ );
+ }
}
return h(
'div',
this.newGame("human", data.fen, data.color, data.oppid);
break;
case "newmove": //..he played!
- this.play(data.move, "animate");
+ this.play(data.move, (variant!="Dark" ? "animate" : null));
break;
case "pong": //received if we sent a ping (game still alive on our side)
if (this.gameId != data.gameId)
this.hints = !this.hints;
localStorage["hints"] = (this.hints ? "1" : "0");
},
- setColor: function(e) {
- this.color = e.target.options[e.target.selectedIndex].value;
- localStorage["color"] = this.color;
+ setBoardColor: function(e) {
+ this.bcolor = e.target.options[e.target.selectedIndex].value;
+ localStorage["bcolor"] = this.bcolor;
},
setSound: function(e) {
this.sound = parseInt(e.target.options[e.target.selectedIndex].value);
this.endGame(this.mycolor=="w"?"0-1":"1-0");
},
newGame: function(mode, fenInit, color, oppId) {
- let fen = fenInit || VariantRules.GenRandInitFen();
+ const fen = fenInit || VariantRules.GenRandInitFen();
console.log(fen); //DEBUG
if (mode=="human" && !oppId)
{
if (this.mycolor != this.vr.turn)
this.playComputerMove();
}
- //else: against a (IRL) friend or problem solving: nothing more to do
+ else if (mode == "friend")
+ this.mycolor = "w"; //convention...
+ //else: problem solving: nothing more to do
},
continueGame: function(mode) {
this.mode = mode;
const score = localStorage.getItem(prefix+"score"); //set in "endGame()"
this.fenStart = localStorage.getItem(prefix+"fenStart");
this.vr = new VariantRules(fen, moves);
+ this.incheck = this.vr.getCheckSquares(this.vr.turn);
if (mode == "human")
{
this.gameId = localStorage.getItem("gameId");
if (this.mycolor != this.vr.turn)
this.playComputerMove();
}
- if (moves.length > 0)
- {
- const lastMove = moves[moves.length-1];
- this.vr.undo(lastMove);
- this.incheck = this.vr.getCheckSquares(lastMove);
- this.vr.play(lastMove, "ingame");
- }
if (score != "*")
{
// Small delay required when continuation run faster than drawing page
if (this.vr.canIplay(color,startSquare))
this.possibleMoves = this.vr.getPossibleMovesFrom(startSquare);
}
+ console.log(this.possibleMoves);
// Next line add moving piece just after current image
// (required for Crazyhouse reserve)
e.target.parentNode.insertBefore(this.selectedPiece, e.target.nextSibling);
// TODO: robustify this...
if (this.mode == "human" && !!move.computer)
return;
- this.incheck = this.vr.getCheckSquares(move); //is opponent in check?
this.vr.play(move, "ingame");
+ // Is opponent in check?
+ this.incheck = this.vr.getCheckSquares(this.vr.turn);
if (this.sound == 2)
new Audio("/sounds/move.mp3").play().catch(err => {});
if (this.mode == "computer")
this.vr.undo(lm);
if (this.sound == 2)
new Audio("/sounds/undo.mp3").play().catch(err => {});
- const lmBefore = this.vr.lastMove;
- if (!!lmBefore)
- {
- this.vr.undo(lmBefore);
- this.incheck = this.vr.getCheckSquares(lmBefore);
- this.vr.play(lmBefore, "ingame");
- }
- else
- this.incheck = [];
+ this.incheck = this.vr.getCheckSquares(this.vr.turn);
}
},
},