From 1697da112a9b9f529fad2f54c62aecd7bbb614e6 Mon Sep 17 00:00:00 2001 From: Kyle Gunger Date: Fri, 3 Apr 2020 16:44:23 -0400 Subject: [WEBCARDS] Update some webcards stuff --- webcards/scripts/client.js | 109 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 webcards/scripts/client.js (limited to 'webcards/scripts/client.js') diff --git a/webcards/scripts/client.js b/webcards/scripts/client.js new file mode 100644 index 0000000..ea62e26 --- /dev/null +++ b/webcards/scripts/client.js @@ -0,0 +1,109 @@ +// Client acts as the message hub for the whole game. +// WebSocket messages come into Client and Client redirects them to the lobby or table based on the state of the game. +// Client also performs the handshake for first starting the connection and messages everyone if the connection errors or closes. +function Client(serveraddr, game) { + this.state = "handshake"; + + this.soc = new SockWorker(serveraddr, "1", this.cb.bind(this)); + + this.lob = new Lobby(document.getElementsByClassName("lobby")[0], this.soc); + this.tab = new Table(document.getElementsByClassName("table")[0], this.soc); + + this.game = game; +} + +Client.prototype = { + // Initialize the connection + init: function() { + this.soc.init(); + }, + + // Entry point for a message from the server. + // If it's a close message, we close the game if it is open and change the lobby to reflect the error/close. + cb: function(m) { + console.log(m); + + if(m.type == "error" || m.type == "closed") { + var t = m.type; + t = t[0].toUpperCase() + t.slice(1) + this.lob.setState(t, "#D00", this.soc.server); + this.tab.handleClose(); + return; + } + + switch(this.state) { + case "handshake": + this.handshake(m); + break; + case "lobby": + this.lobby(m); + break; + case "game": + break; + } + }, + + // Called when negotiating with the server for the first time and we are determining versions + handshake: function(m) { + switch (m.type) { + case "verr": + this.soc.close(); + alert(`Error connecting to server: version of client (${this.version}) not accepted.`); + console.error("Error connecting to server: version of client (${this.version}) not accepted."); + console.error(m.data); + return; + case "lobby": + this.state = "lobby"; + this.soc.send("ready", ""); + return; + } + }, + + // Lobby switch, called when in the lobby and a message arrives from the server + lobby: function (m) { + switch (m.type) { + case "plist": + this.lob.packList(m.data); + break; + case "glist": + this.lob.gameList(m.data, this.game); + this.game = null; + break; + case "players": + this.lob.players(m.data); + break; + case "gdel": + this.lob.removeGame(m.data); + break; + case "gadd": + this.lob.addGame(m.data); + break; + case "pdel": + this.lob.removePlayer(m.data); + break; + case "padd": + this.lob.addPlayer(m.data); + break; + case "pmove": + this.lob.movePlayer(m.data); + break; + } + }, + + // Game switch, called when in game and a message arrives from the server + game: function (m) { + switch (m.type) { + + } + }, + + // Reset the lobby and table, then attempt to reopen the connection to the server. + reset: function() { + this.state = "handshake"; + + this.lob.reset(); + this.tab.reset(); + + this.soc.init(); + } +}; -- cgit v1.2.3