package marathon.leela;
import java.util.*;
import robocode.*;
import robocode.util.*;
/**
* This class manages and tracks enemy movements, notifying listeners as needed
* @author Matthew Chun-Lum
*
*/
public class EnemyManager {
private HashMap<String, EnemyRobot> enemies;
private ArrayList<EnemyManagerListener> listeners;
private Leela reference;
/**
* Constructor
*/
public EnemyManager() {
enemies = new HashMap<String, EnemyRobot>();
listeners = new ArrayList<EnemyManagerListener>();
}
/**
* Sets the reference to Leela
* @param ref
*/
public void setReference(Leela ref) {
reference = ref;
if(!enemies.isEmpty())
for(EnemyRobot enemy : enemies.values())
enemy.setReference(ref);
}
/**
* Given a ScannedRobotEvent, adds a new robot to the enemies map
* @param e
*/
public void addEnemy(ScannedRobotEvent e) {
EnemyRobot enemy = new EnemyRobot(e, reference);
enemies.put(e.getName(), enemy);
notifyListeners(enemy);
}
/**
* Updates the enemy specified by the ScannedRobotEvent
* @param e
*/
public void updateEnemy(ScannedRobotEvent e) {
if(enemies.containsKey(e.getName())) {
EnemyRobot enemy = enemies.get(e.getName());
enemy.update(e);
notifyListeners(enemy);
}
}
/**
* Returns the enemy robot from the map that corresponds to the key
* @param name
* @return
*/
public EnemyRobot getEnemy(String name) {
return enemies.get(name);
}
/**
* Removes the specified enemy (by name) from the map
* @param name
*/
public void removeEnemy(String name) {
notifyListeners(getEnemy(name));
enemies.remove(name);
}
/**
* Removes the specified robot from the map
* @param enemy
*/
public void removeEnemy(EnemyRobot enemy) {
notifyListeners(enemy);
enemies.remove(enemy);
}
/**
* @param name
* @return true if the enemies map contains the specified enemy
*/
public boolean isTrackingEnemy(String name) {
return enemies.containsKey(name);
}
/**
* Notifies all listeners that the passed EnemyRobot has been updated
* @param enemy
*/
public void notifyListeners(EnemyRobot enemy) {
for(EnemyManagerListener listener : listeners)
listener.enemyUpdated(enemy);
}
/**
* Adds the passed listener to the list of listeners. If the listener has
* previously been added, no action is taken
* @param listener
*/
public void addListener(EnemyManagerListener listener) {
if(!listeners.contains(listener))
listeners.add(listener);
}
/**
* Removes the passed listener from the list of listeners
* @param listener
*/
public void removeListener(EnemyManagerListener listener) {
listeners.remove(listener);
}
}