initial framework added
[fp1415-soccerfun.git] / src / StdTeam / TeamMiniEffie.icl
1 implementation module TeamMiniEffie
2
3 import StdEnv, StdIO, Footballer, FootballerFunctions
4
5 Team_MiniEffies :: !Home !FootballField -> Team
6 Team_MiniEffies home field
7 | home==West = westTeam
8 | otherwise = eastTeam
9 where
10 eastTeam = mirror field westTeam
11 westTeam = [keeper : fielders]
12 clubname = base_TeamName_MiniEffie +++ if (home == West) "W" "E"
13 keeper = MiniEffie clubname home field {zero & px=scale -0.5 field.flength} 1
14 fielders = [ MiniEffie clubname home field {px=scale (-0.5*dx) field.flength,py=scale (0.5*dy) field.fwidth} nr
15 \\ (dx,dy) <- west_positions_fielders
16 & nr <- [2..]
17 ]
18 west_positions_fielders = [(0.20, 0.40)
19 ,(0.20,-0.40)
20 ,(0.23, 0.00)
21 ,(0.50, 0.45)
22 ,(0.50,-0.45)
23 ,(0.60, 0.00)
24 ,(0.70, 0.35)
25 ,(0.70,-0.35)
26 ,(0.90, 0.05)
27 ,(0.90,-0.05)
28 ]
29
30 base_TeamName_MiniEffie :: String
31 base_TeamName_MiniEffie = "MiniEffies"
32
33 :: MiniMemory = { home :: !Home }
34
35 MiniEffie :: !ClubName !Home !FootballField !Position !PlayersNumber -> Footballer
36 MiniEffie club home field position nr
37 = { playerID = {clubName=club,playerNr=nr}
38 , name = "MiniF." <+++ nr
39 , length = min_length
40 , pos = position
41 , nose = zero
42 , speed = zero
43 , skills = (Running, Kicking, Rotating)
44 , effect = Nothing
45 , stamina = max_stamina
46 , health = max_health
47 , brain = { memory = {home=home}, ai = minibrain field }
48 }
49
50 minibrain :: !FootballField !(!BrainInput,!MiniMemory) -> (!BrainOutput,!MiniMemory)
51 minibrain field (input=:{referee,me}, memory=:{home})
52 | i_am_close_to_the_ball
53 | i_can_see goal = (kick_the_ball, new_memory)
54 | otherwise = (turn_to_face goal, new_memory)
55 | i_can_see ball = (run_to_the_ball, new_memory)
56 | otherwise = (turn_to_face ball, new_memory)
57 where
58 new_memory = {home=if (any isEndHalf referee) (other home) home}
59 my_direction = me.nose
60 ball = getBall input
61 goal = centerOfGoal (other home) field
62
63 i_am_close_to_the_ball = dist me ball < maxKickReach me
64 i_can_see pos = abs (bearing my_direction me pos) < rad (0.05*pi)
65
66 run_to_the_ball = Move {direction=bearing zero me ball,velocity=speed_of_light} zero
67 turn_to_face pos = Move zero (bearing my_direction me pos)
68 kick_the_ball = KickBall {vxy={direction=my_direction,velocity=speed_of_light}, vz=ms 1.0}
69 speed_of_light = ms 299792458.0