Schafkopf-Server/Public/elements.js

398 lines
10 KiB
JavaScript
Raw Normal View History

2021-11-28 23:59:24 +01:00
/**
2021-12-03 18:03:29 +01:00
* This file acts as an abstraction layer between HTML and JS.
*/
2021-11-28 23:59:24 +01:00
2021-12-01 22:50:42 +01:00
var playerName = ""
2021-12-03 18:03:29 +01:00
var debugSessionToken = null
const debugMode = true // Does not load session token, to allow multiple players per browser
2021-11-28 23:59:24 +01:00
2021-12-18 15:08:43 +01:00
const playerCardsElement = "player-cards"
const offlineText = "Offline"
const missingPlayerText = "Leer"
2021-12-07 09:10:28 +01:00
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("user-name").value = name
document.getElementById("user-pwd").value = name
loginUser()
}
2021-12-01 22:50:42 +01:00
function setDisplayStyle(id, style) {
document.getElementById(id).style.display = style
2021-11-28 23:59:24 +01:00
}
2021-12-03 18:03:29 +01:00
function hide(elementId) {
setDisplayStyle(elementId, "none")
}
2021-12-01 22:50:42 +01:00
function showLoginElements() {
setDisplayStyle("login-window", "table")
2021-12-03 18:03:29 +01:00
hide("top-bar")
hide("table-list-bar")
hide("table-list")
hide("game-bar")
hide("table-players")
2021-12-18 15:08:43 +01:00
hide(playerCardsElement)
2021-11-29 11:06:20 +01:00
}
function showTableListElements() {
2021-12-03 18:03:29 +01:00
hide("login-window")
2021-12-01 22:50:42 +01:00
setDisplayStyle("top-bar", "inherit")
setDisplayStyle("table-list-bar", "grid")
setDisplayStyle("table-list", "inherit")
2021-12-03 18:03:29 +01:00
hide("game-bar")
hide("table-players")
2021-12-18 15:08:43 +01:00
hide(playerCardsElement)
2021-11-29 11:06:20 +01:00
}
2021-11-30 20:55:25 +01:00
function showGameElements() {
2021-12-03 18:03:29 +01:00
hide("login-window")
2021-12-01 22:50:42 +01:00
setDisplayStyle("top-bar", "inherit")
2021-12-03 18:03:29 +01:00
hide("table-list-bar")
hide("table-list")
2021-12-01 22:50:42 +01:00
setDisplayStyle("game-bar", "grid")
setDisplayStyle("table-players", "grid")
2021-12-18 15:08:43 +01:00
setDisplayStyle(playerCardsElement, "grid")
2021-11-30 20:55:25 +01:00
}
2021-12-03 18:03:29 +01:00
function showTableName(name) {
document.getElementById("table-connected-label").innerHTML = name
}
2021-12-01 22:50:42 +01:00
function showConnectedState() {
2021-12-18 15:08:43 +01:00
showPlayerState("bottom", "")
2021-11-30 20:55:25 +01:00
}
2021-12-01 22:50:42 +01:00
function showDisconnectedState() {
2021-12-18 15:08:43 +01:00
showPlayerDisconnected("bottom")
2021-12-01 22:50:42 +01:00
}
function showDealButton() {
setDisplayStyle("deal-button", "inherit")
2021-11-28 23:59:24 +01:00
}
2021-12-01 22:50:42 +01:00
function hideDealButton() {
2021-12-03 18:03:29 +01:00
hide("deal-button")
2021-12-01 22:50:42 +01:00
}
function setPlayerName(name) {
document.getElementById("player-name").innerHTML = name
playerName = name
2021-11-28 23:59:24 +01:00
}
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() {
2021-12-03 18:03:29 +01:00
if (debugMode) {
return debugSessionToken
}
2021-11-28 23:59:24 +01:00
return localStorage.getItem('token')
}
function setSessionToken(token) {
2021-12-03 18:03:29 +01:00
if (debugMode) {
debugSessionToken = token
return
}
2021-11-28 23:59:24 +01:00
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
}
2021-12-01 22:50:42 +01:00
2021-12-03 18:03:29 +01:00
function setEmptyPlayerInfo(position) {
2021-12-18 15:08:43 +01:00
setTablePlayerName(position, null, false)
showPlayerState(position, "")
setTableCard(position, "", 1)
2021-12-03 18:03:29 +01:00
}
2021-12-18 15:08:43 +01:00
function setTablePlayerName(position, name, active) {
2021-12-03 18:03:29 +01:00
const nameElement = document.getElementById("table-player-name-" + position)
2021-12-18 15:08:43 +01:00
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
}
2021-12-03 18:03:29 +01:00
}
2021-12-18 15:08:43 +01:00
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) {
2021-12-03 18:03:29 +01:00
const connectionElement = "table-player-state-" + position
2021-12-18 15:08:43 +01:00
const element = document.getElementById(connectionElement)
element.style.color = color
element.innerHTML = text
2021-12-01 22:50:42 +01:00
}
2021-12-06 18:27:52 +01:00
function setTableCard(position, card, layer) {
const id = "table-player-card-" + position
setCard(id, card, layer)
2021-12-01 22:50:42 +01:00
}
function setHandCard(index, card, playable) {
const id = "player-card" + index.toString()
2021-12-06 18:27:52 +01:00
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() { }
}
2021-12-01 22:50:42 +01:00
}
2021-12-06 18:27:52 +01:00
function setCard(id, card, layer) {
const element = document.getElementById(id)
2021-12-01 22:50:42 +01:00
if (card == "") {
2021-12-06 18:27:52 +01:00
element.style.backgroundColor = "var(--element-background)"
element.style.backgroundImage = ""
element.style.zIndex = 0
2021-12-01 22:50:42 +01:00
} else {
2021-12-06 18:27:52 +01:00
element.style.backgroundColor = ""
element.style.backgroundImage = "url('/cards/" + card + ".jpeg')"
element.style.zIndex = layer + 1
2021-12-01 22:50:42 +01:00
}
2021-12-03 18:03:29 +01:00
}
function updateTableInfo(table) {
showTableName(table.name)
// Set own cards
2021-12-09 11:11:42 +01:00
const cardCount = table.cards.length
2021-12-03 18:03:29 +01:00
for (let i = 0; i < cardCount; i += 1) {
2021-12-09 11:11:42 +01:00
const card = table.cards[i]
2021-12-03 18:03:29 +01:00
setHandCard(i+1, card.card, card.playable)
}
for (let i = cardCount; i < 8; i += 1) {
setHandCard(i+1, "", false)
}
2021-12-18 15:08:43 +01:00
let playedGame = null
if (table.hasOwnProperty("game")) {
playedGame = textForAction(table.game)
}
2021-12-03 18:03:29 +01:00
// Show player info
console.log(table)
2021-12-18 15:08:43 +01:00
setInfoForPlayer(table.player, "bottom", playedGame)
2021-12-09 11:11:42 +01:00
if (table.playerSelectsGame) {
2021-12-06 18:27:52 +01:00
setActionsForOwnPlayer(table.playableGames)
2021-12-07 09:10:28 +01:00
showAvailableGames([])
2021-12-06 18:27:52 +01:00
} else {
2021-12-07 09:10:28 +01:00
if (table.player.active) {
showAvailableGames(table.playableGames)
} else {
showAvailableGames([])
}
2021-12-09 11:11:42 +01:00
setActionsForOwnPlayer(table.actions)
2021-12-06 18:27:52 +01:00
}
2021-12-03 18:03:29 +01:00
if (table.hasOwnProperty("playerLeft")) {
2021-12-18 15:08:43 +01:00
setInfoForPlayer(table.playerLeft, "left", playedGame)
2021-12-03 18:03:29 +01:00
} else {
setEmptyPlayerInfo("left")
}
if (table.hasOwnProperty("playerAcross")) {
2021-12-18 15:08:43 +01:00
setInfoForPlayer(table.playerAcross, "top", playedGame)
2021-12-03 18:03:29 +01:00
} else {
setEmptyPlayerInfo("top")
}
if (table.hasOwnProperty("playerRight")) {
2021-12-18 15:08:43 +01:00
setInfoForPlayer(table.playerRight, "right", playedGame)
2021-12-03 18:03:29 +01:00
} else {
setEmptyPlayerInfo("right")
}
}
2021-12-18 15:08:43 +01:00
function setInfoForPlayer(player, position, game) {
2021-12-06 18:27:52 +01:00
var card = ""
2021-12-18 15:08:43 +01:00
if (player.hasOwnProperty("card")) {
card = player.card
2021-12-06 18:27:52 +01:00
}
2021-12-18 15:08:43 +01:00
const leadsGame = player.leads
2021-12-06 18:27:52 +01:00
const layer = player.position
2021-12-18 15:08:43 +01:00
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")) {
2021-12-18 15:08:43 +01:00
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"
2021-12-03 18:03:29 +01:00
}
function clearInfoForPlayer(position) {
setEmptyPlayerInfo(position)
}
function setActionsForOwnPlayer(actions) {
2021-12-06 18:27:52 +01:00
var len = actions.length
var html = ""
2021-12-03 18:03:29 +01:00
for (let i = 0; i < len; i += 1) {
const action = actions[i]
2021-12-06 18:27:52 +01:00
const content = textForAction(action)
html += "<button class=\"standard-button action-button\" " +
"onclick=\"performAction('" + action + "')\">" + content + "</button>"
2021-12-03 18:03:29 +01:00
}
2021-12-06 18:27:52 +01:00
document.getElementById("action-bar").innerHTML = html
2021-12-03 18:03:29 +01:00
}
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":
2021-12-06 18:27:52 +01:00
return "Schießen"
2021-12-18 15:08:43 +01:00
case "ruf":
return "Ruf"
2021-12-06 18:27:52 +01:00
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"
2021-12-18 15:08:43 +01:00
case "solo":
return "Solo"
2021-12-06 18:27:52 +01:00
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
2021-12-03 18:03:29 +01:00
}
function performAction(action) {
const token = getSessionToken()
if (token == null) {
showBlankLogin()
return
}
performPlayerActionRequest(token, action)
// TODO: Handle errors and success
2021-12-07 09:10:28 +01:00
}
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("available-games-list").innerHTML = html
2021-12-01 22:50:42 +01:00
}