#!/pkg/gnu/bin/gawk -f BEGIN { # GLOBAL VARIABLES # player_color : Our player color # goal_row : Row of opposing goal # goal_col : Col of opposing goal # @color : Array of colors with ( letter => color ) # @row : Array containing row locations of players ( letter => row ) # @col : Array containing col loctions of players ( letter => col ) # @energy : Array containing energy data for players ( letterl => energy ) # ball_row : Row location of ball # ball_col : Col location of ball # @notes : Addition notes about player ( letter => note ) # @static : How long the player has been static MAX_MOVE = 20; KICK_RADIUS = 6; quad_14_c = 200; quad_25_c = 400; quad_36_c = 600; quad_123_r = 150; quad_456_r = 300; # Spark the random generator srand(); # Identify which color we are getline player_color < "/dev/stdin"; close("/dev/stdin"); # Initialize field variables field_height = 300; field_width = 600; goal_row = field_height / 2; goal_col = (player_color == "red") ? field_width : 0; while( getline < "pos" > 0 ) { if ($1 ~ /^[a-zA-Z0]$/) { color[$1] = $2 pos_row[$1] = $3 pos_col[$1] = $4 energy[$1] = $5 if ($1 == "0") { ball_row = pos_row["0"] ball_col = pos_col["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]$/) { motion_row[$1] = $3 motion_col[$1] = $4 if( $1 == "0" ) { ball_motion_row = $3; ball_motion_col = $4; } } } close("dirs"); position_coordinator(); for( i in color ) { if( color[i] != player_color ) continue; print i, color[i], int(new_dirs_r[i]), int(new_dirs_c[i]), kick[i]; } } function max_movement( value ) { if( value > MAX_MOVE ) return MAX_MOVE; else if ( value < -1*MAX_MOVE ) return -1*MAX_MOVE; else return value; } function move_to_ball( player_id ) { # NOTE : Use current position + previous motion vector to determine future # location then from that loc, determine what the movement should be. delta_row = ball_row - pos_row[ player_id ] - motion_row[ player_id ]; delta_col = ball_col - pos_col[ player_id ] - motion_col[ player_id ]; if( ball_col > pos_col[ player_id ] ) delta_col=(player_color == "red")?delta_col-3:delta_col+3; else delta_col=(player_color=="red")?delta_col+3:delta_col-3; if( ball_row > pos_row[ player_id ] ) delta_row=(player_color=="red")?delta_row-3:delta_row+3; else delta_row=(player_color=="red")?delta_row+3:delta_row-3; move_r = max_movement(delta_row); move_c = max_movement(delta_col); code = within_quadrants( player_id , pos_row[ player_id ] + move_r , pos_col[ player_id ] + move_c ); # code : 0 = all good, 1 = over row boundary, 2 = over col boundary, 3 = over both boundaries if( code == 1 ) { new_dirs_r[ player_id ] = 0; new_dirs_c[ player_id ] = move_c; } else if ( code == 2 ) { new_dirs_r[ player_id ] = move_r; new_dirs_c[ player_id ] = 0; } else if ( code == 3 ) { new_dirs_r[ player_id ] = 0; new_dirs_c[ player_id ] = 0; } else { new_dirs_r[ player_id ] = move_r; new_dirs_c[ player_id ] = move_c; } if( within_range(pos_row[player_id]+move_r,pos_col[player_id]+move_c,ball_row,ball_col,KICK_RADIUS) ) kick_ball(player_id); } function within_range( new_r , new_c , target_r , target_c , tolerance ) { if( new_r + tolerance > target_r && new_r - tolerance < target_r ) { if( new_c + tolerance > target_c && new_c - tolerance < target_c ) return 1; } return 0; } function kick_ball( player_id ) { if( rand() < .5 ) kick[ player_id ] = "kick " (goal_row-pos_row[player_id]) " " (goal_col-pos_col[player_id]); else kick[ player_id ] = "kick.aloft " (goal_row-pos_row[player_id]) " " (goal_col-pos_col[player_id]); } function within_quadrants( player_id , new_r, new_c ) { return_code = 0; if( player_id == "a" ) { if( offensive_mode ) return_code = 0; else return_code = 2; } else if ( player_id == "A" ) { if( offensive_mode ) return_code = 2; else return_code = 0; } else if ( player_id == "d" || player_id == "e" || player_id == "D" || player_id == "E" ) { if( ( player_id == "d" || player_id == "D" )&& ( new_r > field_height/2 || new_r < 0 ) )return_code=1; else if ( ( player_id =="e" || player_id == "E" )&& ( new_r < field_height/2 || new_r > field_height ) ) return_code=1; if( player_id == "d" || player_id == "e" ) { if( offensive_mode ) { if( new_c > field_width/2 || new_c < 0 ) return_code = (return_code == 1)?3:2; } else { if( new_c > quad_14_c || new_c < 0 ) return_code = (return_code == 1)?3:2; } } else { # This is really defensive mode for capitals if( offensive_mode ) { if( new_c < quad_25_c || new_c > 600 ) return_code = (return_code == 1)?3:2; } else { if( new_c < field_width/2 || new_c > 600 ) return_code = (return_code == 1)?3:2; } } } else if ( player_id == "f" || player_id == "g" || player_id == "F" || player_id == "G" ) { if( ( player_id == "f" || player_id == "F" ) && ( new_r > field_height/2 || new_r < 0 ) ) return_code=1; else if ( ( player_id == "g" || player_id == "G" ) && ( new_r < field_height/2 || new_r > field_height ) ) return_code=1; if( player_id == "f" || player_id == "g" ) { if( offensive_mode ) { if( new_c > quad_36_c || new_c < quad_25_c ) return_code = (return_code == 1)?3:2; } else { if( new_c > quad_25_c || new_c < quad_14_c ) return_code = (return_code == 1)?3:2; } } else { if( offensive_mode ) { if( new_c > quad_25_c || new_c < field_width/2 ) return_code = (return_code == 1 )?3:2; } else { if( new_c < 0 || new_c > quad_14_c ) return_code = (return_code == 1 )?3:2; } } } else if ( player_id == "c" ) { if( offensive_mode ) { if( new_c > quad_36_c || new_c < quad_25_c ) return_code = 2; } else { if( new_c > quad_25_c || new_c < quad_14_c ) return_code = 2; } } else if ( player_id == "C" ) { if( offensive_mode ) { if( new_c > quad_25_c || new_c < field_width/2 ) return_code = 2; } else { if( new_c > quad_14_c || new_c < 0 ) return_code = 2; } } else if ( player_id == "b" ) { if( offensive_mode ) { if( new_c > quad_25_c || new_c < quad_14_c ) return_code = 2; } else { if( new_c > quad_14_c || new_c < 0 ) return_code = 2; } } else if ( player_id == "B" ) { if( offensive_mode ) { if( new_c > field_width || new_c < quad_25_c ) return_code = 2; } else { if( new_c < quad_14_c || new_c > quad_25_c ) return_code = 2; } } print "Player " player_id " is : " return_code; return return_code; } function not_in_position( player_id ) { # Any code other than 0 means we're not in our quadrant return within_quadrants( player_id , pos_row[ player_id ] , pos_col[ player_id ] ); } function get_in_position( player_id ) { delta_col = 0; delta_row = 0; if( player_id == "d" || player_id == "e" ) { if( offensive_mode ) delta_col = 200 - pos_col[ player_id ]; else delta_col = 100 - pos_col[ player_id ]; if( player_id == "d" ) delta_row = 75 - pos_row[ player_id ]; else delta_row = 225 - pos_row[ player_id ]; } else if ( player_id == "D" || player_id == "E" ) { if( offensive_mode ) delta_col = 550 - pos_col[player_id]; else delta_col = 400 - pos_col[player_id]; if( player_id == "D" ) delta_row = 75 - pos_row[player_id]; else delta_row = 225 - pos_row[player_id]; } else if ( player_id == "f" || player_id == "g" ) { if( offensive_mode )delta_col = 500 - pos_col[ player_id ]; else delta_col = 300 - pos_col[ player_id ]; if( player_id == "f" ) delta_row = 75 - pos_row[ player_id ]; else delta_row = 225 - pos_row[ player_id ]; } else if ( player_id == "F" || player_id == "G" ) { if( offensive_mode ) delta_col = 400 - pos_col[player_id]; else delta_col = 100 - pos_col[player_id]; if( player_id == "F" ) delta_row = 75 - pos_row[ player_id ]; else delta_row = 225 - pos_row[ player_id ]; } else if ( player_id == "c" ) { if( offensive_mode ) delta_col = 500 - pos_col[ player_id ]; else delta_col = 300 - pos_col[ player_id ]; } else if ( player_id == "C" ) { if( offensive_mode ) delta_col = 400 - pos_col[player_id]; else delta_col = 100 - pos_col[player_id]; } else if ( player_id == "b" ) { if( offensive_mode ) delta_col = 400 - pos_col[ player_id ]; else delta_col = 100 - pos_col[ player_id ]; } else if ( player_id == "B" ) { if( offensive_mode ) delta_col = 500 - pos_col[player_id]; else delta_col = 200 - pos_col[player_id]; } else if ( player_id == "a" || player_id == "A" ) { delta_row = (ball_row - pos_row[player_id])/50; } move_r = max_movement(delta_row); move_c = max_movement(delta_col); new_dirs_r[ player_id ] = move_r; new_dirs_c[ player_id ] = move_c; if( within_range(pos_row[player_id]+move_r,pos_col[player_id]+move_c,ball_row,ball_col,KICK_RADIUS ) ) kick_ball(player_id); } function position_coordinator() { # A a : Goalie # D,E d,e : Defense # B b : Midfield # F,G f,g : Wingers # C c : Center if( ball_col > field_width / 2 ) offensive_mode = 1; else offensive_mode = 0; # == defensive mode #if( player_color == "green" ) offensive_mode = !offensive_mode; #if( offensive_mode ) print "In offensive mode"; #else print "In defensive mode"; for( i in color ) { if( color[i] != player_color ) continue; # If it's the other team if( i ~ /[Aa]/ ) continue; # Don't move goalies yet if( not_in_position( i ) ) { print "Player " i " not in position"; get_in_position( i ); } else { move_to_ball( i ); # Strategerize } #if( i == "c" ) move_to_ball( i ); # In defensive mode we want d and e to be in 1 & 4, f and g to be in 2 & 5 # c to be in 2 or 5, b to be in 2 or 5 } }