initial framework added
[fp1415-soccerfun.git] / src / StdTeam / KeeperChallenger.icl
1 implementation module KeeperChallenger
2
3 import Team
4
5 keeperChallenger :: !FootballerID -> Footballer
6 keeperChallenger playerID = { defaultFootballer playerID & name = "Zidane"
7 , length = m 2.2
8 , skills = (Gaining, Catching, Kicking)
9 , brain = {memory = {waitToKick = 0}, ai = mind}
10 }
11
12 :: Memory = { waitToKick :: !Int }
13
14 decreaseWait :: !Memory -> Memory
15 decreaseWait memory=:{waitToKick} = {memory & waitToKick = max 0 (waitToKick-1)}
16
17 startWaiting :: !Memory -> Memory
18 startWaiting memory = {memory & waitToKick = 20}
19
20 mind :: !(!BrainInput,!Memory) -> (!BrainOutput,!Memory)
21 mind ({football,others,me},memory)
22 | memory.waitToKick > 0 = (Move zero zero,decreaseWait memory)
23 | ballIsGainedBy me.playerID football
24 = (KickBall {vxy={direction=bearing zero me next_pos,velocity=ms (max 5.0 (toReal (dist me next_pos)))},vz=ms 1.0},startWaiting memory)
25 | ballIsFree football && i_am_closest_to_ball
26 | dist_to_free_ball <= maxGainReach me
27 = (GainBall,memory)
28 | otherwise = (Move {direction=angle_with_free_ball,velocity=ms 4.0} (angle_with_free_ball - me.nose),memory)
29 | otherwise = (Move zero zero,memory)
30 where
31 team_players = filter (sameClub me) others
32 my_nr = me.playerID.playerNr
33 next_nr = ((my_nr-1) rem (length team_players)) + 2
34 next_player = hd (filter (identify_player {me.playerID & playerNr=next_nr}) team_players)
35 next_pos = next_player.pos
36 free_ball = getFootball football [me:others]
37 angle_with_free_ball = bearing zero me free_ball
38 dist_to_free_ball = dist me free_ball
39 i_am_closest_to_ball = dist_to_free_ball <= minList (map (dist free_ball) team_players)