Autumn meatgrinder

This commit is contained in:
Viktor Kholodov 2021-09-25 03:14:47 +03:00
parent e71480c1f7
commit 52baef061b
5 changed files with 51 additions and 18 deletions

View File

@ -43,6 +43,8 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
private var lobbyType: LobbyType = Last3() private var lobbyType: LobbyType = Last3()
private var isNecrons: Boolean = false
private val mapsLobby: Set[DeciderMap] = { private val mapsLobby: Set[DeciderMap] = {
val configMaps = config.getStringList("maps").asScala val configMaps = config.getStringList("maps").asScala
configMaps.map(e => { configMaps.map(e => {
@ -58,6 +60,7 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
status.toString(), status.toString(),
playerTurn, playerTurn,
lobbyType.toString(), lobbyType.toString(),
isNecrons,
mapsLobby)), mapsLobby)),
this.self) this.self)
@ -139,6 +142,15 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
} }
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse)) users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
case ChangeIsNecronSelected(isSelected) =>
isNecrons = isSelected
if(isSelected) {
mapsLobby.foreach(map => if(map.map == "2p_meeting_of_minds" || map.map == "2p_shrine_of_excellion_[Rem]") map.isBanned = true)
}else{
mapsLobby.foreach(map => map.isBanned = false)
}
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
case KickSecondPlayer => case KickSecondPlayer =>
if (sender() == host.actorRef) { if (sender() == host.actorRef) {
secondPlayer.foreach(player => player.actorRef ! LobbyFatal("You were kicked from lobby!")) secondPlayer.foreach(player => player.actorRef ! LobbyFatal("You were kicked from lobby!"))
@ -202,6 +214,7 @@ class LobbieActor(hostUser: LobbyUser) extends Actor with LazyLogging {
status.toString(), status.toString(),
playerTurn, playerTurn,
lobbyType.toString(), lobbyType.toString(),
isNecrons,
mapsLobby) mapsLobby)
} }
} }
@ -228,6 +241,8 @@ case class MessageForLobby(message: String)
case class ChangeLobbyType(lobbyType: String) case class ChangeLobbyType(lobbyType: String)
case class ChangeIsNecronSelected(isSelected: Boolean)
case object InfoQuery case object InfoQuery
case class UserInfo(name: String, isReady: Boolean) case class UserInfo(name: String, isReady: Boolean)
@ -238,6 +253,7 @@ case class LobbyInfo(user1Info: UserInfo,
status: String, status: String,
playerTurn: BigDecimal, playerTurn: BigDecimal,
selectedType: String, selectedType: String,
isNecrons: Boolean,
maps: Set[DeciderMap]) maps: Set[DeciderMap])
class LobbyStatus class LobbyStatus

View File

