/*! */ bool Body_GoToPointDodge::execute( PlayerAgent * agent ) { dlog.addText( Logger::ACTION, "%s:%d: Body_GoToPointDodge" ,__FILE__, __LINE__ ); Vector2D dodge_pos; if ( ! get_dodge_point( agent, M_point, &dodge_pos ) ) { return Body_GoToPoint( M_point, 0.1, M_dash_power, -1.0, // dash speed 3 ).execute( agent ); } AngleDeg target_angle = ( M_point - agent->world().self().pos() ).th(); Vector2D dodge_rel = dodge_pos - agent->world().self().pos(); // difference angle between target and this player to dodge // if diff is positive this player is left from target angle. double ang_diff = ( target_angle - dodge_rel.th() ).degree(); if ( std::fabs( ang_diff ) > 90.0 ) { return Body_GoToPoint( M_point, 0.1, M_dash_power, -1.0, // dash speed 3 ).execute( agent ); } Vector2D new_target; if ( ang_diff > 0.0 ) { // obstacle is left from target dir -> new target is right from old new_target = dodge_pos + Vector2D::polar2vector( ServerParam::i().defaultPlayerSize() * 4.0, target_angle + 90.0 ); } else { // obstacle is right from target dir -> new target is left from old new_target = dodge_pos + Vector2D::polar2vector( ServerParam::i().defaultPlayerSize() * 4.0, target_angle - 90.0 ); } dlog.addText( Logger::ACTION, "%s:%d: dodge(%f, %f) sub-target(%f, %f)" ,__FILE__, __LINE__, dodge_pos.x, dodge_pos.y, new_target.x, new_target.y ); // never do dodge agen return Body_GoToPoint( new_target, 0.1, M_dash_power, -1.0, // dash speed 3 ).execute( agent ); }
/*! */ bool Bhv_Hunt::execute( PlayerAgent * agent ) { std::list<Vector2D> forces; //Get force from prey Vector2D preyForce = agent->world().ball().rpos(); //Vector to prey int preyCo = 1; // for future usee forces.push_front(preyForce * preyCo/preyForce.r2()); //1/r^2 relationship // Get forces from team mates // PlayerCont * team = agent->world().teammates(); // for ( PlayerCont::const_iterator tm = team.begin(); tm != team.end(); ++tm ){ // } //Sum up all forces to create resultant vector Vector2D * resultant = new Vector2D(); for ( std::list<Vector2D>::iterator it = forces.begin(); it != forces.end(); ++it ){ *resultant = *resultant + *it; } if ( Body_GoToPoint (*resultant, 5, resultant->r()).execute( agent ) ){ agent->setNeckAction( new Neck_TurnToBall()); return true; } return false; }