forked from sent/waves
214 lines
6.3 KiB
JavaScript
214 lines
6.3 KiB
JavaScript
var PIECES = { EMPTY : 0, wP : 1, wN : 2, wB : 3,wR : 4, wQ : 5, wK : 6,
|
|
bP : 7, bN : 8, bB : 9, bR : 10, bQ : 11, bK : 12 };
|
|
|
|
var BRD_SQ_NUM = 120;
|
|
|
|
var FILES = { FILE_A:0, FILE_B:1, FILE_C:2, FILE_D:3,
|
|
FILE_E:4, FILE_F:5, FILE_G:6, FILE_H:7, FILE_NONE:8 };
|
|
|
|
var RANKS = { RANK_1:0, RANK_2:1, RANK_3:2, RANK_4:3,
|
|
RANK_5:4, RANK_6:5, RANK_7:6, RANK_8:7, RANK_NONE:8 };
|
|
|
|
var COLOURS = { WHITE:0, BLACK:1, BOTH:2 };
|
|
|
|
var CASTLEBIT = { WKCA : 1, WQCA : 2, BKCA : 4, BQCA : 8 };
|
|
|
|
var SQUARES = {
|
|
A1:21, B1:22, C1:23, D1:24, E1:25, F1:26, G1:27, H1:28,
|
|
A8:91, B8:92, C8:93, D8:94, E8:95, F8:96, G8:97, H8:98,
|
|
NO_SQ:99, OFFBOARD:100
|
|
};
|
|
|
|
var BOOL = { FALSE:0, TRUE:1 };
|
|
|
|
var MAXGAMEMOVES = 2048;
|
|
var MAXPOSITIONMOVES = 256;
|
|
var MAXDEPTH = 64;
|
|
var INFINITE = 30000;
|
|
var MATE = 29000;
|
|
var PVENTRIES = 10000;
|
|
|
|
var FilesBrd = new Array(BRD_SQ_NUM);
|
|
var RanksBrd = new Array(BRD_SQ_NUM);
|
|
|
|
var START_FEN = "rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1";
|
|
|
|
var PceChar = ".PNBRQKpnbrqk";
|
|
var SideChar = "wb-";
|
|
var RankChar = "12345678";
|
|
var FileChar = "abcdefgh";
|
|
|
|
function FR2SQ(f,r) {
|
|
return ( (21 + (f) ) + ( (r) * 10 ) );
|
|
}
|
|
|
|
var PieceBig = [ BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE ];
|
|
var PieceMaj = [ BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE ];
|
|
var PieceMin = [ BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE ];
|
|
var PieceVal= [ 0, 100, 325, 325, 550, 1000, 50000, 100, 325, 325, 550, 1000, 50000 ];
|
|
var PieceCol = [ COLOURS.BOTH, COLOURS.WHITE, COLOURS.WHITE, COLOURS.WHITE, COLOURS.WHITE, COLOURS.WHITE, COLOURS.WHITE,
|
|
COLOURS.BLACK, COLOURS.BLACK, COLOURS.BLACK, COLOURS.BLACK, COLOURS.BLACK, COLOURS.BLACK ];
|
|
|
|
var PiecePawn = [ BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE ];
|
|
var PieceKnight = [ BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE ];
|
|
var PieceKing = [ BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE ];
|
|
var PieceRookQueen = [ BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE ];
|
|
var PieceBishopQueen = [ BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE, BOOL.TRUE, BOOL.FALSE ];
|
|
var PieceSlides = [ BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE, BOOL.FALSE, BOOL.FALSE, BOOL.TRUE, BOOL.TRUE, BOOL.TRUE, BOOL.FALSE ];
|
|
|
|
var KnDir = [ -8, -19, -21, -12, 8, 19, 21, 12 ];
|
|
var RkDir = [ -1, -10, 1, 10 ];
|
|
var BiDir = [ -9, -11, 11, 9 ];
|
|
var KiDir = [ -1, -10, 1, 10, -9, -11, 11, 9 ];
|
|
|
|
var DirNum = [ 0, 0, 8, 4, 4, 8, 8, 0, 8, 4, 4, 8, 8 ];
|
|
var PceDir = [ 0, 0, KnDir, BiDir, RkDir, KiDir, KiDir, 0, KnDir, BiDir, RkDir, KiDir, KiDir ];
|
|
var LoopNonSlidePce = [ PIECES.wN, PIECES.wK, 0, PIECES.bN, PIECES.bK, 0 ];
|
|
var LoopNonSlideIndex = [ 0, 3 ];
|
|
var LoopSlidePce = [ PIECES.wB, PIECES.wR, PIECES.wQ, 0, PIECES.bB, PIECES.bR, PIECES.bQ, 0 ];
|
|
var LoopSlideIndex = [ 0, 4];
|
|
|
|
var PieceKeys = new Array(14 * 120);
|
|
var SideKey;
|
|
var CastleKeys = new Array(16);
|
|
|
|
var Sq120ToSq64 = new Array(BRD_SQ_NUM);
|
|
var Sq64ToSq120 = new Array(64);
|
|
|
|
function RAND_32() {
|
|
|
|
return (Math.floor((Math.random()*255)+1) << 23) | (Math.floor((Math.random()*255)+1) << 16)
|
|
| (Math.floor((Math.random()*255)+1) << 8) | Math.floor((Math.random()*255)+1);
|
|
|
|
}
|
|
|
|
var Mirror64 = [
|
|
56 , 57 , 58 , 59 , 60 , 61 , 62 , 63 ,
|
|
48 , 49 , 50 , 51 , 52 , 53 , 54 , 55 ,
|
|
40 , 41 , 42 , 43 , 44 , 45 , 46 , 47 ,
|
|
32 , 33 , 34 , 35 , 36 , 37 , 38 , 39 ,
|
|
24 , 25 , 26 , 27 , 28 , 29 , 30 , 31 ,
|
|
16 , 17 , 18 , 19 , 20 , 21 , 22 , 23 ,
|
|
8 , 9 , 10 , 11 , 12 , 13 , 14 , 15 ,
|
|
0 , 1 , 2 , 3 , 4 , 5 , 6 , 7
|
|
];
|
|
|
|
function SQ64(sq120) {
|
|
return Sq120ToSq64[(sq120)];
|
|
}
|
|
|
|
function SQ120(sq64) {
|
|
return Sq64ToSq120[(sq64)];
|
|
}
|
|
|
|
function PCEINDEX(pce, pceNum) {
|
|
return (pce * 10 + pceNum);
|
|
}
|
|
|
|
function MIRROR64(sq) {
|
|
return Mirror64[sq];
|
|
}
|
|
|
|
var Kings = [PIECES.wK, PIECES.bK];
|
|
var CastlePerm = [
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 13, 15, 15, 15, 12, 15, 15, 14, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 7, 15, 15, 15, 3, 15, 15, 11, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15,
|
|
15, 15, 15, 15, 15, 15, 15, 15, 15, 15
|
|
];
|
|
|
|
/*
|
|
0000 0000 0000 0000 0000 0111 1111 -> From 0x7F
|
|
0000 0000 0000 0011 1111 1000 0000 -> To >> 7, 0x7F
|
|
0000 0000 0011 1100 0000 0000 0000 -> Captured >> 14, 0xF
|
|
0000 0000 0100 0000 0000 0000 0000 -> EP 0x40000
|
|
0000 0000 1000 0000 0000 0000 0000 -> Pawn Start 0x80000
|
|
0000 1111 0000 0000 0000 0000 0000 -> Promoted Piece >> 20, 0xF
|
|
0001 0000 0000 0000 0000 0000 0000 -> Castle 0x1000000
|
|
*/
|
|
|
|
|
|
function FROMSQ(m) { return (m & 0x7F); }
|
|
function TOSQ(m) { return ( (m >> 7) & 0x7F); }
|
|
function CAPTURED(m) { return ( (m >> 14) & 0xF); }
|
|
function PROMOTED(m) { return ( (m >> 20) & 0xF); }
|
|
|
|
var MFLAGEP = 0x40000;
|
|
var MFLAGPS = 0x80000;
|
|
var MFLAGCA = 0x1000000;
|
|
|
|
var MFLAGCAP = 0x7C000;
|
|
var MFLAGPROM = 0xF00000;
|
|
|
|
var NOMOVE = 0;
|
|
|
|
function SQOFFBOARD(sq) {
|
|
if(FilesBrd[sq]==SQUARES.OFFBOARD) return BOOL.TRUE;
|
|
return BOOL.FALSE;
|
|
}
|
|
|
|
function HASH_PCE(pce, sq) {
|
|
GameBoard.posKey ^= PieceKeys[(pce * 120) + sq];
|
|
}
|
|
|
|
function HASH_CA() { GameBoard.posKey ^= CastleKeys[GameBoard.castlePerm]; }
|
|
function HASH_SIDE() { GameBoard.posKey ^= SideKey; }
|
|
function HASH_EP() { GameBoard.posKey ^= PieceKeys[GameBoard.enPas]; }
|
|
|
|
var GameController = {};
|
|
GameController.EngineSide = COLOURS.BOTH;
|
|
GameController.PlayerSide = COLOURS.BOTH;
|
|
GameController.GameOver = BOOL.FALSE;
|
|
|
|
var UserMove = {};
|
|
UserMove.from = SQUARES.NO_SQ;
|
|
UserMove.to = SQUARES.NO_SQ;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|