{-# LANGUAGE TypeSynonymInstances, FlexibleInstances #-} module Message where import FRP.Yampa import FRP.Yampa.Geometry import Physics import BasicTypes type Message = (ObjId, MessageBody) data MessageBody = BallMessage BallMessage | PlayerMessage PlayerMessage | GameMessage GameMessage deriving (Eq, Show) -- ************************************************************************* -- -- Ball Messages -- -- ************************************************************************* data BallMsgParam = BPWho ObjId Time -- player currently touching the ball and when he touched it | BPInit (Vector3 Double) ObjId -- starting speed and last player to touch the ball | BPOutOfPlay Team OutOfPlay Position2 ObjId -- team to throw in, type of outofplay (throw in, -- kick off, corner, free kick) and last player to touch -- the ball deriving Eq instance Show BallMsgParam where show (BPWho x t) = "BWho " ++ show x ++ " " ++ show t show (BPInit _ x) = "BPInit " ++ show x show (BPOutOfPlay team oop pos oid) = "BPOOP " ++ show team ++ " " ++ show oop ++ " " ++ show pos ++ " " ++ show oid type BallStateParam = BallMsgParam type BallMessage = (BallTransition, BallMsgParam) data BallTransition = BTGained | BTLost | BTCollisionB | BTOutOfPlay | BTGainedOOP | BTLostOOP | BTGainedGoalie deriving (Show, Eq, Ord) -- ************************************************************************* -- -- Player Messages -- -- ************************************************************************* data PlayerMessage = PhysicalPlayerMessage PhysicalPlayerMessage | TacticalPlayerMessage TacticalPlayerMessage deriving (Show, Eq) data ReleaseType = RTHigh | RTLow | RTNothing deriving (Show, Eq) data BasicMsgParam = BSPNothing | BSPWhoAndWhen ObjId Time | BSPUnstun Time -- duration of key pressed, type of kick | BSPRelease Time ReleaseType | BSPPass Time ReleaseType (Maybe ObjId) -- optional: pass receiver, if Nothing pass to designated | BSPShoot Velocity3 deriving (Show, Eq) type BasicStateParam = BasicMsgParam type PhysicalPlayerMessage = (PhysicalPlayerTransition, BasicMsgParam) data PhysicalPlayerTransition = PPTTakeMe | PPTLoseMe | PPTStun | PPTUnStun | PPTCollisionP | PPTPrepareThrowIn -- | PPTThrowIn deriving (Show, Eq, Ord) --instance Show Position3 -- where show (Point3 x y z) = "(" ++ show x ++ ", " ++ show y ++ ", " ++ show z ++ ")" data TacticalStateParam = TacticalStateParam { tspDesiredPos :: Maybe Position2 ,tspDesiredVector :: Maybe Velocity3 ,tspKicked :: Bool -- true when player has kicked the ball (necessary for rendering) ,tspPlayerId :: Maybe ObjId -- e.g. for covering another player ,tspDirection :: Maybe Angle -- direction where player is looking ,tsKickType :: Maybe ReleaseType ,tsTime :: Maybe Time -- not yet in use, can for instance track the time when -- state was entered... } deriving (Show, Eq) tspNull :: TacticalStateParam tspNull = TacticalStateParam Nothing Nothing False Nothing Nothing Nothing Nothing :: TacticalStateParam type TacticalPlayerMessage = (TacticalPlayerTransition, TacticalStateParam) data TacticalPlayerTransition = TPTWait | TPTCover | TPTHoldPosition | TPTMoveTo | TPTMoveToThrowIn | TPTIntercept | TPTDropInterception | TPTWaitForThrowIn | TPTAimThrowIn | TPTReposition | TPTKickedOff | TPTWaitForKickOff | TPTDesignateReceiver | TPTFreeze | TPTSwitchControl | TPTKickTowards | TPTTendGoal deriving (Show, Eq) instance Ord TacticalPlayerTransition where x < y = translate x < translate y where translate TPTWaitForKickOff = 5 :: Integer translate TPTWait = 10 translate TPTMoveTo = 20 translate TPTHoldPosition = 30 translate TPTCover = 40 translate TPTIntercept = 50 translate TPTDropInterception = 60 translate TPTWaitForThrowIn = 70 translate TPTMoveToThrowIn = 80 translate TPTAimThrowIn = 90 translate TPTReposition = 100 translate TPTKickedOff = 200 translate TPTDesignateReceiver = 2 translate TPTFreeze = 210 translate TPTSwitchControl = 215 translate TPTKickTowards = 216 translate TPTTendGoal = 10 x <= y = x == y || x < y x > y = not $ x < y x >= y = x == y || x > y min x y = if x < y then x else y max x y = if x > y then x else y -- ************************************************************************* -- -- Game Messages -- -- ************************************************************************* data GameTransition = GTOutOfPlay | GTGoal | GTOffsite | GTQuit | GTFreeze | GTBallInPlay | GTTakePossession | GTRunGame | GTWaitKickOff | GTCheckOffsite | GTNoOffsite deriving (Show, Eq, Ord) data GameMsgParam = GPTeamPosition Team -- Team who gets the ball on sideout or who passed the ball on OffsitePending ObjId -- Player who passed the ball on OffsitePending [(Team, ObjId, Position)] -- Position of players on passing (for OffsitePending) Position2 -- Position of event Time -- Time of event Bool -- Whistle flag OutOfPlay deriving (Eq) instance Show GameMsgParam where show (GPTeamPosition team oid _ (Point2 x y) t _ _) = "T=" ++ show team ++ ",P="++show oid++",p=(" ++ show x ++ ", " ++ show y ++ ") " ++ show t type GameStateParam = GameMsgParam type GameMessage = (GameTransition, GameMsgParam) -- ************************************************************************* -- -- General Types and Helper Functions -- -- ************************************************************************* type Collisions = [ObjId] isBallMessage :: MessageBody -> Bool isBallMessage mb = case mb of BallMessage _ -> True; _ -> False isPhysicalPlayerMessage :: MessageBody -> Bool isPhysicalPlayerMessage mb = case mb of PlayerMessage (PhysicalPlayerMessage _) -> True; _ -> False isTacticalPlayerMessage :: MessageBody -> Bool isTacticalPlayerMessage mb = case mb of PlayerMessage (TacticalPlayerMessage _) -> True; _ -> False isGameMessage :: MessageBody -> Bool isGameMessage mb = case mb of GameMessage _ -> True; _ -> False fromBPWho :: BallMsgParam -> ObjId fromBPWho (BPWho x _) = x