Skip to content

Commit a47a7e0

Browse files
committed
check drop is valid before drawing piece
1 parent 0f64aaf commit a47a7e0

File tree

4 files changed

+16
-6
lines changed

4 files changed

+16
-6
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "chessground",
3-
"version": "7.11.1-pstrat2.43",
3+
"version": "7.11.1-pstrat2.44",
44
"description": "playstrategy.org chess ui, forked from lichess.org",
55
"type": "commonjs",
66
"main": "chessground.js",

src/board.ts

+8-3
Original file line numberDiff line numberDiff line change
@@ -367,7 +367,7 @@ export function dropNewPiece(state: HeadlessState, orig: cg.Key, dest: cg.Key, f
367367
} else {
368368
unsetPremove(state);
369369
unsetPredrop(state);
370-
cancelDropMode(state);
370+
if (!state.onlyDropsVariant) cancelDropMode(state);
371371
}
372372
state.pieces.delete(orig);
373373
unselect(state);
@@ -467,9 +467,14 @@ function canDrop(state: HeadlessState, orig: cg.Key, dest: cg.Key): boolean {
467467
const piece = state.pieces.get(orig);
468468
return (
469469
!!piece &&
470-
(orig === dest || !state.pieces.has(dest)) &&
470+
(orig === dest || !state.pieces.has(dest) || state.variant === 'backgammon' || state.variant === 'nackgammon') &&
471471
(state.movable.playerIndex === 'both' ||
472-
(state.movable.playerIndex === piece.playerIndex && state.turnPlayerIndex === piece.playerIndex))
472+
(state.movable.playerIndex === piece.playerIndex && state.turnPlayerIndex === piece.playerIndex)) &&
473+
!!(
474+
state.dropmode.dropDests &&
475+
state.dropmode.dropDests.has(piece.role) &&
476+
state.dropmode.dropDests.get(piece.role)?.includes(dest)
477+
)
473478
);
474479
}
475480

src/drop.ts

+2-2
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ export function drop(s: State, e: cg.MouchEvent): void {
3838
dropFromPocket(s, piece.role);
3939
} else {
4040
const dest = position && board.getKeyAtDomPos(position, s.orientation, s.dom.bounds(), s.dimensions, s.variant);
41-
if (dest) board.dropNewPiece(s, 'a0', dest, s.variant === 'backgammon' || s.variant === 'nackgammon');
41+
if (dest) board.dropNewPiece(s, 'a0', dest);
4242
}
4343
}
4444
//stop processing event clicks, as click drops will trigger a screen click and select a piece.
@@ -59,5 +59,5 @@ function dropFromPocket(s: State, role: cg.Role): void {
5959
? activeDiceKey
6060
: s.dropmode.dropDests.get(role)![0]
6161
: false;
62-
if (dest) board.dropNewPiece(s, 'a0', dest, s.variant === 'backgammon' || s.variant === 'nackgammon');
62+
if (dest) board.dropNewPiece(s, 'a0', dest);
6363
}

src/predrop.ts

+5
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import * as cg from './types';
44
type DropMobility = (x: number, y: number) => boolean;
55

66
const wholeBoard = (_x: number, _y: number) => true;
7+
const noSquares = (_x: number, _y: number) => false;
78

89
/**
910
*
@@ -142,6 +143,10 @@ export default function predrop(
142143
mobility = emptysquares(pieces); // cant drop on current pieces (either side) as they cant move
143144
break;
144145

146+
case 'nackgammon':
147+
case 'backgammon':
148+
mobility = noSquares; // dont allow predrop for backgammon
149+
break;
145150
default:
146151
console.warn('Unknown drop variant', variant);
147152
}

0 commit comments

Comments
 (0)