diff --git a/knockoutwhistweb/app/controllers/HomeController.scala b/knockoutwhistweb/app/controllers/HomeController.scala index ff8281f..f053c49 100644 --- a/knockoutwhistweb/app/controllers/HomeController.scala +++ b/knockoutwhistweb/app/controllers/HomeController.scala @@ -1,11 +1,13 @@ package controllers -import controllers.sessions.SimpleSession +import controllers.sessions.AdvancedSession import com.google.inject.{Guice, Injector} import de.knockoutwhist.KnockOutWhist import de.knockoutwhist.components.Configuration +import de.knockoutwhist.control.GameState.{InGame, Lobby, SelectTrump, TieBreak} +import de.knockoutwhist.control.controllerBaseImpl.BaseGameLogic import di.KnockOutWebConfigurationModule -import play.api.* +import play.api.{controllers, *} import play.api.mvc.* import play.twirl.api.Html @@ -49,15 +51,39 @@ class HomeController @Inject()(val controllerComponents: ControllerComponents) e def ingame(id: String): Action[AnyContent] = { val uuid: UUID = UUID.fromString(id) if (PodGameManager.identify(uuid).isEmpty) { - Action { implicit request => + return Action { implicit request => NotFound(views.html.tui.apply(List(Html(s"

Session with id $id not found!

")))) } } else { val session = PodGameManager.identify(uuid).get - Action { implicit request => - Ok(views.html.tui.apply(session.asInstanceOf[SimpleSession].get())) + val player = session.asInstanceOf[AdvancedSession].player + 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)) + //} } - } \ No newline at end of file diff --git a/knockoutwhistweb/app/controllers/sessions/AdvancedSession.scala b/knockoutwhistweb/app/controllers/sessions/AdvancedSession.scala new file mode 100644 index 0000000..cc9dbaf --- /dev/null +++ b/knockoutwhistweb/app/controllers/sessions/AdvancedSession.scala @@ -0,0 +1 @@ +case class AdvancedSession \ No newline at end of file diff --git a/knockoutwhistweb/app/controllers/sessions/SimpleSession.scala b/knockoutwhistweb/app/controllers/sessions/SimpleSession.scala index 815dab2..fa7bd76 100644 --- a/knockoutwhistweb/app/controllers/sessions/SimpleSession.scala +++ b/knockoutwhistweb/app/controllers/sessions/SimpleSession.scala @@ -15,239 +15,5 @@ case class SimpleSession(id: UUID, private var output: List[Html]) extends Playe } 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("
") - } - - private def showtiecardseventmethod(event: ShowTieCardsEvent): Option[Boolean] = { - var l = List[Html]() - for ((player, card) <- event.card) { - l = l :+ Html(s"

${player.name}:

") - l = l :+ WebUIUtils.cardtoImage(card) - l = l :+ Html("
") - } - output = output :++ l - output = output :+ Html("
") - 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("

") - 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("

") - 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("

") - 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("
") - } - output = output :++ html - } - - private def println(): Unit = { - output = output :+ Html("
") - } - - 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) - } } } \ No newline at end of file diff --git a/knockoutwhistweb/app/views/ingame.scala.html b/knockoutwhistweb/app/views/ingame.scala.html new file mode 100644 index 0000000..e69de29 diff --git a/knockoutwhistweb/app/views/selecttrump.scala.html b/knockoutwhistweb/app/views/selecttrump.scala.html new file mode 100644 index 0000000..e69de29 diff --git a/knockoutwhistweb/app/views/tie.scala.html b/knockoutwhistweb/app/views/tie.scala.html new file mode 100644 index 0000000..e69de29 diff --git a/knockoutwhistweb/public/images/background.png b/knockoutwhistweb/public/images/background.png new file mode 100644 index 0000000..e69de29