UNPKG

jocly

Version:

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

2 lines 33 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 a=new Int32Array(t.length);return a.set(t),a}for(var r=[],i=t.length,s=0;s<i;s++)r.push(t[s]);return r},Model.Game.cbShortRangeGraph=function(t,e,a,r){var i=this;void 0===r&&(r=196608);for(var s={},n=0;n<t.boardSize;n++)s[n]=[],(!a||n in a)&&e.forEach(function(e){var o=t.Graph(n,e);null!=o&&(!a||o in a)&&s[n].push(i.cbTypedArray([o|r]))});return s},Model.Game.cbLongRangeGraph=function(t,e,a,r,i){var s=this;void 0!==r&&null!=r||(r=196608),i||(i=1/0);for(var n={},o=0;o<t.boardSize;o++)n[o]=[],(!a||o in a)&&e.forEach(function(e){for(var h=[],p=t.Graph(o,e),c=0;null!=p&&(!a||p in a)&&(h.push(p|r),++c!=i);)p=t.Graph(p,e);h.length>0&&n[o].push(s.cbTypedArray(h))});return n},Model.Game.cbNullGraph=function(t){for(var e={},a=0;a<t.boardSize;a++)e[a]=[];return e},Model.Game.cbAuthorGraph=function(t){for(var e={},a=0;a<t.boardSize;a++){e[a]=[];for(var r=0;r<t.boardSize;r++)e[a].push([2293760|r])}return e},Model.Game.cbMergeGraphs=function(t){for(var e=[],a=0;a<t.boardSize;a++){e[a]=[];for(var r=1;r<arguments.length;r++)e[a]=e[a].concat(arguments[r][a])}return e},Model.Game.cbGetThreatGraph=function(){function t(e,a){for(var r in n){var i=n[r];if(!(i.p.length<a.length+1)){for(var s=!0,o=0;o<a.length;o++)if(a[o]!=i.p[o]){s=!1;break}if(s){var h=i.p[a.length],p=e[h];void 0===p&&(p={e:{}},e[h]=p),i.p.length==a.length+1&&(p.t=i.t,p.ts=i.ts,p.tk=i.tk,delete n[r]),a.push(h),t(p.e,a),a.pop()}}}}var e=this;this.cbUseScreenCapture=!1,this.cbUseCaptureKing=!1,this.cbUseCaptureNoKing=!1;for(var a={1:[],"-1":[]},r=[],i=0;i<this.g.boardSize;i++)this.g.pTypes.forEach(function(t,a){t.graph[i].forEach(function(t){for(var s=[],n=0;n<t.length;n++){var o=t[n];1048576&o?(e.cbUseCaptureKing=!0,s.unshift({d:65535&o,a:i,tk:a})):2097152&o?(e.cbUseCaptureNoKing=!0,s.unshift({d:65535&o,a:i,tnk:a})):131072&o?s.unshift({d:65535&o,a:i,t:a}):262144&o?s.unshift({d:65535&o,a:i}):524288&o&&(e.cbUseScreenCapture=!0,s.unshift({d:65535&o,a:i,ts:a}))}s.length>0&&r.push(s)})});var s={};r.forEach(function(t){t.forEach(function(e,a){var r=s[e.d];void 0===r&&(r={},s[e.d]=r);for(var i=[],n=a+1;n<t.length;n++)i.push(t[n].d);i.push(e.a);var o=i.join(","),h=r[o];void 0===h&&(h={p:i,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 i=0;i<e.g.boardSize;i++){var n=s[i],o={};t(o,[]),a[1][i]=o,a[-1][i]=o}return a},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 a in t.pieceTypes){var r=t.pieceTypes[a];if(r.castle){(r.initial||[]).forEach(function(t){e.g.castleablePiecesCount[t.s]++})}r.initial&&(this.cbPiecesCount+=r.initial.length)}for(var i=[],a=0;a<this.cbPiecesCount;a++)i.push(a);var s=Object.keys(t.pieceTypes);this.zobrist=new JocGame.Zobrist({board:{type:"array",size:this.cbVar.geometry.boardSize,values:i},who:{values:["1","-1"]},type:{type:"array",size:this.cbPiecesCount,values:s}})},Model.Game.cbGetPieceTypes=function(){for(var t=[],e={},a=0;a<this.cbVar.geometry.boardSize;a++)e[a]=[];for(var r in this.cbVar.pieceTypes){var i=this.cbVar.pieceTypes[r];t[r]={graph:i.graph||e,abbrev:i.abbrev||"",value:i.isKing?100:i.value||1,isKing:!!i.isKing,castle:!!i.castle,epTarget:!!i.epTarget,epCatch:!!i.epCatch}}return t},Model.Board.Init=function(t){this.zSign=0},Model.Board.InitialPosition=function(a){var r=this;this.board=e?new Int16Array(a.g.boardSize):[];for(var i=0;i<a.g.boardSize;i++)this.board[i]=-1;if(this.kings={},this.pieces=[],this.ending={1:!1,"-1":!1},this.lastMove=null,a.cbVar.castle&&(this.castled={1:!1,"-1":!1}),this.zSign=a.zobrist.update(0,"who",-1),this.noCaptCount=0,this.mWho=1,a.mInitial)this.mWho=a.mInitial.turn||1,a.mInitial.pieces.forEach(function(t){var e={};for(var a in t)t.hasOwnProperty(a)&&(e[a]=t[a]);r.pieces.push(e)}),a.mInitial.lastMove&&(this.lastMove={f:a.mInitial.lastMove.f,t:a.mInitial.lastMove.t}),void 0!==a.mInitial.noCaptCount&&(this.noCaptCount=a.mInitial.noCaptCount),a.cbVar.castle&&a.mInitial.castle&&(this.castled={1:{k:!!a.mInitial.castle[1]&&!!a.mInitial.castle[1].k,q:!!a.mInitial.castle[1]&&!!a.mInitial.castle[1].q},"-1":{k:!!a.mInitial.castle[-1]&&!!a.mInitial.castle[-1].k,q:!!a.mInitial.castle[-1]&&!!a.mInitial.castle[-1].q}});else for(var s in a.cbVar.pieceTypes)for(var n=a.cbVar.pieceTypes[s],o=n.initial||[],h=0;h<o.length;h++){var p=o[h],c={s:p.s,t:parseInt(s),p:p.p,m:!1};this.pieces.push(c)}if(this.pieces.sort(function(t,e){if(t.s!=e.s)return e.s-t.s;var r=a.cbVar.pieceTypes[t.t].value||100,i=a.cbVar.pieceTypes[e.t].value||100;return r!=i?r-i:t.p-e.p}),this.pieces.forEach(function(t,e){t.i=e,r.board[t.p]=e,a.g.pTypes[t.t].isKing&&(r.kings[t.s]=t.p),r.zSign=a.zobrist.update(r.zSign,"board",e,t.p),r.zSign=a.zobrist.update(r.zSign,"type",t.t,e)}),a.mInitial&&a.mInitial.enPassant){var i=t.geometry.PosByName(a.mInitial.enPassant);if(i>=0){var l,u=t.geometry.C(i),b=t.geometry.R(i);l=1==a.mInitial.turn?t.geometry.POS(u,b-1):t.geometry.POS(u,b+1),this.epTarget={p:i,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 a=t.board,r=a.length,i=0;i<r;i++)this.board.push(a[i])}this.pieces=[];for(var s=t.pieces.length,i=0;i<s;i++){var n=t.pieces[i];this.pieces.push({s:n.s,p:n.p,t:n.t,i:n.i,m:n.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,a){var r=t.cbVar.castle[e.f+"/"+e.cg],i=r.r[r.r.length-1],s=this.pieces[this.board[e.cg]],n=r.k[r.k.length-1],o=this.pieces[this.board[e.f]];return a&&(this.zSign=t.zobrist.update(this.zSign,"board",s.i,e.cg),this.zSign=t.zobrist.update(this.zSign,"board",s.i,i),this.zSign=t.zobrist.update(this.zSign,"board",o.i,e.f),this.zSign=t.zobrist.update(this.zSign,"board",o.i,n)),s.p=i,s.m=!0,this.board[e.cg]=-1,o.p=n,o.m=!0,this.board[e.f]=-1,this.board[i]=s.i,this.board[n]=o.i,this.castled[s.s]=!0,this.kings[o.s]=n,[{i:s.i,f:i,t:-1},{i:o.i,f:n,t:e.f,kp:e.f,who:o.s,m:!1},{i:s.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 a=[],r=this.board[e.f],i=this.pieces[r];if(null!=e.c){a.unshift({i:e.c,f:-1,t:this.pieces[e.c].p});var s=this.pieces[e.c];this.board[s.p]=-1,s.p=-1}var n=this.kings[i.s];return t.g.pTypes[i.t].isKing&&(this.kings[i.s]=e.t),a.unshift({i:r,f:e.t,t:e.f,kp:n,who:i.s,ty:i.t}),i.p=e.t,void 0!==e.pr&&(i.t=e.pr),this.board[e.f]=-1,this.board[e.t]=r,a},Model.Board.cbQuickUnapply=function(t,e){for(var a=0;a<e.length;a++){var r=e[a],i=this.pieces[r.i];r.f>=0&&(i.p=-1,this.board[r.f]=-1),r.t>=0&&(i.p=r.t,this.board[r.t]=r.i),void 0!==r.m&&(i.m=r.m),void 0!==r.kp&&(this.kings[r.who]=r.kp),void 0!=r.ty&&(i.t=r.ty),void 0!=r.cg&&(this.castled[i.s]=r.cg)}},Model.Board.ApplyMove=function(t,e){var a=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",a.i,e.f),this.board[a.p]=-1,void 0!==e.pr&&(this.zSign=t.zobrist.update(this.zSign,"type",a.t,a.i),a.t=e.pr,this.zSign=t.zobrist.update(this.zSign,"type",a.t,a.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++;a.p=e.t,a.m=!0,this.board[e.t]=a.i,this.zSign=t.zobrist.update(this.zSign,"board",a.i,e.t),t.g.pTypes[a.t].isKing&&(this.kings[a.s]=e.t)}this.check=!!e.ck,this.lastMove={f:e.f,t:e.t,c:e.c},void 0!==e.ko&&(this.ending[a.s]=e.ko),void 0!==e.ept?this.epTarget={p:e.ept,i:a.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(a){function r(e){var a=1/0;for(var r in t.geometry.corners)a=Math.min(a,h.distGraph[s.kings[e]][r]);return a-Math.sqrt(h.boardSize)}var i="debug"==arguments[3],s=this;this.mEvaluation=0;var n,o=this.mWho,h=a.g;if(e)n={1:{count:new Uint8Array(h.pTypes.length),byType:{}},"-1":{count:new Uint8Array(h.pTypes.length),byType:{}}};else{n={1:{count:[],byType:{}},"-1":{count:[],byType:{}}};for(var p=0;p<h.pTypes.length;p++)n[1].count[p]=n[-1].count[p]=0}if(a.mOptions.preventRepeat&&a.GetRepeatOccurence(this)>2)return this.mFinished=!0,void(this.mWinner=a.cbOnPerpetual?o*a.cbOnPerpetual:JocGame.DRAW);for(var c={1:0,"-1":0},l={1:h.distGraph[this.kings[-1]],"-1":h.distGraph[this.kings[1]]},u={1:0,"-1":0},b={1:0,"-1":0},v={1:0,"-1":0},g={1:0,"-1":0},d={1:!1,"-1":!1},f=this.pieces,m=f.length,p=0;p<m;p++){var G=f[p];if(G.p>=0){var M=G.s,S=h.pTypes[G.t];S.isKing?d[M]=G.m:c[M]+=S.value,S.castle&&!G.m&&g[M]++,b[M]++,u[M]+=l[M][G.p],v[M]+=t.geometry.distEdge[G.p];var y=n[M];y.count[G.t]++;var C=y.byType;void 0===C[G.t]?C[G.t]=[G]:C[G.t].push(G)}}if(this.lastMove&&null!=this.lastMove.c){var G=this.pieces[this.board[this.lastMove.t]];c[-G.s]+=this.cbStaticExchangeEval(a,G.p,G.s,{piece:G})}var A={1:0,"-1":0},k={1:0,"-1":0},z={1:0,"-1":0};this.ending[1]&&(k[1]=(u[1]-Math.sqrt(h.boardSize))/b[1],t.geometry.corners&&(z[1]=r(1))),this.ending[-1]&&(k[-1]=(u[-1]-Math.sqrt(h.boardSize))/b[-1],t.geometry.corners&&(z[1]=r(-1)));var T={pieceValue:c[1]-c[-1],pieceValueRatio:(c[1]-c[-1])/(c[1]+c[-1]+1),posValue:v[1]-v[-1],averageDistKing:u[1]/b[1]-u[-1]/b[-1],check:this.check?-o:0,endingKingFreedom:A[1]-A[-1],endingDistKing:k[1]-k[-1],distKingCorner:z[1]-z[-1]};t.castle&&(T.castle=(this.castled[1]?1:d[1]?0:g[1]/(h.castleablePiecesCount[1]+1))-(this.castled[-1]?1:d[-1]?0:g[-1]/(h.castleablePiecesCount[-1]+1))),t.evaluate&&t.evaluate.call(this,a,T,n);var E=a.mOptions.levelOptions;for(var P in T){var R=T[P],L=E[P+"Factor"]||0,F=R*L;i&&console.log(P,"=",R,"*",L,"=>",F),this.mEvaluation+=F}i&&console.log("Evaluation",this.mEvaluation)},Model.Board.cbGeneratePseudoLegalMoves=function(t){function e(e,i){var s=t.cbVar.promote;if(!s)return void r.push(i);var n=s.call(a,t,e,i);if(null!=n)if(0==n.length)r.push(i);else if(1==n.length)i.pr=n[0],r.push(i);else for(var o=0;o<n.length;o++){var h=n[o];r.push({f:i.f,t:i.t,c:i.c,pr:h,ept:i.ept,ep:i.ep,a:i.a})}}for(var a=this,r=[],i=t.cbVar,s=this.mWho,n=!i.castle||this.check||this.castled[s]?null:[],o=-1,h=this.pieces.length,p=0;p<h;p++){var c=this.pieces[p];if(!(c.p<0||c.s!=s)){var l=t.g.pTypes[c.t];l.isKing&&(c.m?n=null:o=c),n&&l.castle&&!c.m&&n.push(c);var u,b;u=l.graph[c.p],b=u.length;for(var v=0;v<b;v++)for(var g=u[v],d=!1,f=g.length,m=null,G=0;G<f;G++){var M=g[G],S=65535&M,y=this.board[S];if(!(y<0)||l.epCatch&&this.epTarget&&this.epTarget.p==S){if(!(524288&M)){var C;C=y<0?this.pieces[this.epTarget.i]:this.pieces[y],!(C.s!=c.s&&131072&M)||1048576&M&&!t.g.pTypes[C.t].isKing||2097152&M&&t.g.pTypes[C.t].isKing||e(c,{f:c.p,t:S,c:C.i,a:l.abbrev,ep:y<0});break}if(d){var C=this.pieces[y];C.s!=c.s&&e(c,{f:c.p,t:S,c:C.i,a:l.abbrev});break}d=!0}else 65536&M&&0==d&&e(c,{f:c.p,t:S,c:null,a:l.abbrev,ept:null!=m&&l.epTarget?m:void 0});m=S}}}if(n)for(var p=0;p<n.length;p++){var A=n[p],k=t.cbVar.castle[o.p+"/"+A.p];if(k){for(var z=!0,v=0;v<k.r.length;v++){var T=k.r[v];if(this.board[T]>=0&&T!=o.p&&T!=A.p){z=!1;break}}if(z){for(var E=!0,v=0;v<k.k.length;v++){var T=k.k[v];if(this.board[T]>=0&&T!=A.p&&T!=o.p||this.cbGetAttackers(t,T,s).length>0){E=!1;break}}E&&r.push({f:o.p,t:k.k[k.k.length-1],c:null,cg:A.p})}}}return r},Model.Board.cbStaticExchangeEval=function(t,e,a,r){var i=0,s=this.cbGetSmallestAttacker(t,e,a);if(s){var n=this.mWho;this.mWho=s.s;var o=this.cbQuickApply(t,{f:s.p,t:e,c:r.piece.i}),h=t.g.pTypes[r.piece.t].value;r.piece=s,i=Math.max(0,h-this.cbStaticExchangeEval(t,e,-a,r)),this.cbQuickUnapply(t,o),this.mWho=n}return i},Model.Board.cbGetSmallestAttacker=function(t,e,a){var r=this.cbGetAttackers(t,e,a);if(0==r.length)return null;for(var i=1/0,s=null,n=r.length,o=0;o<n;o++){var h=r[o],p=t.g.pTypes[h.t].value;p<i&&(i=p,s=h)}return s},Model.Board.cbCollectAttackers=function(t,e,a,r){for(var i in e){var s=e[i],n=this.board[i];if(n<0)this.cbCollectAttackers(t,s.e,a,r);else{var o=this.pieces[n];o.s==-t&&(s.t&&o.t in s.t||r&&s.tk&&o.t in s.tk)&&a.push(o)}}},Model.Board.cbCollectAttackersScreen=function(t,e,a,r,i){for(var s in e){var n=e[s],o=this.board[s];if(o<0)this.cbCollectAttackersScreen(t,n.e,a,r,i);else{var h=this.pieces[o];!i&&h.s==-t&&(n.t&&h.t in n.t||r&&n.tk&&h.t in n.tk)?a.push(h):i?i&&h.s==-t&&n.ts&&h.t in n.ts&&a.push(h):this.cbCollectAttackersScreen(t,n.e,a,r,!0)}}},Model.Board.cbGetAttackers=function(t,e,a,r){var i=[];return t.cbUseScreenCapture?this.cbCollectAttackersScreen(a,t.g.threatGraph[a][e],i,r,!1):this.cbCollectAttackers(a,t.g.threatGraph[a][e],i,r),i},Model.Board.GenerateMoves=function(t){var e=this.cbGeneratePseudoLegalMoves(t);this.mMoves=[];for(var a=!0,r=this.kings[this.mWho],i=e.length,s=0;s<i;s++){var n=e[s],o=this.cbQuickApply(t,n);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;n.ck=h,this.mMoves.push(n),n.f!=r&&(a=!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(!a)for(var s=0;s<this.mMoves.length;s++)this.mMoves[s].ko=!1}else if(!this.ending[this.mWho]&&a&&!this.check)for(var s=0;s<this.mMoves.length;s++)this.mMoves[s].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 a=this;switch(e=e||"natural"){case"natural":return function(){var e;if(void 0!==a.cg?e=t.castle[a.f+"/"+a.cg].n:(e=a.a||"",e+=t.geometry.PosName(a.f),null==a.c?e+="-":e+="x",e+=t.geometry.PosName(a.t)),void 0!==a.pr){var r=t.pieceTypes[a.pr];r&&r.abbrev&&r.abbrev.length>0&&!r.silentPromo&&(e+="="+r.abbrev)}return a.ck&&(e+="+"),e}();case"engine":return function(){var e=t.geometry.PosName(a.f)+t.geometry.PosName(a.t);if(void 0!=a.pr){var r=t.pieceTypes[a.pr];r&&r.abbrev&&r.abbrev.length>0&&!r.silentPromo&&(e+=r.abbrev)}return e}();default:return"??"}},Model.Board.CompactMoveString=function(e,a,r){"function"!=typeof a.ToString&&(a=e.CreateMove(a));var i=a.ToString(),s=/^([A-Z]?)([a-z])([1-9][0-9]*)([-x])([a-z])([1-9][0-9]*)(.*?)$/.exec(i);if(!s)return i;var n=s[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 p=this.mMoves[h];"function"!=typeof p.ToString&&(p=e.CreateMove(p)),r.value.push({str:p.ToString(),move:p})}this.mMoves=o}var c=[];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==a.t&&(t.move.a||"")==s[1]&&e[2]==n&&c.push(t.move)}),1==c.length)return""==s[1]&&"x"==s[4]?s[2]+"x"+s[5]+s[6]+s[7]:s[1]+("x"==s[4]?"x":"")+s[5]+s[6]+s[7];if(t.geometry.CompactCrit)for(var l="",h=0;;h++){var u=t.geometry.CompactCrit(a.f,h);if(null==u)return i;l+=u;for(var b=[],v=0;v<c.length;v++){var g=c[v];t.geometry.CompactCrit(g.f,h)==u&&b.push(g)}if(console.assert(b.length>0),1==b.length)return s[1]+l+("x"==s[4]?"x":"")+s[5]+s[6]+s[7];c=b}return i},Model.Board.cbIntegrity=function(t){function e(t,e){t||console.error(e)}for(var a=this,r=0;r<this.board.length;r++){var i=this.board[r];if(i>=0){var s=a.pieces[i];e(void 0!==s,"no piece at pos"),e(s.p==r,"piece has different pos")}}for(var i=0;i<this.pieces.length;i++){var s=this.pieces[i];s.p>=0&&e(a.board[s.p]==i,"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,a){var r,i=[],s={1:{},"-1":{}},n=null,o=0;if("pjn"==e){var h={status:!1,error:"parse"},p=a.split(" ");if(6!=p.length)return console.warn("FEN should have 6 parts"),h;var c=p[0].split("/"),l=t.geometry.fenHeight||t.geometry.height;if(c.length!=l)return console.warn("FEN board should have",l,"rows, got",c.length),h;var u={};for(var b in t.pieceTypes){var v=t.pieceTypes[b],g=v.fenAbbrev||v.abbrev||"X";u[g.toUpperCase()]={s:1,t:b},u[g.toLowerCase()]={s:-1,t:b}}var d=t.geometry.FenRowPos||function(e,a){return(t.geometry.height-1-e)*t.geometry.width+a};if(c.forEach(function(e,a){for(var r=0,s=0;s<e.length;s++){var n=e.substr(s,1),o=u[n];if(void 0!==o){var p=d(a,r);r++;for(var c={s:o.s,t:o.t,p:p},l=!0,b=t.pieceTypes[c.t].initial||[],v=0;v<b.length;v++){var g=b[v];g.s==c.s&&g.p==p&&(l=!1)}c.m=l,i.push(c)}else{if(isNaN(parseInt(n)))return console.warn("FEN invalid board spec",n),h;r+=parseInt(n)}}}),i.sort(function(t,e){return e.s-t.s}),"w"==p[1])r=1;else{if("b"!=p[1])return console.warn("FEN invalid turn spec",p[1]),h;r=-1}s[1].k=p[2].indexOf("K")>=0,s[1].q=p[2].indexOf("Q")>=0,s[-1].k=p[2].indexOf("k")>=0,s[-1].q=p[2].indexOf("q")>=0,n="-"==p[3]?null:p[3];var f=parseInt(p[4]);isNaN(f)||(o=f);var m={pieces:i,turn:r,castle:s,enPassant:n,noCaptCount:o};return t.importGame&&t.importGame.call(this,m,e,a),{status:!0,initial:m}}return{status:!1,error:"unsupported"}}}(),function(){Model.Game.cbBoardGeometryGrid=function(t,e){function a(e){return e%t}function r(e){return Math.floor(e/t)}function i(e,a){return a*t+e}function s(s,n){var o=a(s),h=r(s),p=o+n[0],c=h+n[1];return p<0||p>=t||c<0||c>=e?null:i(p,c)}function n(t){return String.fromCharCode("a".charCodeAt(0)+a(t))+(r(t)+1)}function o(t){var e=/^([a-z])([0-9]+)$/.exec(t);return e?i(e[1].charCodeAt(0)-"a".charCodeAt(0),parseInt(e[2])-1):-1}function h(t,e){return 0==e?String.fromCharCode("a".charCodeAt(0)+a(t)):1==e?r(t)+1:null}function p(){for(var i=[],s=0;s<t*e;s++){var n=[];i.push(n);for(var o=0;o<t*e;o++){var h=r(s),p=a(s),c=r(o),l=a(o);n.push(Math.max(Math.abs(h-c),Math.abs(p-l)))}}return i}function c(a,r,s){for(var o=[],h=e-1;h>=0;h--){for(var p="",c=0,l=0;l<t;l++){var u=a.board[i(l,h)];if(u<0)c++;else{c>0&&(p+=c,c=0);var b=a.pieces[u],v=r.pieceTypes[b.t].fenAbbrev||r.pieceTypes[b.t].abbrev||"?";-1==b.s?p+=v.toLowerCase():p+=v.toUpperCase()}}c&&(p+=c),o.push(p)}var g=o.join("/");g+=" ",1==a.mWho?g+="w":g+="b",g+=" ";var d="";return a.castled&&(!1===a.castled[1]?d+="KQ":(a.castled[1].k&&(d+="K"),a.castled[1].q&&(d+="Q")),!1===a.castled[-1]?d+="kq":(a.castled[-1].k&&(d+="k"),a.castled[-1].q&&(d+="q"))),0==d.length&&(d="-"),g+=d,g+=" ",a.epTarget?g+=n(a.epTarget.p):g+="-",g+=" ",g+=a.noCaptCount,g+=" ",g+=Math.floor(s/2)+1}return{boardSize:t*e,width:t,height:e,C:a,R:r,POS:i,Graph:s,PosName:n,PosByName:o,CompactCrit:h,GetDistances:p,distEdge:function(){for(var i=[],s=0;s<t*e;s++){var n=a(s),o=r(s);i[s]=Math.min(n,Math.abs(t-n-1),o,Math.abs(e-o-1))}return i}(),corners:function(){var a={};return a[i(0,0)]=1,a[i(0,e-1)]=1,a[i(t-1,0)]=1,a[i(t-1,e-1)]=1,a}(),ExportBoardState:c}},Model.Game.cbPawnGraph=function(t,e,a){for(var r=this,i={},s=0;s<t.boardSize;s++)if(!a||s in a){var n=[],o=t.Graph(s,[0,e]);null!=o&&(!a||o in a)&&n.push(r.cbTypedArray([o|r.cbConstants.FLAG_MOVE])),[-1,1].forEach(function(i){var o=t.Graph(s,[i,e]);null!=o&&(!a||o in a)&&n.push(r.cbTypedArray([o|r.cbConstants.FLAG_CAPTURE]))}),i[s]=n}else i[s]=[];return i},Model.Game.cbInitialPawnGraph=function(t,e,a){for(var r=this,i={},s=0;s<t.boardSize;s++)if(!a||s in a){var n=[],o=t.Graph(s,[0,e]);if(null!=o&&(!a||o in a)){var h=[o|r.cbConstants.FLAG_MOVE],p=t.Graph(o,[0,e]);null!=p&&(!a||p in a)&&h.push(p|r.cbConstants.FLAG_MOVE),n.push(r.cbTypedArray(h))}[-1,1].forEach(function(i){var o=t.Graph(s,[i,e]);null!=o&&(!a||o in a)&&n.push(r.cbTypedArray([o|r.cbConstants.FLAG_CAPTURE]))}),i[s]=n}else i[s]=[];return i},Model.Game.cbKingGraph=function(t,e){return this.cbShortRangeGraph(t,[[-1,-1],[-1,0],[-1,1],[0,-1],[0,1],[1,-1],[1,0],[1,1]],e)},Model.Game.cbKnightGraph=function(t,e){return this.cbShortRangeGraph(t,[[2,-1],[2,1],[-2,-1],[-2,1],[-1,2],[-1,-2],[1,2],[1,-2]],e)},Model.Game.cbHorseGraph=function(t){for(var e=this,a={},r=0;r<t.boardSize;r++)a[r]=[],[[1,0,2,-1],[1,0,2,1],[-1,0,-2,-1],[-1,0,-2,1],[0,1,-1,2],[0,-1,-1,-2],[0,1,1,2],[0,-1,1,-2]].forEach(function(i){var s=t.Graph(r,[i[0],i[1]]);if(null!=s){var n=t.Graph(r,[i[2],i[3]]);null!=n&&a[r].push(e.cbTypedArray([s|e.cbConstants.FLAG_STOP,n|e.cbConstants.FLAG_MOVE|e.cbConstants.FLAG_CAPTURE]))}});return a},Model.Game.cbRookGraph=function(t,e){return this.cbLongRangeGraph(t,[[0,-1],[0,1],[-1,0],[1,0]],e)},Model.Game.cbBishopGraph=function(t,e){return this.cbLongRangeGraph(t,[[1,-1],[1,1],[-1,1],[-1,-1]],e)},Model.Game.cbQueenGraph=function(t,e){return this.cbLongRangeGraph(t,[[0,-1],[0,1],[-1,0],[1,0],[1,-1],[1,1],[-1,1],[-1,-1]],e)},Model.Game.cbXQGeneralGraph=function(t,e){for(var a=this,r={},i=0;i<t.boardSize;i++)r[i]=[],[[-1,0,!1],[0,-1,!0],[0,1,!0],[1,0,!1]].forEach(function(s){var n=[],o=t.Graph(i,s);if(null!=o&&((!e||o in e)&&n.push(o|a.cbConstants.FLAG_MOVE|a.cbConstants.FLAG_CAPTURE),s[2]))for(var h=t.Graph(o,s);null!=h;)!e||h in e?n.push(h|a.cbConstants.FLAG_CAPTURE|a.cbConstants.FLAG_CAPTURE_KING):n.push(h|a.cbConstants.FLAG_STOP),h=t.Graph(h,s);n.length>0&&r[i].push(a.cbTypedArray(n))});return r},Model.Game.cbXQSoldierGraph=function(t,e){return this.cbShortRangeGraph(t,[[0,e]])},Model.Game.cbXQPromoSoldierGraph=function(t,e){return this.cbShortRangeGraph(t,[[0,e],[-1,0],[1,0]])},Model.Game.cbXQAdvisorGraph=function(t,e){return this.cbShortRangeGraph(t,[[1,1],[-1,1],[1,-1],[-1,-1]],e)},Model.Game.cbXQCannonGraph=function(t){return this.cbLongRangeGraph(t,[[0,-1],[0,1],[-1,0],[1,0]],null,this.cbConstants.FLAG_MOVE|this.cbConstants.FLAG_SCREEN_CAPTURE)},Model.Game.cbXQElephantGraph=function(t,e){for(var a=this,r={},i=0;i<t.boardSize;i++)r[i]=[],(!e||i in e)&&[[1,1,2,2],[1,-1,2,-2],[-1,1,-2,2],[-1,-1,-2,-2]].forEach(function(s){var n=t.Graph(i,[s[0],s[1]]);if(null!=n){var o=t.Graph(i,[s[2],s[3]]);null!=o&&(!e||o in e)&&r[i].push(a.cbTypedArray([n|a.cbConstants.FLAG_STOP,o|a.cbConstants.FLAG_MOVE|a.cbConstants.FLAG_CAPTURE]))}});return r},Model.Game.cbSilverGraph=function(t,e){return this.cbShortRangeGraph(t,[[0,e],[-1,-1],[-1,1],[1,-1],[1,1]])},Model.Game.cbFersGraph=function(t,e){return this.cbShortRangeGraph(t,[[-1,-1],[-1,1],[1,-1],[1,1]])},Model.Game.cbSchleichGraph=function(t,e){return this.cbShortRangeGraph(t,[[-1,0],[1,0],[0,-1],[0,1]])},Model.Game.cbAlfilGraph=function(t,e){return this.cbShortRangeGraph(t,[[-2,-2],[-2,2],[2,2],[2,-2]])}}(),function(){var t=Model.Game.cbBoardGeometryGrid(12,12);Model.Game.cbDefine=function(){function e(e){for(var a={},i=0;i<t.boardSize;i++){a[i]=[];var s=[],n=t.Graph(i,[0,e]);null!=n&&(s.push(n|r.cbConstants.FLAG_MOVE|r.cbConstants.FLAG_CAPTURE),n=t.Graph(n,[0,e]),null!=n&&s.push(n|r.cbConstants.FLAG_MOVE),a[i].push(r.cbTypedArray(s)))}return r.cbMergeGraphs(t,r.cbShortRangeGraph(t,[[-1,-1],[-1,1],[-1,0],[1,0],[1,-1],[1,1],[0,-e]]),a)}function a(){for(var e=r.cbConstants.FLAG_MOVE|r.cbConstants.FLAG_CAPTURE,a={},i=0;i<t.boardSize;i++)a[i]=[],[[-1,-1],[-1,1],[1,-1],[1,1]].forEach(function(s){var n=t.Graph(i,s);if(null!=n)for(var o=0;o<2;o++){for(var h=[],p=1;p<11;p++){var c=[];c[o]=s[o]*p,c[1-o]=0;var l=t.Graph(n,c);null!=l&&(1==p&&h.push(n|r.cbConstants.FLAG_STOP),h.push(l|e))}h.length>0&&a[i].push(r.cbTypedArray(h))}});return r.cbMergeGraphs(t,r.cbShortRangeGraph(t,[[-1,-1],[-1,1],[1,-1],[1,1]]),a)}var r=this;return{geometry:t,pieceTypes:{0:{name:"pawn-w",aspect:"fr-pawn",graph:this.cbPawnGraph(t,1),value:1,abbrev:"",fenAbbrev:"P",epCatch:!1},1:{name:"ipawn-w",aspect:"fr-pawn",graph:this.cbInitialPawnGraph(t,1),value:1,abbrev:"",fenAbbrev:"P",initial:[{s:1,p:24},{s:1,p:25},{s:1,p:26},{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,epCatch:!1},2:{name:"pawn-b",aspect:"fr-pawn",graph:this.cbPawnGraph(t,-1),value:1,abbrev:"",fenAbbrev:"P",epCatch:!1},3:{name:"ipawn-b",aspect:"fr-pawn",graph:this.cbInitialPawnGraph(t,-1),value:1,abbrev:"",fenAbbrev:"P",initial:[{s:-1,p:108},{s:-1,p:109},{s:-1,p:110},{s:-1,p:111},{s:-1,p:112},{s:-1,p:113},{s:-1,p:114},{s:-1,p:115},{s:-1,p:116},{s:-1,p:117},{s:-1,p:118},{s:-1,p:119}],epTarget:!0,epCatch:!1},4:{name:"knight",aspect:"fr-knight",graph:this.cbKnightGraph(t),value:2.9,abbrev:"N",initial:[{s:1,p:14},{s:1,p:21},{s:-1,p:122},{s:-1,p:129}]},5:{name:"bishop",aspect:"fr-bishop",graph:this.cbBishopGraph(t),value:3.1,abbrev:"B",initial:[{s:1,p:15},{s:1,p:20},{s:-1,p:123},{s:-1,p:128}]},6:{name:"rook",aspect:"fr-rook",graph:this.cbRookGraph(t),value:5,abbrev:"R",initial:[{s:1,p:13},{s:1,p:22},{s:-1,p:121},{s:-1,p:130}],castle:!0},7:{name:"queen",aspect:"fr-queen",graph:this.cbQueenGraph(t),value:9,abbrev:"Q",initial:[{s:1,p:18},{s:-1,p:126}]},8:{name:"king",aspect:"fr-king",isKing:!0,graph:this.cbKingGraph(t),abbrev:"K",initial:[{s:1,p:17},{s:-1,p:125}]},9:{name:"cannon",aspect:"fr-cannon2",graph:this.cbXQCannonGraph(t),value:3.5,abbrev:"C",initial:[{s:1,p:0},{s:1,p:11},{s:-1,p:132},{s:-1,p:143}]},10:{name:"elephant",aspect:"fr-elephant",graph:this.cbShortRangeGraph(t,[[-1,-1],[-1,1],[1,-1],[1,1],[-2,-2],[-2,2],[2,-2],[2,2]]),value:2.5,abbrev:"E",initial:[{s:1,p:12},{s:1,p:23},{s:-1,p:120},{s:-1,p:131}]},11:{name:"prince-w",aspect:"fr-admiral",graph:e(1),value:3,epTarget:!0,abbrev:"I",initial:[{s:1,p:16},{s:1,p:19}]},12:{name:"prince-b",aspect:"fr-admiral",graph:e(-1),epTarget:!0,value:3,abbrev:"I",initial:[{s:-1,p:124},{s:-1,p:127}]},13:{name:"camel",aspect:"fr-camel",graph:this.cbShortRangeGraph(t,[[-3,-1],[-3,1],[3,-1],[3,1],[1,3],[1,-3],[-1,3],[-1,-3]]),value:2,abbrev:"M",initial:[{s:1,p:1},{s:1,p:10},{s:-1,p:133},{s:-1,p:142}]},14:{name:"lion",aspect:"fr-lion",graph:this.cbShortRangeGraph(t,[[-1,-1],[-1,1],[1,-1],[1,1],[1,0],[0,1],[-1,0],[0,-1],[-2,0],[-2,-1],[-2,-2],[-1,-2],[0,-2],[1,-2],[2,-2],[2,-1],[2,0],[2,1],[2,2],[1,2],[0,2],[-1,2],[-2,2],[-2,1]]),value:7.5,abbrev:"L",initial:[{s:1,p:5},{s:-1,p:137}]},15:{name:"eagle",aspect:"fr-eagle",graph:a(),value:8,abbrev:"A",initial:[{s:1,p:6},{s:-1,p:138}]},16:{name:"unicorn",aspect:"fr-unicorn",graph:this.cbMergeGraphs(t,this.cbShortRangeGraph(t,[[-2,-2],[-2,0],[-2,2],[0,2],[2,2],[2,0],[2,-2],[0,-2],[-3,-3],[-3,0],[-3,3],[0,3],[3,3],[3,0],[3,-3],[0,-3]]),this.cbKingGraph(t),this.cbKnightGraph(t),this.cbLongRangeGraph(t,[[2,-1],[2,1],[-2,-1],[-2,1],[-1,2],[-1,-2],[1,2],[1,-2]]),this.cbShortRangeGraph(t,[[-3,-1],[-3,1],[3,-1],[3,1],[1,3],[1,-3],[-1,3],[-1,-3]])),value:13,abbrev:"Pa",initial:[{s:1,p:2},{s:-1,p:134}]},17:{name:"dragon",aspect:"fr-dragon",graph:this.cbMergeGraphs(t,this.cbQueenGraph(t),a()),value:14,abbrev:"D",initial:[{s:1,p:4},{s:-1,p:136}]},18:{name:"lighthouse",aspect:"fr-lighthouse",graph:this.cbMergeGraphs(t,this.cbQueenGraph(t),this.cbXQCannonGraph(t),this.cbLongRangeGraph(t,[[1,-1],[-1,-1],[-1,1],[1,1]],null,this.cbConstants.FLAG_MOVE|this.cbConstants.FLAG_SCREEN_CAPTURE)),value:12,abbrev:"LH",initial:[{s:1,p:3},{s:-1,p:135}]},19:{name:"emperor",aspect:"fr-crowned-rook",graph:this.cbMergeGraphs(t,this.cbQueenGraph(t),this.cbXQCannonGraph(t),this.cbLongRangeGraph(t,[[1,-1],[-1,-1],[-1,1],[1,1]],null,this.cbConstants.FLAG_MOVE|this.cbConstants.FLAG_SCREEN_CAPTURE),a(),this.cbShortRangeGraph(t,[[-2,-2],[-2,0],[-2,2],[0,2],[2,2],[2,0],[2,-2],[0,-2],[-3,-3],[-3,0],[-3,3],[0,3],[3,3],[3,0],[3,-3],[0,-3]]),this.cbKnightGraph(t),this.cbLongRangeGraph(t,[[2,-1],[2,1],[-2,-1],[-2,1],[-1,2],[-1,-2],[1,2],[1,-2]]),this.cbShortRangeGraph(t,[[-3,-1],[-3,1],[3,-1],[3,1],[1,3],[1,-3],[-1,3],[-1,-3]])),value:20,abbrev:"EM"},20:{name:"commander",aspect:"fr-amazon",graph:this.cbMergeGraphs(t,this.cbQueenGraph(t),this.cbKnightGraph(t)),value:13,abbrev:"Co",initial:[{s:1,p:7},{s:-1,p:139}]},21:{name:"cardinal",aspect:"fr-cardinal",graph:this.cbMergeGraphs(t,this.cbBishopGraph(t),this.cbKnightGraph(t)),value:6,abbrev:"Ca",initial:[{s:1,p:9},{s:-1,p:141}]},22:{name:"chancellor",aspect:"fr-marshall",graph:this.cbMergeGraphs(t,this.cbRookGraph(t),this.cbKnightGraph(t)),value:9,abbrev:"Ch",initial:[{s:1,p:8},{s:-1,p:140}],castle:!0}},promote:function(e,a,r){return 1==a.t&&11==t.R(r.t)?[14,15,20,16,17,18]:3==a.t&&0==t.R(r.t)?[14,15,20,16,17,18]:11==a.t&&11==t.R(r.t)?[19]:12==a.t&&0==t.R(r.t)?[19]:[]}}};var e={1:{17:[[15,16],[19,18],[41,29],[39,28],[43,30],[3,4,16],[27,16,28],[40,28,29],[42,29,30],[31,18,30],[7,18,6]],5:[[3,4],[7,8],[29,17],[27,16],[31,18],[15,4,6],[28,16,17],[30,17,18],[19,6,18]]},"-1":{125:[[127,126],[123,124],[101,113],[99,112],[103,114],[135,124,136],[111,112,124],[100,112,113],[102,113,114],[115,114,126],[139,126,138]],137:[[139,138],[135,136],[113,125],[115,126],[111,124],[127,126,138],[114,125,126],[112,124,125],[123,124,136]]}},a=Model.Board.GenerateMoves;Model.Board.GenerateMoves=function(t){if(void 0===this.setupState)return void(this.mMoves=[{}]);if("setup"!=this.setupState){a.apply(this,arguments);var r=this.pieces[this.board[this.kings[this.mWho]]];if(!r.m&&!this.check)for(var i=e[this.mWho][r.p],s=0;s<i.length;s++){var n=i[s];if(!(this.board[n[0]]>=0)){for(var o=!0,h=!1,p=0;p<n.length;p++){var c=n[p],l=this.board[c];this.board[c]=-1;var u=this.cbQuickApply(t,{f:r.p,t:c}),b=this.cbGetAttackers(t,c,this.mWho,!0).length>0;if(b||0!=p||(h=this.cbGetAttackers(t,this.kings[-this.mWho],-this.mWho,!0).length>0),this.cbQuickUnapply(t,u),this.board[c]=l,this.cbIntegrity(t),b){o=!1;break}}o&&this.mMoves.push({f:r.p,t:n[0],c:null,ck:h,a:"K"})}}}else{this.mMoves=[];for(var s=0;s<12;s++)this.mMoves.push({setup:s})}};var r=Model.Board.CopyFrom;Model.Board.CopyFrom=function(t){r.apply(this,arguments),this.setupState=t.setupState};var i=Model.Board.Evaluate;Model.Board.Evaluate=function(t){void 0!==this.setupState&&"setup"!=this.setupState&&i.apply(this,arguments)};var s=Model.Board.ApplyMove;Model.Board.ApplyMove=function(t,e){if(void 0===this.setupState)this.setupState="setup";else if("setup"==this.setupState){var a,r=this,i={1:{K:17,Q:18,L:5,E:6},"-1":{K:125,Q:126,L:137,E:138}},n={1:{},"-1":{}};["1","-1"].forEach(function(t){for(var e in i[t])n[t][e]=r.board[i[t][e]]}),[5,6,17,18,125,126,137,138].forEach(function(e){var i=r.board[e];r.board[e]=-1,a=r.pieces[i],a.p=-1,r.zSign=t.zobrist.update(r.zSign,"board",a.t,e)});var o=e.setup,h={};o/6<1?(this.board[17]=n[1].K,a=this.pieces[n[1].K],a.p=17,r.zSign=t.zobrist.update(r.zSign,"board",a.t,17),this.kings[1]=17,h[1]=[18,5,6],this.board[125]=n[-1].K,a=this.pieces[n[-1].K],a.p=125,r.zSign=t.zobrist.update(r.zSign,"board",a.t,125),this.kings[-1]=125,h[-1]=[126,137,138]):(this.board[5]=n[1].K,a=this.pieces[n[1].K],a.p=5,r.zSign=t.zobrist.update(r.zSign,"board",a.t,5),this.kings[1]=5,h[1]=[17,18,6],this.board[137]=n[-1].K,a=this.pieces[n[-1].K],a.p=137,r.zSign=t.zobrist.update(r.zSign,"board",a.t,137),this.kings[-1]=137,h[-1]=[125,126,138]),o%=6;var p=Math.floor(o/2);this.board[h[1][p]]=n[1].Q,a=this.pieces[n[1].Q],a.p=h[1][p],r.zSign=t.zobrist.update(r.zSign,"board",a.t,h[1][p]),h[1].splice(p,1),this.board[h[-1][p]]=n[-1].Q,a=this.pieces[n[-1].Q],a.p=h[-1][p],r.zSign=t.zobrist.update(r.zSign,"board",a.t,h[-1][p]),h[-1].splice(p,1);var c,l;o%=2,0==o?(c=0,l=1):(c=1,l=0),this.board[h[1][c]]=n[1].E,a=this.pieces[n[1].E], a.p=h[1][c],r.zSign=t.zobrist.update(r.zSign,"board",a.t,h[1][c]),this.board[h[1][l]]=n[1].L,a=this.pieces[n[1].L],a.p=h[1][l],r.zSign=t.zobrist.update(r.zSign,"board",a.t,h[1][l]),this.board[h[-1][c]]=n[-1].E,a=this.pieces[n[-1].E],a.p=h[-1][c],r.zSign=t.zobrist.update(r.zSign,"board",a.t,h[-1][c]),this.board[h[-1][l]]=n[-1].L,a=this.pieces[n[-1].L],a.p=h[-1][l],r.zSign=t.zobrist.update(r.zSign,"board",a.t,h[1][l]),this.setupState="done"}else s.apply(this,arguments)};var n=Model.Move.ToString;Model.Move.ToString=function(){return void 0===this.f?void 0===this.setup?"--":"#"+this.setup:n.apply(this,arguments)};var o=Model.Board.CompactMoveString;Model.Board.CompactMoveString=function(t,e,a){return"function"!=typeof e.ToString&&(e=t.CreateMove(e)),void 0===this.setupState||"setup"==this.setupState?e.ToString():o.apply(this,arguments)},Model.Board.StaticGenerateMoves=function(t){return"setup"==this.setupState?[t.CreateMove({setup:Math.floor(12*Math.random())})]:null}}();