aboutsummaryrefslogtreecommitdiff
path: root/gameserver/gameserver.js
diff options
context:
space:
mode:
Diffstat (limited to 'gameserver/gameserver.js')
-rwxr-xr-xgameserver/gameserver.js33
1 files changed, 30 insertions, 3 deletions
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\"");
}
});
});