UNPKG

jocly

Version:

Board games 3D/2D UI and AI web library

1 lines 26 kB
exports.model=Model={Game:{},Board:{},Move:{}},function(){var t;Model.Game.cbConstants={MASK:65535,FLAG_MOVE:65536,FLAG_CAPTURE:131072,FLAG_STOP:262144,FLAG_SCREEN_CAPTURE:524288,FLAG_CAPTURE_KING:1048576,FLAG_CAPTURE_NO_KING:2097152};var e="undefined"!=typeof Int32Array;Model.Game.cbUseTypedArrays=e,Model.Game.cbTypedArray=function(t){if(e){var i=new Int32Array(t.length);return i.set(t),i}for(var r=[],a=t.length,n=0;n<a;n++)r.push(t[n]);return r},Model.Game.cbShortRangeGraph=function(t,e,i,r){var a=this;void 0===r&&(r=196608);for(var n={},s=0;s<t.boardSize;s++)n[s]=[],(!i||s in i)&&e.forEach(function(e){var o=t.Graph(s,e);null!=o&&(!i||o in i)&&n[s].push(a.cbTypedArray([o|r]))});return n},Model.Game.cbLongRangeGraph=function(t,e,i,r,a){var n=this;void 0!==r&&null!=r||(r=196608),a||(a=1/0);for(var s={},o=0;o<t.boardSize;o++)s[o]=[],(!i||o in i)&&e.forEach(function(e){for(var h=[],c=t.Graph(o,e),p=0;null!=c&&(!i||c in i)&&(h.push(c|r),++p!=a);)c=t.Graph(c,e);h.length>0&&s[o].push(n.cbTypedArray(h))});return s},Model.Game.cbNullGraph=function(t){for(var e={},i=0;i<t.boardSize;i++)e[i]=[];return e},Model.Game.cbAuthorGraph=function(t){for(var e={},i=0;i<t.boardSize;i++){e[i]=[];for(var r=0;r<t.boardSize;r++)e[i].push([2293760|r])}return e},Model.Game.cbMergeGraphs=function(t){for(var e=[],i=0;i<t.boardSize;i++){e[i]=[];for(var r=1;r<arguments.length;r++)e[i]=e[i].concat(arguments[r][i])}return e},Model.Game.cbGetThreatGraph=function(){function t(e,i){for(var r in s){var a=s[r];if(!(a.p.length<i.length+1)){for(var n=!0,o=0;o<i.length;o++)if(i[o]!=a.p[o]){n=!1;break}if(n){var h=a.p[i.length],c=e[h];void 0===c&&(c={e:{}},e[h]=c),a.p.length==i.length+1&&(c.t=a.t,c.ts=a.ts,c.tk=a.tk,delete s[r]),i.push(h),t(c.e,i),i.pop()}}}}var e=this;this.cbUseScreenCapture=!1,this.cbUseCaptureKing=!1,this.cbUseCaptureNoKing=!1;for(var i={1:[],"-1":[]},r=[],a=0;a<this.g.boardSize;a++)this.g.pTypes.forEach(function(t,i){t.graph[a].forEach(function(t){for(var n=[],s=0;s<t.length;s++){var o=t[s];1048576&o?(e.cbUseCaptureKing=!0,n.unshift({d:65535&o,a:a,tk:i})):2097152&o?(e.cbUseCaptureNoKing=!0,n.unshift({d:65535&o,a:a,tnk:i})):131072&o?n.unshift({d:65535&o,a:a,t:i}):262144&o?n.unshift({d:65535&o,a:a}):524288&o&&(e.cbUseScreenCapture=!0,n.unshift({d:65535&o,a:a,ts:i}))}n.length>0&&r.push(n)})});var n={};r.forEach(function(t){t.forEach(function(e,i){var r=n[e.d];void 0===r&&(r={},n[e.d]=r);for(var a=[],s=i+1;s<t.length;s++)a.push(t[s].d);a.push(e.a);var o=a.join(","),h=r[o];void 0===h&&(h={p:a,t:{},ts:{},tk:{}},r[o]=h),void 0!==e.t?h.t[e.t]=!0:void 0!==e.tk?h.tk[e.tk]=!0:void 0!==e.ts&&(h.ts[e.ts]=!0)})});for(var a=0;a<e.g.boardSize;a++){var s=n[a],o={};t(o,[]),i[1][a]=o,i[-1][a]=o}return i},Model.Game.InitGame=function(){var e=this;this.cbVar=t=this.cbDefine(),this.g.boardSize=this.cbVar.geometry.boardSize,this.g.pTypes=this.cbGetPieceTypes(),this.g.threatGraph=this.cbGetThreatGraph(),this.g.distGraph=this.cbVar.geometry.GetDistances(),this.cbPiecesCount=0,this.g.castleablePiecesCount={1:0,"-1":0};for(var i in t.pieceTypes){var r=t.pieceTypes[i];if(r.castle){(r.initial||[]).forEach(function(t){e.g.castleablePiecesCount[t.s]++})}r.initial&&(this.cbPiecesCount+=r.initial.length)}for(var a=[],i=0;i<this.cbPiecesCount;i++)a.push(i);var n=Object.keys(t.pieceTypes);this.zobrist=new JocGame.Zobrist({board:{type:"array",size:this.cbVar.geometry.boardSize,values:a},who:{values:["1","-1"]},type:{type:"array",size:this.cbPiecesCount,values:n}})},Model.Game.cbGetPieceTypes=function(){for(var t=[],e={},i=0;i<this.cbVar.geometry.boardSize;i++)e[i]=[];for(var r in this.cbVar.pieceTypes){var a=this.cbVar.pieceTypes[r];t[r]={graph:a.graph||e,abbrev:a.abbrev||"",value:a.isKing?100:a.value||1,isKing:!!a.isKing,castle:!!a.castle,epTarget:!!a.epTarget,epCatch:!!a.epCatch}}return t},Model.Board.Init=function(t){this.zSign=0},Model.Board.InitialPosition=function(i){var r=this;this.board=e?new Int16Array(i.g.boardSize):[];for(var a=0;a<i.g.boardSize;a++)this.board[a]=-1;if(this.kings={},this.pieces=[],this.ending={1:!1,"-1":!1},this.lastMove=null,i.cbVar.castle&&(this.castled={1:!1,"-1":!1}),this.zSign=i.zobrist.update(0,"who",-1),this.noCaptCount=0,this.mWho=1,i.mInitial)this.mWho=i.mInitial.turn||1,i.mInitial.pieces.forEach(function(t){var e={};for(var i in t)t.hasOwnProperty(i)&&(e[i]=t[i]);r.pieces.push(e)}),i.mInitial.lastMove&&(this.lastMove={f:i.mInitial.lastMove.f,t:i.mInitial.lastMove.t}),void 0!==i.mInitial.noCaptCount&&(this.noCaptCount=i.mInitial.noCaptCount),i.cbVar.castle&&i.mInitial.castle&&(this.castled={1:{k:!!i.mInitial.castle[1]&&!!i.mInitial.castle[1].k,q:!!i.mInitial.castle[1]&&!!i.mInitial.castle[1].q},"-1":{k:!!i.mInitial.castle[-1]&&!!i.mInitial.castle[-1].k,q:!!i.mInitial.castle[-1]&&!!i.mInitial.castle[-1].q}});else for(var n in i.cbVar.pieceTypes)for(var s=i.cbVar.pieceTypes[n],o=s.initial||[],h=0;h<o.length;h++){var c=o[h],p={s:c.s,t:parseInt(n),p:c.p,m:!1};this.pieces.push(p)}if(this.pieces.sort(function(t,e){if(t.s!=e.s)return e.s-t.s;var r=i.cbVar.pieceTypes[t.t].value||100,a=i.cbVar.pieceTypes[e.t].value||100;return r!=a?r-a:t.p-e.p}),this.pieces.forEach(function(t,e){t.i=e,r.board[t.p]=e,i.g.pTypes[t.t].isKing&&(r.kings[t.s]=t.p),r.zSign=i.zobrist.update(r.zSign,"board",e,t.p),r.zSign=i.zobrist.update(r.zSign,"type",t.t,e)}),i.mInitial&&i.mInitial.enPassant){var a=t.geometry.PosByName(i.mInitial.enPassant);if(a>=0){var l,v=t.geometry.C(a),f=t.geometry.R(a);l=1==i.mInitial.turn?t.geometry.POS(v,f-1):t.geometry.POS(v,f+1),this.epTarget={p:a,i:this.board[l]}}}},Model.Board.CopyFrom=function(t){if(e)this.board=new Int16Array(t.board.length),this.board.set(t.board);else{this.board=[];for(var i=t.board,r=i.length,a=0;a<r;a++)this.board.push(i[a])}this.pieces=[];for(var n=t.pieces.length,a=0;a<n;a++){var s=t.pieces[a];this.pieces.push({s:s.s,p:s.p,t:s.t,i:s.i,m:s.m})}this.kings={1:t.kings[1],"-1":t.kings[-1]},this.check=t.check,t.lastMove?this.lastMove={f:t.lastMove.f,t:t.lastMove.t,c:t.lastMove.c}:this.lastMove=null,this.ending={1:t.ending[1],"-1":t.ending[-1]},void 0!==t.castled&&(this.castled={1:t.castled[1],"-1":t.castled[-1]}),this.noCaptCount=t.noCaptCount,t.epTarget?this.epTarget={p:t.epTarget.p,i:t.epTarget.i}:this.epTarget=null,this.mWho=t.mWho,this.zSign=t.zSign},Model.Board.cbApplyCastle=function(t,e,i){var r=t.cbVar.castle[e.f+"/"+e.cg],a=r.r[r.r.length-1],n=this.pieces[this.board[e.cg]],s=r.k[r.k.length-1],o=this.pieces[this.board[e.f]];return i&&(this.zSign=t.zobrist.update(this.zSign,"board",n.i,e.cg),this.zSign=t.zobrist.update(this.zSign,"board",n.i,a),this.zSign=t.zobrist.update(this.zSign,"board",o.i,e.f),this.zSign=t.zobrist.update(this.zSign,"board",o.i,s)),n.p=a,n.m=!0,this.board[e.cg]=-1,o.p=s,o.m=!0,this.board[e.f]=-1,this.board[a]=n.i,this.board[s]=o.i,this.castled[n.s]=!0,this.kings[o.s]=s,[{i:n.i,f:a,t:-1},{i:o.i,f:s,t:e.f,kp:e.f,who:o.s,m:!1},{i:n.i,f:-1,t:e.cg,m:!1,cg:!1}]},Model.Board.cbQuickApply=function(t,e){if(void 0!==e.cg)return this.cbApplyCastle(t,e,!1);var i=[],r=this.board[e.f],a=this.pieces[r];if(null!=e.c){i.unshift({i:e.c,f:-1,t:this.pieces[e.c].p});var n=this.pieces[e.c];this.board[n.p]=-1,n.p=-1}var s=this.kings[a.s];return t.g.pTypes[a.t].isKing&&(this.kings[a.s]=e.t),i.unshift({i:r,f:e.t,t:e.f,kp:s,who:a.s,ty:a.t}),a.p=e.t,void 0!==e.pr&&(a.t=e.pr),this.board[e.f]=-1,this.board[e.t]=r,i},Model.Board.cbQuickUnapply=function(t,e){for(var i=0;i<e.length;i++){var r=e[i],a=this.pieces[r.i];r.f>=0&&(a.p=-1,this.board[r.f]=-1),r.t>=0&&(a.p=r.t,this.board[r.t]=r.i),void 0!==r.m&&(a.m=r.m),void 0!==r.kp&&(this.kings[r.who]=r.kp),void 0!=r.ty&&(a.t=r.ty),void 0!=r.cg&&(this.castled[a.s]=r.cg)}},Model.Board.ApplyMove=function(t,e){var i=this.pieces[this.board[e.f]];if(void 0!==e.cg)this.cbApplyCastle(t,e,!0);else{if(this.zSign=t.zobrist.update(this.zSign,"board",i.i,e.f),this.board[i.p]=-1,void 0!==e.pr&&(this.zSign=t.zobrist.update(this.zSign,"type",i.t,i.i),i.t=e.pr,this.zSign=t.zobrist.update(this.zSign,"type",i.t,i.i)),null!=e.c){var r=this.pieces[e.c];this.zSign=t.zobrist.update(this.zSign,"board",r.i,r.p),this.board[r.p]=-1,r.p=-1,r.m=!0,this.noCaptCount=0}else this.noCaptCount++;i.p=e.t,i.m=!0,this.board[e.t]=i.i,this.zSign=t.zobrist.update(this.zSign,"board",i.i,e.t),t.g.pTypes[i.t].isKing&&(this.kings[i.s]=e.t)}this.check=!!e.ck,this.lastMove={f:e.f,t:e.t,c:e.c},void 0!==e.ko&&(this.ending[i.s]=e.ko),void 0!==e.ept?this.epTarget={p:e.ept,i:i.i}:this.epTarget=null,this.zSign=t.zobrist.update(this.zSign,"who",-this.mWho),this.zSign=t.zobrist.update(this.zSign,"who",this.mWho)},Model.Board.Evaluate=function(i){function r(e){var i=1/0;for(var r in t.geometry.corners)i=Math.min(i,h.distGraph[n.kings[e]][r]);return i-Math.sqrt(h.boardSize)}var a="debug"==arguments[3],n=this;this.mEvaluation=0;var s,o=this.mWho,h=i.g;if(e)s={1:{count:new Uint8Array(h.pTypes.length),byType:{}},"-1":{count:new Uint8Array(h.pTypes.length),byType:{}}};else{s={1:{count:[],byType:{}},"-1":{count:[],byType:{}}};for(var c=0;c<h.pTypes.length;c++)s[1].count[c]=s[-1].count[c]=0}if(i.mOptions.preventRepeat&&i.GetRepeatOccurence(this)>2)return this.mFinished=!0,void(this.mWinner=i.cbOnPerpetual?o*i.cbOnPerpetual:JocGame.DRAW);for(var p={1:0,"-1":0},l={1:h.distGraph[this.kings[-1]],"-1":h.distGraph[this.kings[1]]},v={1:0,"-1":0},f={1:0,"-1":0},u={1:0,"-1":0},g={1:0,"-1":0},b={1:!1,"-1":!1},d=this.pieces,m=d.length,c=0;c<m;c++){var G=d[c];if(G.p>=0){var y=G.s,M=h.pTypes[G.t];M.isKing?b[y]=G.m:p[y]+=M.value,M.castle&&!G.m&&g[y]++,f[y]++,v[y]+=l[y][G.p],u[y]+=t.geometry.distEdge[G.p];var S=s[y];S.count[G.t]++;var k=S.byType;void 0===k[G.t]?k[G.t]=[G]:k[G.t].push(G)}}if(this.lastMove&&null!=this.lastMove.c){var G=this.pieces[this.board[this.lastMove.t]];p[-G.s]+=this.cbStaticExchangeEval(i,G.p,G.s,{piece:G})}var C={1:0,"-1":0},T={1:0,"-1":0},z={1:0,"-1":0};this.ending[1]&&(T[1]=(v[1]-Math.sqrt(h.boardSize))/f[1],t.geometry.corners&&(z[1]=r(1))),this.ending[-1]&&(T[-1]=(v[-1]-Math.sqrt(h.boardSize))/f[-1],t.geometry.corners&&(z[1]=r(-1)));var A={pieceValue:p[1]-p[-1],pieceValueRatio:(p[1]-p[-1])/(p[1]+p[-1]+1),posValue:u[1]-u[-1],averageDistKing:v[1]/f[1]-v[-1]/f[-1],check:this.check?-o:0,endingKingFreedom:C[1]-C[-1],endingDistKing:T[1]-T[-1],distKingCorner:z[1]-z[-1]};t.castle&&(A.castle=(this.castled[1]?1:b[1]?0:g[1]/(h.castleablePiecesCount[1]+1))-(this.castled[-1]?1:b[-1]?0:g[-1]/(h.castleablePiecesCount[-1]+1))),t.evaluate&&t.evaluate.call(this,i,A,s);var P=i.mOptions.levelOptions;for(var E in A){var w=A[E],I=P[E+"Factor"]||0,R=w*I;a&&console.log(E,"=",w,"*",I,"=>",R),this.mEvaluation+=R}a&&console.log("Evaluation",this.mEvaluation)},Model.Board.cbGeneratePseudoLegalMoves=function(t){function e(e,a){var n=t.cbVar.promote;if(!n)return void r.push(a);var s=n.call(i,t,e,a);if(null!=s)if(0==s.length)r.push(a);else if(1==s.length)a.pr=s[0],r.push(a);else for(var o=0;o<s.length;o++){var h=s[o];r.push({f:a.f,t:a.t,c:a.c,pr:h,ept:a.ept,ep:a.ep,a:a.a})}}for(var i=this,r=[],a=t.cbVar,n=this.mWho,s=!a.castle||this.check||this.castled[n]?null:[],o=-1,h=this.pieces.length,c=0;c<h;c++){var p=this.pieces[c];if(!(p.p<0||p.s!=n)){var l=t.g.pTypes[p.t];l.isKing&&(p.m?s=null:o=p),s&&l.castle&&!p.m&&s.push(p);var v,f;v=l.graph[p.p],f=v.length;for(var u=0;u<f;u++)for(var g=v[u],b=!1,d=g.length,m=null,G=0;G<d;G++){var y=g[G],M=65535&y,S=this.board[M];if(!(S<0)||l.epCatch&&this.epTarget&&this.epTarget.p==M){if(!(524288&y)){var k;k=S<0?this.pieces[this.epTarget.i]:this.pieces[S],!(k.s!=p.s&&131072&y)||1048576&y&&!t.g.pTypes[k.t].isKing||2097152&y&&t.g.pTypes[k.t].isKing||e(p,{f:p.p,t:M,c:k.i,a:l.abbrev,ep:S<0});break}if(b){var k=this.pieces[S];k.s!=p.s&&e(p,{f:p.p,t:M,c:k.i,a:l.abbrev});break}b=!0}else 65536&y&&0==b&&e(p,{f:p.p,t:M,c:null,a:l.abbrev,ept:null!=m&&l.epTarget?m:void 0});m=M}}}if(s)for(var c=0;c<s.length;c++){var C=s[c],T=t.cbVar.castle[o.p+"/"+C.p];if(T){for(var z=!0,u=0;u<T.r.length;u++){var A=T.r[u];if(this.board[A]>=0&&A!=o.p&&A!=C.p){z=!1;break}}if(z){for(var P=!0,u=0;u<T.k.length;u++){var A=T.k[u];if(this.board[A]>=0&&A!=C.p&&A!=o.p||this.cbGetAttackers(t,A,n).length>0){P=!1;break}}P&&r.push({f:o.p,t:T.k[T.k.length-1],c:null,cg:C.p})}}}return r},Model.Board.cbStaticExchangeEval=function(t,e,i,r){var a=0,n=this.cbGetSmallestAttacker(t,e,i);if(n){var s=this.mWho;this.mWho=n.s;var o=this.cbQuickApply(t,{f:n.p,t:e,c:r.piece.i}),h=t.g.pTypes[r.piece.t].value;r.piece=n,a=Math.max(0,h-this.cbStaticExchangeEval(t,e,-i,r)),this.cbQuickUnapply(t,o),this.mWho=s}return a},Model.Board.cbGetSmallestAttacker=function(t,e,i){var r=this.cbGetAttackers(t,e,i);if(0==r.length)return null;for(var a=1/0,n=null,s=r.length,o=0;o<s;o++){var h=r[o],c=t.g.pTypes[h.t].value;c<a&&(a=c,n=h)}return n},Model.Board.cbCollectAttackers=function(t,e,i,r){for(var a in e){var n=e[a],s=this.board[a];if(s<0)this.cbCollectAttackers(t,n.e,i,r);else{var o=this.pieces[s];o.s==-t&&(n.t&&o.t in n.t||r&&n.tk&&o.t in n.tk)&&i.push(o)}}},Model.Board.cbCollectAttackersScreen=function(t,e,i,r,a){for(var n in e){var s=e[n],o=this.board[n];if(o<0)this.cbCollectAttackersScreen(t,s.e,i,r,a);else{var h=this.pieces[o];!a&&h.s==-t&&(s.t&&h.t in s.t||r&&s.tk&&h.t in s.tk)?i.push(h):a?a&&h.s==-t&&s.ts&&h.t in s.ts&&i.push(h):this.cbCollectAttackersScreen(t,s.e,i,r,!0)}}},Model.Board.cbGetAttackers=function(t,e,i,r){var a=[];return t.cbUseScreenCapture?this.cbCollectAttackersScreen(i,t.g.threatGraph[i][e],a,r,!1):this.cbCollectAttackers(i,t.g.threatGraph[i][e],a,r),a},Model.Board.GenerateMoves=function(t){var e=this.cbGeneratePseudoLegalMoves(t);this.mMoves=[];for(var i=!0,r=this.kings[this.mWho],a=e.length,n=0;n<a;n++){var s=e[n],o=this.cbQuickApply(t,s);if(!(this.cbGetAttackers(t,this.kings[this.mWho],this.mWho,!0).length>0)){var h=this.cbGetAttackers(t,this.kings[-this.mWho],-this.mWho,!0).length>0;s.ck=h,this.mMoves.push(s),s.f!=r&&(i=!1)}this.cbQuickUnapply(t,o)}if(0==this.mMoves.length)this.mFinished=!0,this.mWinner=t.cbOnStaleMate?t.cbOnStaleMate*this.mWho:JocGame.DRAW,this.check&&(this.mWinner=-this.mWho);else if(this.ending[this.mWho]){if(!i)for(var n=0;n<this.mMoves.length;n++)this.mMoves[n].ko=!1}else if(!this.ending[this.mWho]&&i&&!this.check)for(var n=0;n<this.mMoves.length;n++)this.mMoves[n].ko=!0},Model.Board.GetSignature=function(){return this.zSign},Model.Move.Init=function(t){for(var e in t)t.hasOwnProperty(e)&&(this[e]=t[e])},Model.Move.Equals=function(t){return this.f==t.f&&this.t==t.t&&this.pr==t.pr},Model.Move.CopyFrom=function(t){this.Init(t)},Model.Move.ToString=function(e){var i=this;switch(e=e||"natural"){case"natural":return function(){var e;if(void 0!==i.cg?e=t.castle[i.f+"/"+i.cg].n:(e=i.a||"",e+=t.geometry.PosName(i.f),null==i.c?e+="-":e+="x",e+=t.geometry.PosName(i.t)),void 0!==i.pr){var r=t.pieceTypes[i.pr];r&&r.abbrev&&r.abbrev.length>0&&!r.silentPromo&&(e+="="+r.abbrev)}return i.ck&&(e+="+"),e}();case"engine":return function(){var e=t.geometry.PosName(i.f)+t.geometry.PosName(i.t);if(void 0!=i.pr){var r=t.pieceTypes[i.pr];r&&r.abbrev&&r.abbrev.length>0&&!r.silentPromo&&(e+=r.abbrev)}return e}();default:return"??"}},Model.Board.CompactMoveString=function(e,i,r){"function"!=typeof i.ToString&&(i=e.CreateMove(i));var a=i.ToString(),n=/^([A-Z]?)([a-z])([1-9][0-9]*)([-x])([a-z])([1-9][0-9]*)(.*?)$/.exec(a);if(!n)return a;var s=n[7];if(r||(r={}),r.value||(r.value=[]),0==r.value.length){var o=this.mMoves;this.mMoves&&0!=this.mMoves.length||this.GenerateMoves(e);for(var h=0;h<this.mMoves.length;h++){var c=this.mMoves[h];"function"!=typeof c.ToString&&(c=e.CreateMove(c)),r.value.push({str:c.ToString(),move:c})}this.mMoves=o}var p=[];if(r.value.forEach(function(t){var e=/^([A-Z]?[a-z][1-9][0-9]*[-x][a-z][1-9][0-9]*)(.*?)$/.exec(t.str);e&&t.move.t==i.t&&(t.move.a||"")==n[1]&&e[2]==s&&p.push(t.move)}),1==p.length)return""==n[1]&&"x"==n[4]?n[2]+"x"+n[5]+n[6]+n[7]:n[1]+("x"==n[4]?"x":"")+n[5]+n[6]+n[7];if(t.geometry.CompactCrit)for(var l="",h=0;;h++){var v=t.geometry.CompactCrit(i.f,h);if(null==v)return a;l+=v;for(var f=[],u=0;u<p.length;u++){var g=p[u];t.geometry.CompactCrit(g.f,h)==v&&f.push(g)}if(console.assert(f.length>0),1==f.length)return n[1]+l+("x"==n[4]?"x":"")+n[5]+n[6]+n[7];p=f}return a},Model.Board.cbIntegrity=function(t){function e(t,e){t||console.error(e)}for(var i=this,r=0;r<this.board.length;r++){var a=this.board[r];if(a>=0){var n=i.pieces[a];e(void 0!==n,"no piece at pos"),e(n.p==r,"piece has different pos")}}for(var a=0;a<this.pieces.length;a++){var n=this.pieces[a];n.p>=0&&e(i.board[n.p]==a,"board index mismatch")}},Model.Board.ExportBoardState=function(t){return t.cbVar.geometry.ExportBoardState?t.cbVar.geometry.ExportBoardState(this,t.cbVar,t.mPlayedMoves.length):"not supported"},Model.Game.Import=function(e,i){var r,a=[],n={1:{},"-1":{}},s=null,o=0;if("pjn"==e){var h={status:!1,error:"parse"},c=i.split(" ");if(6!=c.length)return console.warn("FEN should have 6 parts"),h;var p=c[0].split("/"),l=t.geometry.fenHeight||t.geometry.height;if(p.length!=l)return console.warn("FEN board should have",l,"rows, got",p.length),h;var v={};for(var f in t.pieceTypes){var u=t.pieceTypes[f],g=u.fenAbbrev||u.abbrev||"X";v[g.toUpperCase()]={s:1,t:f},v[g.toLowerCase()]={s:-1,t:f}}var b=t.geometry.FenRowPos||function(e,i){return(t.geometry.height-1-e)*t.geometry.width+i};if(p.forEach(function(e,i){for(var r=0,n=0;n<e.length;n++){var s=e.substr(n,1),o=v[s];if(void 0!==o){var c=b(i,r);r++;for(var p={s:o.s,t:o.t,p:c},l=!0,f=t.pieceTypes[p.t].initial||[],u=0;u<f.length;u++){var g=f[u];g.s==p.s&&g.p==c&&(l=!1)}p.m=l,a.push(p)}else{if(isNaN(parseInt(s)))return console.warn("FEN invalid board spec",s),h;r+=parseInt(s)}}}),a.sort(function(t,e){return e.s-t.s}),"w"==c[1])r=1;else{if("b"!=c[1])return console.warn("FEN invalid turn spec",c[1]),h;r=-1}n[1].k=c[2].indexOf("K")>=0,n[1].q=c[2].indexOf("Q")>=0,n[-1].k=c[2].indexOf("k")>=0,n[-1].q=c[2].indexOf("q")>=0,s="-"==c[3]?null:c[3];var d=parseInt(c[4]);isNaN(d)||(o=d);var m={pieces:a,turn:r,castle:n,enPassant:s,noCaptCount:o};return t.importGame&&t.importGame.call(this,m,e,i),{status:!0,initial:m}}return{status:!1,error:"unsupported"}}}(),function(){Model.Game.cbBoardGeometryHex=function(t,e){function i(t,e){for(var i=r(t),s=a(t),o=i,h=s,c=0;c<3;c++)for(var p=Math.abs(e[c]),l=0==p?0:e[c]/p,g=0;g<p;g++)h%2==v?(1==c&&l<0&&o--,2==c&&l>0&&o--):(1==c&&l>0&&o++,2==c&&l<0&&o++),1!=c&&2!=c||(h+=l),0==c&&(o+=l);if(o<0||o>=u||h<0||h>=f)return null;var t=n(o,h);return t in d?t:null}function r(t){return t%u}function a(t){return Math.floor(t/u)}function n(t,e){return e*u+t}function s(t){return void 0!==e[t]?e[t]:String.fromCharCode("a".charCodeAt(0)+r(t))+(a(t)+1)}function o(t){if(void 0!==l[t])return l[t];var e=/^([a-z])([0-9]+)$/.exec(t);return e?n(e[1].charCodeAt(0)-"a".charCodeAt(0),parseInt(e[2])-1):-1}function h(t,e){return 0==e?String.fromCharCode("a".charCodeAt(0)+r(t)):1==e?a(t)+1:null}function c(){return G}function p(e,i){var r=t[t.length-1-i][2*e];return" "==r&&(r=t[t.length-1-i][2*e+1]||" "),r}var l={};if(e)for(y in e)l[e[y]]=y;else e={};for(var v,f=t.length,u=0,g=!1,b=0,d={},m=0;m<t.length;m++)t[m].length%2==1&&t[m],t[m].length>b&&(b=t[m].length);for(var m=0;m<t.length;m++)for(;t[m].length<b;)t[m]+=" ";t.forEach(function(t,e){" "!=t[0]&&(v=e%2);var i=Math.ceil(t.length/2);i>u&&(u=i)}),t.forEach(function(e,i){(t.length-1-i)%2==1-v&&(" "==e[e.length-1]&&" "==e[e.length-2]||(g=!0));for(var r=0;r<e.length;r+=2)if(" "!=e[r]||r+1<e.length&&" "!=e[r+1]){var a=i*u+r/2;d[a]=1}});var G={};for(var y in d)G[y]={},G[y][y]=0;for(var M=[[1,0,0],[0,1,0],[0,0,1],[-1,0,0],[0,-1,0],[0,0,-1]],S=!0;S;){S=!1;for(var y in d)M.forEach(function(t){var e=i(y,t);if(null!=e){1!=G[y][e]&&(G[y][e]=1,G[e][y]=1,S=!0);for(var r in d)r!=y&&(void 0===G[e][r]&&void 0!==G[y][r]?(G[e][r]=G[y][r]+1,G[r][e]=G[y][r]+1,S=!0):void 0!==G[e][r]&&void 0!==G[y][r]&&G[e][r]>G[y][r]+1&&(G[e][r]=G[y][r]+1,G[r][e]=G[y][r]+1,S=!0))}})}var k=0,C={};for(var y in d){var T=0;for(var z in d){var A=G[y][z];T+=A*A}T>k?(C={},C[y]=1,k=T):T==k&&(C[y]=1)}for(var P={},S=!0;S;){S=!1;for(var y in d)y in P||M.forEach(function(t){var e=i(y,t);null==e?P[y]=1:e in P&&(y in P&&!(P[y]>P[e]+1)||(P[y]=P[e]+1,S=!0))})}return{boardSize:u*f,width:u,height:f,C:r,R:a,POS:n,Graph:i,PosName:s,PosByName:o,CompactCrit:h,GetDistances:c,distEdge:P,corners:C,SHIFTMOD2:v,SHIFTRIGHT:g,CellType:p,confine:d}};var t=Model.Game.cbConstants,e=[[1,0,0],[0,1,0],[0,0,1],[-1,0,0],[0,-1,0],[0,0,-1]],i=[[1,1,0],[0,1,1],[-1,0,1],[-1,-1,0],[0,-1,-1],[1,0,-1]],r=[[2,1,0],[1,2,0],[0,2,1],[0,1,2],[-1,0,2],[-2,0,1],[-2,-1,0],[-1,-2,0],[0,-2,-1],[0,-1,-2],[1,0,-2],[2,0,-1]];Model.Game.cbGLKingGraph=function(t){return this.cbShortRangeGraph(t,i.concat(e),t.confine)},Model.Game.cbGLRookGraph=function(t){return this.cbLongRangeGraph(t,e,t.confine)},Model.Game.cbGLBishopGraph=function(t){return this.cbLongRangeGraph(t,i,t.confine)},Model.Game.cbGLQueenGraph=function(t){return this.cbLongRangeGraph(t,i.concat(e),t.confine)},Model.Game.cbGLKnightGraph=function(t){return this.cbShortRangeGraph(t,r,t.confine)},Model.Game.cbGLPawnGraph=function(e,i,r){for(var a=this.cbLongRangeGraph(e,[[i,0,0]],e.confine,t.FLAG_MOVE,r),n={1:[[0,1,0],[0,0,-1]],"-1":[[0,0,1],[0,-1,0]]},s=this.cbShortRangeGraph(e,n[i],e.confine,t.FLAG_CAPTURE),o=[],h=0;h<e.boardSize;h++)o[h]=a[h].concat(s[h]);return o},Model.Game.cbBRInitialPawnGraph=function(e,i){for(var r=this.cbLongRangeGraph(e,[[0,-i,0],[0,0,-i]],e.confine,t.FLAG_MOVE,2),a=this.cbShortRangeGraph(e,[[-i,-i,0],[i,0,-i],[0,-i,-i]],e.confine,t.FLAG_CAPTURE),n=[],s=0;s<e.boardSize;s++)n[s]=r[s].concat(a[s]);return n},Model.Game.cbDVInitialPawnGraph=function(e,i){for(var r=this.cbLongRangeGraph(e,[[0,-i,0],[0,0,-i]],e.confine,t.FLAG_MOVE,2),a=this.cbShortRangeGraph(e,[[-i,-i,0],[i,0,-i]],e.confine,t.FLAG_CAPTURE),n=[],s=0;s<e.boardSize;s++)n[s]=r[s].concat(a[s]);return n},Model.Game.cbBRPawnGraph=function(e,i){for(var r=this.cbShortRangeGraph(e,[[0,-i,0],[0,0,-i]],e.confine,t.FLAG_MOVE),a=this.cbShortRangeGraph(e,[[-i,-i,0],[i,0,-i]],e.confine,t.FLAG_CAPTURE),n=[],s=0;s<e.boardSize;s++)n[s]=r[s].concat(a[s]);return n},Model.Game.cbMCPawnGraph=function(e,i,r){for(var a=this.cbLongRangeGraph(e,[[i,0,0]],e.confine,t.FLAG_MOVE,r),n=this.cbShortRangeGraph(e,[[i,0,-i],[i,i,0]],e.confine,t.FLAG_CAPTURE),s=[],o=0;o<e.boardSize;o++)s[o]=a[o].concat(n[o]);return s}}(),function(){var t={108:"a1",109:"b1",110:"c1",111:"d1",112:"e1",113:"f1",114:"g1",115:"h1",116:"i1",94:"a2",95:"b2",96:"c2",97:"d2",98:"e2",99:"f2",100:"g2",101:"h2",102:"i2",81:"a3",82:"b3",83:"c3",84:"d3",85:"e3",86:"f3",87:"g3",88:"h3",89:"i3",67:"a4",68:"b4",69:"c4",70:"d4",71:"e4",72:"f4",73:"g4",74:"h4",75:"i4",54:"a5",55:"b5",56:"c5",57:"d5",58:"e5",59:"f5",60:"g5",61:"h5",62:"i5",40:"a6",41:"b6",42:"c6",43:"d6",44:"e6",45:"f6",46:"g6",47:"h6",48:"i6",27:"a7",28:"b7",29:"c7",30:"d7",31:"e7",32:"f7",33:"g7",34:"h7",35:"i7",13:"a8",14:"b8",15:"c8",16:"d8",17:"e8",18:"f8",19:"g8",20:"h8",21:"i8",0:"a9",1:"b9",2:"c9",3:"d9",4:"e9",5:"f9",6:"g9",7:"h9",8:"i9"},e=Model.Game.cbBoardGeometryHex([". + # . + # . + #"," # . + # . + # . +"," + # . + # . + # ."," . + # . + # . + #"," # . + # . + # . +"," + # . + # . + # ."," . + # . + # . + #"," # . + # . + # . +"," + # . + # . + # ."],t),i={1:{0:1,1:1,2:1,3:1,4:1,5:1,6:1,7:1,8:1},"-1":{108:1,109:1,110:1,111:1,112:1,113:1,114:1,115:1,116:1}},r={1:{},"-1":{}},a=e.GetDistances();["1","-1"].forEach(function(t){for(var n in e.confine){var s=1/0;for(var o in i[t]){var h=a[n][o];h<s&&(r[t][n]=h,s=h)}}}),Model.Game.cbDefine=function(){return{geometry:e,pieceTypes:{0:{name:"pawn-w",aspect:"pawn",graph:this.cbBRPawnGraph(e,1,1),value:1,abbrev:"",fenAbbrev:"P",epCatch:!0},1:{name:"ipawn-w",aspect:"pawn",graph:this.cbDVInitialPawnGraph(e,1),value:1,abbrev:"",fenAbbrev:"P",initial:[{s:1,p:81},{s:1,p:82},{s:1,p:83},{s:1,p:84},{s:1,p:85},{s:1,p:86},{s:1,p:87},{s:1,p:88},{s:1,p:89}],epTarget:!0},2:{name:"pawn-b",aspect:"pawn",graph:this.cbBRPawnGraph(e,-1,1),value:1,abbrev:"",fenAbbrev:"P",epCatch:!0},3:{name:"ipawn-b",aspect:"pawn",graph:this.cbDVInitialPawnGraph(e,-1),value:1,abbrev:"",fenAbbrev:"P",initial:[{s:-1,p:27},{s:-1,p:28},{s:-1,p:29},{s:-1,p:30},{s:-1,p:31},{s:-1,p:32},{s:-1,p:33},{s:-1,p:34},{s:-1,p:35}],epTarget:!0},4:{name:"knight",graph:this.cbGLKnightGraph(e),value:2.9,abbrev:"N",initial:[{s:1,p:109},{s:1,p:115},{s:-1,p:1},{s:-1,p:7}]},5:{name:"bishop",graph:this.cbGLBishopGraph(e),value:3.1,abbrev:"B",initial:[{s:1,p:110},{s:1,p:112},{s:1,p:114},{s:-1,p:2},{s:-1,p:4},{s:-1,p:6}]},6:{name:"rook",graph:this.cbGLRookGraph(e),value:5,abbrev:"R",initial:[{s:1,p:108},{s:1,p:116},{s:-1,p:0},{s:-1,p:8}],castle:!0},7:{name:"queen",graph:this.cbGLQueenGraph(e),value:9,abbrev:"Q",initial:[{s:1,p:111},{s:-1,p:5}]},8:{name:"king",isKing:!0,graph:this.cbGLKingGraph(e),abbrev:"K",initial:[{s:1,p:113},{s:-1,p:3}]}},promote:function(t,e,r){return 1==e.t?[0]:3==e.t?[2]:0==e.t&&r.t in i[1]?[4,5,6,7]:2==e.t&&r.t in i[-1]?[4,5,6,7]:[]},castle:{"98/93":{k:[97,96],r:[94,95,96,97],n:"O-O-O"},"98/101":{k:[99,100],r:[100,99],n:"O-O"},"4/9":{k:[5,6],r:[8,7,6,5],n:"O-O-O"},"4/1":{k:[3,2],r:[2,3],n:"O-O"}},evaluate:function(t,e,i){var a=i[1].count,n=i[-1].count;a[0]||a[1]||a[4]||a[5]||a[6]||a[7]||n[2]||n[3]||n[6]||n[7]||!(n[4]+n[5]<2||n[5]<2)||(this.mFinished=!0,this.mWinner=JocGame.DRAW),n[2]||n[3]||n[4]||n[5]||n[6]||n[7]||a[0]||a[1]||a[6]||a[7]||!(a[4]+a[5]<2||a[5]<2)||(this.mFinished=!0,this.mWinner=JocGame.DRAW),this.noCaptCount>=100&&(this.mFinished=!0,this.mWinner=JocGame.DRAW);var s,o=t.cbUseTypedArrays?new Int8Array(3):[0,0,0],h=i[1].byType[0];if(h){s=h.length;for(var c=0;c<s;c++){var p=r[1][h[c].p];p>0&&p<4&&o[p-1]++}}if(h=i[-1].byType[2]){s=h.length;for(var c=0;c<s;c++){var p=r[-1][h[c].p];p>0&&p<4&&o[p-1]--}}0!=o[0]&&(e.distPawnPromo1=o[0]),0!=o[1]&&(e.distPawnPromo2=o[1]),0!=o[2]&&(e.distPawnPromo3=o[2]);for(var l=0,v=4;v<=5;v++)for(var f=1;f>=-1;f-=2){var u=i[f].byType[v];if(u)for(var c=0;c<u.length;c++)u[c].m&&(l+=f)}0!=l&&(e.minorPiecesMoved=l)}}}}();