--- /dev/null
+implementation module RefereeCoach_Passing_Assignment\r
+\r
+import StdEnvExt\r
+import Referee\r
+import Team_Opponent_Passing_Assignment\r
+\r
+RefereeCoach_Passing :: !FootballField -> Referee\r
+RefereeCoach_Passing field = { name = "RefereeCoach Passing"\r
+ , brain = { memory = initMem\r
+ , ai = randomlessRefereeAI (brain field)\r
+ }\r
+ , refActionPics = []\r
+ }\r
+\r
+:: Memory = { first :: !Bool\r
+ , kickedBy1 :: !Bool // PA: oh dear, you should use [Bool], or better: if in sequence: Int\r
+ , kickedBy2 :: !Bool\r
+ , kickedBy3 :: !Bool\r
+ , kickedBy4 :: !Bool\r
+ , kickedBy5 :: !Bool\r
+ , kickedBy6 :: !Bool\r
+ , pos1 :: !Position // PA: dito, but now [Position]\r
+ , pos2 :: !Position\r
+ , pos3 :: !Position\r
+ , pos4 :: !Position\r
+ , pos5 :: !Position\r
+ , pos6 :: !Position\r
+ , practiceFailed :: !Bool\r
+ , gameOver :: !Bool \r
+ }\r
+\r
+initMem :: Memory\r
+initMem = { first = True\r
+ , kickedBy1 = False\r
+ , kickedBy2 = False\r
+ , kickedBy3 = False\r
+ , kickedBy4 = False\r
+ , kickedBy5 = False\r
+ , kickedBy6 = False\r
+ , pos1 = zero\r
+ , pos2 = zero\r
+ , pos3 = zero\r
+ , pos4 = zero\r
+ , pos5 = zero\r
+ , pos6 = zero\r
+ , practiceFailed = False\r
+ , gameOver = False\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"],{memory & gameOver = True})\r
+| length players <> 6 // Check if there are indeed six fielders (to prevent run time errors)\r
+ = ([TellMessage "Number of fielders should be six. Correct your team and try again."],{memory & gameOver = True})\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 // check if players did not move more than 10 meters from their starting positions\r
+| not (isEmpty playersMovedToFar)\r
+ = (refActions ++ getMessagesForTooFarPlayers playersMovedToFar,{memory & practiceFailed = True})\r
+| not memory.kickedBy1 // first player has not kicked the ball yet\r
+ # (more,memory) = checkIfPlayerKickedBall 1 memory\r
+ = (refActions++more,memory)\r
+| not memory.kickedBy2 // second player has not kicked the ball yet\r
+ # (more,memory) = checkIfPlayerKickedBall 2 memory\r
+ = (refActions++more,memory)\r
+| not memory.kickedBy3 // third player has not kicked the ball yet\r
+ # (more,memory) = checkIfPlayerKickedBall 3 memory\r
+ = (refActions++more,memory)\r
+| not memory.kickedBy4 // fourth player has not kicked the ball yet\r
+ # (more,memory) = checkIfPlayerKickedBall 4 memory\r
+ = (refActions++more,memory)\r
+| not memory.kickedBy5 // fifth player has not kicked the ball yet\r
+ # (more,memory) = checkIfPlayerKickedBall 5 memory\r
+ = (refActions++more,memory)\r
+| not memory.kickedBy6 // sixth player has not kicked the ball yet\r
+ # (more,memory) = checkIfPlayerKickedBall 6 memory\r
+ = (refActions++more,memory)\r
+| ballIsGoingInWrongDirection // ball is going in the wrong direction\r
+ = (refActions ++ [TellMessage "ball should be played towards the goal"],{memory & practiceFailed = True})\r
+| ballBehindLine // ball is behind the line\r
+ | theBall.ballPos.pz > goal_height // ball is over\r
+ = (refActions ++ [TellMessage "Try shooting less high, the ball went over"],{memory & practiceFailed = True})\r
+ | isbetween theBall.ballPos.pxy.py south_pole north_pole\r
+ = (refActions ++ [TellMessage "Well Done! Move on to the next assignment!"],{memory & gameOver = True})\r
+ | otherwise\r
+ = (refActions ++ [TellMessage "Ball is out, try shooting in the goal next time"],{memory & practiceFailed = True})\r
+| theBall.ballSpeed.vxy.velocity == zero // ball stopped moving\r
+ = (refActions ++ [TellMessage "Try shooting harder, the ball stopped moving forwards"],{memory & practiceFailed = True})\r
+| otherwise // ball may be on its way to the goal\r
+ = (refActions,memory)\r
+where\r
+ theBall = getFootball ballState (team1 ++ team2)\r
+ (compTeam,(studentTeam,studentHome)) = if (stringStarts (nameOf team1) base_TeamName_Opponent_Passing) (team1,(team2,East)) (team2,(team1,West))\r
+ ballKickoff = {zero & px = if (studentHome == West) (scale -0.5 field.flength + penalty_area_depth) (scale 0.5 field.flength - penalty_area_depth)}\r
+ getMessagesForTooFarPlayers = map (\fb -> TellMessage ("Your player with number " <+++ fb.playerID.playerNr <+++ " moved further than 10 meters"))\r
+ (north_pole,south_pole) = goal_poles field\r
+ \r
+ players = filter isFielder studentTeam\r
+ stud1 = players!!0\r
+ stud2 = players!!1\r
+ stud3 = players!!2\r
+ stud4 = players!!3\r
+ stud5 = players!!4\r
+ stud6 = players!!5\r
+ stud1fa = getAction stud1.playerID\r
+ stud2fa = getAction stud2.playerID\r
+ stud3fa = getAction stud3.playerID\r
+ stud4fa = getAction stud4.playerID\r
+ stud5fa = getAction stud5.playerID\r
+ stud6fa = getAction stud6.playerID\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
+ ballIsGoingInWrongDirection = if (studentHome == West) > < theBall.ballSpeed.vxy.direction (rad (0.5*pi)) &&\r
+ if (studentHome == East) < > theBall.ballSpeed.vxy.direction (rad (1.5*pi)) \r
+ ballBehindLine = abs theBall.ballPos.pxy.px > scale 0.5 field.flength\r
+ \r
+ updateAllPos :: !Memory -> Memory\r
+ updateAllPos memory = {memory & pos1 = stud1.pos\r
+ , pos2 = stud2.pos\r
+ , pos3 = stud3.pos\r
+ , pos4 = stud4.pos\r
+ , pos5 = stud5.pos\r
+ , pos6 = stud6.pos\r
+ }\r
+ \r
+ getPlayersThatMovedTooFar :: !Memory -> [Footballer]\r
+ getPlayersThatMovedTooFar memory\r
+ = [fb \\ fb <- players & pos <- [memory.pos1,memory.pos2,memory.pos3,memory.pos4,memory.pos5,memory.pos6] | dist fb pos > m 10.0]\r
+ \r
+ checkIfPlayerKickedBall :: !Int !Memory -> (![RefereeAction],!Memory)\r
+ checkIfPlayerKickedBall i memory\r
+ # (studfa,stud) = case i of\r
+ 1 -> (stud1fa,stud1)\r
+ 2 -> (stud2fa,stud2)\r
+ 3 -> (stud3fa,stud3)\r
+ 4 -> (stud4fa,stud4)\r
+ 5 -> (stud5fa,stud5)\r
+ 6 -> (stud6fa,stud6)\r
+ | perhaps isKickedBall studfa = ([], updateMemory i memory)\r
+ | perhaps isCaughtBall studfa = ([Hands stud.playerID, ReprimandPlayer stud.playerID RedCard],{memory & practiceFailed = True})\r
+ | otherwise = ([], memory)\r
+ where\r
+ updateMemory :: !Int !Memory -> Memory\r
+ updateMemory 1 m = {m & kickedBy1 = True}\r
+ updateMemory 2 m = {m & kickedBy2 = True}\r
+ updateMemory 3 m = {m & kickedBy3 = True}\r
+ updateMemory 4 m = {m & kickedBy4 = True}\r
+ updateMemory 5 m = {m & kickedBy5 = True}\r
+ updateMemory 6 m = {m & kickedBy6 = True}\r