Display fastest player in clients, style GM client
This commit is contained in:
parent
67b5bf5fe0
commit
4147cbde0e
4 changed files with 124 additions and 19 deletions
|
@ -12,6 +12,11 @@ fun HTML.createGameMasterDocument() {
|
||||||
rel = "stylesheet",
|
rel = "stylesheet",
|
||||||
type = "text/css"
|
type = "text/css"
|
||||||
)
|
)
|
||||||
|
link(
|
||||||
|
href = "/assets/gamemaster.css",
|
||||||
|
rel = "stylesheet",
|
||||||
|
type = "text/css"
|
||||||
|
)
|
||||||
script {
|
script {
|
||||||
src = "https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"
|
src = "https://unpkg.com/alpinejs@3.x.x/dist/cdn.min.js"
|
||||||
defer = true
|
defer = true
|
||||||
|
@ -36,19 +41,27 @@ fun HTML.createGameMasterDocument() {
|
||||||
xEffect(
|
xEffect(
|
||||||
//language=JavaScript
|
//language=JavaScript
|
||||||
"""
|
"""
|
||||||
if (Alpine.data.buzzerWebSocket.readyState === 1) {
|
|
||||||
if (firstPlayer !== null) {
|
if (firstPlayer !== null) {
|
||||||
console.log("Player")
|
|
||||||
Alpine.data.buzzerWebSocket.send(`PLAYER:${"$"}{firstPlayer}`);
|
Alpine.data.buzzerWebSocket.send(`PLAYER:${"$"}{firstPlayer}`);
|
||||||
} else {
|
} else {
|
||||||
console.log("Clear")
|
|
||||||
Alpine.data.buzzerWebSocket.send("CLEAR:");
|
Alpine.data.buzzerWebSocket.send("CLEAR:");
|
||||||
}
|
}
|
||||||
}
|
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
div(classes = "parent") {
|
div(classes = "parent") {
|
||||||
button {
|
div(classes = "player") {
|
||||||
|
xShow("firstPlayer")
|
||||||
|
xText("firstPlayer")
|
||||||
|
}
|
||||||
|
div { xShow("!firstPlayer") }
|
||||||
|
div(classes = "playerlist") list@{
|
||||||
|
template {
|
||||||
|
attributes["x-for"] = "name in receivedNames"
|
||||||
|
this@list.div(classes = "listedname") { xText("name") }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
button(classes = "submit") {
|
||||||
|
xData("{clicked: false}")
|
||||||
xOn(
|
xOn(
|
||||||
"click",
|
"click",
|
||||||
//language=JavaScript
|
//language=JavaScript
|
||||||
|
@ -56,17 +69,16 @@ fun HTML.createGameMasterDocument() {
|
||||||
() => {
|
() => {
|
||||||
receivedNames = []
|
receivedNames = []
|
||||||
firstPlayer = null
|
firstPlayer = null
|
||||||
|
clicked = true
|
||||||
|
setTimeout(() => {clicked = false}, 50)
|
||||||
}
|
}
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
|
xOn("mousedown", "clicked = true")
|
||||||
|
xOn("touchstart", "clicked = true")
|
||||||
|
xBind("class", "{'active': clicked}")
|
||||||
+"Reset"
|
+"Reset"
|
||||||
}
|
}
|
||||||
ol {
|
|
||||||
template {
|
|
||||||
attributes["x-for"] = "name in receivedNames"
|
|
||||||
this@ol.li { xText("name") }
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -29,13 +29,23 @@ fun HTML.createPlayerDocument() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
body {
|
body {
|
||||||
xData("{playerName: \"\", buzzerWebSocket: null}")
|
xData("{playerName: \"\", buzzerWebSocket: null, firstPlayer: null}")
|
||||||
div(classes = "parent") {
|
div(classes = "parent") {
|
||||||
|
xEffect("console.log(firstPlayer)")
|
||||||
xInit(
|
xInit(
|
||||||
//language=JavaScript
|
//language=JavaScript
|
||||||
"""
|
"""
|
||||||
() => {
|
() => {
|
||||||
startWebSocket('/socket/player')
|
startWebSocket('/socket/player', (ev) => {
|
||||||
|
console.log("received: " + ev.data)
|
||||||
|
if (ev.data === "CLEAR:") {
|
||||||
|
firstPlayer = null;
|
||||||
|
} else {
|
||||||
|
let newName = ev.data.split(":")[1]
|
||||||
|
console.log(newName)
|
||||||
|
setTimeout(() => { firstPlayer = newName }, 500)
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
""".trimIndent()
|
""".trimIndent()
|
||||||
)
|
)
|
||||||
|
@ -54,7 +64,7 @@ fun HTML.createPlayerDocument() {
|
||||||
+"Enter a name first!"
|
+"Enter a name first!"
|
||||||
}
|
}
|
||||||
button(classes = "submit") {
|
button(classes = "submit") {
|
||||||
xShow("playerName")
|
xShow("playerName && !firstPlayer")
|
||||||
xData("{clicked: false}")
|
xData("{clicked: false}")
|
||||||
xOn(
|
xOn(
|
||||||
"click",
|
"click",
|
||||||
|
@ -78,6 +88,11 @@ fun HTML.createPlayerDocument() {
|
||||||
}
|
}
|
||||||
p { +"and I know this!" }
|
p { +"and I know this!" }
|
||||||
}
|
}
|
||||||
|
div(classes = "lockindicator") {
|
||||||
|
xShow("firstPlayer")
|
||||||
|
xBind("class", "{'self': firstPlayer === playerName, 'other': firstPlayer !== playerName }")
|
||||||
|
xText("firstPlayer")
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
58
src/main/resources/css/gamemaster.css
Normal file
58
src/main/resources/css/gamemaster.css
Normal file
|
@ -0,0 +1,58 @@
|
||||||
|
body, html {
|
||||||
|
height: 100%;
|
||||||
|
overflow: hidden;
|
||||||
|
font-size: var(--font-size);
|
||||||
|
box-sizing: border-box;
|
||||||
|
padding: var(--bumper-small-size);
|
||||||
|
margin: 0;
|
||||||
|
background-color: var(--background);
|
||||||
|
color: var(--text);
|
||||||
|
}
|
||||||
|
|
||||||
|
div.parent {
|
||||||
|
display: grid;
|
||||||
|
grid-template-rows: 3fr auto 1fr;
|
||||||
|
height: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.player {
|
||||||
|
background-color: var(--foreground02);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
}
|
||||||
|
|
||||||
|
.playerlist {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: row;
|
||||||
|
flex-wrap: wrap;
|
||||||
|
}
|
||||||
|
|
||||||
|
.listedname + .listedname::before {
|
||||||
|
content: "»";
|
||||||
|
padding-left: var(--bumper-small-size);
|
||||||
|
padding-right: var(--bumper-small-size);
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit {
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
font-size: var(--font-size);
|
||||||
|
height: 100%;
|
||||||
|
border: solid 0.25vh var(--highlight-dark);
|
||||||
|
background-color: var(--foreground);
|
||||||
|
color: var(--text);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.submit.active {
|
||||||
|
background-color: var(--highlight01);
|
||||||
|
}
|
||||||
|
|
|
@ -59,6 +59,26 @@ div > .submit {
|
||||||
flex-direction: column;
|
flex-direction: column;
|
||||||
}
|
}
|
||||||
|
|
||||||
div > button.active {
|
div > .submit.active {
|
||||||
background-color: var(--highlight01);
|
background-color: var(--highlight01);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.lockindicator {
|
||||||
|
width: 100%;
|
||||||
|
max-width: 100%;
|
||||||
|
height: 100%;
|
||||||
|
border: solid 0.25vh var(--highlight-dark);
|
||||||
|
border-radius: var(--border-radius);
|
||||||
|
display: flex;
|
||||||
|
align-items: center;
|
||||||
|
justify-content: center;
|
||||||
|
flex-direction: column;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lockindicator.self {
|
||||||
|
background-color: darkgreen;
|
||||||
|
}
|
||||||
|
|
||||||
|
.lockindicator.other {
|
||||||
|
background-color: darkred;
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in a new issue