/**
* PatternMatchingGun.java
*/
package rampancy_old.weapons;
import java.awt.Color;
import java.awt.geom.Point2D;
import java.util.*;
import rampancy_old.statistics.pattern.*;
import rampancy_old.util.*;
/**
* @author Matthew Chun-Lum
*
*/
public abstract class PatternMatchingGun {
public static final String NAME = Constants.PM_GUN_NAME;
public static final Color DEFAULT_COLOR = Constants.PM_GUN_COLOR;
public static final int WEAPON_INDEX = Constants.PM_GUN_INDEX;
public static double computeShotPower(double deviation) {
double shotPower;
if(deviation < 0.5)
shotPower = 2.0;
else
shotPower = 1.0;
return Util.limit(0.1, shotPower, 3.0);
}
public static PMFiringSolution computOffsetAngle(Battlefield bf,
PMMatch match,
EnemyRobot enemy,
Point2D.Double fireLocation) {
if(match == null || match.pattern == null || match.pattern.isEmpty())
return null;
PMFiringSolution fs = determineInterceptLocation(bf, match, enemy, fireLocation);
if(fs == null)
return null;
double enemyAbsBearing = enemy.getAbsoluteBearing();
double bearingToIntercept = Util.computeAbsoluteBearing(fireLocation, fs.anticipated);
double offset = bearingToIntercept - enemyAbsBearing;
fs.offset = offset;
return fs;
}
public static PMFiringSolution determineInterceptLocation(Battlefield bf,
PMMatch match,
EnemyRobot enemy,
Point2D.Double fireLocation) {
double x = enemy.getLocation().x;
double y = enemy.getLocation().y;
double heading = enemy.getHeading();
ArrayList<PMState> pattern = match.pattern;
Point2D.Double bestIntercept = null;
double bestPower = 0.1;
for(int i = 0; i < pattern.size(); i++) {
MovSimStat predicted = predictPosition(x, y, heading, pattern.get(i), bf);
Point2D.Double predictedPoint = new Point2D.Double(predicted.x, predicted.y);
double power = 3.0;
while(power >= 0.1) {
if(fireLocation.distance(predictedPoint) <= Util.computeBulletVelocity(power) * (i + 1)) {
if(power > bestPower) {
bestPower = power;
bestIntercept = predictedPoint;
}
}
power -= 0.1;
}
x = predicted.x;
y = predicted.y;
heading = predicted.h;
}
if(bestIntercept == null) {
return null;
} else {
return new PMFiringSolution(bestPower, 0, bestIntercept);
}
}
private static MovSimStat predictPosition(double x, double y, double heading, PMState state, Battlefield bf) {
MovSim sim = new MovSim();
double distanceRemaining = 1000;
double battleFieldW = bf.width;
double battleFieldH = bf.height;
MovSimStat[] stat = sim.futurePos(1, x, y,
state.velocity,
state.velocity,
heading,
distanceRemaining,
state.deltaHeading,
10.0, battleFieldW,
battleFieldH);
return stat[0];
}
}