--- /dev/null
+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