--- /dev/null
+implementation module RefereeCoach_DeepPass_Assignment\r
+\r
+import StdEnvExt\r
+import Referee\r
+import Team_Opponent_DeepPass_Assignment\r
+\r
+RefereeCoach_DeepPass :: !FootballField -> Referee\r
+RefereeCoach_DeepPass field = { name = "RefereeCoach DeepPass"\r
+ , brain = { memory = initMem\r
+ , ai = randomlessRefereeAI (brain field)\r
+ }\r
+ , refActionPics = []\r
+ }\r
+\r
+:: Memory = { first :: !Bool\r
+ , practiceFailed :: !Bool\r
+ , gameOver :: !Bool\r
+ , ballKicked :: !Bool\r
+ , ballGained :: !Bool\r
+ , positions :: !(!Position,!Position)\r
+ }\r
+\r
+initMem :: Memory\r
+initMem = { first = True\r
+ , practiceFailed = False\r
+ , gameOver = False\r
+ , ballKicked = False\r
+ , ballGained = False\r
+ , positions = (zero,zero)\r
+ }\r
+\r
+brain :: !FootballField !(!RefereeInput,!Memory) -> (!RefereeOutput,!Memory)\r
+brain field ({RefereeInput | theBall=ballState,team1,team2},memory)\r
+| memory.gameOver // game over because of succes or failure\r
+ = ([GameOver],memory)\r
+| memory.practiceFailed // assignment has failed\r
+ = ([TellMessage "Assignment failed, correct your team and try again."],stop memory)\r
+| length (filter isFielder studentTeam) <> 2 // check if there are indeed two fielders in the students team\r
+ = ([TellMessage "There should be two fielders in student team."],stop memory)\r
+# (refActions,memory) = if memory.first // when first, alter ball pos and remember all positions\r
+ ([DirectFreeKick studentHome ballKickoff],{updateAllPos memory & first = False})\r
+ ([],memory)\r
+# playersMovedToFar = getPlayersThatMovedTooFar memory\r
+| not (isEmpty playersMovedToFar) // check if players did not move more than 10 meters from their starting positions\r
+ = (refActions ++ getMessagesForTooFarPlayers playersMovedToFar,fail memory)\r
+| ballGainedByComputer\r
+ = (refActions ++ [TellMessage ("Computer gained the ball")],fail memory)\r
+| not memory.ballKicked\r
+ | perhaps isKickedBall kickerAction = (refActions,kick memory)\r
+ | perhaps isTackled kickerAction = (refActions ++ [TackleDetected kickerID, ReprimandPlayer kickerID RedCard],fail memory)\r
+ | perhaps isTackled gainerAction = (refActions ++ [TackleDetected gainerID, ReprimandPlayer gainerID RedCard],fail memory)\r
+ | otherwise = (refActions,memory)\r
+| not memory.ballGained\r
+ | perhaps isTackled kickerAction = (refActions ++ [TackleDetected kickerID, ReprimandPlayer kickerID RedCard],fail memory)\r
+ | perhaps isTackled gainerAction = (refActions ++ [TackleDetected gainerID, ReprimandPlayer gainerID RedCard],fail memory)\r
+ | perhaps isGainedBall gainerAction = (refActions ++ [TellMessage "Well Done! Move on to the next assignment!"], stop memory)\r
+ | otherwise = (refActions,memory)\r
+| otherwise\r
+ = (refActions,memory)\r
+where\r
+ (compTeam,studentTeam,studentHome) = if (stringStarts (nameOf team1) base_TeamName_Opponent_DeepPass) (team1,team2,East) (team2,team1,West)\r
+ (kicker, gainer) = let fielders = filter isFielder studentTeam in (fielders!!0,fielders!!1)\r
+ (kickerID,gainerID) = (kicker.playerID,gainer.playerID)\r
+ kickerAction = getAction kickerID\r
+ gainerAction = getAction gainerID\r
+ ballKickoff = if (studentHome == West)\r
+ {py=scale -0.05 field.fwidth, px=scale 0.06 field.flength}\r
+ {py=scale 0.05 field.fwidth, px=scale -0.06 field.flength}\r
+ ballGainedByComputer = any (\fb -> ballIsGainedBy fb.playerID ballState) compTeam\r
+ \r
+ fail memory = {memory & practiceFailed = True}\r
+ stop memory = {memory & gameOver = True}\r
+ kick memory = {memory & ballKicked = True}\r
+\r
+ getAction :: !FootballerID -> Maybe FootballerEffect\r
+ getAction playerID = case [fb.effect \\ fb <- team1 ++ team2 | identify_player playerID fb] of\r
+ [effect:_] = effect\r
+ _ = Nothing\r
+ \r
+ updateAllPos :: !Memory -> Memory\r
+ updateAllPos memory = {memory & positions = (kicker.pos,gainer.pos)}\r
+ \r
+ getPlayersThatMovedTooFar :: !Memory -> [Footballer]\r
+ getPlayersThatMovedTooFar {positions=(kicker_pos,gainer_pos)}\r
+ = [fb \\ (fb,pos) <- [(kicker,kicker_pos),(gainer,gainer_pos)] | dist fb pos > m 10.0]\r
+ \r
+ getMessagesForTooFarPlayers = map (\fb -> TellMessage ("Your player with number " <+++ fb.playerID.playerNr <+++ " moved further than 10 meters"))\r