/**
* StatisticsManager.java
*/
package rampancy_old.management;
import rampancy_old.*;
import rampancy_old.data.*;
import rampancy_old.statistics.*;
import rampancy_old.util.*;
import rampancy_old.weapons.FiringSolution;
import rampancy_old.weapons.Weapon;
import robocode.HitByBulletEvent;
import java.util.*;
import java.awt.*;
import java.awt.geom.*;
/**
* This class manages data gathered from enemy robot movements and
* from Durandal's movement/attack
* @author Matthew Chun-Lum
*
*/
public class StatisticsManager implements EnemyListener {
private RampantRobot reference;
private HashMap<String, MovementStatistic> movementStats;
private HashMap<String, WeaponStatistic> weaponStats;
/**
* Constructor
*/
public StatisticsManager() {
movementStats = new HashMap<String, MovementStatistic>();
weaponStats = new HashMap<String, WeaponStatistic>();
}
/**
* Sets the reference to Durandal
* @param reference
*/
public void setInitialState(RampantRobot reference) {
this.reference = reference;
if(movementStats.size() > 0)
for(MovementStatistic stat : movementStats.values())
stat.rebuildTree();
}
/**
* Determines the danger given a wave and direction
* @param wave
* @param direction
* @return the danger of the particular wave
*/
public double getDanger(Point2D.Double predictedLocation, EnemyWave wave) {
MovementStatistic enemyStat = movementStats.get(wave.getCreator().getName());
if(enemyStat == null) {
System.out.println("EnemyStat NULL error");
return 0.0;
}
// return enemyStat.getFactorForIndex(index);
return enemyStat.getDanger(wave, predictedLocation);
}
/**
* Logs the data for the hit event
* @param e
*/
public void processHitByBulletEvent(String name, EnemyWave wave, Point2D.Double target) {
if(movementStats.containsKey(name)) {
movementStats.get(name).logHit(wave, target);
//movementStats.get(name).logVirtualHit(wave, target);
}
}
/**
* @param enemy
* @return a computed firing solution for the passed enemy
*/
public FiringSolution getFiringSolution(EnemyRobot enemy, int weapon) {
if(weaponStats.containsKey(enemy.getName())) {
return weaponStats.get(enemy.getName()).getFiringSolution(reference, enemy, weapon);
}
return null;
}
/**
* @param name
* @return a reference to the weapon statistics object for the specified enemy
*/
public WeaponStatistic getWeaponStatsForEnemy(String name) {
return weaponStats.get(name);
}
public MovementStatistic getMovementStatsForEnemy(String name) {
return movementStats.get(name);
}
/**
* Adds an enemy to the manager
* @param enemy
*/
public void addEnemy(EnemyRobot enemy) {
MovementStatistic moveStat = new MovementStatistic(enemy.getName());
movementStats.put(enemy.getName(), moveStat);
enemy.addListener(moveStat);
weaponStats.put(enemy.getName(), new WeaponStatistic(enemy.getName()));
}
/**
* Prints out the stats to the console
*/
public void printBattleStats() {
String stats = "\nBATTLE STATISTICS:\n";
for(String key : weaponStats.keySet()) {
stats += StatisticsAnalyzer.analyze(weaponStats.get(key), movementStats.get(key)).toString();
}
System.out.println(stats);
}
/**
* Invoked when an enemy that the manager is listening to gets updated
*/
public void enemyUpdated(EnemyRobot enemy) {
// TODO Auto-generated method stub
}
}