@ -38,6 +38,7 @@ class UserActor(out: ActorRef,
"status" -> lobby.status, "status" -> lobby.status,
"playerTurn" -> lobby.playerTurn, "playerTurn" -> lobby.playerTurn,
"selectedType" -> lobby.selectedType, "selectedType" -> lobby.selectedType,
"isNecrons" -> lobby.isNecrons,
"maps" -> Json.toJson(lobby.maps) "maps" -> Json.toJson(lobby.maps)
) )
} }
@ -56,6 +57,7 @@ class UserActor(out: ActorRef,
"status" -> lobby.status, "status" -> lobby.status,
"playerTurn" -> lobby.playerTurn, "playerTurn" -> lobby.playerTurn,
"selectedType" -> lobby.selectedType, "selectedType" -> lobby.selectedType,
"isNecrons" -> lobby.isNecrons,
"maps" -> Json.toJson(lobby.maps) "maps" -> Json.toJson(lobby.maps)
))) )))
} }
@ -146,6 +148,10 @@ class UserActor(out: ActorRef,
val lobbyType = (json \ "lobbyType").as[String] val lobbyType = (json \ "lobbyType").as[String]
lobbieActor.foreach(lobby => lobby ! ChangeLobbyType(lobbyType)) lobbieActor.foreach(lobby => lobby ! ChangeLobbyType(lobbyType))
case Some("changeIsNecronSelected") =>
val isNecronSelected = (json \ "isNecronSelected").as[Boolean]
lobbieActor.foreach(lobby => lobby ! ChangeIsNecronSelected(isNecronSelected))
case Some("kickSecondPlayer") => case Some("kickSecondPlayer") =>
lobbieActor.foreach(lobby => lobby ! KickSecondPlayer) lobbieActor.foreach(lobby => lobby ! KickSecondPlayer)

View File

@ -270,6 +270,10 @@ function renderPlayersAndStats(lobby) {
var last5Selected = ""; var last5Selected = "";
var superfinalSelected = ""; var superfinalSelected = "";
var looserPickSelected = ""; var looserPickSelected = "";
var isNecronsSelected = "";
if(lobby.isNecrons) isNecronsSelected = "checked";
switch (lobby.selectedType) { switch (lobby.selectedType) {
case "Last3()": case "Last3()":
last3Selected = "selected"; last3Selected = "selected";
@ -309,10 +313,19 @@ function renderPlayersAndStats(lobby) {
disabledText = "disabled"; disabledText = "disabled";
} }
resHtml += "<br/><select class=\"form-control\" id = 'deciderOption' onChange='changeLobbyType()' "+disabledText+" >" + resHtml += "<br/><select class=\"form-control\" id = 'deciderOption' onChange='changeLobbyType()' "+disabledText+" >" +
"<option "+looserPickSelected+" value = 'looserpick'>Play on last map (BO1)</option>" +
"<option "+last3Selected+" value = 'last3'>Play on last 3 maps (BO3)</option>" + "<option "+last3Selected+" value = 'last3'>Play on last 3 maps (BO3)</option>" +
"<option "+last5Selected+" value = 'last5'>Play on last 5 maps (BO5)</option>" + "<option "+last5Selected+" value = 'last5'>Play on last 5 maps (BO5)</option>" +
"<option "+superfinalSelected+" value = 'superfinal'>Superfinal (BO7)</option>" + //"<option "+superfinalSelected+" value = 'superfinal'>Superfinal (BO7)</option>" +
"</select>" "</select>";
if(lobby.user1Info.name !== userName && lobby.user2Info.name !== userName){
disabledText = "disabled";
}else{
disabledText = "";
}
resHtml += "<br/><label><input onchange=\"changeIsNecronSelected()\" id='isNecron' type=\"checkbox\" "+isNecronsSelected +" " + disabledText +">" +
" Necrons are present</label>";
resHtml += "</div>"; resHtml += "</div>";
break; break;
case "Draft()": case "Draft()":
@ -377,6 +390,14 @@ function changeLobbyType(){
})); }));
} }
function changeIsNecronSelected(){
var isNecronSelected = $("#isNecron").is(':checked');
ws.send(JSON.stringify({
type: "changeIsNecronSelected",
isNecronSelected: isNecronSelected
}));
}
function joinDecider(actorName){ function joinDecider(actorName){
ws.send(JSON.stringify({ ws.send(JSON.stringify({
type: "joinDecider", type: "joinDecider",

View File

@ -13,7 +13,7 @@
<script type='text/javascript' src='@routes.Assets.at("lib/backbonejs/backbone.js")'></script> <script type='text/javascript' src='@routes.Assets.at("lib/backbonejs/backbone.js")'></script>
<script type="text/javascript" src="@routes.Assets.at("lib/jquery-cookie/jquery.cookie.js")"></script> <script type="text/javascript" src="@routes.Assets.at("lib/jquery-cookie/jquery.cookie.js")"></script>
<script type='text/javascript' src='@routes.Assets.at("javascripts/index.js?040921")'></script> <script type='text/javascript' src='@routes.Assets.at("javascripts/index.js?180921")'></script>
</head> </head>
<body data-ws-url="@routes.HomeController.ws.webSocketURL()"> <body data-ws-url="@routes.HomeController.ws.webSocketURL()">
<div class="navbar navbar-inverse navbar-fixed-top"> <div class="navbar navbar-inverse navbar-fixed-top">
@ -51,21 +51,11 @@
</div> </div>
</div> </div>
<div style="clear: both"></div> <div style="clear: both"></div>
<div><i><b>Правила турнира Big Boss of Summer 2021</b><br/> <div><i><b>Правила турнира "Осенняя мясорубка#1"</b><br/>
<p>Выбор карт в БО3 и БО5 осуществляется без лузерпиков, с тремя и пятью десайдерами соответственно. <p>Выбор карт в БО3 и БО5 осуществляется без лузерпиков, с тремя и пятью десайдерами соответственно.
Игроки вычеркивают по очереди карты из маппула, пока их не останется 3 (для БО3) или 5 (для БО5). Игроки вычеркивают по очереди карты из маппула, пока их не останется 3 (для БО3) или 5 (для БО5). На этих картах и проходят все матчи встречи. Затем игроки вычеркивают выбранные карты, пока не останется только одна, на которой и играется первый матч встречи. Тот, кто первым начал вычеркивать из всего маппула, уступает оппоненту право вычеркивания первой карты из оставшихся карт-десайдеров. Во втором и последующем матчах проигравший выбирает карту из числа выбранных 3 (5) десайдеров.
На этих картах и проходят все матчи встречи. Затем игроки вычеркивают выбранные карты, пока не останется только одна, на которой и играется первый матч встречи. В случае, если один из игроков играет за расу некронов, из маппула исключаются карты MoM и SoE, после чего оба игрока приступают к вычеркиванию карт стандартным образом из 11-картового маппула.</p>
Тот, кто первым начал вычеркивать из всего маппула, уступает оппоненту право вычеркивания первой карты из оставшихся карт-десайдеров.
Во втором и последующем матчах проигравший выбирает карту из числа выбранных 3 (5) десайдеров.</p>
<p>В суперфинале турнира оба игрока вычеркивают по две карты. После этого из оставшихся 9 карт можно брать любые, выбирает их проигравший в предыдущем матче.
Первый лузер-пик - за игроком из нижней сетки, который начинает с -1 очком.</p>
<br> <br>
<p>Maps for BO3 and BO5 should be picked with 3 and 5 deciders respectively, w/o looser picks.
Players disclude maps from the map pool one-by-one, until they got 3 (for BO3) or 5 (for BO5).
At these maps you play all the matches vs your opponent. After defining the maps for BO3/BO5, the players disclude maps one-by-one from this small pool of 3(5), untill they get one.
This gonna be the first map for your round. The next one will be picked by looser from the previously defined map pool of 3 (5) maps.</p>
<p>At grandfinal both players disclude only two maps. After that, looser can pick ANY map from the 9 left in map pool.
First looser pick belongs to the player from looser bracket, because he/she starts with -1 score.</p>
</i> </i>
</div> </div>

View File

@ -16,8 +16,8 @@ maps = ["2p_battle_marshes",
"2p_shrine_of_excellion_[Rem]", "2p_shrine_of_excellion_[Rem]",
"2p_titan_fall_[Rem]", "2p_titan_fall_[Rem]",
"2p_tranquilitys_end_[Rem]", "2p_tranquilitys_end_[Rem]",
"2p_fraziersdemise",
"2p_emerald_river",
"2p_deadly_fun_archeology", "2p_deadly_fun_archeology",
"2p_vortex_plateau",
"2p_sugaroasis",
"2p_blood_river_[Rem]"] "2p_blood_river_[Rem]"]