diff --git a/knockoutwhist b/knockoutwhist
index b9a7b0a..5aa1cef 160000
--- a/knockoutwhist
+++ b/knockoutwhist
@@ -1 +1 @@
-Subproject commit b9a7b0a2af7cef7225bf1a0388ebf58171a173f2
+Subproject commit 5aa1cef35689d2df8a89e2d8864fc5fcf9c30e33
diff --git a/knockoutwhistweb/app/assets/stylesheets/main.less b/knockoutwhistweb/app/assets/stylesheets/main.less
index 145789b..447f7c9 100644
--- a/knockoutwhistweb/app/assets/stylesheets/main.less
+++ b/knockoutwhistweb/app/assets/stylesheets/main.less
@@ -33,6 +33,10 @@
width: 100%;
height: 100vh;
}
+.lobby-background {
+ background-color: @background-color;
+
+}
.navbar-header{
text-align:center;
@@ -78,6 +82,10 @@ body {
overflow: auto;
}
+.navbar-drop-shadow {
+ box-shadow: 0 1px 15px 0 #000000
+}
+
#sessions {
display: flex;
flex-direction: column;
@@ -228,4 +236,36 @@ body {
}
.score-row {
color: #000000;
-}
\ No newline at end of file
+}
+
+/* In-game centered stage and blurred sides overlay */
+.ingame-stage {
+ min-height: 100vh;
+ display: flex;
+ align-items: center;
+ justify-content: center;
+ padding: 2rem 1rem;
+}
+
+/* Wrapper that adds a backdrop blur to the background outside the centered card */
+.blur-sides {
+ position: relative;
+}
+
+/* Create an overlay that blurs everything behind it, except the central content area */
+.blur-sides::before {
+ content: "";
+ position: fixed;
+ inset: 0;
+ pointer-events: none;
+ /* fallback: subtle vignette if backdrop-filter unsupported */
+ background: radial-gradient(ellipse at center, rgba(0,0,0,0) 30%, rgba(0,0,0,0.35) 100%);
+}
+
+@supports ((-webkit-backdrop-filter: blur(8px)) or (backdrop-filter: blur(8px))) {
+ .blur-sides::before {
+ background: rgba(0,0,0,0.08);
+ -webkit-backdrop-filter: blur(10px) saturate(110%);
+ backdrop-filter: blur(10px) saturate(110%);
+ }
+}
diff --git a/knockoutwhistweb/app/controllers/IngameController.scala b/knockoutwhistweb/app/controllers/IngameController.scala
index d808f05..6f301b8 100644
--- a/knockoutwhistweb/app/controllers/IngameController.scala
+++ b/knockoutwhistweb/app/controllers/IngameController.scala
@@ -39,12 +39,14 @@ class IngameController @Inject()(
case SelectTrump =>
Ok(views.html.ingame.selecttrump(
g.getPlayerByUser(request.user),
- g.logic
+ g.logic,
+ gameId
))
case TieBreak =>
Ok(views.html.ingame.tie(
g.getPlayerByUser(request.user),
- g.logic
+ g.logic,
+ gameId
))
case _ =>
InternalServerError(s"Invalid game state for in-game view. GameId: $gameId" + s" State: ${g.logic.getCurrentState}")
@@ -318,7 +320,7 @@ class IngameController @Inject()(
val session = g.getUserSession(request.user.id)
optSession = Some(session)
session.lock.lock()
- g.selectTie(g.getUserSession(request.user.id), tie.toInt)
+ g.selectTie(g.getUserSession(request.user.id), tie.toInt - 1)
}
optSession.foreach(_.lock.unlock())
if (result.isSuccess) {
diff --git a/knockoutwhistweb/app/logic/game/GameLobby.scala b/knockoutwhistweb/app/logic/game/GameLobby.scala
index 486bf4f..0e8ac9f 100644
--- a/knockoutwhistweb/app/logic/game/GameLobby.scala
+++ b/knockoutwhistweb/app/logic/game/GameLobby.scala
@@ -157,6 +157,9 @@ class GameLobby private(
*/
def selectTie(userSession: UserSession, tieNumber: Int): Unit = {
val player = getPlayerInteractable(userSession, InteractionType.TieChoice)
+ val highestNumber = logic.playerTieLogic.highestAllowedNumber()
+ if (tieNumber < 0 || tieNumber > highestNumber)
+ throw new IllegalArgumentException(s"Selected number $tieNumber is out of allowed range (0 to $highestNumber)")
userSession.resetCanInteract()
logic.playerTieLogic.receivedTieBreakerCard(tieNumber)
}
diff --git a/knockoutwhistweb/app/views/ingame/selecttrump.scala.html b/knockoutwhistweb/app/views/ingame/selecttrump.scala.html
index 8aef1e3..82c58c2 100644
--- a/knockoutwhistweb/app/views/ingame/selecttrump.scala.html
+++ b/knockoutwhistweb/app/views/ingame/selecttrump.scala.html
@@ -1,27 +1,72 @@
-@(player: de.knockoutwhist.player.AbstractPlayer, logic: de.knockoutwhist.control.GameLogic)
+@(player: de.knockoutwhist.player.AbstractPlayer, logic: de.knockoutwhist.control.GameLogic, gameId: String)
@main("Selecting Trumpsuit...") {
- @if(player.equals(logic.getCurrentMatch.get.roundlist.last.winner.get)) {
-
Knockout Whist
-
You (@player.toString) have won the last round! Select a trumpsuit for the next round!
-
Available trumpsuits are displayed below:
-
- @util.WebUIUtils.cardtoImage(de.knockoutwhist.cards.Card(de.knockoutwhist.cards.CardValue.Ace, de.knockoutwhist.cards.Suit.Spades))
- @util.WebUIUtils.cardtoImage(de.knockoutwhist.cards.Card(de.knockoutwhist.cards.CardValue.Ace, de.knockoutwhist.cards.Suit.Clubs))
- @util.WebUIUtils.cardtoImage(de.knockoutwhist.cards.Card(de.knockoutwhist.cards.CardValue.Ace, de.knockoutwhist.cards.Suit.Hearts))
- @util.WebUIUtils.cardtoImage(de.knockoutwhist.cards.Card(de.knockoutwhist.cards.CardValue.Ace, de.knockoutwhist.cards.Suit.Diamonds))
-
-
Your cards
+
+
+
+
+
+
+
+ @if(player.equals(logic.getCurrentMatch.get.roundlist.last.winner.get)) {
+
+ You (@player.toString) won the last round. Choose the trump suit for the next round.
+
-
- @for(card <- player.currentHand().get.cards) {
- @util.WebUIUtils.cardtoImage(card)
- }
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ @for(i <- player.currentHand().get.cards.indices) {
+
+ @util.WebUIUtils.cardtoImage(player.currentHand().get.cards(i)) width="120px" style="border-radius: 6px"/>
+
+ }
+
+ } else {
+
+ @logic.getCurrentMatch.get.roundlist.last.winner.get.name is choosing a trumpsuit. The new round will start once a suit is picked.
+
+ }
+
+
+
+
- } else {
-
Knockout Whist
-
@player.toString is choosing a trumpsuit. Starting new round when @player.toString picked a trumpsuit...
- }
+
}
\ No newline at end of file
diff --git a/knockoutwhistweb/app/views/ingame/tie.scala.html b/knockoutwhistweb/app/views/ingame/tie.scala.html
index 505c68d..7aad171 100644
--- a/knockoutwhistweb/app/views/ingame/tie.scala.html
+++ b/knockoutwhistweb/app/views/ingame/tie.scala.html
@@ -1,27 +1,107 @@
-@(player: de.knockoutwhist.player.AbstractPlayer, logic: de.knockoutwhist.control.GameLogic)
+@(player: de.knockoutwhist.player.AbstractPlayer, logic: de.knockoutwhist.control.GameLogic, gameId: String)
@main("Tie") {
-
Knockout Whist
-
The last Round was tied between
- @for(players <- logic.playerTieLogic.getTiedPlayers) {
- @players
- }
-
- @if(player.equals(logic.playerTieLogic.currentTiePlayer())) {
-
Pick a card between 1 and @logic.playerTieLogic.highestAllowedNumber()! The resulting card will be your card for the cut.
- } else {
-
@logic.playerTieLogic.currentTiePlayer() is currently picking his number for the cut.
-
Currently picked Cards:
-
- @for((player, card) <- logic.playerTieLogic.getSelectedCard) {
-
-
@player
- @util.WebUIUtils.cardtoImage(card)
-
- }
-
- }
+
+
+
+
+
+
+
+
+
+ The last round was tied between:
+
+ @for(players <- logic.playerTieLogic.getTiedPlayers) {
+ @players
+ }
+
+
+
+ @if(player.equals(logic.playerTieLogic.currentTiePlayer())) {
+ @defining(logic.playerTieLogic.highestAllowedNumber()) { maxNum =>
+
+ Pick a number between 1 and @{maxNum + 1}. The resulting card will be your card for the cut.
+
+
+
+
Currently Picked Cards
+
+
+ @if(logic.playerTieLogic.getSelectedCard.nonEmpty) {
+ @for((player, card) <- logic.playerTieLogic.getSelectedCard) {
+
+
+
+
@player
+
+ @util.WebUIUtils.cardtoImage(card)
+
+
+
+
+ }
+ } else {
+
+
+
+ No cards have been selected yet.
+
+
+ }
+
+ }
+ } else {
+
+ @logic.playerTieLogic.currentTiePlayer() is currently picking a number for the cut.
+
+
+
Currently Picked Cards
+
+
+ @if(logic.playerTieLogic.getSelectedCard.nonEmpty) {
+ @for((player, card) <- logic.playerTieLogic.getSelectedCard) {
+
+
+
+
@player
+
+ @util.WebUIUtils.cardtoImage(card)
+
+
+
+
+ }
+ } else {
+
+
+
+ No cards have been selected yet.
+
+
+ }
+
+ }
+
+
+
+
+
+
+
}
\ No newline at end of file
diff --git a/knockoutwhistweb/app/views/main.scala.html b/knockoutwhistweb/app/views/main.scala.html
index e1cc5d1..50f3d41 100644
--- a/knockoutwhistweb/app/views/main.scala.html
+++ b/knockoutwhistweb/app/views/main.scala.html
@@ -22,6 +22,7 @@
@* And here's where we render the `Html` object containing
* the page content. *@
@content
+
diff --git a/knockoutwhistweb/app/views/mainmenu/creategame.scala.html b/knockoutwhistweb/app/views/mainmenu/creategame.scala.html
index fd680fd..4daeb42 100644
--- a/knockoutwhistweb/app/views/mainmenu/creategame.scala.html
+++ b/knockoutwhistweb/app/views/mainmenu/creategame.scala.html
@@ -3,7 +3,7 @@
@main("Create Game") {
@navbar(user)
-
+
diff --git a/knockoutwhistweb/app/views/mainmenu/navbar.scala.html b/knockoutwhistweb/app/views/mainmenu/navbar.scala.html
index 5d21070..57d8d41 100644
--- a/knockoutwhistweb/app/views/mainmenu/navbar.scala.html
+++ b/knockoutwhistweb/app/views/mainmenu/navbar.scala.html
@@ -1,6 +1,6 @@
@(user: Option[model.users.User])