#!/usr/bin/env node "use strict"; var fs=require("fs"), http=require("http"), util=require("util"), assert=require("assert"), WebSocketServer=require("ws").Server, Naampje=require("naampje").name; var HTTPPORT=83,WSPORT=8383; var conns=[],games=[]; var genid=(function(){ var $=1; return function(){return $++;}; })(); function findby(a,key,val){ for(var i=0;i=5||y2<0||y2>=5||bd[5*y2+x2]!=0)return 5*y+x; x=x2; y=y2; } } function applyMove(bd,mv){ var neuidx=-1,newidx,i; bd=bd.slice(); for(i=0;i<25;i++)if(bd[i]==3){neuidx=i;break;} assert(neuidx!=-1); if(mv[0]!=-1){ newidx=idxAfterSlide(bd,neuidx,mv[0]); bd[newidx]=3; bd[neuidx]=0; } if(mv[1]!=-1&&mv[2]!=-1){ newidx=idxAfterSlide(bd,mv[1],mv[2]); bd[newidx]=bd[mv[1]]; bd[mv[1]]=0; } return bd; } function moveIsLegal(bd,mv,forpl){ var neuidx=-1,newidx,i; if(bd[mv[1]]!=forpl)return false; for(i=0;i<25;i++)if(bd[i]==3){neuidx=i;break;} assert(neuidx!=-1); if(mv[0]!=-1){ newidx=idxAfterSlide(bd,neuidx,mv[0]); if(newidx==neuidx)return false; } newidx=idxAfterSlide(applyMove(bd,[mv[0],-1,-1]),mv[1],mv[2]); if(newidx==mv[1])return false; 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,won; switch(cmd[0]){ case "nick": conn.ws.send("nick \""+conn.nick+"\""); break; /*case "list_free_users": list=[]; for(i=0;i=8) || mv[1]==undefined||isNaN(mv[1])||mv[1]%1!=0||mv[1]<0||mv[1]>=25|| mv[2]==undefined||isNaN(mv[2])||mv[2]%1!=0||mv[2]<0||mv[2]>=8){ conn.ws.send("game_doturn [false,\"Invalid move\"]"); break; } if(!moveIsLegal(game.board,mv,game.onturn)){ conn.ws.send("game_doturn [false,\"Illegal move\"]"); break; } game.board=applyMove(game.board,mv); console.log("new board:"); console.log(game.board); 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("other_turn "+JSON.stringify(mv)); won=checkWin(game.board,3-game.onturn); //player that just moved if(won){ saveFinishedBoard(game.board); 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: conn.ws.send("error "+cmd[0]); break; } } new WebSocketServer({port:WSPORT}).on("connection",function(ws){ var conn=new Connection(ws); conns.push(conn); ws.on("message",function(msg){ console.log(msg,util.inspect(conn,{depth:0})); handleMessage(conn,msg); }); ws.on("open",function(){ //hi! }); ws.on("close",function(){ if(conn.gameid!=null){ var gameidx=findby(games,"id",conn.gameid); var game=games[gameidx]; var otherplayeridx=findby(conns,"id",game.i1==conn.id?game.i2:game.i1) console.log("otherplayeridx="+otherplayeridx); conns[otherplayeridx].gameid=null; conn.gameid=null; games.splice(gameidx,1); conns[otherplayeridx].ws.send("game_stop \"Other player quit\""); } }); }); console.log("Websocket server started on port "+WSPORT+"."); http.createServer(function(req,res){ if(req.url=="/"){ res.writeHead(200,{"Content-Type":"text/html"}); res.end(String(fs.readFileSync("gameserver.html"))); } else { res.writeHead(404,{"Content-Type":"text/plain"}); res.end("404 Not found"); } }).listen(HTTPPORT); console.log("HTTP server started on port "+HTTPPORT+".");