Рабочий десайдер
@@ -11,6 +11,7 @@ import java.util
|
||||
import scala.collection.JavaConverters.iterableAsScalaIterableConverter
|
||||
import scala.collection.immutable.HashSet
|
||||
import scala.concurrent.duration._
|
||||
import scala.util.Try
|
||||
|
||||
case class LobbyUser(name: String, actorRef: ActorRef)
|
||||
|
||||
@@ -43,13 +44,11 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
|
||||
private var lobbyType: LobbyType = Last1()
|
||||
|
||||
private var isNecrons: Boolean = false
|
||||
|
||||
private var firstPlayerSelectedRaces: Option[SelectedRaces] = None
|
||||
private var secondPlayerSelectedRaces: Option[SelectedRaces] = None
|
||||
private var thirdPlayerSelectedRaces: Option[SelectedRaces] = None
|
||||
|
||||
|
||||
private val isSolo: Boolean = Try(config.getBoolean(s"deciders.$deciderName.isSolo")).getOrElse(false)
|
||||
private val mapsLobby: Set[DeciderMap] = {
|
||||
val configMaps = config.getList(s"deciders.$deciderName.maps").asScala
|
||||
configMaps.map(e => {
|
||||
@@ -67,7 +66,7 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
status.toString(),
|
||||
playerTurn,
|
||||
lobbyType.toString(),
|
||||
isNecrons,
|
||||
isSolo,
|
||||
mapsLobby)),
|
||||
this.self)
|
||||
|
||||
@@ -79,6 +78,16 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
// notify watchers
|
||||
logger.info(s"Ban map $mapName by ${sender.path.name}")
|
||||
|
||||
if (isSolo) {
|
||||
mapsLobby.find(p => p.map == mapName).foreach(m => m.isBanned = true)
|
||||
if (isFinish) {
|
||||
status = Finish()
|
||||
} else {
|
||||
status = Draft()
|
||||
}
|
||||
refreshAndBanMap(mapName)
|
||||
}
|
||||
|
||||
if (status == Draft()) {
|
||||
if ((playerTurn == 1 && sender == host.actorRef) ||
|
||||
(playerTurn == 2 && secondPlayer.exists(_.actorRef == sender))) {
|
||||
@@ -87,19 +96,10 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
if (!map.isBanned) {
|
||||
map.isBanned = true
|
||||
if (playerTurn == 1) playerTurn = 2 else playerTurn = 1
|
||||
if (mapsLobby.count(_.isBanned == false) == 1 && lobbyType == Last1() ||
|
||||
mapsLobby.count(_.isBanned == false) == 3 && lobbyType == Last3() ||
|
||||
mapsLobby.count(_.isBanned == false) == 5 && lobbyType == Last5() ||
|
||||
mapsLobby.count(_.isBanned == false) == 7 && lobbyType == Last7()
|
||||
) {
|
||||
if (isFinish) {
|
||||
status = Finish()
|
||||
}
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
|
||||
val senderName: String = if (sender == host.actorRef) {
|
||||
host.name
|
||||
} else secondPlayer.get.name
|
||||
users.foreach(_ ! SendBanMapMessage(BanMapMessage(senderName, mapName)))
|
||||
refreshAndBanMap(mapName)
|
||||
} else {
|
||||
logger.warn(s"User ban map $mapName, but map already banned")
|
||||
}
|
||||
@@ -227,9 +227,25 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
status.toString(),
|
||||
playerTurn,
|
||||
lobbyType.toString(),
|
||||
isNecrons,
|
||||
isSolo,
|
||||
mapsLobby)
|
||||
}
|
||||
|
||||
private def isFinish: Boolean = {
|
||||
mapsLobby.count(_.isBanned == false) == 1 && lobbyType == Last1() ||
|
||||
mapsLobby.count(_.isBanned == false) == 3 && lobbyType == Last3() ||
|
||||
mapsLobby.count(_.isBanned == false) == 5 && lobbyType == Last5() ||
|
||||
mapsLobby.count(_.isBanned == false) == 7 && lobbyType == Last7()
|
||||
}
|
||||
|
||||
private def refreshAndBanMap(mapName: String): Unit = {
|
||||
val senderName: String = if (sender == host.actorRef) {
|
||||
host.name
|
||||
} else secondPlayer.get.name
|
||||
users.foreach(_ ! SendBanMapMessage(BanMapMessage(senderName, mapName)))
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
case class BanMap(mapName: String)
|
||||
@@ -269,7 +285,7 @@ case class LobbyInfo(user1Info: UserInfo,
|
||||
status: String,
|
||||
playerTurn: BigDecimal,
|
||||
selectedType: String,
|
||||
isNecrons: Boolean,
|
||||
isSolo: Boolean,
|
||||
maps: Set[DeciderMap])
|
||||
|
||||
class LobbyStatus
|
||||
|
||||
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 51 KiB |
|
After Width: | Height: | Size: 499 KiB |
|
After Width: | Height: | Size: 41 KiB |
|
After Width: | Height: | Size: 42 KiB |
|
After Width: | Height: | Size: 40 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 36 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 39 KiB |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 38 KiB |
|
After Width: | Height: | Size: 43 KiB |
@@ -3,6 +3,11 @@ var ws;
|
||||
var userName = ""
|
||||
|
||||
var raceCount = $("#raceCount").html()
|
||||
var isSolo = $("#isSolo").html() === 'true'
|
||||
|
||||
var isMuted = false;
|
||||
var isDraftStarted = false;
|
||||
|
||||
|
||||
window.onload = function() {
|
||||
|
||||
@@ -96,6 +101,15 @@ window.onload = function() {
|
||||
}
|
||||
});
|
||||
|
||||
$("#mute").click(function(event) {
|
||||
if(isMuted){
|
||||
isMuted = false;
|
||||
$("#mute").html("🔊");
|
||||
}else{
|
||||
isMuted = true;
|
||||
$("#mute").html("🔈");
|
||||
}
|
||||
});
|
||||
|
||||
$("#exit").click(function(event) {
|
||||
event.preventDefault();
|
||||
@@ -123,7 +137,6 @@ window.onload = function() {
|
||||
|
||||
$("#playerName").html(userName);
|
||||
|
||||
|
||||
ws = new WebSocket($("body").data("ws-url"));
|
||||
ws.onmessage = function(event) {
|
||||
var message;
|
||||
@@ -131,6 +144,7 @@ window.onload = function() {
|
||||
switch (message.type) {
|
||||
case "refreshLobby":
|
||||
if(message.lobby.status === "SelectRace()" && (!isObserver)){
|
||||
isDraftStarted = false;
|
||||
renderRaces();
|
||||
}else {
|
||||
renderMaps(message.lobby.maps, message.lobby.status);
|
||||
@@ -140,7 +154,7 @@ window.onload = function() {
|
||||
case "switchToLobby":
|
||||
console.log(message);
|
||||
switchToLobby(message.lobby.maps, message.lobby.status);
|
||||
renderPlayersAndStats(message.lobby);
|
||||
if(!isSolo) renderPlayersAndStats(message.lobby);
|
||||
break;
|
||||
case "sendMessage":
|
||||
console.log(message);
|
||||
@@ -148,7 +162,7 @@ window.onload = function() {
|
||||
break;
|
||||
case "sendMapBanMessage":
|
||||
console.log(message);
|
||||
addBanMapMessageToChat(message.message);
|
||||
handleMapBanEvent(message.message);
|
||||
break;
|
||||
case "lobbyError":
|
||||
console.log(message);
|
||||
@@ -295,7 +309,7 @@ function renderRaces() {
|
||||
banned = "bannedRace";
|
||||
selectedFourthRace = i;
|
||||
}
|
||||
resHtml += '<a href = "#" class="'+selected+' thirdRaceIcon" onclick="selectFourthRace(this, ' +i+')"><img class="raceIcon" src="'+getRaceImageByNumber(i)+'"></a> ';
|
||||
resHtml += '<a href = "#" class="'+selected+' fourthRaceIcon" onclick="selectFourthRace(this, ' +i+')"><img class="raceIcon" src="'+getRaceImageByNumber(i)+'"></a> ';
|
||||
}
|
||||
resHtml += "</center></div>";
|
||||
}
|
||||
@@ -392,7 +406,7 @@ function renderMaps(maps, lobbyStatus) {
|
||||
banHtml = "<div class = 'banX'>✕</div>";
|
||||
banClass = "bannedMap";
|
||||
}
|
||||
if(lobbyStatus === "NotStarted()"){
|
||||
if(lobbyStatus === "NotStarted()" && !isSolo){
|
||||
banClass = "bannedMap";
|
||||
}
|
||||
|
||||
@@ -427,28 +441,30 @@ function renderFinish(maps, firstPlayerInfo, secondPlayerInfo) {
|
||||
|
||||
resHtml += "<div style='clear: both;'>";
|
||||
|
||||
resHtml += "<h2>" + firstPlayerInfo.name + "</h2>";
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.firstRace)+"> ";
|
||||
if(raceCount >= 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.secondRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 4){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.fourthRace)+"> ";
|
||||
}
|
||||
if(!isSolo){
|
||||
resHtml += "<h2>" + firstPlayerInfo.name + "</h2>";
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.firstRace)+"> ";
|
||||
if(raceCount >= 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.secondRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 4){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(firstPlayerInfo.selectedRaces.fourthRace)+"> ";
|
||||
}
|
||||
|
||||
resHtml += "<h2>" + secondPlayerInfo.name + "</h2>";
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.firstRace)+"> ";
|
||||
if(raceCount >= 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.secondRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 4){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.fourthRace)+"> ";
|
||||
resHtml += "<h2>" + secondPlayerInfo.name + "</h2>";
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.firstRace)+"> ";
|
||||
if(raceCount >= 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.secondRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount >= 4){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(secondPlayerInfo.selectedRaces.fourthRace)+"> ";
|
||||
}
|
||||
}
|
||||
|
||||
resHtml += "</center>"
|
||||
@@ -566,32 +582,39 @@ function renderPlayersAndStats(lobby) {
|
||||
resHtml += "</div>";
|
||||
break;
|
||||
case "SelectRace()":
|
||||
|
||||
resHtml = "<center>"+lobby.user1Info.name + " vs " + lobby.user2Info.name + " - " +lobbyTypeText+ "<br/> players select races</center>";
|
||||
break;
|
||||
case "Draft()":
|
||||
console.log(lobby.turn);
|
||||
var playerTurn = (lobby.playerTurn === 1) ? lobby.user1Info.name : lobby.user2Info.name
|
||||
resHtml = "<center>"+lobby.user1Info.name + " vs " + lobby.user2Info.name + " - " +lobbyTypeText+ "<br/><b>" + playerTurn +"</b> turn</center>";
|
||||
resHtml += "<center><img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.firstRace)+"> ";
|
||||
if(raceCount > 1){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.secondRace)+"> ";
|
||||
if(!isDraftStarted){
|
||||
isDraftStarted = true;
|
||||
}
|
||||
if(raceCount > 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount > 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.fourthRace)+"> ";
|
||||
}
|
||||
resHtml += " <span style='font-size: 14px'>VS</span> ";
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.firstRace)+">";
|
||||
if(raceCount > 1){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.secondRace)+"> ";
|
||||
}
|
||||
if(raceCount > 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount > 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.fourthRace)+"> ";
|
||||
|
||||
if(!isSolo){
|
||||
var playerTurn = (lobby.playerTurn === 1) ? lobby.user1Info.name : lobby.user2Info.name
|
||||
resHtml = "<center>"+lobby.user1Info.name + " vs " + lobby.user2Info.name + " - " +lobbyTypeText+ "<br/><b>" + playerTurn +"</b> turn</center>";
|
||||
resHtml += "<center><img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.firstRace)+"> ";
|
||||
if(raceCount > 1){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.secondRace)+"> ";
|
||||
}
|
||||
if(raceCount > 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount > 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user1Info.selectedRaces.fourthRace)+"> ";
|
||||
}
|
||||
resHtml += " <span style='font-size: 14px'>VS</span> ";
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.firstRace)+">";
|
||||
if(raceCount > 1){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.secondRace)+"> ";
|
||||
}
|
||||
if(raceCount > 2){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.thirdRace)+"> ";
|
||||
}
|
||||
if(raceCount > 3){
|
||||
resHtml += "<img class=\"raceIcon\" src="+getRaceImageByNumber(lobby.user2Info.selectedRaces.fourthRace)+"> ";
|
||||
}
|
||||
|
||||
}
|
||||
break;
|
||||
case "Finish()":
|
||||
@@ -611,7 +634,13 @@ function addMessageToChat(message){
|
||||
chatBox.scrollTop(40000);
|
||||
}
|
||||
|
||||
function addBanMapMessageToChat(message){
|
||||
function handleMapBanEvent(message){
|
||||
if(!isMuted){
|
||||
var audioPick = new Audio('/assets/sound/pick.mp3.mpeg');
|
||||
audioPick.volume = 0.1;
|
||||
audioPick.play();
|
||||
}
|
||||
|
||||
var messageHtml = "<div class='msgln'><span style='color: #2C3D9B'>" + convertMapName(message.mapTechName) + "</span> banned by " + message.user + "<br></div>";
|
||||
var chatBox = $("#chatbox");
|
||||
chatBox.append(messageHtml);
|
||||
@@ -688,6 +717,10 @@ function kickSecondPlayer(){
|
||||
}
|
||||
|
||||
function convertMapName (techMapName) {
|
||||
var mapName = techMapName.replace("2p_", "").replaceAll("_", " ") + " (2)";
|
||||
var mapPlayerSize = techMapName.charAt(0);
|
||||
var mapName = techMapName.replace(mapPlayerSize + "p_", "").replaceAll("_", " ") +
|
||||
" ("+mapPlayerSize+")";
|
||||
|
||||
|
||||
return mapName.charAt(0).toUpperCase() + mapName.slice(1);
|
||||
}
|
||||
|
||||
@@ -43,10 +43,11 @@ class HomeController @Inject()(cc: ControllerComponents) extends AbstractControl
|
||||
logger.info(s"Received request from: ${request.remoteAddress}")
|
||||
val deciderHumanName = config.getString(s"deciders.$deciderName.name")
|
||||
val deciderDescription = config.getString(s"deciders.$deciderName.rules")
|
||||
val isSolo = Try(config.getBoolean(s"deciders.$deciderName.isSolo")).getOrElse(false)
|
||||
val raceCount = Try(config.getInt(s"deciders.$deciderName.raceCount")).getOrElse(1)
|
||||
val lastmapsSettings = LastMapsSelectConfig(true, true, true, true)
|
||||
val raceSelect = RaceSelect(true, false)
|
||||
Ok(views.html.index(deciderName, deciderHumanName, raceCount, deciderDescription, raceSelect, lastmapsSettings))
|
||||
Ok(views.html.index(deciderName, deciderHumanName, raceCount, deciderDescription, raceSelect, lastmapsSettings, isSolo))
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
@(deciderName: String, deciderHumanName: String, raceCount: Int, rules: String, raceSelect: RaceSelect, boSettings: LastMapsSelectConfig)(implicit r: Request[_])
|
||||
@(deciderName: String, deciderHumanName: String, raceCount: Int, rules: String, raceSelect: RaceSelect, boSettings: LastMapsSelectConfig, isSolo: Boolean)(implicit r: Request[_])
|
||||
<!DOCTYPE html>
|
||||
|
||||
<span id="deciderName" style="display: none">@deciderName</span>
|
||||
@@ -7,6 +7,7 @@
|
||||
<span id="last3Presence" style="display: none">@boSettings.last3</span>
|
||||
<span id="last5Presence" style="display: none">@boSettings.last5</span>
|
||||
<span id="last7Presence" style="display: none">@boSettings.last7</span>
|
||||
<span id="isSolo" style="display: none">@isSolo</span>
|
||||
|
||||
|
||||
<html>
|
||||
@@ -20,7 +21,7 @@
|
||||
<script type='text/javascript' src='@routes.Assets.at("lib/underscore/underscore.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("javascripts/index.js?270822")'></script>
|
||||
<script type='text/javascript' src='@routes.Assets.at("javascripts/index.js?301222")'></script>
|
||||
</head>
|
||||
<body data-ws-url="@routes.HomeController.ws.webSocketURL()">
|
||||
<div class="navbar navbar-inverse navbar-fixed-top">
|
||||
@@ -44,6 +45,7 @@
|
||||
|
||||
<div id = "decider" style="display:none">
|
||||
<button id = "exit" class="btn btn-primary">Exit</button>
|
||||
<button id = "mute" class="btn btn-primary">🔊</button>
|
||||
<br/>
|
||||
<div id = "mapList" class="container"></div>
|
||||
<div id = "playersStatsList"></div>
|
||||
|
||||