1 var canvas = document.getElementById("game-canvas");
2 var context = canvas.getContext("2d");
4 var backgroundColor = '#F5DEB3';
5 var gridColor = '#8B4513';
8 var border = canvas.width / 10;
9 var boardWidth = canvas.width - (border * 2);
10 var boardHeight = canvas.height - (border * 2);
12 var cellWidth = boardWidth / (boardSize - 1);
13 var cellHeight = boardHeight / (boardSize - 1);
26 /* get session ID from URI if included */
28 var queryString = location.search
29 let params = new URLSearchParams(queryString)
30 let url_session = parseInt(params.get("session"))
36 console.log("Session ID: " + url_session)
39 for (var i = 0; i < boardSize; i++)
42 for (var j = 0; j < boardSize; j++)
49 // Connect to the websocket
51 const connect = function() {
52 return new Promise((resolve, reject) => {
53 const socketProtocol = (window.location.protocol === 'https:' ? 'wss:' : 'ws:')
54 const port = window.location.port;
55 const socketUrl = `${socketProtocol}//${window.location.hostname}:${port}/ws/`
58 socket = new WebSocket(socketUrl);
60 socket.onopen = (e) => {
61 // Resolve the promise - we are connected
65 socket.onmessage = (msg) => {
66 // Any data from the server can be manipulated here.
67 let parsed = JSON.parse(msg.data);
68 switch (parsed.type) {
70 socket.send(JSON.stringify({
78 console.log("Setting board state");
80 // lazily clean up board and reinit
81 for (var i = 0; i < boardSize; i++) {
82 for (var j = 0; j < boardSize; j++) {
87 // set up board according to db state
88 parsed.data.forEach( function (move, index) {
89 state[move.x][move.y] = move.state;
95 for (var i = 0; i < boardSize; i++) {
96 for (var j = 0; j < boardSize; j++) {
106 socket.onerror = (e) => {
107 // Return an error if any occurs
110 // Try to connect again
117 // check if a websocket is open
118 const isOpen = function(ws) {
119 console.log(ws.readyState);
120 return ws.readyState === ws.OPEN
128 /* draw board square */
129 context.fillStyle = backgroundColor;
130 context.fillRect(0, 0, canvas.width, canvas.height);
132 /* draw board grid */
133 context.fillStyle = gridColor;
134 for (var i = 0; i < boardSize - 1; i++)
136 for (var j = 0; j < boardSize - 1; j++)
139 i * cellWidth + border,
140 j * cellHeight + border,
147 /* draw quarter marks and center mark on grid */
148 var quarter = Math.floor((boardSize - 1) / 4);
150 var markerMargin = (markerSize / 2) + 0.5;
152 context.fillStyle = backgroundColor;
153 if (!!(boardSize % 2))
156 (((boardSize - 1) / 2) * cellWidth) + border - markerMargin,
157 (((boardSize - 1) / 2) * cellWidth) + border - markerMargin,
163 (quarter * cellWidth) + border - markerMargin,
164 (quarter * cellWidth) + border - markerMargin,
169 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
170 (quarter * cellWidth) + border - markerMargin,
175 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
176 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
181 (quarter * cellWidth) + border - markerMargin,
182 (((boardSize - 1) - quarter) * cellWidth) + border - markerMargin,
187 /* draw text labels for grid */
188 var size = canvas.width / 40;
189 var textSpacing = 10;
190 context.fillStyle = '#000000';
191 context.font = size + "px Arial";
193 for (i = 0; i < boardSize; i++)
196 (i + 1), textSpacing,
197 ((canvas.height - border) - (i * cellHeight)) + (size / 3)
200 (i + 1), canvas.width - (size + textSpacing),
201 ((canvas.height - border) - (i * cellHeight)) + (size / 3)
205 (String.fromCharCode(97 + i)),
206 (border + (i * cellHeight) + (size / 3)) - (size / 1.5),
210 (String.fromCharCode(97 + i)),
211 (border + (i * cellHeight) + (size / 3)) - (size / 1.5),
212 canvas.height - (textSpacing * 2)
219 function drawPieces() {
221 for (var i = 0; i < boardSize; i++)
223 for (var j = 0; j < boardSize; j++)
225 switch(state[i][j]) {
228 (i * cellWidth) + border,
229 (j * cellWidth) + border,
230 'rgba(255, 255, 255, 1)'
235 (i * cellWidth) + border,
236 (j * cellWidth) + border,
246 canvas.addEventListener('mousedown', function(evt)
249 // push state change to backend
251 socket.send(JSON.stringify({
257 "state":state[lastX][lastY] > 0 ? 0 : playerStone
261 console.log("Websocket is closed");
268 canvas.addEventListener('mousemove', function(evt)
270 var position = getGridPoint(evt);
272 if ((position.x != lastX) || (position.y != lastY))
276 ((position.x >=0) && (position.x < boardSize)) &&
277 ((position.y >=0) && (position.y < boardSize))
280 (position.x * cellWidth) + border,
281 (position.y * cellWidth) + border,
290 function placeStone(x, y, color)
292 var radius = cellWidth / 2;
295 context.arc(x, y, radius, 0, 2 * Math.PI, false);
296 context.fillStyle = color;
298 context.lineWidth = 5;
301 function getGridPoint(evt)
303 var rect = canvas.getBoundingClientRect();
306 (evt.clientX-border-rect.left) / (rect.right-2*border-rect.left) * boardWidth
309 (evt.clientY-border-rect.top) / (rect.bottom-2*border-rect.top) * boardHeight
312 var roundX = Math.round(x / cellWidth);
313 var roundY = Math.round(y / cellHeight);
322 document.getElementById("new").onclick = function () {
323 // new game, new session, etc
324 socket.send(JSON.stringify({
332 const stones = document.getElementById("stones");
333 playerStone = stones.selectedIndex;
334 stones.onchange = function () {
335 // let player pick stone type
336 playerStone = stones.selectedIndex;
337 console.log(`Player changed stone to ${playerStone}`);