RLG-Web: Allow games to be taken over.

Make it possible to reconnect to a game if the user has left the page
without saving.
This commit is contained in:
John "Elwin" Edwards 2012-07-11 10:30:33 -07:00
parent 8ebcf32a4d
commit 2828b5f33c
2 changed files with 51 additions and 5 deletions

View file

@ -309,6 +309,23 @@ function Player(gamename, lkey, dims, callback) {
}
tslog("Flushing queue for player %s", player.id);
};
this.reset = function () {
/* To be called when the game is taken over. */
if (this.Qtimeout) {
clearTimeout(this.Qtimeout);
this.Qtimeout = null;
}
for (var i = 0; i < this.recvQ.length; i++) {
if (this.recvQ[i] !== undefined) {
this.session.write(this.recvQ[i]);
}
}
this.recvQ = [];
this.nrecv = 0;
this.nsend = 0;
this.sendQ = [{"t": "d", "n": this.nsend++,
"d": this.session.framebuf.toString("hex", 0, this.session.frameoff)}];
};
this.quit = function() {
if (this.alive)
this.session.close();
@ -611,7 +628,9 @@ function startgame(req, res, formdata) {
}
// A callback to pass to the game-in-progress checker.
var launch = function(err, fname) {
if (fname) {
var nodematch = new RegExp("^" + username + ":node:");
if (fname && (fname.match(nodematch) === null)) {
/* It's being played in dgamelaunch. */
sendError(res, 4, null);
tslog("%s is already playing %s", username, gname);
return;
@ -630,7 +649,23 @@ function startgame(req, res, formdata) {
tslog("Unable to allocate TTY for %s", gname);
}
};
new Player(gname, lkey, dims, respondlaunch);
if (fname) {
for (var cid in clients) {
cli = clients[cid];
if ((cli instanceof Player) &&
cli.session.pname == username &&
cli.session.game.uname == gname) {
cli.reset();
respondlaunch(cli, true);
tslog("Game %d has been taken over.", cli.session.sessid);
return;
}
}
sendError(res, 7);
}
else {
new Player(gname, lkey, dims, respondlaunch);
}
};
checkprogress(username, games[gname], launch, []);
}