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