Видосы и параметризованный выбор кол-ва рас
This commit is contained in:
@@ -1,20 +1,20 @@
|
||||
package actors
|
||||
|
||||
import actors.UserActor.{BanMapMessage, GetName, HostLeaveLobby, LobbyFatal, Message, RefreshLobbyInfo, SecondPlayerLeaveLobby, SendBanMapMessage, SendMessage, SetUserAsHost, SetUserAsObs, SetUserAsSecondPlayer}
|
||||
import akka.actor.{Actor, ActorLogging, ActorRef}
|
||||
import actors.UserActor._
|
||||
import akka.actor.{Actor, ActorRef}
|
||||
import akka.event.LoggingReceive
|
||||
import com.typesafe.scalalogging.LazyLogging
|
||||
import akka.pattern.ask
|
||||
import akka.util.Timeout
|
||||
import com.typesafe.config.{Config, ConfigFactory}
|
||||
import com.typesafe.config.ConfigFactory
|
||||
import com.typesafe.scalalogging.LazyLogging
|
||||
|
||||
import java.util
|
||||
import scala.collection.JavaConverters.iterableAsScalaIterableConverter
|
||||
import scala.collection.immutable.{HashSet, Queue}
|
||||
import scala.concurrent.Await
|
||||
import scala.collection.immutable.HashSet
|
||||
import scala.concurrent.duration._
|
||||
|
||||
case class LobbyUser(name: String, actorRef: ActorRef)
|
||||
case class DeciderMap(map: String, var isBanned: Boolean = false)
|
||||
|
||||
case class DeciderMap(map: String, description: Option[String] = None, var isBanned: Boolean = false)
|
||||
|
||||
/**
|
||||
* There is one StockActor per stock symbol. The StockActor maintains a list of users watching the stock and the stock
|
||||
@@ -41,20 +41,26 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
|
||||
private var status: LobbyStatus = NotStarted()
|
||||
|
||||
private var lobbyType: LobbyType = Last3()
|
||||
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 mapsLobby: Set[DeciderMap] = {
|
||||
val configMaps = config.getStringList(s"deciders.$deciderName.maps").asScala
|
||||
val configMaps = config.getList(s"deciders.$deciderName.maps").asScala
|
||||
configMaps.map(e => {
|
||||
DeciderMap(e)
|
||||
val mapConfig = e.unwrapped().asInstanceOf[util.ArrayList[String]].asScala
|
||||
DeciderMap(mapConfig.head, mapConfig.tail.headOption)
|
||||
}).toSet
|
||||
}
|
||||
|
||||
hostUser.actorRef.tell(
|
||||
SetUserAsHost(LobbyInfo(
|
||||
UserInfo(hostUser.name,firstPlayerReady),
|
||||
UserInfo(hostUser.name, firstPlayerReady),
|
||||
UserInfo("", secondPlayerReady),
|
||||
self.path.name,
|
||||
deciderName,
|
||||
@@ -73,23 +79,24 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
// notify watchers
|
||||
logger.info(s"Ban map $mapName by ${sender.path.name}")
|
||||
|
||||
if(status == Draft()){
|
||||
if((playerTurn == 1 && sender == host.actorRef) ||
|
||||
(playerTurn == 2 && secondPlayer.exists(_.actorRef == sender))){
|
||||
if (status == Draft()) {
|
||||
if ((playerTurn == 1 && sender == host.actorRef) ||
|
||||
(playerTurn == 2 && secondPlayer.exists(_.actorRef == sender))) {
|
||||
mapsLobby.find(p => p.map == mapName) match {
|
||||
case Some(map) =>
|
||||
if(!map.isBanned){
|
||||
if (!map.isBanned) {
|
||||
map.isBanned = true
|
||||
if (playerTurn== 1) playerTurn = 2 else playerTurn = 1
|
||||
if(mapsLobby.count(_.isBanned == false) == 3 && lobbyType == Last3() ||
|
||||
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) == 9 && lobbyType == Superfinal() ||
|
||||
mapsLobby.count(_.isBanned == false) == 1 && lobbyType == LooserPick()){
|
||||
mapsLobby.count(_.isBanned == false) == 7 && lobbyType == Last7()
|
||||
) {
|
||||
status = Finish()
|
||||
}
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
|
||||
val senderName: String = if (sender == host.actorRef) {
|
||||
val senderName: String = if (sender == host.actorRef) {
|
||||
host.name
|
||||
} else secondPlayer.get.name
|
||||
users.foreach(_ ! SendBanMapMessage(BanMapMessage(senderName, mapName)))
|
||||
@@ -99,23 +106,35 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
case None =>
|
||||
logger.error(s"Map $mapName not exist")
|
||||
}
|
||||
} else{
|
||||
} else {
|
||||
logger.warn(s"Player ${sender.path.name} ban map, but turn is $playerTurn")
|
||||
}
|
||||
} else {
|
||||
logger.warn(s"Player ${sender.path.name} ban map, but lobby status is '$status' status")
|
||||
}
|
||||
case selectedRaces: SelectedRaces =>
|
||||
if (sender == host.actorRef) {
|
||||
firstPlayerSelectedRaces = Some(selectedRaces)
|
||||
logger.info(s"First player select $selectedRaces")
|
||||
} else if (sender == secondPlayer.get.actorRef) {
|
||||
secondPlayerSelectedRaces = Some(selectedRaces)
|
||||
logger.info(s"Second player select $selectedRaces")
|
||||
}
|
||||
if (firstPlayerSelectedRaces.nonEmpty && secondPlayerSelectedRaces.nonEmpty) {
|
||||
status = Draft()
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
}
|
||||
case SetReady =>
|
||||
// notify watchers
|
||||
var readyPlayer = sender()
|
||||
if(readyPlayer == hostUser.actorRef){
|
||||
if (readyPlayer == hostUser.actorRef) {
|
||||
firstPlayerReady = true
|
||||
} else if (secondPlayer.exists(sp => sp.actorRef == readyPlayer)) {
|
||||
secondPlayerReady = true
|
||||
}
|
||||
|
||||
if(firstPlayerReady && secondPlayerReady){
|
||||
status = Draft()
|
||||
if (firstPlayerReady && secondPlayerReady) {
|
||||
status = SelectRace()
|
||||
}
|
||||
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
@@ -123,7 +142,7 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
case SetNotReady =>
|
||||
// notify watchers
|
||||
var notReadyPlayer = sender()
|
||||
if(notReadyPlayer == hostUser.actorRef){
|
||||
if (notReadyPlayer == hostUser.actorRef) {
|
||||
firstPlayerReady = false
|
||||
} else if (secondPlayer.exists(sp => sp.actorRef == notReadyPlayer)) {
|
||||
secondPlayerReady = false
|
||||
@@ -132,22 +151,23 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
|
||||
case ChangeLobbyType(lobbyTypeNew) =>
|
||||
lobbyTypeNew match {
|
||||
case "last1" =>
|
||||
lobbyType = Last1()
|
||||
case "last3" =>
|
||||
lobbyType = Last3()
|
||||
case "last5" =>
|
||||
lobbyType = Last5()
|
||||
case "superfinal" =>
|
||||
lobbyType = Superfinal()
|
||||
case "looserpick" =>
|
||||
lobbyType = LooserPick()
|
||||
case "last7" =>
|
||||
lobbyType = Last7()
|
||||
|
||||
}
|
||||
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{
|
||||
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))
|
||||
@@ -163,7 +183,7 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
case MessageForLobby(message) =>
|
||||
if (sender() == host.actorRef) {
|
||||
users.foreach(_ ! SendMessage(Message(host.name, message)))
|
||||
}else if (secondPlayer.exists(sp => sp.actorRef == sender())){
|
||||
} else if (secondPlayer.exists(sp => sp.actorRef == sender())) {
|
||||
users.foreach(_ ! SendMessage(Message(secondPlayer.get.name, message)))
|
||||
}
|
||||
case JoinLobbyAsPlayer(sp) =>
|
||||
@@ -184,16 +204,16 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
sender ! SetUserAsObs(getLobbyInfoResponse)
|
||||
case LeaveLobby =>
|
||||
users = users - sender
|
||||
if(host.actorRef == sender()){
|
||||
if (host.actorRef == sender()) {
|
||||
users.foreach(_ ! HostLeaveLobby)
|
||||
context.stop(self)
|
||||
}else if(secondPlayer.exists(_.actorRef == sender())){
|
||||
} else if (secondPlayer.exists(_.actorRef == sender())) {
|
||||
secondPlayerReady = false
|
||||
secondPlayer = None
|
||||
if(status == Draft()){
|
||||
if (status == Draft() || status == SelectRace()) {
|
||||
users.foreach(_ ! SecondPlayerLeaveLobby)
|
||||
context.stop(self)
|
||||
}else {
|
||||
} else {
|
||||
users.foreach(_ ! RefreshLobbyInfo(getLobbyInfoResponse))
|
||||
}
|
||||
}
|
||||
@@ -209,8 +229,8 @@ class LobbieActor(hostUser: LobbyUser, deciderName: String) extends Actor with L
|
||||
private def getLobbyInfoResponse: LobbyInfo = {
|
||||
val user2Name = secondPlayer.map(_.name).getOrElse("")
|
||||
LobbyInfo(
|
||||
UserInfo(host.name, firstPlayerReady),
|
||||
UserInfo(user2Name, secondPlayerReady),
|
||||
UserInfo(host.name, firstPlayerReady, firstPlayerSelectedRaces),
|
||||
UserInfo(user2Name, secondPlayerReady, secondPlayerSelectedRaces),
|
||||
self.path.name,
|
||||
deciderName,
|
||||
status.toString(),
|
||||
@@ -247,7 +267,9 @@ case class ChangeIsNecronSelected(isSelected: Boolean)
|
||||
|
||||
case object InfoQuery
|
||||
|
||||
case class UserInfo(name: String, isReady: Boolean)
|
||||
case class SelectedRaces(firstRace: Int, secondRace: Int, thirdRace: Int)
|
||||
|
||||
case class UserInfo(name: String, isReady: Boolean, selectedRaces: Option[SelectedRaces] = None)
|
||||
|
||||
case class LobbyInfo(user1Info: UserInfo,
|
||||
user2Info: UserInfo,
|
||||
@@ -262,12 +284,21 @@ case class LobbyInfo(user1Info: UserInfo,
|
||||
class LobbyStatus
|
||||
|
||||
sealed case class NotStarted() extends LobbyStatus
|
||||
|
||||
sealed case class SelectRace() extends LobbyStatus
|
||||
|
||||
sealed case class Draft() extends LobbyStatus
|
||||
|
||||
sealed case class Finish() extends LobbyStatus
|
||||
|
||||
class LobbyType
|
||||
|
||||
sealed case class Last1() extends LobbyType
|
||||
|
||||
sealed case class Last3() extends LobbyType
|
||||
|
||||
sealed case class Last5() extends LobbyType
|
||||
|
||||
sealed case class Last7() extends LobbyType
|
||||
|
||||
sealed case class Superfinal() extends LobbyType
|
||||
sealed case class LooserPick() extends LobbyType
|
||||
Reference in New Issue
Block a user