#! /pkg/gnu/bin/gawk -f BEGIN { srand() lmargin = 10 tmargin = 10 height = 300 width = 600 halfemh = 18 halfemw = 12 MAXDEVP = 20 TRAILS = 1 redrgoal = height/2 redcgoal = 0 greenrgoal = height/2 greencgoal = width getline whoami # print "i am "whoami while (getline < "pos" > 0) { if ($1 ~ /^[a-zA-Z0]$/) { dat[$1] = $0 color[$1] = $2 rdat[$1] = $3 cdat[$1] = $4 edat[$1] = $5 if ($1 == "0") { rball = rdat["0"] cball = cdat["0"] if ($0 ~ /aloft/) notes["0"] = "aloft" if (match($0,/static[0-9]*/)) static["0"] = substr($0,RSTART+6,RLENGTH) } } } close("pos") while (getline < "dirs" > 0) { if ($1 ~ /^[a-zA-Z0]$/) { dirdat[$1] = $0 rdev[$1] = $3 cdev[$1] = $4 if ($1 == "0") { rrdev[$1] = rdev[$1] ccdev[$1] = cdev[$1] } else { rrdev[$1] = maxdev(rdev[$1]) ccdev[$1] = maxdev(cdev[$1]) } rkick[$1] = maxkick($6) ckick[$1] = maxkick($7) kick[$1] = $5" "$6" "$7 } } close("dirs") makedirs() for (i in rrdev) { if (rand() < .5) if (color[i] == whoami) print i, color[i], rdev[i], cdev[i], kick[i] } } func rok(x) { x = int(.5+x) if (x < 0) return 0 if (x > height) return height return x } func cok(x) { x = int(.5+x) if (x < 0) return 0 if (x > width) return width return x } func eok(x) { x = int(.5+x) if (x < 0) return 0 if (x > 100) return 100 return x } func sgn(x) { if (x < 0) return -1 if (x > 0) return 1 return 0 } func abs(x) { if (x < 0) return -x return x } func makedirs() { while (getline < "init") { rinit[$1] = $3 cinit[$1] = $4 } close("init") #F and G are offensive players chaser["f"] = 1 chaser["g"] = 1 chaser["F"] = 1 chaser["G"] = 1 # to do: vision based on direction, speed, ball, player # to do: call each program for (i in dat) { if (color[i] != whoami) continue key = index("aAbBcCdDeEfFgG",i) #if you're near the ball and have enough energy, kick it if (i != "0" && i !="a" && i != "A") { if (edat[i] > 20 && chaser[i] || (abs(cdat["0"]-cdat[i]) < 100 && abs(rdat["0"]-rdat[i]) < 50)) { # cdev[i] = maxdev(cdat["0"]-cdat[i]) # rdev[i] = maxdev(rdat["0"]-rdat[i]) if (abs(cdat["f"] - cdat["0"]) < abs(cdat["g"] - cdat["0"])){ cdev["f"] = maxdev(cdat["0"]-cdat["f"]) rdev["f"] = maxdev(rdat["0"]-rdat["f"]) cdev["g"] = maxdev((greencgoal-30)-cdat["g"]) rdev["g"] = maxdev(greenrgoal-rdat["g"]) } else if (abs(cdat["g"] - cdat["0"]) <= abs(cdat["f"] - cdat["0"])){ cdev["g"] = maxdev(cdat["0"]-cdat["g"]) rdev["g"] = maxdev(rdat["0"]-rdat["g"]) cdev["f"] = maxdev((greencgoal-30)-cdat["f"]) rdev["f"] = maxdev(greenrgoal-rdat["f"]) } if (abs(cdat["F"] - cdat["0"]) < abs(cdat["G"] - cdat["0"])){ cdev["F"] = maxdev(cdat["0"]-cdat["F"]) rdev["F"] = maxdev(rdat["0"]-rdat["F"]) cdev["G"] = maxdev((redcgoal+30)-cdat["G"]) rdev["G"] = maxdev(redrgoal-rdat["G"]) } else if (abs(cdat["G"] - cdat["0"]) <= abs(cdat["F"] - cdat["0"])){ cdev["G"] = maxdev(cdat["0"]-cdat["G"]) rdev["G"] = maxdev(rdat["0"]-rdat["G"]) cdev["F"] = maxdev((redcgoal+30)-cdat["F"]) rdev["F"] = maxdev(redrgoal-rdat["F"]) } if (edat[i] > 20 && abs(cdat["0"]-cdat[i]) < 30 && abs(rdat["0"]-rdat[i]) < 30) { if (rand() < .8 && (cball < 20 || cball > width-20 || rand() < .25)) { if (color[i] ~ /red/) kick[i] = "kick.aloft " (greenrgoal-rdat[i]) " "greencgoal-cdat[i] if (color[i] ~ /green/) kick[i] = "kick.aloft " (redrgoal-rdat[i]) " "redcgoal-cdat[i] } else { if (color[i] ~ /red/) kick[i] = "kick.aloft " (greenrgoal-rdat[i]) " "greencgoal-cdat[i] if (color[i] ~ /green/) kick[i] = "kick.aloft " (redrgoal-rdat[i]) " "redcgoal-cdat[i] } } else kick[i] = "" } #move the defenders #allow the defenders to kick the ball away else if (i~"d" || i~"D" || i~"e" || i~"E" || i ~ "b" || i ~ "B" || i ~ "c" || i ~ "C"){ if (edat[i] > 20 && abs(cdat["0"]-cdat[i]) < 30 && abs(rdat["0"]-rdat[i]) < 30) { if (rand() < .8 && (cball < 20 || cball > width-20 || rand() < .25)) { if (color[i] ~ /red/) kick[i] = "kick.aloft " (greenrgoal-rdat[i]) " "greencgoal-cdat[i] if (color[i] ~ /green/) kick[i] = "kick.aloft " (redrgoal-rdat[i]) " "redcgoal-cdat[i] } else { if (color[i] ~ /red/) kick[i] = "kick.aloft " (300+200*rand()) " "greencgoal-cdat[i] if (color[i] ~ /green/) kick[i] = "kick.aloft " (-300-200*rand()) " "redcgoal-cdat[i] } } else kick[i] = "" if (whoami ~ "red"){ if (i ~ "c"){ #Upper right if (cdat[i] < cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] < 300){ rdev[i] = -5 cdev[i] = 5 } else{ rdev[i] = -5 cdev[i] = 0 } } #bottom right else if (cdat[i] < cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] < 300){ rdev[i] = 5 cdev[i] = 5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] > cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] >=100){ rdev[i] = 5 cdev[i] = -5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] > cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] >=100){ rdev[i] = -5 cdev[i] = -5 } else{ rdev[i] = -5 cdev[i] = 0 } } else{ rdev[i] = 0 cdev[i] = 0 } } else if (i ~ "d" || i ~ "e" ){ #Upper right if (cdat[i] < cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] < 100){ rdev[i] = -5 cdev[i] = 5 } else{ rdev[i] = -5 cdev[i] = 0 } } #bottom right else if (cdat[i] < cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] < 100){ rdev[i] = 5 cdev[i] = 5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] > cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] >=20){ rdev[i] = 5 cdev[i] = -5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] > cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] >=20){ rdev[i] = -5 cdev[i] = -5 } else{ rdev[i] = -5 cdev[i] = 0 } } else{ rdev[i] = 0 cdev[i] = 0 } } else if (i ~ "b"){ if (cdat[i] < greencgoal-130 && rdat[i] > 120){ cdev[i] = 10 rdev[i] = -10 } else if (cdat[i] < greencgoal-130 && rdat[i] <= 120){ cdev[i] = 10 rdev[i] = 0 } #else if (cdat[0] >= greencgoal-130 && rdat[0] > 130 && rdat[0] < 170) { #cdev[i] = maxdev(cdat[0]-cdat[i]) #rdev[i] = maxdev(rdat[0]-rdat[i]) #} else{ cdev[i]=0 rdev[i]=0 } } else{ rdev[i] = 0 cdev[i] = 0 } } else if (whoami ~ "green"){ if (i ~ "C"){ #Upper right if (cdat[i] > cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] > 300){ rdev[i] = -5 cdev[i] = -5 } else{ rdev[i] = -5 cdev[i] = 0 } } #bottom right else if (cdat[i] > cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] > 300){ rdev[i] = 5 cdev[i] = -5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] < cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] <=500){ rdev[i] = 5 cdev[i] = 5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] < cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] <=100){ rdev[i] = -5 cdev[i] = 5 } else{ rdev[i] = -5 cdev[i] = 0 } } else{ rdev[i] = 0 cdev[i] = 0 } } else if (i ~ "D" || i ~ "E"){ #Upper right if (cdat[i] > cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] > 500){ rdev[i] = -5 cdev[i] = -5 } else{ rdev[i] = -5 cdev[i] = 0 } } #bottom right else if (cdat[i] > cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] > 500){ rdev[i] = 5 cdev[i] = -5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] < cdat[0] && rdat[i] < rdat[0]){ if (cdat[i] <=580){ rdev[i] = 5 cdev[i] = 5 } else{ rdev[i] = 5 cdev[i] = 0 } } else if (cdat[i] < cdat[0] && rdat[i] > rdat[0]){ if (cdat[i] <=580){ rdev[i] = -5 cdev[i] = 5 } else{ rdev[i] = -5 cdev[i] = 0 } } else{ rdev[i] = 0 cdev[i] = 0 } } else if (i ~ "B"){ if (cdat[i] > redcgoal+130 && rdat[i] > 140){ cdev[i] = -10 rdev[i] = -10 } else if (cdat[i] > redcgoal+130 && rdat[i] < 140){ cdev[i] = -10 rdev[i] = 0 } else{ cdev[i] = 0 rdev[i] = 0 } } else{ rdev[i] = 0 cdev[i] = 0 } } }#end of defenders and cherry pickers section #if out of energy, then you can't move else { cdev[i] = 0 rdev[i] = 0 kick[i] = "" } } else { #control goalie if (edat[i] > 20 && abs(cdat["0"]-cdat[i]) < 30 && abs(rdat["0"]-rdat[i]) < 30) { if (rand() < .8 && (cball < 20 || cball > width-20 || rand() < .25)) { if (color[i] ~ /red/) kick[i] = "kick.aloft " (greenrgoal-rdat[i]) " "greencgoal-cdat[i] if (color[i] ~ /green/) kick[i] = "kick.aloft " (redrgoal-rdat[i]) " "redcgoal-cdat[i] } else { if (color[i] ~ /red/) kick[i] = "kick.aloft " (300+200*rand()) " "greencgoal-cdat[i] if (color[i] ~ /green/) kick[i] = "kick.aloft " (-300-200*rand()) " "redcgoal-cdat[i] } } else kick[i] = "" if (rdat[0] > 150 && rdat[i] <= 170){ rdev[i] = 5 cdev[i] = 0 } else if (rdat[0] < 150 && rdat[i] >= 130){ rdev[i] = -5 cdev[i] = 0 }else{ rdev[i] = 0 cdev[i] = 0 } } } } func maxkick(x) { if (x > 2*MAXDEVP) return 2*MAXDEVP if (x < -2*MAXDEVP) return -2*MAXDEVP return x } func maxdev(x) { if (x > MAXDEVP) return MAXDEVP if (x < -1*MAXDEVP) return -1*MAXDEVP return x }