lila/modules/game/src/main/Event.scala

187 lines
4.6 KiB
Scala
Raw Normal View History

2013-03-22 11:53:13 -06:00
package lila.game
2012-05-14 14:36:32 -06:00
import lila.common.PimpedJson._
2012-05-14 14:36:32 -06:00
import play.api.libs.json._
2013-05-24 11:04:49 -06:00
import chess.Pos.{ piotr, allPiotrs }
2014-02-17 02:12:19 -07:00
import chess.{ PromotableRole, Pos, Color, Situation, Move => ChessMove, Clock => ChessClock }
import lila.chat.{ Line, UserLine, PlayerLine }
2012-05-14 14:36:32 -06:00
sealed trait Event {
def typ: String
def data: JsValue
def only: Option[Color] = None
def owner: Boolean = false
def watcher: Boolean = false
def troll: Boolean = false
2012-05-14 14:36:32 -06:00
}
object Event {
def fromMove(move: ChessMove): List[Event] = Move(move) :: List(
2013-10-03 04:18:30 -06:00
(move.capture ifTrue move.enpassant) map Event.Enpassant.apply,
2012-05-14 14:36:32 -06:00
move.promotion map { Promotion(_, move.dest) },
2014-02-17 02:12:19 -07:00
move.castle map { case (king, rook) => Castling(king, rook, move.color) }
2012-05-14 14:36:32 -06:00
).flatten
def fromSituation(situation: Situation): List[Event] = List(
2013-09-30 15:10:42 -06:00
situation.check ?? situation.kingPos map Check.apply,
situation.threefoldRepetition option Threefold,
2012-05-14 14:36:32 -06:00
Some(Premove(situation.color))
).flatten
def possibleMoves(situation: Situation, color: Color): Event =
2013-09-30 15:10:42 -06:00
PossibleMoves(color, (color == situation.color) ?? situation.destinations)
2012-05-14 14:36:32 -06:00
sealed trait Empty extends Event {
def data = JsNull
}
2013-03-30 15:30:47 -06:00
object Start extends Empty {
2012-05-14 14:36:32 -06:00
def typ = "start"
}
case class Move(orig: Pos, dest: Pos, color: Color, san: String) extends Event {
2012-05-14 14:36:32 -06:00
def typ = "move"
2013-04-01 21:43:01 -06:00
def data = Json.obj(
"from" -> orig.key,
"to" -> dest.key,
"color" -> color.name,
"san" -> san)
2012-05-14 14:36:32 -06:00
}
object Move {
def apply(move: ChessMove): Move =
Move(move.orig, move.dest, move.piece.color, chess.format.pgn.Dumper(move))
2012-05-14 14:36:32 -06:00
}
case class PossibleMoves(
color: Color,
moves: Map[Pos, List[Pos]]) extends Event {
2014-05-10 04:39:38 -06:00
def typ = "possibleMoves"
2012-05-14 14:36:32 -06:00
def data =
if (moves.isEmpty) JsNull
else JsObject(moves map {
2014-02-17 02:12:19 -07:00
case (o, d) => o.key -> JsString(d map (_.key) mkString)
2012-05-14 14:36:32 -06:00
} toList)
override def only = Some(color)
}
case class Enpassant(killed: Pos) extends Event {
def typ = "enpassant"
def data = JsString(killed.key)
}
case class Castling(king: (Pos, Pos), rook: (Pos, Pos), color: Color) extends Event {
def typ = "castling"
2013-04-01 21:43:01 -06:00
def data = Json.obj(
"king" -> Json.arr(king._1.key, king._2.key),
"rook" -> Json.arr(rook._1.key, rook._2.key),
"color" -> color.name
)
2012-05-14 14:36:32 -06:00
}
case class RedirectOwner(
color: Color,
2014-08-13 16:14:03 -06:00
id: String,
cookie: Option[JsObject]) extends Event {
2012-05-14 14:36:32 -06:00
def typ = "redirect"
def data = Json.obj(
2014-08-13 16:14:03 -06:00
"id" -> id,
"url" -> s"/$id",
"cookie" -> cookie
).noNull
2012-05-14 14:36:32 -06:00
override def only = Some(color)
override def owner = true
}
case class Promotion(role: PromotableRole, pos: Pos) extends Event {
def typ = "promotion"
2013-04-01 21:43:01 -06:00
def data = Json.obj(
"key" -> pos.key,
"pieceClass" -> role.toString.toLowerCase
)
2012-05-14 14:36:32 -06:00
}
case class Check(pos: Pos) extends Event {
def typ = "check"
def data = JsString(pos.key)
}
2014-01-31 18:02:32 -07:00
case class PlayerMessage(line: PlayerLine) extends Event {
2012-05-14 14:36:32 -06:00
def typ = "message"
2014-01-31 18:02:32 -07:00
def data = Line toJson line
2012-05-14 14:36:32 -06:00
override def owner = true
2014-01-31 18:02:32 -07:00
override def troll = false
2012-05-14 14:36:32 -06:00
}
2014-01-31 18:02:32 -07:00
case class UserMessage(line: UserLine, w: Boolean) extends Event {
def typ = "message"
2014-01-31 18:02:32 -07:00
def data = Line toJson line
override def troll = line.troll
override def watcher = w
2014-02-19 11:52:22 -07:00
override def owner = !w
}
2013-03-30 15:30:47 -06:00
object End extends Empty {
2012-05-14 14:36:32 -06:00
def typ = "end"
}
2013-03-30 15:30:47 -06:00
object Threefold extends Empty {
2014-05-10 04:39:38 -06:00
def typ = "threefoldRepetition"
2012-05-14 14:36:32 -06:00
}
2014-10-03 02:10:12 -06:00
case object Reload extends Empty {
def typ = "reload"
}
case object ReloadOwner extends Empty {
def typ = "reload"
override def owner = true
}
2012-05-14 14:36:32 -06:00
case class Premove(color: Color) extends Empty {
def typ = "premove"
override def only = Some(color)
override def owner = true
2012-05-14 14:36:32 -06:00
}
case class Clock(white: Float, black: Float) extends Event {
def typ = "clock"
2013-04-01 21:43:01 -06:00
def data = Json.obj(
"white" -> white,
"black" -> black
)
2012-05-14 14:36:32 -06:00
}
object Clock {
def apply(clock: ChessClock): Clock = Clock(
clock remainingTime Color.White,
clock remainingTime Color.Black)
}
2014-07-31 13:06:22 -06:00
case class CheckCount(white: Int, black: Int) extends Event {
def typ = "checkCount"
def data = Json.obj(
"white" -> white,
"black" -> black
)
}
2012-05-14 14:36:32 -06:00
case class State(color: Color, turns: Int) extends Event {
def typ = "state"
2013-04-01 21:43:01 -06:00
def data = Json.obj(
"color" -> color.name,
"turns" -> turns
)
2012-05-14 14:36:32 -06:00
}
case class Crowd(
white: Boolean,
black: Boolean,
2012-06-10 15:37:11 -06:00
watchers: List[String]) extends Event {
2012-05-14 14:36:32 -06:00
def typ = "crowd"
2013-04-01 21:43:01 -06:00
def data = Json.obj(
"white" -> white,
"black" -> black,
2013-05-10 07:32:45 -06:00
"watchers" -> watchers)
2012-05-14 14:36:32 -06:00
}
}