diff --git a/app/actors/LobbieActor.scala b/app/actors/LobbieActor.scala index 2838783..2ea8240 100644 --- a/app/actors/LobbieActor.scala +++ b/app/actors/LobbieActor.scala @@ -20,7 +20,7 @@ case class DeciderMap(map: String, var isBanned: Boolean = false) * There is one StockActor per stock symbol. The StockActor maintains a list of users watching the stock and the stock * values. Each StockActor updates a rolling dataset of randomly generated stock values. */ -class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { +class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with LazyLogging { val config = ConfigFactory.load() logger.info(s"Create lobby... host: ${hostUser.actorRef.path.name}") @@ -46,7 +46,7 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { private var isNecrons: Boolean = false private val mapsLobby: Set[DeciderMap] = { - val configMaps = config.getStringList("maps").asScala + val configMaps = config.getStringList(s"deciders.$deciderName.maps").asScala configMaps.map(e => { DeciderMap(e) }).toSet @@ -57,6 +57,7 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { UserInfo(hostUser.name,firstPlayerReady), UserInfo("", secondPlayerReady), self.path.name, + deciderName, status.toString(), playerTurn, lobbyType.toString(), @@ -211,6 +212,7 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging { UserInfo(host.name, firstPlayerReady), UserInfo(user2Name, secondPlayerReady), self.path.name, + deciderName, status.toString(), playerTurn, lobbyType.toString(), @@ -223,7 +225,7 @@ case class BanMap(mapName: String) case class MapsUpdate(maps: Set[String]) -case class CreateLobby(userName: String) +case class CreateLobby(userName: String, deciderName: String) case class JoinLobbyAsPlayer(lobbyUser: LobbyUser) @@ -250,6 +252,7 @@ case class UserInfo(name: String, isReady: Boolean) case class LobbyInfo(user1Info: UserInfo, user2Info: UserInfo, lobbyActorName: String, + deciderName: String, status: String, playerTurn: BigDecimal, selectedType: String, diff --git a/app/actors/LobbiesActor.scala b/app/actors/LobbiesActor.scala index 3a2320b..7a50ef8 100644 --- a/app/actors/LobbiesActor.scala +++ b/app/actors/LobbiesActor.scala @@ -17,10 +17,10 @@ class LobbiesActor extends Actor with LazyLogging { val lobbies: ListBuffer[String] = ListBuffer() def receive: Receive = LoggingReceive { - case CreateLobby(hostName) => + case CreateLobby(hostName, deciderName) => val hostActorRef = sender logger.info(s"Player ${hostActorRef.path.name} create lobby.") - val lobbyActor = context.actorOf(Props(new LobbieActor(LobbyUser(hostName, hostActorRef))), + val lobbyActor = context.actorOf(Props(new LobbieActor(LobbyUser(hostName, hostActorRef), deciderName)), s"lobbyActor-${(math.random * 100000000L).toLong}") lobbyActor.tell(WatchLobby("watchIt"), hostActorRef) case JoinLobbyByActorName(lobbyName, userName) => diff --git a/app/actors/UserActor.scala b/app/actors/UserActor.scala index 24eca46..b2854ce 100644 --- a/app/actors/UserActor.scala +++ b/app/actors/UserActor.scala @@ -35,6 +35,7 @@ class UserActor(out: ActorRef, "user1Info" -> lobby.user1Info, "user2Info" -> lobby.user2Info, "lobbyActorName" -> lobby.lobbyActorName, + "deciderName" -> lobby.deciderName, "status" -> lobby.status, "playerTurn" -> lobby.playerTurn, "selectedType" -> lobby.selectedType, @@ -54,6 +55,7 @@ class UserActor(out: ActorRef, "user1Info" -> lobby.user1Info, "user2Info" -> lobby.user2Info, "lobbyActorName" -> lobby.lobbyActorName, + "deciderName" -> lobby.deciderName, "status" -> lobby.status, "playerTurn" -> lobby.playerTurn, "selectedType" -> lobby.selectedType, @@ -129,7 +131,8 @@ class UserActor(out: ActorRef, logger.debug(s"Set user name: $name for actor ${this.self}") case Some("createDecider") => - LobbiesActor.actor ! CreateLobby(name) + val deciderName = (json \ "deciderName").as[String] + LobbiesActor.actor ! CreateLobby(name, deciderName) case Some("leaveDecider") => lobbieActor.foreach(lobby => lobby ! LeaveLobby) diff --git a/app/assets/javascripts/index.js b/app/assets/javascripts/index.js index ddffee6..e3e9094 100644 --- a/app/assets/javascripts/index.js +++ b/app/assets/javascripts/index.js @@ -37,6 +37,8 @@ window.onload = function() { var lobbiesAsTableRows = _.reduce(this.lobbies, function (memo, lobby) { + if ($("#deciderName").html() !== lobby.deciderName) return memo; + var joinButton = (lobby.status === "NotStarted()") ? '' : ""; @@ -77,7 +79,8 @@ window.onload = function() { $("#createDecider").click(function(event) { event.preventDefault(); ws.send(JSON.stringify({ - type: "createDecider" + type: "createDecider", + deciderName: $("#deciderName").html() })); }); @@ -312,10 +315,12 @@ function renderPlayersAndStats(lobby) { if(lobby.user1Info.name !== userName){ disabledText = "disabled"; } + + //TODO: here from config resHtml += "
"; @@ -324,8 +329,10 @@ function renderPlayersAndStats(lobby) { }else{ disabledText = ""; } - resHtml += "
"; + if($("#necronPresence").html() === "true"){ + resHtml += "
"; + } resHtml += ""; break; case "Draft()": diff --git a/app/controllers/HomeController.scala b/app/controllers/HomeController.scala index 91a2ae2..8db0116 100644 --- a/app/controllers/HomeController.scala +++ b/app/controllers/HomeController.scala @@ -9,6 +9,7 @@ import akka.pattern.ask import akka.stream._ import akka.stream.scaladsl._ import akka.util.Timeout +import com.typesafe.config.ConfigFactory import org.reactivestreams.Publisher import play.api.libs.json._ import play.api.mvc._ @@ -16,6 +17,8 @@ import play.api.mvc._ import scala.concurrent.duration._ import scala.concurrent.{ExecutionContext, Future} +case class LastMapsSelectConfig(last1: Boolean, last3: Boolean, last5: Boolean, last7: Boolean) + /** * This class creates the actions and the websocket needed. */ @@ -25,6 +28,8 @@ class HomeController @Inject()(cc: ControllerComponents) extends AbstractControl implicit val actorSystem: ActorSystem = ActorSystem() implicit val ec: ExecutionContext = defaultExecutionContext + val config = ConfigFactory.load() + // Use a direct reference to SLF4J private val logger = org.slf4j.LoggerFactory.getLogger("controllers.HomeController") @@ -32,9 +37,13 @@ class HomeController @Inject()(cc: ControllerComponents) extends AbstractControl val userParentActor: ActorRef = actorSystem.actorOf(Props(classOf[UserParentActor], actorSystem)) // Home page that renders template - def index() = Action { implicit request => + def index(deciderName: String) = Action { implicit request => logger.info(s"Received request from: ${request.remoteAddress}") - Ok(views.html.index()) + val deciderHumanName = config.getString(s"deciders.$deciderName.name") + val deciderDescription = config.getString(s"deciders.$deciderName.rules") + val necronPresence = config.getBoolean(s"deciders.$deciderName.necronrestrict") + val lastmapsSettings = LastMapsSelectConfig(true, true, true, true) + Ok(views.html.index(deciderName, deciderHumanName, deciderDescription, necronPresence, lastmapsSettings)) } /** diff --git a/app/views/index.scala.html b/app/views/index.scala.html index 0257df4..9d3806d 100644 --- a/app/views/index.scala.html +++ b/app/views/index.scala.html @@ -1,6 +1,14 @@ -@()(implicit r: Request[_]) +@(deciderName: String, deciderHumanName: String, rules: String, necronPresence: Boolean, boSettings: LastMapsSelectConfig)(implicit r: Request[_]) + + + + + + + + Soulstorm tournament decider @@ -13,7 +21,7 @@ - +
-
Правила турнира "Осенняя мясорубка#1"
-

Выбор карт в БО3 и БО5 осуществляется без лузерпиков, с тремя и пятью десайдерами соответственно. - Игроки вычеркивают по очереди карты из маппула, пока их не останется 3 (для БО3) или 5 (для БО5). На этих картах и проходят все матчи встречи. Затем игроки вычеркивают выбранные карты, пока не останется только одна, на которой и играется первый матч встречи. Тот, кто первым начал вычеркивать из всего маппула, уступает оппоненту право вычеркивания первой карты из оставшихся карт-десайдеров. Во втором и последующем матчах проигравший выбирает карту из числа выбранных 3 (5) десайдеров. - В случае, если один из игроков играет за расу некронов, из маппула исключаются карты MoM и SoE, после чего оба игрока приступают к вычеркиванию карт стандартным образом из 11-картового маппула.

+
Правила турнира "@deciderHumanName"
+

@rules


diff --git a/conf/application.conf b/conf/application.conf index 90c9e43..56fa006 100644 --- a/conf/application.conf +++ b/conf/application.conf @@ -7,17 +7,45 @@ play.filters.hosts { play.http.secret.key="QCY?tAnfk?aZ?iwrNwnxIlR6CTf:123123Latabg@5241AB`R5W:1uDFN];Ik@n" play.server.http.port = 80 -maps = ["2p_battle_marshes", - "2p_fallen_city_[Rem]", - "2p_fata_morgana_[Rem]", - "2p_meeting_of_minds", - "2p_outer_reaches", - "2p_quests_triumph", - "2p_shrine_of_excellion_[Rem]", - "2p_titan_fall_[Rem]", - "2p_tranquilitys_end_[Rem]", - "2p_deadly_fun_archeology", - "2p_vortex_plateau", - "2p_sugaroasis", - "2p_blood_river_[Rem]"] +deciders{ + dvijcup{ + maps = ["2p_battle_marshes", + "2p_fallen_city_[Rem]", + "2p_meeting_of_minds", + "2p_quests_triumph", + "2p_shrine_of_excellion_[Rem]", + "2p_titan_fall_[Rem]", + "2p_tranquilitys_end_[Rem]", + "2p_fraziersdemise", + "2p_sugaroasis", + "2p_blood_river_[Rem]", + "2p_deadly_fun_archeology"] + name = "Dvij cup" + rules = """Выбор карт в БО3 и БО5 осуществляется без лузерпиков, с тремя и пятью десайдерами соответственно. + Игроки вычеркивают по очереди карты из маппула, пока их не останется 3 (для БО3) или 5 (для БО5). На этих картах и проходят все матчи встречи. + Затем игроки вычеркивают выбранные карты, пока не останется только одна, на которой и играется первый матч встречи. + Тот, кто первым начал вычеркивать из всего маппула, уступает оппоненту право вычеркивания первой карты из оставшихся карт-десайдеров. + Во втором и последующем матчах проигравший выбирает карту из числа выбранных 3 (5) десайдеров.""" + necronrestrict = false + } + newplayerslegue{ + necronrestrict = false + maps = ["2p_battle_marshes", + "2p_fallen_city", + "2p_fata_morgana", + "2p_meeting_of_minds", + "2p_outer_reaches", + "2p_quests_triumph", + "2p_shrine_of_excellion", + "2p_titan_fall_[Rem]", + "2p_tranquilitys_end", + "2p_emerald_river", + "2p_vortex_plateau", + "2p_fraziersdemise", + "2p_blood_river"] + name = "Лига новых игроков 2" + rules = """Первую карту вы с оппонентом выбираете, поочередно вычеркивая неудобные для Вас карты из этих тринадцати. Вычеркиваете, пока не остается одна. На ней и играете. В последующих матчах карту выбирает тот, кто проиграл (это называется лузер-пик). Выбирать повторно карту, на которой вы с этим оппонентом уже играли, нельзя. Играть на ремастер-версиях карт можно по обоюдному согласию игроков. Если один из Вас не скачал новые версии карт - играйте на старых.""" + necronrestrict = true + } +} diff --git a/conf/routes b/conf/routes index 3b7f411..458e3c1 100644 --- a/conf/routes +++ b/conf/routes @@ -2,15 +2,11 @@ # This file defines all application routes (Higher priority routes first) # ~~~~ -GET /meatgrinder controllers.HomeController.index -GET /bigbossofsummer controllers.HomeController.index -GET /dvijcup controllers.HomeController.index +GET /decider/:name controllers.HomeController.index(name) -GET /ws controllers.HomeController.ws +GET /ws controllers.HomeController.ws -GET /reloadconfig controllers.AdminController.reloadConfig - -GET /lobbyadmin controllers.AdminController.viewAllLobbies +GET /lobbyadmin controllers.AdminController.viewAllLobbies # Map static resources from the /public folder to the /assets URL path -GET /assets/*file controllers.Assets.at(path="/public", file) +GET /assets/*file controllers.Assets.at(path="/public", file)