/**
* TargetingManager.java
*/
package rampancy_old.management;
import rampancy_old.*;
import rampancy_old.statistics.*;
import rampancy_old.util.*;
import rampancy_old.weapons.*;
import robocode.util.Utils;
import java.util.*;
import java.awt.*;
import java.awt.geom.*;
/**
* This class handles Durandal's targeting
* @author Matthew Chun-Lum
*
*/
public class TargetingManager {
private RampantRobot reference;
private ArrayList<TargetingManagerListener> listeners;
private double fireSwitch;
private int numReadings;
public TargetingManager() {
listeners = new ArrayList<TargetingManagerListener>();
numReadings = 0;
}
/**
* Sets the reference to Durandal
* @param reference
*/
public void setInitialState(RampantRobot reference) {
this.reference = reference;
fireSwitch = 0;
}
/**
* Targets the specified enemy robot
* @param enemy
*/
public void targetEnemy(EnemyRobot enemy) {
// handle the case where the enemy is disabled
if(enemy.getEnergy() == 0) {
reference.setTurnGunRightRadians(Utils.normalRelativeAngle(enemy.getAbsoluteBearing() - reference.getGunHeadingRadians()));
reference.fire(0.1);
return;
}
WeaponStatistic stat = reference.getStatisticsManager().getWeaponStatsForEnemy(enemy.getName());
FiringSolution firingSolution = stat.getFiringSolution(reference, enemy, 0);
BulletWave bullet = new BulletWave(enemy, (Point2D.Double) reference.getLocation().clone(), reference.getTime(), firingSolution);
reference.setTurnGunRightRadians(Utils.normalRelativeAngle(enemy.getAbsoluteBearing() - reference.getGunHeadingRadians() + firingSolution.offsetAngle));
if(reference.setFireBullet(firingSolution.power) != null) {
if(firingSolution.anticipated != null)
System.out.println("Using PM Gun");
bullet.setWillDraw(true);
stat.getGFGunStats().noteShotFired();
}
notifyListeners(bullet);
}
// -------- Listener Code ---------- //
/**
* Adds a listener to the list of listeners
* @param listener
*/
public void addListener(TargetingManagerListener listener) {
if(!listeners.contains(listener))
listeners.add(listener);
}
/**
* Removes a listener from the list if it exists
* @param listener
* @return {@code true} if the listener was removed
*/
public boolean removeListener(TargetingManagerListener listener) {
return listeners.remove(listener);
}
/**
* Notifies the listeners that multiple bullets were fired
* @param waves
*/
public void notifyListeners(ArrayList<BulletWave> waves) {
for(TargetingManagerListener listener : listeners)
listener.bulletsFired(waves);
}
/**
* Notifies the listeners that a single bullet was fired
* @param wave
*/
public void notifyListeners(BulletWave wave) {
for(TargetingManagerListener listener : listeners)
listener.bulletFired(wave);
}
}