Видосы и параметризованный выбор кол-ва рас

This commit is contained in:
v.holodov
2022-06-03 21:07:54 +03:00
parent aa692419cf
commit d3e90fb01e
34 changed files with 685 additions and 126 deletions
+73 -42
View File
@@ -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
+9
View File
@@ -23,11 +23,14 @@ class UserActor(out: ActorRef,
def writes(deciderMap: DeciderMap): JsValue = {
Json.obj(
"map" -> deciderMap.map,
"description" -> deciderMap.description,
"isBanned" -> deciderMap.isBanned
)
}
}
implicit val selectedRacesWrites: OWrites[SelectedRaces] = Json.writes[SelectedRaces]
implicit val userInfoWrites: OWrites[UserInfo] = Json.writes[UserInfo]
implicit val lobbyWrites: Writes[LobbyInfo] = new Writes[LobbyInfo]{
@@ -172,6 +175,12 @@ class UserActor(out: ActorRef,
val map = (json \ "map").as[String]
lobbieActor.foreach(lobby => lobby ! BanMap(map))
case Some("selectRace") =>
val firstRace = (json \ "raceFirst").as[Int]
val secondRace = (json \ "raceSecond").as[Int]
val thirdRace = (json \ "raceThird").as[Int]
lobbieActor.foreach(lobby => lobby ! SelectedRaces(firstRace, secondRace, thirdRace))
case Some("getLobbies") =>
logger.debug("Get all lobby request")
(LobbiesActor.actor ? GetAllLobbies).mapTo[List[RefreshLobbyInfo]] onComplete {