initial framework added
[fp1415-soccerfun.git] / src / StdReferee / RefereeCoach_Passing_Assignment.icl
diff --git a/src/StdReferee/RefereeCoach_Passing_Assignment.icl b/src/StdReferee/RefereeCoach_Passing_Assignment.icl
new file mode 100644 (file)
index 0000000..6ab6e2f
--- /dev/null
@@ -0,0 +1,157 @@
+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