/**
*
*/
package rampancy.util.wave;
import java.awt.*;
import java.awt.geom.Line2D;
import rampancy.RampantRobot;
import rampancy.util.RDrawableObject;
import rampancy.util.REnemyRobot;
import rampancy.util.RPoint;
import rampancy.util.RRectangle;
import rampancy.util.RRobotState;
import rampancy.util.RUtil;
import rampancy.util.weapon.RFiringSolution;
import robocode.util.Utils;
/**
* @author Matthew Chun-Lum
*
*/
public class RBulletWave extends RWave {
public static final Color DEFAULT_COLOR = Color.green;
public static final Color ANTICIPATED_COLOR = Color.pink;
public static final int ANTICIPATED_RADIUS = 4;
protected REnemyRobot target;
protected RRobotState targetState;
protected RRobotState creatorState;
protected RFiringSolution firingSolution;
protected RPoint bulletLocation;
protected double absoluteFiringAngle;
protected boolean didHit;
/**
* @param target
* @param power
* @param anticipatedImpactLocation
*/
public RBulletWave(REnemyRobot target, RFiringSolution firingSolution) {
this(target, firingSolution, false);
}
/**
* @param target
* @param power
* @param anticipatedImpactLocation
* @param virtual
* @param color
*/
public RBulletWave(REnemyRobot target, RFiringSolution firingSolution, boolean virtual) {
super(target.getReference().getCopyOfLocation(),
target.getReference().getTime(),
firingSolution.power,
firingSolution.color,
virtual,
firingSolution.drawableObject);
this.target = target;
this.targetState = target.getCurrentState().getCopy();
this.creatorState = target.getReference().getCurrentState();
this.firingSolution = firingSolution;
this.absoluteFiringAngle = Utils.normalAbsoluteAngle(target.getReference().getGunHeadingRadians() + firingSolution.firingAngle);
this.bulletLocation = origin.getCopy();
didHit = false;
}
public void update(long time) {
super.update(time);
bulletLocation = RUtil.project(origin, absoluteFiringAngle, distanceTraveled);
if(RUtil.pointOnRobot(bulletLocation, getTarget())) {
didHit = true;
}
}
public boolean didBreak() {
return (distanceTraveled > target.getCurrentState().location.distance(origin) + 50);
}
/**
* @return the target
*/
public REnemyRobot getTarget() {
return target;
}
/**
* @return the targetState
*/
public RRobotState getTargetState() {
return targetState;
}
/**
* @return the creatorState
*/
public RRobotState getCreatorState() {
return creatorState;
}
public RFiringSolution getFiringSolution() {
return firingSolution;
}
/**
* @return the anticipatedImpactLocation
*/
public RPoint getAnticipatedImpactLocation() {
return firingSolution.intendedHitLocation;
}
public double getAbsoluteFiringAngle() {
return absoluteFiringAngle;
}
public RPoint getBulletLocation() {
return bulletLocation;
}
public boolean didHitEnemy() {
return didHit;
}
/**
* Draw the anticipated location as well
*/
public void draw(Graphics2D g) {
if(isVirtual()) {
g.setColor(color);
RUtil.fillOval(getBulletLocation(), 3, g);
return;
}
if(drawableObject != null)
drawableObject.draw(g);
if(firingSolution.intendedHitLocation == null) {
super.draw(g);
return;
}
g.setColor(ANTICIPATED_COLOR);
RUtil.fillOval(firingSolution.intendedHitLocation, ANTICIPATED_RADIUS, g);
g.draw(new RRectangle(firingSolution.intendedHitLocation));
double angle = RUtil.computeAbsoluteBearing(getOrigin(), firingSolution.intendedHitLocation);
RPoint currentPosition = RUtil.project(getOrigin(), angle, getDistanceTraveled());
if(getDistanceTraveled() > getOrigin().distance(firingSolution.intendedHitLocation))
return;
g.draw(new Line2D.Double(currentPosition, firingSolution.intendedHitLocation));
}
}