/** * Colloid project * * Combat log analyzer. * * copyright: (c) 2013 by Darek <netmik12 [AT] gmail [DOT] com> * license: BSD, see LICENSE for more details */ package colloid.model.event; import java.util.Comparator; import java.util.Iterator; import colloid.model.event.Combat; import colloid.model.event.Combat.Event; public class Actor extends Character implements Combat.Actor, Comparable<Actor> { public Actor(String logdata) throws DoesNotExist { super(logdata); } @Override public boolean isPlayer() { // TODO Auto-generated method stub return false; } @Override public String getName() { return name; } @Override public void compile() throws DoesNotExist { try { String[] items = logdata.substring(1).split("\\]\\s\\["); if (items[1].contains("{")) { name = items[1].substring(0, items[1].indexOf("{")-1); return; } name = items[1]; } catch (StringIndexOutOfBoundsException ex) { throw new DoesNotExist(); } catch (ArrayIndexOutOfBoundsException ex) { throw new DoesNotExist(); } } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((name == null) ? 0 : name.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; Actor other = (Actor) obj; if (name == null) { if (other.name != null) return false; } else if (!name.equals(other.name)) return false; return true; } public double getDamageDone() { return getValueDone(new EventFilter() { @Override boolean hasEvent(Event event) { if (event instanceof CombatDamageEvent) { return true; } return false; } }); } public double getDamageDone(final Fight fight) { if (fight == null) { return 0; } return getValueDone(new EventFilter() { @Override boolean hasEvent(Event event) { if (event.getFight() == null) { return false; } if (event instanceof CombatDamageEvent && event.getFight().equals(fight)) { return true; } return false; } public boolean isOld(Event event) { if (fight.start.getTime() < ((CombatEvent) event).getTimestamp().getTime()) { return false; } return true; } }); } public double getHealDone() { return getValueDone(new EventFilter() { @Override boolean hasEvent(Event event) { if (event instanceof CombatHealEvent) { return true; } return false; } }); } public double getHealDone(final Fight fight) { if (fight == null) { return 0; } return getValueDone(new EventFilter() { @Override boolean hasEvent(Event event) { if (event.getFight() == null) { return false; } if (event instanceof CombatHealEvent && event.getFight().equals(fight)) { return true; } return false; } }); } protected double getValueDone(EventFilter filter) { double sum = 0; Iterator<Combat.Event> iter = events.iterator(); while (iter.hasNext()) { Combat.Event event = iter.next(); if (filter.hasEvent(event)) { sum += event.getValue(); } } return sum; } abstract class EventFilter { abstract boolean hasEvent(Combat.Event event); } @Override public int compareTo(Actor o) { if (getDamageDone() > o.getDamageDone()) { return 1; } return -1; } public String info(String dps, String hps) { return String.format( "%s, damage: %s: dps: %s, heal: %s, hps: %s", getName(), getDamageDone(), dps, getHealDone(), hps); } public String info(Fight fight, String dps, String hps) { return String.format( "%s, damage: %s: dps: %s, heal: %s, hps: %s", getName(), getDamageDone(fight), dps, getHealDone(fight), hps); } @Override public String toString() { return String.format( "Actor [%s, DamageDone: %s, HealDone: %s]", getName(), getDamageDone(), getHealDone()); } public class AbilityValueDoneComparator implements Comparator<Ability> { @Override public int compare(Ability ability1, Ability ability2) { if (ability1.getValueDone() < ability2.getValueDone()) { return 1; } return -1; } } public class AbilityHealDoneComparator implements Comparator<Ability> { @Override public int compare(Ability ability1, Ability ability2) { if (ability1.getHealDone() < ability2.getHealDone()) { return 1; } return -1; } } }