initial framework added
[fp1415-soccerfun.git] / src / StdTeam / KeeperChallenger.icl
diff --git a/src/StdTeam/KeeperChallenger.icl b/src/StdTeam/KeeperChallenger.icl
new file mode 100644 (file)
index 0000000..427fd07
--- /dev/null
@@ -0,0 +1,39 @@
+implementation module KeeperChallenger\r
+\r
+import Team\r
+\r
+keeperChallenger                                       :: !FootballerID -> Footballer\r
+keeperChallenger playerID                      = { defaultFootballer playerID & name   = "Zidane"\r
+                                                                                              , length = m 2.2\r
+                                                                                              , skills = (Gaining, Catching, Kicking)\r
+                                                                                              , brain  = {memory = {waitToKick = 0}, ai = mind}\r
+                                                                 }\r
+\r
+::     Memory                                                  = { waitToKick  :: !Int }\r
+\r
+decreaseWait                                           :: !Memory -> Memory\r
+decreaseWait memory=:{waitToKick}      = {memory & waitToKick = max 0 (waitToKick-1)}\r
+\r
+startWaiting                                           :: !Memory -> Memory\r
+startWaiting memory                                    = {memory & waitToKick = 20}\r
+\r
+mind                                                           :: !(!BrainInput,!Memory) -> (!BrainOutput,!Memory)\r
+mind ({football,others,me},memory)\r
+| memory.waitToKick > 0                                = (Move zero zero,decreaseWait memory)\r
+| ballIsGainedBy me.playerID football\r
+                                                                       = (KickBall {vxy={direction=bearing zero me next_pos,velocity=ms (max 5.0 (toReal (dist me next_pos)))},vz=ms 1.0},startWaiting memory)\r
+| ballIsFree football && i_am_closest_to_ball\r
+       | dist_to_free_ball <= maxGainReach me\r
+                                                                       = (GainBall,memory)\r
+       | otherwise                                             = (Move {direction=angle_with_free_ball,velocity=ms 4.0} (angle_with_free_ball - me.nose),memory)\r
+| otherwise                                                    = (Move zero zero,memory)\r
+where\r
+       team_players                                    = filter (sameClub me) others\r
+       my_nr                                                   = me.playerID.playerNr\r
+       next_nr                                                 = ((my_nr-1) rem (length team_players)) + 2\r
+       next_player                                             = hd (filter (identify_player {me.playerID & playerNr=next_nr}) team_players)\r
+       next_pos                                                = next_player.pos\r
+       free_ball                                               = getFootball football [me:others]\r
+       angle_with_free_ball                    = bearing zero me free_ball\r
+       dist_to_free_ball                               = dist me free_ball\r
+       i_am_closest_to_ball                    = dist_to_free_ball <= minList (map (dist free_ball) team_players)\r