1
0
forked from sent/waves
waves-fork/public/assets/g/chess/other-implementations/example3/js/makemove.js
2025-04-09 17:11:14 -05:00

284 lines
4.7 KiB
JavaScript

function ClearPiece(sq) {
var pce = GameBoard.pieces[sq];
var col = PieceCol[pce];
var index;
var t_pceNum = -1;
HASH_PCE(pce, sq);
GameBoard.pieces[sq] = PIECES.EMPTY;
GameBoard.material[col] -= PieceVal[pce];
for(index = 0; index < GameBoard.pceNum[pce]; ++index) {
if(GameBoard.pList[PCEINDEX(pce,index)] == sq) {
t_pceNum = index;
break;
}
}
GameBoard.pceNum[pce]--;
GameBoard.pList[PCEINDEX(pce, t_pceNum)] = GameBoard.pList[PCEINDEX(pce, GameBoard.pceNum[pce])];
}
function AddPiece(sq, pce) {
var col = PieceCol[pce];
HASH_PCE(pce, sq);
GameBoard.pieces[sq] = pce;
GameBoard.material[col] += PieceVal[pce];
GameBoard.pList[PCEINDEX(pce, GameBoard.pceNum[pce])] = sq;
GameBoard.pceNum[pce]++;
}
function MovePiece(from, to) {
var index = 0;
var pce = GameBoard.pieces[from];
HASH_PCE(pce, from);
GameBoard.pieces[from] = PIECES.EMPTY;
HASH_PCE(pce,to);
GameBoard.pieces[to] = pce;
for(index = 0; index < GameBoard.pceNum[pce]; ++index) {
if(GameBoard.pList[PCEINDEX(pce,index)] == from) {
GameBoard.pList[PCEINDEX(pce,index)] = to;
break;
}
}
}
function MakeMove(move) {
var from = FROMSQ(move);
var to = TOSQ(move);
var side = GameBoard.side;
GameBoard.history[GameBoard.hisPly].posKey = GameBoard.posKey;
if( (move & MFLAGEP) != 0) {
if(side == COLOURS.WHITE) {
ClearPiece(to-10);
} else {
ClearPiece(to+10);
}
} else if( (move & MFLAGCA) != 0) {
switch(to) {
case SQUARES.C1:
MovePiece(SQUARES.A1, SQUARES.D1);
break;
case SQUARES.C8:
MovePiece(SQUARES.A8, SQUARES.D8);
break;
case SQUARES.G1:
MovePiece(SQUARES.H1, SQUARES.F1);
break;
case SQUARES.G8:
MovePiece(SQUARES.H8, SQUARES.F8);
break;
default: break;
}
}
if(GameBoard.enPas != SQUARES.NO_SQ) HASH_EP();
HASH_CA();
GameBoard.history[GameBoard.hisPly].move = move;
GameBoard.history[GameBoard.hisPly].fiftyMove = GameBoard.fiftyMove;
GameBoard.history[GameBoard.hisPly].enPas = GameBoard.enPas;
GameBoard.history[GameBoard.hisPly].castlePerm = GameBoard.castlePerm;
GameBoard.castlePerm &= CastlePerm[from];
GameBoard.castlePerm &= CastlePerm[to];
GameBoard.enPas = SQUARES.NO_SQ;
HASH_CA();
var captured = CAPTURED(move);
GameBoard.fiftyMove++;
if(captured != PIECES.EMPTY) {
ClearPiece(to);
GameBoard.fiftyMove = 0;
}
GameBoard.hisPly++;
GameBoard.ply++;
if(PiecePawn[GameBoard.pieces[from]] == BOOL.TRUE) {
GameBoard.fiftyMove = 0;
if( (move & MFLAGPS) != 0) {
if(side==COLOURS.WHITE) {
GameBoard.enPas=from+10;
} else {
GameBoard.enPas=from-10;
}
HASH_EP();
}
}
MovePiece(from, to);
var prPce = PROMOTED(move);
if(prPce != PIECES.EMPTY) {
ClearPiece(to);
AddPiece(to, prPce);
}
GameBoard.side ^= 1;
HASH_SIDE();
if(SqAttacked(GameBoard.pList[PCEINDEX(Kings[side],0)], GameBoard.side)) {
TakeMove();
return BOOL.FALSE;
}
return BOOL.TRUE;
}
function TakeMove() {
GameBoard.hisPly--;
GameBoard.ply--;
var move = GameBoard.history[GameBoard.hisPly].move;
var from = FROMSQ(move);
var to = TOSQ(move);
if(GameBoard.enPas != SQUARES.NO_SQ) HASH_EP();
HASH_CA();
GameBoard.castlePerm = GameBoard.history[GameBoard.hisPly].castlePerm;
GameBoard.fiftyMove = GameBoard.history[GameBoard.hisPly].fiftyMove;
GameBoard.enPas = GameBoard.history[GameBoard.hisPly].enPas;
if(GameBoard.enPas != SQUARES.NO_SQ) HASH_EP();
HASH_CA();
GameBoard.side ^= 1;
HASH_SIDE();
if( (MFLAGEP & move) != 0) {
if(GameBoard.side == COLOURS.WHITE) {
AddPiece(to-10, PIECES.bP);
} else {
AddPiece(to+10, PIECES.wP);
}
} else if( (MFLAGCA & move) != 0) {
switch(to) {
case SQUARES.C1: MovePiece(SQUARES.D1, SQUARES.A1); break;
case SQUARES.C8: MovePiece(SQUARES.D8, SQUARES.A8); break;
case SQUARES.G1: MovePiece(SQUARES.F1, SQUARES.H1); break;
case SQUARES.G8: MovePiece(SQUARES.F8, SQUARES.H8); break;
default: break;
}
}
MovePiece(to, from);
var captured = CAPTURED(move);
if(captured != PIECES.EMPTY) {
AddPiece(to, captured);
}
if(PROMOTED(move) != PIECES.EMPTY) {
ClearPiece(from);
AddPiece(from, (PieceCol[PROMOTED(move)] == COLOURS.WHITE ? PIECES.wP : PIECES.bP));
}
}