422 lines
12 KiB
JavaScript
422 lines
12 KiB
JavaScript
/**
|
|
* This file acts as an abstraction layer between HTML and JS.
|
|
*/
|
|
|
|
var playerName = ""
|
|
var debugSessionToken = null
|
|
const debugMode = false // Does not load session token, to allow multiple players per browser
|
|
|
|
|
|
const offlineText = "Offline"
|
|
const missingPlayerText = "Leer"
|
|
|
|
const elementIdUserName = "user-name"
|
|
const elementIdUserPssword = "user-pwd"
|
|
const elementIdPlayerCards = "player-cards"
|
|
const elementIdLoginWindow = "login-window"
|
|
const elementIdTopBar = "top-bar"
|
|
const elementIdTableListBar = "table-list-bar"
|
|
const elementIdTableList = "table-list"
|
|
const elementIdGameBar = "game-bar"
|
|
const elementIdTablePlayers = "table-players"
|
|
const elementIdTableName = "table-name-label"
|
|
const elementIdPlayerName = "player-name"
|
|
const elementIdLoginError = "login-error"
|
|
const elementIdTableNameField = "table-name-field"
|
|
const elementIdPublicTableCheckbox = "table-public-checkbox"
|
|
const elementIdActionBar = "action-bar"
|
|
const elementIdAvailableGamesList = "available-games-list"
|
|
const elementIdGameSummary = "game-summary"
|
|
|
|
const localStorageTokenId = "token"
|
|
|
|
function showDebugLogins() {
|
|
document.getElementById("login-window-inner").innerHTML +=
|
|
"<button class=\"login-buttons standard-button\" onclick=\"loginDebugUser('a')\">Player A</button>" +
|
|
"<button class=\"login-buttons standard-button\" onclick=\"loginDebugUser('b')\">Player B</button>" +
|
|
"<button class=\"login-buttons standard-button\" onclick=\"loginDebugUser('c')\">Player C</button>" +
|
|
"<button class=\"login-buttons standard-button\" onclick=\"loginDebugUser('d')\">Player D</button>"
|
|
}
|
|
|
|
function loginDebugUser(name) {
|
|
document.getElementById(elementIdUserName).value = name
|
|
document.getElementById(elementIdUserPssword).value = name
|
|
loginUser()
|
|
}
|
|
|
|
function setDisplayStyle(id, style) {
|
|
document.getElementById(id).style.display = style
|
|
}
|
|
|
|
function hide(elementId) {
|
|
setDisplayStyle(elementId, "none")
|
|
}
|
|
|
|
function showLoginElements() {
|
|
setDisplayStyle(elementIdLoginWindow, "table")
|
|
hide(elementIdTopBar)
|
|
hide(elementIdTableListBar)
|
|
hide(elementIdTableList)
|
|
hide(elementIdGameBar)
|
|
hide(elementIdTablePlayers)
|
|
hide(elementIdPlayerCards)
|
|
hide(elementIdActionBar)
|
|
}
|
|
|
|
function showTableListElements() {
|
|
hide(elementIdLoginWindow)
|
|
setDisplayStyle(elementIdTopBar, "inherit")
|
|
setDisplayStyle(elementIdTableListBar, "grid")
|
|
setDisplayStyle(elementIdTableList, "inherit")
|
|
hide(elementIdGameBar)
|
|
hide(elementIdTablePlayers)
|
|
hide(elementIdPlayerCards)
|
|
hide(elementIdActionBar)
|
|
}
|
|
|
|
function showGameElements() {
|
|
hide(elementIdLoginWindow)
|
|
setDisplayStyle(elementIdTopBar, "inherit")
|
|
hide(elementIdTableListBar)
|
|
hide(elementIdTableList)
|
|
setDisplayStyle(elementIdGameBar, "grid")
|
|
setDisplayStyle(elementIdTablePlayers, "grid")
|
|
setDisplayStyle(elementIdPlayerCards, "grid")
|
|
setDisplayStyle(elementIdActionBar, "inline-block")
|
|
}
|
|
|
|
function showTableName(name) {
|
|
document.getElementById(elementIdTableName).innerHTML = name
|
|
}
|
|
|
|
function showConnectedState() {
|
|
showPlayerState("bottom", "")
|
|
}
|
|
|
|
function showDisconnectedState() {
|
|
showPlayerDisconnected("bottom")
|
|
}
|
|
|
|
function setPlayerName(name) {
|
|
document.getElementById(elementIdPlayerName).innerHTML = name
|
|
playerName = name
|
|
}
|
|
|
|
function getLoginName() {
|
|
return document.getElementById(elementIdUserName).value
|
|
}
|
|
|
|
function clearLoginName() {
|
|
document.getElementById(elementIdUserName).value = ""
|
|
}
|
|
|
|
function getLoginPassword() {
|
|
return document.getElementById(elementIdUserPssword).value
|
|
}
|
|
|
|
function clearLoginPassword() {
|
|
document.getElementById(elementIdUserPssword).value = ""
|
|
}
|
|
|
|
function getSessionToken() {
|
|
if (debugMode) {
|
|
return debugSessionToken
|
|
}
|
|
return localStorage.getItem(localStorageTokenId)
|
|
}
|
|
|
|
function setSessionToken(token) {
|
|
if (debugMode) {
|
|
debugSessionToken = token
|
|
return
|
|
}
|
|
localStorage.setItem(localStorageTokenId, token)
|
|
}
|
|
|
|
function deleteSessionToken() {
|
|
localStorage.removeItem(localStorageTokenId)
|
|
}
|
|
|
|
function setLoginError(text) {
|
|
document.getElementById(elementIdLoginError).innerHTML = text
|
|
}
|
|
|
|
function getTableName() {
|
|
return document.getElementById(elementIdTableNameField).value
|
|
}
|
|
|
|
function clearTableName() {
|
|
return document.getElementById(elementIdTableNameField).value = ""
|
|
}
|
|
|
|
function getTableVisibility() {
|
|
return document.getElementById(elementIdPublicTableCheckbox).checked
|
|
}
|
|
|
|
function setTableListContent(content) {
|
|
document.getElementById(elementIdTableList).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")
|
|
}
|
|
if (table.hasOwnProperty("summary")) {
|
|
setGameSummary(table.summary)
|
|
} else {
|
|
hideGameSummary()
|
|
}
|
|
}
|
|
|
|
function setGameSummary(summary) {
|
|
document.getElementById(elementIdGameSummary).innerHTML = summary.text
|
|
setDisplayStyle(elementIdGameSummary, "inherit")
|
|
}
|
|
|
|
function hideGameSummary() {
|
|
hide(elementIdGameSummary)
|
|
}
|
|
|
|
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)
|
|
}
|
|
|
|
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 += "<button class=\"standard-button action-button\" " +
|
|
"onclick=\"performAction('" + action + "')\">" + content + "</button>"
|
|
}
|
|
document.getElementById(elementIdActionBar).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 += "<div class=\"standard-button available-game\">" + content + "</div>"
|
|
}
|
|
document.getElementById(elementIdAvailableGamesList).innerHTML = html
|
|
} |