From a4575459cd3f7d20dcc0f7d46d71a02eb102c0ba Mon Sep 17 00:00:00 2001 From: SK2iP Date: Mon, 2 Dec 2024 16:11:51 +0330 Subject: [PATCH 1/3] Add checks for opponent presence and offside line adjustments in action generators; update requirements and also fix a kill bug in generator_action.py --- base/generator_action.py | 2 ++ base/generator_pass.py | 6 ++++++ base/generator_shoot.py | 3 +++ requirements.txt | 1 + 4 files changed, 12 insertions(+) diff --git a/base/generator_action.py b/base/generator_action.py index 964aed07..0af768df 100644 --- a/base/generator_action.py +++ b/base/generator_action.py @@ -29,6 +29,8 @@ def __init__(self): def calculate_min_opp_dist(self, wm: 'WorldModel' = None): if wm is None: return 0.0 + if wm.opponents() is None: + return 0.0 return min([opp.pos().dist(self.target_ball_pos) for opp in wm.opponents() if opp is not None and opp.unum() > 0]) def evaluate(self, wm: 'WorldModel' = None): diff --git a/base/generator_pass.py b/base/generator_pass.py index ece617c5..268ed7ea 100644 --- a/base/generator_pass.py +++ b/base/generator_pass.py @@ -111,6 +111,9 @@ def generate_direct_pass(self, wm: 'WorldModel', receiver: 'PlayerObject'): receive_point = ptype.inertiaFinalPoint(receiver.pos(), receiver.vel()) ball_move_dist = wm.ball().pos().dist(receive_point) + if receive_point.x() >= wm.offside_line_x(): + receive_point = Vector2D(wm.offside_line_x() - 0.5, receive_point.y()) + if ball_move_dist < min_direct_pass_dist or max_direct_pass_dist < ball_move_dist: if debug_pass: log.sw_log().pass_().add_text( '#DPass to {} {}, far or close'.format(receiver.unum(), receiver.pos())) @@ -180,6 +183,9 @@ def generate_lead_pass(self, wm: 'WorldModel', receiver): for a in range(abgle_divs + 1): angle = angle_from_ball + angle_step * a receive_point = receiver.inertia_point(1) + Vector2D.from_polar(player_move_dist, angle) + + if receive_point.x() >= wm.offside_line_x(): + receive_point = Vector2D(wm.offside_line_x() - 0.5, receive_point.y()) move_dist_penalty_step = 0 ball_move_line = Line2D(wm.ball().pos(), receive_point) diff --git a/base/generator_shoot.py b/base/generator_shoot.py index 04247981..d09fae71 100644 --- a/base/generator_shoot.py +++ b/base/generator_shoot.py @@ -117,6 +117,9 @@ def check_shoot(self, wm: 'WorldModel', target_point: Vector2D, first_ball_speed for o in range(1, 12): opp = wm.their_player(o) + if opp is None: + log.sw_log().shoot().add_text( '## opp {} can not, none') + continue if opp.unum() < 1: log.sw_log().shoot().add_text( '## opp {} can not, unum') continue diff --git a/requirements.txt b/requirements.txt index 2e94d1a4..cd4ac353 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,6 @@ coloredlogs==15.0.1 humanfriendly==10.0 +setuptools==58.2.0 numpy==1.24.2 pyrusgeom==0.1.2 scipy==1.10.1 From 5c1f1a79f3c100738f93da909832ab1b51b7da9a Mon Sep 17 00:00:00 2001 From: SK2iP Date: Fri, 6 Dec 2024 03:24:52 +0330 Subject: [PATCH 2/3] Refactor kick and pass behavior to adjust target positions based on offside line; simplify dribble angle checks --- base/bhv_kick.py | 8 +++++++- base/generator_dribble.py | 2 +- base/generator_pass.py | 7 ------- 3 files changed, 8 insertions(+), 9 deletions(-) diff --git a/base/bhv_kick.py b/base/bhv_kick.py index 22c6de4f..d3293c8e 100644 --- a/base/bhv_kick.py +++ b/base/bhv_kick.py @@ -17,6 +17,7 @@ from lib.player.world_model import WorldModel from lib.player.player_agent import PlayerAgent +from pyrusgeom.geom_2d import Vector2D class BhvKick: def __init__(self): @@ -40,12 +41,17 @@ def execute(self, agent: 'PlayerAgent'): if len(action_candidates) == 0: return self.no_candidate_action(agent) - + best_action: KickAction = max(action_candidates) target = best_action.target_ball_pos + if target.x() >= wm.offside_line_x(): + target = Vector2D(wm.offside_line_x() - 0.5, target.y()) + if len(wm.opponents()) == 0 and best_action.type is KickActionType.Pass: + best_action = max(action_candidates, key=lambda x: x.eval and x.type is not KickActionType.Pass) log.debug_client().set_target(target) log.debug_client().add_message(best_action.type.value + 'to ' + best_action.target_ball_pos.__str__() + ' ' + str(best_action.start_ball_speed)) + SmartKick(target, best_action.start_ball_speed, best_action.start_ball_speed - 1, 3).execute(agent) if best_action.type is KickActionType.Pass: diff --git a/base/generator_dribble.py b/base/generator_dribble.py index 71527811..ef993d58 100644 --- a/base/generator_dribble.py +++ b/base/generator_dribble.py @@ -50,7 +50,7 @@ def generate_simple_dribble(self, wm: 'WorldModel'): for a in range(angle_div): dash_angle = wm.self().body() + (angle_step * a) - if wm.self().pos().x() < 16.0 and dash_angle.abs() > 100.0: + if dash_angle.abs() > 100.0: if debug_dribble: log.sw_log().dribble().add_text( '#dash angle:{} cancel is not safe1'.format(dash_angle)) continue diff --git a/base/generator_pass.py b/base/generator_pass.py index 268ed7ea..1f497534 100644 --- a/base/generator_pass.py +++ b/base/generator_pass.py @@ -111,9 +111,6 @@ def generate_direct_pass(self, wm: 'WorldModel', receiver: 'PlayerObject'): receive_point = ptype.inertiaFinalPoint(receiver.pos(), receiver.vel()) ball_move_dist = wm.ball().pos().dist(receive_point) - if receive_point.x() >= wm.offside_line_x(): - receive_point = Vector2D(wm.offside_line_x() - 0.5, receive_point.y()) - if ball_move_dist < min_direct_pass_dist or max_direct_pass_dist < ball_move_dist: if debug_pass: log.sw_log().pass_().add_text( '#DPass to {} {}, far or close'.format(receiver.unum(), receiver.pos())) @@ -183,10 +180,6 @@ def generate_lead_pass(self, wm: 'WorldModel', receiver): for a in range(abgle_divs + 1): angle = angle_from_ball + angle_step * a receive_point = receiver.inertia_point(1) + Vector2D.from_polar(player_move_dist, angle) - - if receive_point.x() >= wm.offside_line_x(): - receive_point = Vector2D(wm.offside_line_x() - 0.5, receive_point.y()) - move_dist_penalty_step = 0 ball_move_line = Line2D(wm.ball().pos(), receive_point) player_line_dist = ball_move_line.dist(receiver.pos()) From be7121ab25fca45ba449c0f6a9404fc4cf981dfb Mon Sep 17 00:00:00 2001 From: SK2iP Date: Fri, 6 Dec 2024 04:01:17 +0330 Subject: [PATCH 3/3] Remove unnecessary opponent presence check in minimum opponent distance calculation --- base/generator_action.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/base/generator_action.py b/base/generator_action.py index 0af768df..964aed07 100644 --- a/base/generator_action.py +++ b/base/generator_action.py @@ -29,8 +29,6 @@ def __init__(self): def calculate_min_opp_dist(self, wm: 'WorldModel' = None): if wm is None: return 0.0 - if wm.opponents() is None: - return 0.0 return min([opp.pos().dist(self.target_ball_pos) for opp in wm.opponents() if opp is not None and opp.unum() > 0]) def evaluate(self, wm: 'WorldModel' = None):