diff --git a/app/actors/LobbieActor.scala b/app/actors/LobbieActor.scala index a67d2f3..564fd5f 100644 --- a/app/actors/LobbieActor.scala +++ b/app/actors/LobbieActor.scala @@ -41,6 +41,8 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { private var status: LobbyStatus = NotStarted() + private var lobbyType: LobbyType = Last3() + private val mapsLobby: Set[DeciderMap] = { val configMaps = config.getStringList("maps").asScala configMaps.map(e => { @@ -55,6 +57,7 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { self.path.name, status.toString(), playerTurn, + lobbyType.toString(), mapsLobby)), this.self) @@ -74,7 +77,9 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { if(!map.isBanned){ map.isBanned = true if (playerTurn== 1) playerTurn = 2 else playerTurn = 1 - if(mapsLobby.count(_.isBanned == false) == 1){ + if(mapsLobby.count(_.isBanned == false) == 3 && lobbyType == Last3() || + mapsLobby.count(_.isBanned == false) == 4 && lobbyType == Last4() || + mapsLobby.count(_.isBanned == false) == 1 && lobbyType == LooserPick()){ status = Finish() } users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse)) @@ -120,6 +125,17 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { } users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse)) + case ChangeLobbyType(lobbyTypeNew) => + lobbyTypeNew match { + case "last3" => + lobbyType = Last3() + case "last4" => + lobbyType = Last4() + case "looserpick" => + lobbyType = LooserPick() + } + users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse)) + case KickSecondPlayer => if (sender() == host.actorRef) { secondPlayer.foreach(player => player.actorRef ! LobbyFatal("You were kicked from lobby!")) @@ -177,6 +193,7 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { self.path.name, status.toString(), playerTurn, + lobbyType.toString(), mapsLobby) } } @@ -201,6 +218,8 @@ case object SetNotReady case class MessageForLobby(message: String) +case class ChangeLobbyType(lobbyType: String) + case object InfoQuery case class UserInfo(name: String, isReady: Boolean) @@ -210,6 +229,7 @@ case class LobbyInfo(user1Info: UserInfo, lobbyActorName: String, status: String, playerTurn: BigDecimal, + selectedType: String, maps: Set[DeciderMap]) class LobbyStatus @@ -217,3 +237,9 @@ class LobbyStatus sealed case class NotStarted() extends LobbyStatus sealed case class Draft() extends LobbyStatus sealed case class Finish() extends LobbyStatus + +class LobbyType + +sealed case class Last3() extends LobbyType +sealed case class Last4() extends LobbyType +sealed case class LooserPick() extends LobbyType \ No newline at end of file diff --git a/app/actors/UserActor.scala b/app/actors/UserActor.scala index 194f6fb..1b0916a 100644 --- a/app/actors/UserActor.scala +++ b/app/actors/UserActor.scala @@ -31,7 +31,17 @@ class UserActor(out: ActorRef, implicit val userInfoWrites: OWrites[UserInfo] = Json.writes[UserInfo] - implicit val lobbyWrites: OWrites[LobbyInfo] = Json.writes[LobbyInfo] + implicit val lobbyWrites: Writes[LobbyInfo] = new Writes[LobbyInfo]{ + override def writes(lobby: LobbyInfo) = Json.obj( + "user1Info" -> lobby.user1Info, + "user2Info" -> lobby.user2Info, + "lobbyActorName" -> lobby.lobbyActorName, + "status" -> lobby.status, + "playerTurn" -> lobby.playerTurn, + "selectedType" -> lobby.selectedType, + "maps" -> Json.toJson(lobby.maps) + ) + } implicit val messageWrites: OWrites[Message] = Json.writes[Message] @@ -40,7 +50,15 @@ class UserActor(out: ActorRef, implicit val lobbyResponseWrites: Writes[List[LobbyInfo]] = new Writes[List[LobbyInfo]] { override def writes(o: List[LobbyInfo]): JsValue = { - JsArray(o.map(lobby => Json.toJson(lobby))) + JsArray(o.map(lobby => Json.obj( + "user1Info" -> lobby.user1Info, + "user2Info" -> lobby.user2Info, + "lobbyActorName" -> lobby.lobbyActorName, + "status" -> lobby.status, + "playerTurn" -> lobby.playerTurn, + "selectedType" -> lobby.selectedType, + "maps" -> Json.toJson(lobby.maps) + ))) } } @@ -135,6 +153,10 @@ class UserActor(out: ActorRef, val message = (json \ "message").as[String] lobbieActor.foreach(lobby => lobby ! MessageForLobby(message)) + case Some("changeLobbyType") => + val lobbyType = (json \ "lobbyType").as[String] + lobbieActor.foreach(lobby => lobby ! ChangeLobbyType(lobbyType)) + case Some("kickSecondPlayer") => lobbieActor.foreach(lobby => lobby ! KickSecondPlayer) diff --git a/app/assets/images/buttons/Ulthwe.png b/app/assets/images/buttons/Ulthwe.png new file mode 100644 index 0000000..8b274d2 Binary files /dev/null and b/app/assets/images/buttons/Ulthwe.png differ diff --git a/app/assets/images/buttons/isAuto.png b/app/assets/images/buttons/isAuto.png new file mode 100644 index 0000000..6d09853 Binary files /dev/null and b/app/assets/images/buttons/isAuto.png differ diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index cf7d230..98850bc 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -263,7 +263,26 @@ function renderPlayersAndStats(lobby) { $("#inputMsg").hide(); } - switch (lobby.status){ + var lobbyTypeText = ""; + var last3Selected = ""; + var last4Selected = ""; + var looserPickSelected = ""; + switch (lobby.selectedType) { + case "Last3()": + last3Selected = "selected"; + lobbyTypeText = "Play on last 3 maps"; + break; + case "Last4()": + last4Selected = "selected"; + lobbyTypeText = "Play on last 4 maps"; + break; + case "LooserPick()": + looserPickSelected = "selected"; + lobbyTypeText = "Decide first, then looserpick"; + break; + } + + switch (lobby.status) { case "NotStarted()": resHtml = "
" + lobby.user1Info.name + ": " + player1ReadyBtn +"

" if(lobby.user2Info.name !== ""){ @@ -273,19 +292,36 @@ function renderPlayersAndStats(lobby) { } resHtml += "
" + lobby.user2Info.name + ": " + player2ReadyBtn + kickBtn + "
" }else{ - resHtml += "
waiting 2-nd player...
" + resHtml += "
waiting 2-nd player...
" } + + var disabledText = ""; + + + if(lobby.user1Info.name !== userName){ + disabledText = "disabled"; + } + resHtml += "
" + resHtml += ""; break; case "Draft()": console.log(lobby.turn); var playerTurn = (lobby.playerTurn === 1) ? lobby.user1Info.name : lobby.user2Info.name - resHtml = "
"+lobby.user1Info.name + " vs " + lobby.user2Info.name +"
" + playerTurn +" turn
"; + resHtml = "
"+lobby.user1Info.name + " vs " + lobby.user2Info.name + " - " +lobbyTypeText+ "
" + playerTurn +" turn
"; break; case "Finish()": - var lastMap = _.find(lobby.maps, function (map){ + var lastMaps = _.filter(lobby.maps, function (map){ return map.isBanned === false; - }).map; - resHtml = "
"+convertMapName(lastMap)+"
"; + }); + resHtml = "
"; + _.forEach(lastMaps,function (map){ + resHtml += convertMapName(map.map) + "; " + }) + resHtml += "
"; } resHtml = resHtml + "" @@ -326,6 +362,14 @@ function setNotReady(){ })); } +function changeLobbyType(){ + var lobbyType = $("#deciderOption").val(); + ws.send(JSON.stringify({ + type: "changeLobbyType", + lobbyType: lobbyType + })); +} + function joinDecider(actorName){ ws.send(JSON.stringify({ type: "joinDecider",