UNPKG

jocly

Version:

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

1 lines 7.07 kB
exports.model=Model={Game:{},Board:{},Move:{}},Model.Game.InitGame=function(){function t(e,s,o,a){for(var r=i.g.Graph[o[o.length-1]],h=0;h<4;h++){var n=r[h];if(n>=0&&!a[n])if(0==s){e[n]||(e[n]=[]);for(var p=[],m=0;m<o.length;m++)p.push(o[m]);p.push(n),e[n].push(p)}else o.push(n),a[n]=!0,t(e,s-1,o,a),delete a[n],o.pop()}}var i=this;this.g.Graph=[],this.g.CValue=[];for(var e=[[1,0],[-1,0],[0,1],[0,-1]],s=0;s<this.mOptions.height;s++)for(var o=0;o<this.mOptions.width;o++){for(var a=[],r=0;r<e.length;r++){var h=e[r][0],n=e[r][1],p=s+n,m=o+h;p>=0&&p<this.mOptions.height&&m>=0&&m<this.mOptions.width?a.push(p*this.mOptions.width+m):a.push(-1)}this.g.Graph.push(a),this.g.CValue[s*this.mOptions.width+o]=parseInt(this.mOptions.initial[s].charAt(o))}this.g.Targets=[];for(var d=0;d<this.g.Graph.length;d++){var l={},v={};v[d]=!0,t(l,this.g.CValue[d]-1,[d],v),this.g.Targets[d]=l}this.g.Orients={NW:{angle:-90},NE:{angle:180},SW:{angle:0},SE:{angle:90}};for(var u=[],f=0;f<this.g.Graph.length;f++){u.push([]);for(var c=0;c<this.g.Graph.length;c++)u[f].push(f==c?0:-1)}for(;;){for(var g=0,f=0;f<this.g.Graph.length;f++)for(var c=0;c<this.g.Graph.length;c++)if(u[f][c]>=0){var y=this.g.Targets[c];for(var O in y)if(y.hasOwnProperty(O)){var C=parseInt(O);u[f][C]<0&&(u[f][C]=u[f][c]+1,g++)}}if(0==g)break}this.g.Dist=u},Model.Game.DestroyGame=function(){},Model.Move.Init=function(t){void 0!==t&&this.CopyFrom(t)},Model.Move.ToString=function(){var t=[];if(this.o&&t.push("o"+this.o),this.p){for(var i=0;i<this.p.d.length;i++)t.push("d"+this.p.d[i]);for(var i=0;i<this.p.r.length;i++)t.push("r"+this.p.r[i])}return this.m&&t.push("m"+this.m[0]+">"+this.m[1]),void 0!==this.i&&t.push("p"+this.i),t.join(" ")},Model.Move.CopyFrom=function(t){Object.assign(this,JSON.parse(JSON.stringify(t)))},Model.Board.Init=function(t){},Model.Board.InitialPosition=function(t){for(var i=[],e=[],s=0;s<t.g.Graph.length;s++)e[s]=-1;this.pieces=i,this.board=e,this.stage=1,this.mana=-1,this.roninOut={1:0,"-1":0},this.damyoOut={1:0,"-1":0}},Model.Board._getRCCoord=function(t,i,e){var s=Math.floor(i/t.mOptions.width),o=i%t.mOptions.width;if(arguments.length<3&&(e=this.orient),"NE"==e||"SW"==e){var a=s;s=o,o=a}return"NE"!=e&&"NW"!=e||(o=t.mOptions.width-1-o),"NE"!=e&&"SE"!=e||(s=t.mOptions.height-1-s),[s,o]},Model.Board.manaCreatePlacement=function(t,i){for(var e=[],s=0;s<t.g.Graph.length;s++){var o=this._getRCCoord(t,s,i);(-1==this.mWho&&o[1]<=1||1==this.mWho&&o[1]>=t.mOptions.width-2)&&e.push(s)}for(var a={d:[],r:[]},r=0;r<t.mOptions.damyoCount;r++){var h=t.Random(e.length),s=e[h];e.splice(h,1),a.d.push(s)}for(var r=0;r<t.mOptions.roninCount;r++){var h=t.Random(e.length),s=e[h];e.splice(h,1),a.r.push(s)}return a},Model.Board.GenerateMoves=function(t){if(this.mMoves=[],1==this.stage)for(var i=["NE","SE","SW","NW"],e=0;e<t.mOptions.stage1start;e++){var s=i[t.Random(4)],o=this.manaCreatePlacement(t,s);this.mMoves.push({o:s,p:o})}else if(2==this.stage)for(var e=0;e<t.mOptions.stage2start;e++){var o=this.manaCreatePlacement(t,this.orient);this.mMoves.push({p:o})}else{var a=this.manaMovablePieces(t),r=[],h=-1;this.mana>=0&&(h=t.g.CValue[this.mana]);for(var e in a)if(a.hasOwnProperty(e)){var n=this.pieces[e];if(h<0||t.g.CValue[n.p]==h)for(var p in a[e])a[e].hasOwnProperty(p)&&r.push({m:[n.p,parseInt(p)]})}if(0==r.length){for(var e in a)if(a.hasOwnProperty(e)){var n=this.pieces[e];for(var p in a[e])a[e].hasOwnProperty(p)&&r.push({m:[n.p,parseInt(p)]})}if(this.roninOut[this.mWho]>0)for(var p=0;p<t.g.Graph.length;p++)this.board[p]<0&&(t.mOptions.insertAnywhere||t.g.CValue[p]==h)&&r.push({i:p})}this.mMoves=r}},Model.Board.Evaluate=function(aGame,aFinishOnly,aTopLevel){if(this.mEvaluation=0,this.damyoOut[JocGame.PLAYER_A]>=aGame.mOptions.damyoKillWin)return this.mFinished=!0,void(this.mWinner=JocGame.PLAYER_B);if(this.damyoOut[JocGame.PLAYER_B]>=aGame.mOptions.damyoKillWin)return this.mFinished=!0,void(this.mWinner=JocGame.PLAYER_A);for(var cellTypesPieceCount={1:{1:0,2:0,3:0},"-1":{1:0,2:0,3:0}},cellTypesDamyoCount={1:{1:0,2:0,3:0},"-1":{1:0,2:0,3:0}},damyoPoss={1:[],"-1":[]},pIndex=0;pIndex<this.pieces.length;pIndex++){var piece=this.pieces[pIndex];piece.p>=0&&(cellTypesPieceCount[piece.s][aGame.g.CValue[piece.p]]++,"d"==piece.t&&(cellTypesDamyoCount[piece.s][aGame.g.CValue[piece.p]]++,damyoPoss[piece.s].push(piece.p)))}for(var pos=0;pos<aGame.g.Graph.length;pos++){var pIndex=this.board[pos];if(pIndex>=0)var piece=this.pieces[pIndex]}for(var typeCount={1:0,"-1":0},who=-1;who<=1;who+=2)for(var type=1;type<=3;type++)cellTypesPieceCount[who][type]>0&&typeCount[who]++;for(var sameAsDamyo={1:0,"-1":0},who=-1;who<=1;who+=2)for(var type=1;type<=3;type++)sameAsDamyo[who]+=cellTypesDamyoCount[who][type]*cellTypesPieceCount[who][type];for(var roninCount={1:0,"-1":0},who=-1;who<=1;who+=2)roninCount[who]=aGame.mOptions.roninCount-this.roninOut[who];for(var dist2Damyo={1:{dist:0,invSquare:0},"-1":{dist:0,invSquare:0}},pIndex=0;pIndex<this.pieces.length;pIndex++){var piece=this.pieces[pIndex];if(piece.p>=0&&"r"==piece.t){for(var minDist=-1,i=0;i<damyoPoss[-piece.s].length;i++){var damyoPos=damyoPoss[-piece.s][i],dist=aGame.g.Dist[piece.p][damyoPos];(minDist<0||dist<minDist)&&(minDist=dist)}dist2Damyo[piece.s].dist+=minDist,dist2Damyo[piece.s].invSquare+=1/(minDist*minDist)}}var eval=0,factors=aGame.mOptions.factors;eval+=factors.typeCount[typeCount[1]]-factors.typeCount[typeCount[-1]],eval+=factors.sameAsDamyo*(sameAsDamyo[1]-sameAsDamyo[-1]),eval+=factors.roninCount[roninCount[1]]-factors.roninCount[roninCount[-1]],eval+=factors.dist2Damyo*(dist2Damyo[1].dist-dist2Damyo[-1].dist),eval+=factors.dist2DamyoInvSquare*(dist2Damyo[1].invSquare-dist2Damyo[-1].invSquare),isNaN(eval),this.mEvaluation=eval},Model.Board.ApplyMove=function(t,i){if(1==this.stage&&(this.orient=i.o),1==this.stage||2==this.stage){for(var e=0,s=0;s<i.p.d.length;s++){var o=i.p.d[s],a={s:this.mWho,t:"d",p:o,i:e++};this.pieces.push(a),this.board[o]=this.pieces.length-1}e=0;for(var s=0;s<i.p.r.length;s++){var o=i.p.r[s],a={s:this.mWho,t:"r",p:o,i:e++};this.pieces.push(a),this.board[o]=this.pieces.length-1}this.stage++}if(i.m){var r=this.board[i.m[0]],a=this.pieces[r];this.board[i.m[0]]=-1;var h=this.board[i.m[1]];if(h>=0){var n=this.pieces[h];n.p=-1,"r"==n.t?this.roninOut[-this.mWho]++:"d"==n.t&&this.damyoOut[-this.mWho]++}a.p=i.m[1],this.board[i.m[1]]=r,this.mana=i.m[1]}if(void 0!==i.i){var a,s;for(s=0;s<this.pieces.length&&(a=this.pieces[s],!("r"==a.t&&a.s==this.mWho&&a.p<0));s++);a.p=i.i,this.board[i.i]=s,this.mana=i.i,this.roninOut[this.mWho]--}},Model.Board.IsValidMove=function(t,i){return!0},Model.Board.manaMovablePieces=function(t){for(var i={},e=0;e<this.pieces.length;e++){var s=this.pieces[e];if(s.s==this.mWho){var o=s.p;for(var a in t.g.Targets[o])if(t.g.Targets[o].hasOwnProperty(a)){if(this.board[a]>=0&&this.pieces[this.board[a]].s==this.mWho)continue;for(var r=null,h=t.g.Targets[o][a],n=0;n<h.length;n++){for(var p=!0,m=h[n],d=1;d<m.length-1;d++)if(this.board[m[d]]>=0){p=!1;break}if(p){r=m;break}}r&&(i[e]||(i[e]={}),i[e][a]=r)}}}return i};