package it.marteEngine.entity; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Set; /** * Holds all the alarms for a single Entity. The entity is notified when an * alarm is triggered by the alarmTriggered method. */ public class AlarmContainer { private Map<String, Alarm> alarms = new HashMap<String, Alarm>(); private Map<String, Alarm> alarmsToAdd = new HashMap<String, Alarm>(); private Entity entity; public AlarmContainer(Entity entity) { this.entity = entity; } public void addAlarm(Alarm alarm, boolean startNow) { if (startNow) { alarm.start(); } alarmsToAdd.put(alarm.getName(), alarm); } public void update(int delta) { List<String> deadAlarms = null; Set<String> alarmNames = alarms.keySet(); for (String alarmName : alarmNames) { Alarm alarm = alarms.get(alarmName); if (alarm.isActive()) { updateActiveAlarm(alarm, delta); } if (alarm.isDead()) { if (deadAlarms == null) { deadAlarms = new ArrayList<String>(); } deadAlarms.add(alarmName); } } if (deadAlarms != null) { for (String deadAlarm : deadAlarms) { alarms.remove(deadAlarm); } } if (!alarmsToAdd.isEmpty()) { for (String alarmName : alarmsToAdd.keySet()) { alarms.put(alarmName, alarmsToAdd.get(alarmName)); } alarmsToAdd.clear(); } } private void updateActiveAlarm(Alarm alarm, int delta) { boolean retval = alarm.update(delta); if (retval) { entity.alarmTriggered(alarm.getName()); if (alarm.isOneShotAlaram()) { alarm.setActive(false); } else { alarm.start(); } } } public boolean restartAlarm(String name) { Alarm alarm = alarms.get(name); if (alarm != null) { alarm.start(); return true; } return false; } public boolean pauseAlarm(String name) { Alarm alarm = alarms.get(name); if (alarm != null) { alarm.pause(); return true; } return false; } public boolean resumeAlarm(String name) { Alarm alarm = alarms.get(name); if (alarm != null) { alarm.resume(); return true; } return false; } public boolean destroyAlarm(String name) { Alarm alarm = alarms.get(name); if (alarm != null) { alarm.setDead(true); return true; } return false; } public boolean hasAlarm(String name) { return alarms.containsKey(name); } }