class Chip { constructor(obj1) { this.obj = obj1; } get x() { return this.obj.attr("data-x"); } get y() { return this.obj.attr("data-y"); } get uid() { return this.obj.attr("data-uid"); } get color() { return this.obj.attr("data-color"); } set x(x) { this.obj.attr("data-x", x); } set y(y) { this.obj.attr("data-y", y); } set uid(uid) { this.obj.attr("data-uid", uid); } set color(color) { this.obj.attr("data-color", color); } get dom() { return this.obj; } } class Board { constructor() { this.board_chips = []; } get chips() { return this.board_chips; } set chips(chips) { this.board_chips = chips; } } const top_offset = 18; const board = new Board(); var socket = null; function disconnect() { if (socket !== null) { socket.close(); } console.log("Disconnected"); } function sendMessage(message, type) { socket.send(JSON.stringify({ 'type': type, 'body': JSON.stringify(message), 'accessToken': $("api-tag").attr("data-access-token"), 'uid': $("api-tag").attr("data-uid"), 'roomId': $("api-tag").attr("data-room-id") })); } function jsonParseFixer(data) { if( data == undefined ) return undefined; if( (typeof data) == "object" ) { if(data.length != undefined && data.length == 2 && typeof (data[0]) == "string" && ( data[0].startsWith("com.alterdekim.") || data[0].startsWith("java.util."))) { // array data = jsonParseFixer(data[1]); } else if(data.length != undefined) { for(let i = 0; i < data.length; i++) { data[i] = jsonParseFixer(data[i]); } } else { // object let k = Object.keys(data); for( let i = 0; i < k.length; i++ ) { data[k[i]] = jsonParseFixer(data[k[i]]); } } } return data; } $(document).ready(function() { let chips = []; $(".chip").each(function() { chips.push(new Chip($(this))); }); board.chips = chips; socket = new SockJS('/websocket'); socket.onopen = function() { $("#loading").css("display", "none"); console.log('open'); sendMessage({}, 'InfoRequest'); }; socket.onmessage = function(e) { //console.log('message', e.data); showMessage(jsonParseFixer(JSON.parse(e.data))); }; socket.onclose = function() { console.log('close'); window.location.assign("/games"); }; }); function showMessage(message) { console.log('GOT IT'); console.log(message.body); let v = jsonParseFixer(JSON.parse(message.body)); switch(message.type) { case 'PlayersList': parsePlayersList(v); break; case 'BoardGUI': parseBoardGUI(v); break; case 'ChangeBoardTileState': changeBoardState(v); break; case 'AssignChip': assignChip(v); break; case 'ChipMove': chipMove(v); break; case 'PlayerColor': playerColor(v); break; case 'ShowDialog': showDialog(v); break; } } function clamp(number, min, max) { return Math.max(min, Math.min(number, max)); } function chipMove(body) { let nc = board.chips.find((c) => c.uid == body.uid); if( nc == undefined ) return; nc.x = body.x; nc.y = body.y; moveChips(); } function showDialog(body) { let title = body.dialogTitle; let descr = body.dialogDescription; if( body.actionDialogType == "Buttons" ) { let btns = body.actionDialogBody.value; let html_btns = ''; for(let i = 0; i < btns.length; i++) { let btn = btns[i]; html_btns += '
'+btn.buttonText+'
'; } $("#twobtns").html(html_btns); } $("#dialog").css("display", ""); $("#onebtn").css("display", "none"); } function playerColor(body) { $(".player").each(function() { if( $(this).attr("data-pid") == body.playerId ) { $(this).css("background-color", body.color); return; } $(this).css("background-color", ""); }); } const corners = [ {x: 0, y: 0}, {x: 10, y: 0}, {x: 10, y: 10}, {x: 0, y: 10} ]; const chips_margins = [[], [{top: 40, left: 20}], [{top: 25, left: 20}, {top: 50, left: 20}], [{top: 20, left: 20}, {top: 45, left: 20}, {top: 70, left: 20}], [{top: 20, left: 20}, {top: 45, left: 28}, {top: 70, left: 20}, {top: 45, left: 8}], [{top: 20, left: 20}, {top: 45, left: 25}, {top: 70, left: 20}, {top: 70, left: 10}, {top: 45, left: 10}] ]; function distinct(arr) { for(let i = 0; i < arr.length; i++) { let a = arr[i]; let cnt = 0; for(let u = 0; u < arr.length; u++) { if(a.x == arr[u].x && a.y == arr[u].y) { cnt++; } } if( cnt > 1 ) { arr.splice(i, 1); i = 0; } } return arr; } function includes(pos) { for(let i = 0; i < corners.length; i++) { if( pos.x == corners[i].x && pos.y == corners[i].y ) { return true; } } return false; } function moveChipTo(chip) { $(chip.dom).css("background-color", chip.color); let offsetY = (Math.max(chip.y-1, 0) * 55) + (chip.y * 2) + (clamp(chip.y, 0, 1) * 100) + 18; let offsetX = (Math.max(chip.x-1, 0) * 55) + (chip.x * 2) + (clamp(chip.x, 0, 1) * 100); let a = board.chips.filter((c) => c.x == chip.x && c.y == chip.y && c.uid != 0); let num = -1; for( let i = 0; i < a.length; i++ ) { if(a[i].uid == chip.uid) { num = i; break; } } let mm = refreshChip({x: chip.x, y: chip.y})[num]; $(chip.dom).animate({marginTop: offsetY + mm.marginTop, marginLeft: offsetX + mm.marginLeft}, 1000); } function moveChips() { for(let i = 0; i < board.chips.length; i++ ) { let chip = board.chips[i]; if( chip.uid == 0 ) continue; moveChipTo(chip); } } function refreshChip(position) { let chips_coords = []; let a = board.chips.filter((c) => c.x == position.x && c.y == position.y && c.uid != 0); if( includes(position) ) { switch(a.length) { case 1: chips_coords[0] = {marginTop: 40, marginLeft: 40}; break; case 2: chips_coords[0] = {marginTop: 20, marginLeft: 40}; chips_coords[1] = {marginTop: 60, marginLeft: 40}; break; case 3: chips_coords[0] = {marginTop: 40, marginLeft: 15}; chips_coords[1] = {marginTop: 40, marginLeft: 40}; chips_coords[2] = {marginTop: 40, marginLeft: 65}; break; case 4: chips_coords[0] = {marginTop: 15, marginLeft: 20}; chips_coords[1] = {marginTop: 15, marginLeft: 60}; chips_coords[2] = {marginTop: 55, marginLeft: 20}; chips_coords[3] = {marginTop: 55, marginLeft: 60}; break; case 5: chips_coords[0] = {marginTop: 15, marginLeft: 20}; chips_coords[1] = {marginTop: 15, marginLeft: 60}; chips_coords[2] = {marginTop: 55, marginLeft: 20}; chips_coords[3] = {marginTop: 55, marginLeft: 60}; chips_coords[4] = {marginTop: 35, marginLeft: 40}; break; } } else { if( position.x > 0 && position.x < 10 ) { for(let u = 0; u < a.length; u++) { chips_coords[u] = {marginTop: chips_margins[a.length][u].top, marginLeft: chips_margins[a.length][u].left}; } } else { for(let u = 0; u < a.length; u++) { chips_coords[u] = {marginTop: chips_margins[a.length][u].left, marginLeft: chips_margins[a.length][u].top}; } } } return chips_coords; } function assignChip(body) { let nc = board.chips.find((c) => c.uid == 0); if( nc == undefined ) return; nc.uid = body.uid; nc.color = body.color; nc.x = body.x; nc.y = body.y; $(nc.obj).css("display", ""); moveChips(); } function changeBoardState(body) { let board_tile = $(".board_field[data-fid='" + body.uid + "']"); $(board_tile).find(".cost").css("background-color", "#"+body.color); $(board_tile).find(".cost").html(body.cost); $(board_tile).find(".lcost").css("background-color", "#"+body.color); $(board_tile).find(".lcost").html(body.cost); $(board_tile).find("._star").html(body.stars); $(board_tile).find("img").attr("src", body.img); $(board_tile).find(".fv").css("background-color", "#"+body.ownerColor); $(board_tile).find(".fh").css("background-color", "#"+body.ownerColor); } function parseBoardGUI(body) { console.log(body); let t_html = ''; for( let i = 0; i < body.top.length; i++ ) { let board_tile = body.top[i]; t_html += '
'+board_tile.cost+'
'+board_tile.stars+'
'; } $("#top_board_tiles").replaceWith(t_html); let r_html = ''; for( let i = 0; i < body.right.length; i++ ) { let board_tile = body.right[i]; r_html += '
'+board_tile.cost+'
'+board_tile.stars+'
'; } $("#right_board_tiles").replaceWith(r_html); let b_html = ''; for( let i = 0; i < body.bottom.length; i++ ) { let board_tile = body.bottom[i]; b_html += '
'+board_tile.stars+'
'+board_tile.cost+'
'; } $("#bottom_board_tiles").replaceWith(b_html); let l_html = ''; for( let i = 0; i < body.left.length; i++ ) { let board_tile = body.left[i]; l_html += '
'+board_tile.cost+'
'+board_tile.stars+'
'; } $("#left_board_tiles").replaceWith(l_html); let corners = $(".corner"); for(let i = 0; i < body.corners.length; i++ ) { $(corners[i]).find("img").attr("src", body.corners[i].img); } resizeTable(); } function parsePlayersList(body) { let p_html = ''; for( let i = 0; i < body.length; i++ ) { let player = body[i]; p_html += '

'+player.displayName+'

'+player.money+'

'; } $(".players").append(p_html); }