# HG changeset patch # User John "Elwin" Edwards # Date 1342027833 25200 # Node ID 597e9477b8ae1409f58b7fd3c5755c1ed51c2cb3 # Parent 104409bf5f03e23af71fef6afb774a84f7dc5db6 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. diff -r 104409bf5f03 -r 597e9477b8ae rlgterm.js --- a/rlgterm.js Wed Jul 11 07:37:56 2012 -0700 +++ b/rlgterm.js Wed Jul 11 10:30:33 2012 -0700 @@ -562,14 +562,14 @@ else if (reply.stat[gname] == "0") acttext = "Start a game"; else if (reply.stat[gname] == "p") - acttext = "Game in progress"; + acttext = "Reconnect"; else if (reply.stat[gname] == "d") acttext = "Game in progress (dgl)"; else continue; var button = document.createElement("span"); button.appendChild(document.createTextNode(acttext)); - if ("s0".indexOf(reply.stat[gname]) >= 0) { + if ("s0p".indexOf(reply.stat[gname]) >= 0) { button.onclick = makeStarter(gname); button.className = "ibutton"; } @@ -628,9 +628,20 @@ } else if (reply.t == 'E') { debug(1, "Could not start game: " + reply.s); - message("Your game could not be started: " + reply.s); if (reply.c == 1) { logout(); + message("The server forgot about you, please log in again."); + } + else if (reply.c == 4) { + message("You can't play that game because it is currently being " + + "played over SSH."); + } + else if (reply.c == 7) { + message("The game is being saved, try again in a few seconds."); + } + else { + message("The server says it can't start your game because \"" + + reply.s + "\". This is probably a bug."); } } }; diff -r 104409bf5f03 -r 597e9477b8ae rlgwebd.js --- a/rlgwebd.js Wed Jul 11 07:37:56 2012 -0700 +++ b/rlgwebd.js Wed Jul 11 10:30:33 2012 -0700 @@ -309,6 +309,23 @@ } 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 @@ } // 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 @@ 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, []); }