(function() { var geometry = Model.Game.cbBoardGeometryGrid(5,5); Model.Game.cbDefine = function() { return { geometry: geometry, pieceTypes: { 0: { name: 'pawn-w', aspect: 'pawn', graph: this.cbPawnGraph(geometry,1), value: 1, abbrev: '', fenAbbrev: 'P', epCatch: true, }, 1: { name: 'ipawn-w', aspect: 'pawn', graph: this.cbInitialPawnGraph(geometry,1), value: 1, abbrev: '', fenAbbrev: 'P', initial: [{s:1,p:5},{s:1,p:6},{s:1,p:7},{s:1,p:8},{s:1,p:9}], epCatch: true, epTarget: true, }, 2: { name: 'pawn-b', aspect: 'pawn', graph: this.cbPawnGraph(geometry,-1), value: 1, abbrev: '', fenAbbrev: 'P', epCatch: true, }, 3: { name: 'ipawn-b', aspect: 'pawn', graph: this.cbInitialPawnGraph(geometry,-1), value: 1, abbrev: '', fenAbbrev: 'P', initial: [{s:-1,p:15},{s:-1,p:16},{s:-1,p:17},{s:-1,p:18},{s:-1,p:19}], epCatch: true, epTarget: true, }, 4: { name: 'knight', graph: this.cbKnightGraph(geometry), value: 2.9, abbrev: 'N', initial: [{s:1,p:1},{s:1,p:4}], }, 5: { name: 'bishop', graph: this.cbBishopGraph(geometry), value: 3.1, abbrev: 'B', initial: [{s:-1,p:21},{s:-1,p:24}], }, 6: { name: 'rook', graph: this.cbRookGraph(geometry), value: 5, abbrev: 'R', initial: [{s:1,p:0},{s:-1,p:20}], castle: true, }, 7: { name: 'queen', graph: this.cbQueenGraph(geometry), value: 9, abbrev: 'Q', initial: [{s:1,p:3},{s:-1,p:23}], }, 8: { name: 'king', isKing: true, graph: this.cbKingGraph(geometry), abbrev: 'K', initial: [{s:1,p:2},{s:-1,p:22}], }, }, promote: function(aGame,piece,move) { if(piece.t==1) return [0]; else if(piece.t==3) return [2]; else if(piece.t==0 && geometry.R(move.t)==4) return [4,5,6,7]; else if(piece.t==2 && geometry.R(move.t)==0) return [4,5,6,7]; return []; }, castle: { "2/0": {k:[1],r:[1,2],n:"O-O"}, "22/20": {k:[21],r:[21,22],n:"O-O"}, }, evaluate: function(aGame,evalValues,material) { // check lack of material to checkmate var white=material[1].count; var black=material[-1].count; if(!white[0] && !white[1] && !white[4] && !white[5] && !white[6] && !white[7]) { // white king single if(!black[2] && !black[3] && !black[6] && !black[7] && (black[4]+black[5]<2 || black[5]<2)) { this.mFinished=true; this.mWinner=JocGame.DRAW; } } if(!black[2] && !black[3] && !black[4] && !black[5] && !black[6] && !black[7]) { // black king single if(!white[0] && !white[1] && !white[6] && !white[7] && (white[4]+white[5]<2 || white[5]<2)) { this.mFinished=true; this.mWinner=JocGame.DRAW; } } // check 50 moves without capture if(this.noCaptCount>=100) { this.mFinished=true; this.mWinner=JocGame.DRAW; } // motivate pawns to reach the promotion line var distPromo=aGame.cbUseTypedArrays?new Int8Array(3):[0,0,0]; var height=geometry.height; var pawns=material[1].byType[0],pawnsLength; if(pawns) { pawnsLength=pawns.length; for(var i=0;i=-1;s-=2) { var pieces=material[s].byType[t]; if(pieces) for(var i=0;i