/** * This file acts as an abstraction layer between HTML and JS. */ var playerName = "" var debugSessionToken = null const debugMode = true // Does not load session token, to allow multiple players per browser const playerCardsElement = "player-cards" const offlineText = "Offline" const missingPlayerText = "Leer" function showDebugLogins() { document.getElementById("login-window-inner").innerHTML += "" + "" + "" + "" } function loginDebugUser(name) { document.getElementById("user-name").value = name document.getElementById("user-pwd").value = name loginUser() } function setDisplayStyle(id, style) { document.getElementById(id).style.display = style } function hide(elementId) { setDisplayStyle(elementId, "none") } function showLoginElements() { setDisplayStyle("login-window", "table") hide("top-bar") hide("table-list-bar") hide("table-list") hide("game-bar") hide("table-players") hide(playerCardsElement) } function showTableListElements() { hide("login-window") setDisplayStyle("top-bar", "inherit") setDisplayStyle("table-list-bar", "grid") setDisplayStyle("table-list", "inherit") hide("game-bar") hide("table-players") hide(playerCardsElement) } function showGameElements() { hide("login-window") setDisplayStyle("top-bar", "inherit") hide("table-list-bar") hide("table-list") setDisplayStyle("game-bar", "grid") setDisplayStyle("table-players", "grid") setDisplayStyle(playerCardsElement, "grid") } function showTableName(name) { document.getElementById("table-connected-label").innerHTML = name } function showConnectedState() { showPlayerState("bottom", "") } function showDisconnectedState() { showPlayerDisconnected("bottom") } function showDealButton() { setDisplayStyle("deal-button", "inherit") } function hideDealButton() { hide("deal-button") } function setPlayerName(name) { document.getElementById("player-name").innerHTML = name playerName = name } function getLoginName() { return document.getElementById("user-name").value } function clearLoginName() { document.getElementById("user-name").value = "" } function getLoginPassword() { return document.getElementById("user-pwd").value } function clearLoginPassword() { document.getElementById("user-pwd").value = "" } function getSessionToken() { if (debugMode) { return debugSessionToken } return localStorage.getItem('token') } function setSessionToken(token) { if (debugMode) { debugSessionToken = token return } localStorage.setItem('token', token) } function deleteSessionToken() { localStorage.removeItem('token') } function setLoginError(text) { document.getElementById("login-error").innerHTML = text } function getTableName() { return document.getElementById("table-name-field").value } function clearTableName() { return document.getElementById("table-name-field").value = "" } function getTableVisibility() { return document.getElementById("table-public-checkbox").checked } function setTableListContent(content) { document.getElementById("table-list").innerHTML = content } function setEmptyPlayerInfo(position) { setTablePlayerName(position, null, false) showPlayerState(position, "") setTableCard(position, "", 1) } function setTablePlayerName(position, name, active) { const nameElement = document.getElementById("table-player-name-" + position) if (name == null) { nameElement.style.color = "var(--secondary-text-color)" nameElement.innerHTML = missingPlayerText } else { nameElement.style.color = active ? "var(--button-color)" : "var(--text-color)" nameElement.innerHTML = name } } function showPlayerDisconnected(position) { setPlayerState(position, "var(--alert-color)", offlineText) } function showPlayerState(position, state) { setPlayerState(position, "var(--secondary-text-color)", state) } function setPlayerState(position, color, text) { const connectionElement = "table-player-state-" + position const element = document.getElementById(connectionElement) element.style.color = color element.innerHTML = text } function setTableCard(position, card, layer) { const id = "table-player-card-" + position setCard(id, card, layer) } function setHandCard(index, card, playable) { const id = "player-card" + index.toString() setCard(id, card, 1) const button = document.getElementById(id) if (playable) { button.disabled = false button.onclick = function() { playCard(card) } } else { button.disabled = true button.onclick = function() { } } } function setCard(id, card, layer) { const element = document.getElementById(id) if (card == "") { element.style.backgroundColor = "var(--element-background)" element.style.backgroundImage = "" element.style.zIndex = 0 } else { element.style.backgroundColor = "" element.style.backgroundImage = "url('/cards/" + card + ".jpeg')" element.style.zIndex = layer + 1 } } function updateTableInfo(table) { showTableName(table.name) // Set own cards const cardCount = table.cards.length for (let i = 0; i < cardCount; i += 1) { const card = table.cards[i] setHandCard(i+1, card.card, card.playable) } for (let i = cardCount; i < 8; i += 1) { setHandCard(i+1, "", false) } let playedGame = null if (table.hasOwnProperty("game")) { playedGame = textForAction(table.game) } // Show player info console.log(table) setInfoForPlayer(table.player, "bottom", playedGame) if (table.playerSelectsGame) { setActionsForOwnPlayer(table.playableGames) showAvailableGames([]) } else { if (table.player.active) { showAvailableGames(table.playableGames) } else { showAvailableGames([]) } setActionsForOwnPlayer(table.actions) } if (table.hasOwnProperty("playerLeft")) { setInfoForPlayer(table.playerLeft, "left", playedGame) } else { setEmptyPlayerInfo("left") } if (table.hasOwnProperty("playerAcross")) { setInfoForPlayer(table.playerAcross, "top", playedGame) } else { setEmptyPlayerInfo("top") } if (table.hasOwnProperty("playerRight")) { setInfoForPlayer(table.playerRight, "right", playedGame) } else { setEmptyPlayerInfo("right") } } function setInfoForPlayer(player, position, game) { var card = "" if (player.hasOwnProperty("card")) { card = player.card } const leadsGame = player.leads const layer = player.position setTableCard(position, card, layer) setTablePlayerName(position, player.name, player.active) if (!player.connected) { showPlayerDisconnected(position) return } var state = [] if (game != null && leadsGame) { state.push(game) } const double = doubleText(player.doubles) if (double) { state.push(double) } if (game != null && player.hasOwnProperty("points")) { state.push(player.points.toString() + " Punkte") } const text = state.join(", ") showPlayerState(position, text) } function doubleText(doubles) { if (doubles == 0) { return null } if (doubles == 1) { return "gedoppelt" } return doubles.toString() + "x gedoppelt" } function clearInfoForPlayer(position) { setEmptyPlayerInfo(position) } function setActionsForOwnPlayer(actions) { var len = actions.length var html = "" for (let i = 0; i < len; i += 1) { const action = actions[i] const content = textForAction(action) html += "" } document.getElementById("action-bar").innerHTML = html } function textForAction(action) { switch (action) { /// The player can request cards to be dealt case "deal": return "Austeilen" /// The player doubles on the initial four cards case "double": return "Legen" /// The player does not double on the initial four cards case "skip": return "Nicht legen" /// The player offers a wedding (one trump card) case "wedding": return "Hochzeit anbieten" /// The player can choose to accept the wedding case "accept": return "Hochzeit akzeptieren" /// The player matches or increases the game during auction case "bid": return "Spielen" /// The player does not want to play case "out": return "Weg" /// The player claims to win and doubles the game cost ("schießen") case "raise": return "Schießen" case "ruf": return "Ruf" case "ruf-eichel": return "Ruf Eichel" case "ruf-blatt": return "Ruf Blatt" case "ruf-schelln": return "Ruf Schelln" case "bettel": return "Bettel" case "wenz": return "Wenz" case "geier": return "Geier" case "solo": return "Solo" case "solo-eichel": return "Eichel Solo" case "solo-blatt": return "Blatt Solo" case "solo-herz": return "Herz Solo" case "solo-schelln": return "Schelln Solo" } return action } function performAction(action) { const token = getSessionToken() if (token == null) { showBlankLogin() return } performPlayerActionRequest(token, action) // TODO: Handle errors and success } function showAvailableGames(games) { var len = games.length var html = "" for (let i = 0; i < len; i += 1) { const game = games[i] const content = textForAction(game) html += "
" + content + "
" } document.getElementById("available-games-list").innerHTML = html }