Added rendering for Web Page
This commit is contained in:
@@ -1,11 +1,13 @@
|
|||||||
package controllers
|
package controllers
|
||||||
|
|
||||||
import controllers.sessions.SimpleSession
|
import controllers.sessions.AdvancedSession
|
||||||
import com.google.inject.{Guice, Injector}
|
import com.google.inject.{Guice, Injector}
|
||||||
import de.knockoutwhist.KnockOutWhist
|
import de.knockoutwhist.KnockOutWhist
|
||||||
import de.knockoutwhist.components.Configuration
|
import de.knockoutwhist.components.Configuration
|
||||||
|
import de.knockoutwhist.control.GameState.{InGame, Lobby, SelectTrump, TieBreak}
|
||||||
|
import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic
|
||||||
import di.KnockOutWebConfigurationModule
|
import di.KnockOutWebConfigurationModule
|
||||||
import play.api.*
|
import play.api.{controllers, *}
|
||||||
import play.api.mvc.*
|
import play.api.mvc.*
|
||||||
import play.twirl.api.Html
|
import play.twirl.api.Html
|
||||||
|
|
||||||
@@ -49,15 +51,39 @@ class HomeController @Inject()(val controllerComponents: ControllerComponents) e
|
|||||||
def ingame(id: String): Action[AnyContent] = {
|
def ingame(id: String): Action[AnyContent] = {
|
||||||
val uuid: UUID = UUID.fromString(id)
|
val uuid: UUID = UUID.fromString(id)
|
||||||
if (PodGameManager.identify(uuid).isEmpty) {
|
if (PodGameManager.identify(uuid).isEmpty) {
|
||||||
Action { implicit request =>
|
return Action { implicit request =>
|
||||||
NotFound(views.html.tui.apply(List(Html(s"<p>Session with id $id not found!</p>"))))
|
NotFound(views.html.tui.apply(List(Html(s"<p>Session with id $id not found!</p>"))))
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
val session = PodGameManager.identify(uuid).get
|
val session = PodGameManager.identify(uuid).get
|
||||||
Action { implicit request =>
|
val player = session.asInstanceOf[AdvancedSession].player
|
||||||
Ok(views.html.tui.apply(session.asInstanceOf[SimpleSession].get()))
|
val logic = WebUI.logic.get.asInstanceOf[BaseGameLogic]
|
||||||
|
if (logic.getCurrentState == Lobby) {
|
||||||
|
|
||||||
|
} else if (logic.getCurrentState == InGame) {
|
||||||
|
return Action { implicit request =>
|
||||||
|
Ok(views.html.ingame.apply(player, logic))
|
||||||
|
}
|
||||||
|
} else if (logic.getCurrentState == SelectTrump) {
|
||||||
|
return Action { implicit request =>
|
||||||
|
Ok(views.html.selecttrump.apply(player, logic))
|
||||||
|
}
|
||||||
|
} else if (logic.getCurrentState == TieBreak) {
|
||||||
|
return Action { implicit request =>
|
||||||
|
Ok(views.html.tie.apply(player, logic))
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Action { implicit request =>
|
||||||
|
InternalServerError("Oops")
|
||||||
|
}
|
||||||
|
//if (logic.getCurrentState == Lobby) {
|
||||||
|
//Action { implicit request =>
|
||||||
|
//Ok(views.html.tui.apply(player, logic))
|
||||||
|
//}
|
||||||
|
//} else {
|
||||||
|
//Action { implicit request =>
|
||||||
|
//Ok(views.html.tui.apply(player, logic))
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
case class AdvancedSession
|
||||||
@@ -15,239 +15,5 @@ case class SimpleSession(id: UUID, private var output: List[Html]) extends Playe
|
|||||||
}
|
}
|
||||||
|
|
||||||
override def updatePlayer(event: SimpleEvent): Unit = {
|
override def updatePlayer(event: SimpleEvent): Unit = {
|
||||||
event match {
|
|
||||||
case event: RenderHandEvent =>
|
|
||||||
renderHand(event)
|
|
||||||
case event: ShowTieCardsEvent =>
|
|
||||||
showtiecardseventmethod(event)
|
|
||||||
case event: ShowGlobalStatus =>
|
|
||||||
showglobalstatusmethod(event)
|
|
||||||
case event: ShowPlayerStatus =>
|
|
||||||
showplayerstatusmethod(event)
|
|
||||||
case event: ShowRoundStatus =>
|
|
||||||
showroundstatusmethod(event)
|
|
||||||
case event: ShowErrorStatus =>
|
|
||||||
showerrstatmet(event)
|
|
||||||
case event: ShowCurrentTrickEvent =>
|
|
||||||
showcurtrevmet(event)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def clear(): Unit = {
|
|
||||||
output = List()
|
|
||||||
}
|
|
||||||
|
|
||||||
private def renderHand(event: RenderHandEvent): Unit = {
|
|
||||||
output = output :++ WebUICards.renderHandEvent(event.hand)
|
|
||||||
output = output :+ Html("<br>")
|
|
||||||
}
|
|
||||||
|
|
||||||
private def showtiecardseventmethod(event: ShowTieCardsEvent): Option[Boolean] = {
|
|
||||||
var l = List[Html]()
|
|
||||||
for ((player, card) <- event.card) {
|
|
||||||
l = l :+ Html(s"<p>${player.name}:</p>")
|
|
||||||
l = l :+ WebUIUtils.cardtoImage(card)
|
|
||||||
l = l :+ Html("<br>")
|
|
||||||
}
|
|
||||||
output = output :++ l
|
|
||||||
output = output :+ Html("<br>")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
private def showglobalstatusmethod(event: ShowGlobalStatus): Option[Boolean] = {
|
|
||||||
event.status match {
|
|
||||||
case SHOW_TIE =>
|
|
||||||
println("It's a tie! Let's cut to determine the winner.")
|
|
||||||
Some(true)
|
|
||||||
case SHOW_TIE_WINNER =>
|
|
||||||
if (event.objects.length != 1 || !event.objects.head.isInstanceOf[AbstractPlayer]) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
println(s"${event.objects.head.asInstanceOf[AbstractPlayer].name} wins the cut!")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
case SHOW_TIE_TIE =>
|
|
||||||
println("It's a tie again! Let's cut again.")
|
|
||||||
Some(true)
|
|
||||||
case SHOW_START_MATCH =>
|
|
||||||
clear()
|
|
||||||
println("Starting a new match...")
|
|
||||||
output = output :+ Html("<br><br>")
|
|
||||||
Some(true)
|
|
||||||
case SHOW_TYPE_PLAYERS =>
|
|
||||||
println("Please enter the names of the players, separated by a comma.")
|
|
||||||
Some(true)
|
|
||||||
case SHOW_FINISHED_MATCH =>
|
|
||||||
if (event.objects.length != 1 || !event.objects.head.isInstanceOf[AbstractPlayer]) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
clear()
|
|
||||||
println(s"The match is over. The winner is ${event.objects.head.asInstanceOf[AbstractPlayer]}")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def showplayerstatusmethod(event: ShowPlayerStatus): Option[Boolean] = {
|
|
||||||
val player = event.player
|
|
||||||
event.status match {
|
|
||||||
case SHOW_PLAY_CARD =>
|
|
||||||
println("Which card do you want to play?")
|
|
||||||
Some(true)
|
|
||||||
case SHOW_DOG_PLAY_CARD =>
|
|
||||||
if (event.objects.length != 1 || !event.objects.head.isInstanceOf[Boolean]) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
println("You are using your dog life. Do you want to play your final card now?")
|
|
||||||
if (event.objects.head.asInstanceOf[Boolean]) {
|
|
||||||
println("You have to play your final card this round!")
|
|
||||||
println("Please enter y to play your final card.")
|
|
||||||
Some(true)
|
|
||||||
} else {
|
|
||||||
println("Please enter y/n to play your final card.")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
case SHOW_TIE_NUMBERS =>
|
|
||||||
if (event.objects.length != 1 || !event.objects.head.isInstanceOf[Int]) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
println(s"${player.name} enter a number between 1 and ${event.objects.head.asInstanceOf[Int]}.")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
case SHOW_TRUMPSUIT_OPTIONS =>
|
|
||||||
println("Which suit do you want to pick as the next trump suit?")
|
|
||||||
println("1: Hearts")
|
|
||||||
println("2: Diamonds")
|
|
||||||
println("3: Clubs")
|
|
||||||
println("4: Spades")
|
|
||||||
println()
|
|
||||||
Some(true)
|
|
||||||
case SHOW_NOT_PLAYED =>
|
|
||||||
println(s"Player ${event.player} decided to not play his card")
|
|
||||||
Some(true)
|
|
||||||
case SHOW_WON_PLAYER_TRICK =>
|
|
||||||
println(s"${event.player.name} won the trick.")
|
|
||||||
output = output :+ Html("<br><br>")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def showroundstatusmethod(event: ShowRoundStatus): Option[Boolean] = {
|
|
||||||
event.status match {
|
|
||||||
case SHOW_TURN =>
|
|
||||||
if (event.objects.length != 1 || !event.objects.head.isInstanceOf[AbstractPlayer]) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
println(s"It's ${event.objects.head.asInstanceOf[AbstractPlayer].name} turn.")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
case SHOW_START_ROUND =>
|
|
||||||
clear()
|
|
||||||
println(s"Starting a new round. The trump suit is ${event.currentRound.trumpSuit}.")
|
|
||||||
output = output :+ Html("<br><br>")
|
|
||||||
Some(true)
|
|
||||||
case WON_ROUND =>
|
|
||||||
if (event.objects.length != 1 || !event.objects.head.isInstanceOf[AbstractPlayer]) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
println(s"${event.objects.head.asInstanceOf[AbstractPlayer].name} won the round.")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
case PLAYERS_OUT =>
|
|
||||||
println("The following players are out of the game:")
|
|
||||||
event.currentRound.playersout.foreach(p => {
|
|
||||||
println(p.name)
|
|
||||||
})
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def showerrstatmet(event: ShowErrorStatus): Option[Boolean] = {
|
|
||||||
event.status match {
|
|
||||||
case INVALID_NUMBER =>
|
|
||||||
println("Please enter a valid number.")
|
|
||||||
Some(true)
|
|
||||||
case NOT_A_NUMBER =>
|
|
||||||
println("Please enter a number.")
|
|
||||||
Some(true)
|
|
||||||
case INVALID_INPUT =>
|
|
||||||
println("Please enter a valid input")
|
|
||||||
Some(true)
|
|
||||||
case INVALID_NUMBER_OF_PLAYERS =>
|
|
||||||
println("Please enter at least two names.")
|
|
||||||
Some(true)
|
|
||||||
case IDENTICAL_NAMES =>
|
|
||||||
println("Please enter unique names.")
|
|
||||||
Some(true)
|
|
||||||
case INVALID_NAME_FORMAT =>
|
|
||||||
println("Please enter valid names. Those can not be empty, shorter than 2 or longer then 10 characters.")
|
|
||||||
Some(true)
|
|
||||||
case WRONG_CARD =>
|
|
||||||
if (event.objects.length != 1 || !event.objects.head.isInstanceOf[Card]) {
|
|
||||||
None
|
|
||||||
} else {
|
|
||||||
println(f"You have to play a card of suit: ${event.objects.head.asInstanceOf[Card].suit}\n")
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private def showcurtrevmet(event: ShowCurrentTrickEvent): Option[Boolean] = {
|
|
||||||
clear()
|
|
||||||
val sb = new StringBuilder()
|
|
||||||
sb.append("Current Trick:\n")
|
|
||||||
sb.append("Trump-Suit: " + event.round.trumpSuit + "\n")
|
|
||||||
if (event.trick.firstCard.isDefined) {
|
|
||||||
sb.append(s"Suit to play: ${event.trick.firstCard.get.suit}\n")
|
|
||||||
}
|
|
||||||
for ((card, player) <- event.trick.cards) {
|
|
||||||
sb.append(s"${player.name} played ${card.toString}\n")
|
|
||||||
}
|
|
||||||
println(sb.toString())
|
|
||||||
Some(true)
|
|
||||||
}
|
|
||||||
|
|
||||||
private def println(s: String): Unit = {
|
|
||||||
var html = List[Html]()
|
|
||||||
for (line <- s.split("\n")) {
|
|
||||||
html = html :+ Html(line)
|
|
||||||
html = html :+ Html("<br>")
|
|
||||||
}
|
|
||||||
output = output :++ html
|
|
||||||
}
|
|
||||||
|
|
||||||
private def println(): Unit = {
|
|
||||||
output = output :+ Html("<br>")
|
|
||||||
}
|
|
||||||
|
|
||||||
object WebUICards {
|
|
||||||
def renderCardAsString(card: Card): Vector[String] = {
|
|
||||||
val lines = "│ │"
|
|
||||||
if (card.cardValue == CardValue.Ten) {
|
|
||||||
return Vector(
|
|
||||||
s"┌─────────┐",
|
|
||||||
s"│${card.cardValue.cardType()} │",
|
|
||||||
lines,
|
|
||||||
s"│ ${card.suit.cardType()} │",
|
|
||||||
lines,
|
|
||||||
s"│ ${card.cardValue.cardType()}│",
|
|
||||||
s"└─────────┘"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
Vector(
|
|
||||||
s"┌─────────┐",
|
|
||||||
s"│${card.cardValue.cardType()} │",
|
|
||||||
lines,
|
|
||||||
s"│ ${card.suit.cardType()} │",
|
|
||||||
lines,
|
|
||||||
s"│ ${card.cardValue.cardType()}│",
|
|
||||||
s"└─────────┘"
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
def renderHandEvent(hand: Hand): List[Html] = {
|
|
||||||
hand.cards.map(WebUIUtils.cardtoImage)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
0
knockoutwhistweb/app/views/ingame.scala.html
Normal file
0
knockoutwhistweb/app/views/ingame.scala.html
Normal file
0
knockoutwhistweb/app/views/selecttrump.scala.html
Normal file
0
knockoutwhistweb/app/views/selecttrump.scala.html
Normal file
0
knockoutwhistweb/app/views/tie.scala.html
Normal file
0
knockoutwhistweb/app/views/tie.scala.html
Normal file
0
knockoutwhistweb/public/images/background.png
Normal file
0
knockoutwhistweb/public/images/background.png
Normal file
Reference in New Issue
Block a user