public override NodeStatus Run() { var evt = blackboard.robot.LastScanEvent; if (evt == null) { return(NodeStatus.Failed); } // Calculate bearing from gun to target var absoluteBearing = blackboard.robot.Heading + evt.Bearing; var bearingFromGun = Utils.NormalRelativeAngleDegrees(absoluteBearing - blackboard.robot.GunHeading); // Turn left or right depending on what is shortest if (bearingFromGun < 0) { blackboard.robot.SetTurnGunLeft(Math.Abs(bearingFromGun)); } else if (bearingFromGun > 0) { blackboard.robot.SetTurnGunRight(Math.Abs(bearingFromGun)); } if (!useParallel) { blackboard.robot.Execute(); } return(NodeStatus.Success); }
public override NodeStatus Run() { var evt = blackboard.robot.LastScanEvent; if (evt == null) { return(NodeStatus.Failed); } // Calculation stolen from http://robowiki.net/wiki/Linear_Targeting var bulletPower = 3; var headOnBearing = blackboard.robot.HeadingRadians + evt.BearingRadians; var linearBearing = headOnBearing + Math.Asin(evt.Velocity / Rules.GetBulletSpeed(bulletPower) * Math.Sin(evt.HeadingRadians - headOnBearing)); blackboard.robot.TurnGunRightRadians(Utils.NormalRelativeAngle(linearBearing - blackboard.robot.GunHeadingRadians)); return(NodeStatus.Success); }