diff options
| -rw-r--r-- | gameserver/gameserver.html | 42 | ||||
| -rwxr-xr-x | gameserver/gameserver.js | 33 | 
2 files changed, 62 insertions, 13 deletions
| diff --git a/gameserver/gameserver.html b/gameserver/gameserver.html index d8528ab..7fc27fc 100644 --- a/gameserver/gameserver.html +++ b/gameserver/gameserver.html @@ -74,19 +74,33 @@ function preinit(){  				MOVES.push(arg[1]);  				addmovelistrow(arg[1]);  				nextmove(); -			} else alert(arg[1]); -		} else if(cmd=="your_turn"){ -			canAlreadyTurn=true; -			if(hasInited){ +			} else { +				alert(arg[1]);  				enableClicking(true,isFirstMove&&imPlayer==1); -				isFirstMove=false;  			} +		} else if(cmd=="other_turn"){  			if(arg){  				MOVES.push(arg);  				addmovelistrow(arg);  				nextmove();  			} -		} +		} else if(cmd=="your_turn"){ +			canAlreadyTurn=true; +			if(hasInited){ +				enableClicking(true,isFirstMove&&imPlayer==1); +				isFirstMove=false; +			} +		} else if(cmd=="game_stop"){ +			alert("Game has been stopped:\n"+arg); +			enableClicking(false); +		} else if(cmd=="game_win"){ +			bgcell(neuidx).classList.add("win"); +			if(arg==imPlayer){ +				alert("You have won the game!"); +			} else { +				alert("You have lost the game! Better luck next time."); +			} +		} else alert("Unrecognised message "+msg);  	});  	ws.addEventListener("open",function(){  		ws.send("nick"); @@ -262,8 +276,8 @@ function addmovelistrow(mv,i/*optional*/){  		if(moveidx==target)return;  		while(moveidx<target)nextmove(true);  		while(moveidx>target)prevmove(true); -		setselectedmovelistline(i+1); -	};})(i+1)); +		setselectedmovelistline(target); +	};})(i-1));  	movelisttbody.appendChild(tr);  } @@ -339,7 +353,7 @@ function nextmove(notimeout){  		fgcells[neuidx]=null;  		neuidx=newidx; -		if(moveidx==MOVES.length-1)bgcell(neuidx).classList.add("win"); +		//if(moveidx==MOVES.length-1)bgcell(neuidx).classList.add("win");  	}  	newidx=indexafterslide(MOVES[moveidx][1],MOVES[moveidx][2]); @@ -371,7 +385,9 @@ function prevmove(notimeout){  	if(moveidx==0||!canclick)return false;  	moveidx--; -	if(MOVES[moveidx][0]!=-1&&moveidx==MOVES.length-1)winGlowIdxToRemove=neuidx; +	//if(MOVES[moveidx][0]!=-1&&moveidx==MOVES.length-1)winGlowIdxToRemove=neuidx; +	for(var i=0;i<S*S;i++)if(bgcell(i).classList.contains("win"))break; +	if(i<S*S)winGlowIdxToRemove=i;  	newidx=indexafterslide(MOVES[moveidx][1],MOVES[moveidx][2],true);  	board[MOVES[moveidx][1]]=board[newidx]; @@ -559,6 +575,12 @@ div#movelist tr.selected{  input[type=button].selected{  	background-color:#aaf;  } + +div#nickname{ +	margin-top:10px; +	font-family:Sans-serif; +	font-style:italic; +}  </style>  </head>  <body> diff --git a/gameserver/gameserver.js b/gameserver/gameserver.js index ddc6f0b..8ab4bbc 100755 --- a/gameserver/gameserver.js +++ b/gameserver/gameserver.js @@ -127,8 +127,24 @@ function moveIsLegal(bd,mv,forpl){  	return true;  } +function checkWin(bd,pljustmoved){ +	var i,neuidx=-1,newidx; +	for(i=0;i<25;i++)if(bd[i]==3){neuidx=i;break;} +	assert(neuidx!=-1); +	if(neuidx<5)return 1; +	if(neuidx>=20)return 2; +	for(i=0;i<8;i++){ +		newidx=idxAfterSlide(bd,neuidx,i); +		if(newidx!=neuidx)break; +	} +	if(i==8){ //no shifts of the neutron possible +		return pljustmoved; +	} +	return 0; +} +  function handleMessage(conn,msg){ -	var cmd=msg.split(" "),list,i,game,c2,mv; +	var cmd=msg.split(" "),list,i,game,c2,mv,won;  	switch(cmd[0]){  	case "nick":  		conn.ws.send("nick \""+conn.nick+"\""); @@ -203,10 +219,20 @@ function handleMessage(conn,msg){  		game.board=applyMove(game.board,mv);  		console.log("new board:");  		console.log(game.board); -		game.onturn=3-game.onturn;  		conn.ws.send("game_doturn "+JSON.stringify([true,mv])); +		game.onturn=3-game.onturn;  		c2=conns[findby(conns,"id",conn.id==game.i1?game.i2:game.i1)]; -		c2.ws.send("your_turn "+JSON.stringify(mv)); +		c2.ws.send("other_turn "+JSON.stringify(mv)); +		won=checkWin(game.board,3-game.onturn); //player that just moved +		if(won){ +			conn.ws.send("game_win "+won); +			c2.ws.send("game_win "+won); +			games.splice(findby(games,"id",conn.gameid),1); +			conn.gameid=null; +			c2.gameid=null; +			break; +		} +		c2.ws.send("your_turn true");  		game.firstmove=false;  		break;  	default: @@ -234,6 +260,7 @@ new WebSocketServer({port:WSPORT}).on("connection",function(ws){  			conns[otherplayeridx].gameid=null;  			conn.gameid=null;  			games.splice(gameidx,1); +			conns[otherplayeridx].ws.send("game_stop \"Other player quit\"");  		}  	});  }); | 
