/** * */ package rampancy.standard; import rampancy.RampantRobot; import rampancy.util.*; import rampancy.util.data.segmentArray.*; import rampancy.util.wave.*; import rampancy.util.weapon.*; import rampancy_old.util.Util; import robocode.util.Utils; import java.awt.Color; import java.util.*; /** * The default targeting statistic accepts a variety of * weapon statistics as input, and more can be added * later. * * @author Matthew Chun-Lum * */ public class RDefaultTargetingStatistic implements RTargetingStatistic { private RDefaultTargetingSegmentArray segmentArray; private RDefaultKDTree kdTree; private int currentWeapon; public RDefaultTargetingStatistic() { segmentArray = new RDefaultTargetingSegmentArray(); kdTree = new RDefaultKDTree(); currentWeapon = 0; } /* (non-Javadoc) * @see rampancy_v2.util.weapon.RTargetingStatistic#getBestFiringSolutionForEnemy(rampancy_v2.util.REnemyRobot, double) */ public RFiringSolution getBestFiringSolutionForEnemy(REnemyRobot enemy, double currentBearingToTarget) { // RRobotState enemyState = enemy.getCurrentState(); // // double guessFactor = getBestGuessFactorForEnemy(enemy); // // double power; // if(enemy.getCurrentState().distance < 100) { // power = 3.0; // } else { // power = (1 - enemy.getCurrentState().distance / 1500.0) * 3.0; // } // // power = Util.limit(0.1, power, 3.0); // // double offsetAngle = enemyState.directionTraveling * guessFactor * RUtil.computeMaxEscapeAngle(RUtil.computeBulletVelocity(power)); // offsetAngle = Utils.normalRelativeAngle(offsetAngle); // RFiringSolution guessFactorSolution = new RFiringSolution(power, currentBearingToTarget + offsetAngle, 0, guessFactor, Color.green, "guess factor gun"); // RFiringSolution pmFiringSolution = OldRPatternMatchingGun.getFiringSolution(enemy, RampantRobot.getGlobalReference().getGunHeadingRadians()); // if(pmFiringSolution == null || pmFiringSolution.reliabilityFactor > 0.02) { // return guessFactorSolution; // } else { // return pmFiringSolution; // } return null; } /* (non-Javadoc) * @see rampancy_v2.util.weapon.RTargetingStatistic#noteHitOnEnemy(rampancy_v2.util.REnemyRobot, rampancy_v2.util.wave.RBulletWave) */ public void noteHitOnEnemy(REnemyRobot enemy, RBulletWave wave) { updateSegmentArray(enemy, wave); updateKDTree(enemy, wave); } // -------------- Private Helpers ---------------- // private void updateSegmentArray(REnemyRobot enemy, RBulletWave wave) { RLeafSegment leaf = segmentArray.getSegmentForState(wave.getTargetState()); double desiredDirection = RUtil.computeAbsoluteBearing(wave.getOrigin(), wave.getTarget().getLastState().location); double angleOffset = Utils.normalRelativeAngle(desiredDirection - wave.getTargetState().absoluteBearing); double guessFactor = Math.max(-1, Math.min(1, angleOffset / RUtil.computeMaxEscapeAngle(wave.getVelocity()))) * wave.getTargetState().directionTraveling; int index = RUtil.computeBin(guessFactor, leaf.guessFactorArray.length); RLeafSegment.updateGuessFactors(leaf, index, 1.0, 2); } private void updateKDTree(REnemyRobot enemy, RBulletWave wave) { double desiredDirection = RUtil.computeAbsoluteBearing(wave.getOrigin(), wave.getTarget().getLastState().location); double angleOffset = Utils.normalRelativeAngle(desiredDirection - wave.getTargetState().absoluteBearing); double guessFactor = Math.max(-1, Math.min(1, angleOffset / RUtil.computeMaxEscapeAngle(wave.getVelocity()))) * wave.getTargetState().directionTraveling; kdTree.addPoint(wave.getTargetState(), guessFactor); } /* * compute the best guess factor for the given enemy */ private double getBestGuessFactorForEnemy(REnemyRobot enemy) { RLeafSegment leaf = segmentArray.getSegmentForState(enemy.getCurrentState()); // for now, just do this, modify for more guns later int bestIndex = RUtil.indexOfLargest(leaf.guessFactorArray); double factor = RUtil.getGuessFactorForIndex(bestIndex, leaf.guessFactorArray.length); return factor; } }