void DefendFarFromBall::perform(Robot *robot) { GameModel *gm = GameModel::getModel(); Point robPoint = robot->getRobotPosition(); Point ballPoint = gm->getBallPoint(); Point myGoal = gm->getMyGoal(); double direction = Measurments::angleBetween(myGoal, ballPoint); Point defensiveWall(cos(direction)*DISTANCE + myGoal.x, sin(direction)*DISTANCE + myGoal.y); /* Check if there are any opp robots within 3000 distance of the ball * This boolean is used to determine if the goalie should wait * before kicking the ball to a teammate in case an opp robot intersepts * the ball */ bool safeToKick = 1; for(Robot* opRob:gm->getOponentTeam()) { if (Measurments::distance(opRob->getRobotPosition(),ballPoint) < 3000) safeToKick = 0; } bool isScoreHazard = Measurments::distance(myGoal, ballPoint) < 1200 and not(Measurments::isClose(robPoint, ballPoint, 100)) and lastKickCounter <= 0 and safeToKick; if(isScoreHazard or isKickingAwayBall) { if(wasNotPreviousScoreHazard) { KTPSkill = new Skill::KickToPoint(Point(0,0), 50*M_PI/180); isKickingAwayBall = true; wasNotPreviousScoreHazard = false; } if(KTPSkill->perform(robot) or Measurments::distance(ballPoint, myGoal) > 1200){ lastKickCounter = 100; wasNotPreviousScoreHazard = true; isKickingAwayBall = false; delete KTPSkill; KTPSkill = nullptr; } } else { if(lastKickCounter > 0) --lastKickCounter; Point defensiveWall(cos(direction)*DISTANCE + myGoal.x, sin(direction)*DISTANCE + myGoal.y); setMovementTargets(defensiveWall, direction, false, false); GenericMovementBehavior::perform(robot, Movement::Type::facePoint); } }
/* This is the function that communicates outside the FPPA namespace to define * obstacle information. In our case, that is getting the GameModel and all the robots * from that. However, I would like to have this more generalized in the future. */ void buildObstacleCollection() { GameModel* mod = GameModel::getModel(); const auto& myTeam = mod->getMyTeam(); const auto& opTeam = mod->getOponentTeam(); currentFrameObstacles.clear(); currentFrameObstacles.reserve(myTeam.size() + opTeam.size() + 1); for(Robot* rob : myTeam) currentFrameObstacles.push_back(rob->getRobotPosition()); for(Robot* rob : opTeam) currentFrameObstacles.push_back(rob->getRobotPosition()); currentFrameObstacles.push_back(mod->getBallPoint()); #if FPPA_DEBUG // std::cout << "[FPPA] All Obstacles: " << std::endl; //for(Point pt : *obstacles) std::cout << pt.toString() << std::endl; #endif }