/**
* 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.ArrayList;
import java.util.HashSet;
import java.util.Iterator;
import colloid.RecountApp;
import colloid.model.event.Combat.EventHandler;
public abstract class Character implements Combat.Character {
protected String name;
protected String logdata;
protected HashSet<EventHandler<Combat.Event>> handlerDamage = new HashSet<EventHandler<Combat.Event>>();
protected HashSet<EventHandler<Combat.Event>> handlerHeal = new HashSet<EventHandler<Combat.Event>>();
protected ArrayList<Combat.Event> events = new ArrayList<Combat.Event>();
protected HashSet<Ability> abilities = new HashSet<Ability>();
public Character(String logdata) throws DoesNotExist {
this.logdata = logdata;
compile();
}
@Override
public boolean isPlayer() {
// TODO Auto-generated method stub
return false;
}
@Override
public void setOnHeal(EventHandler<Combat.Event> handler) {
String logdata = RecountApp.getInstance().getCurrentLogadata();
handlerHeal.add(handler);
if (logdata != null && logdata.contains("Heal")) {
Combat.Event event = new CombatHealEvent(this, logdata);
handler.handle(event);
}
}
@Override
public void setOnDamage(EventHandler<Combat.Event> handler) {
String logdata = RecountApp.getInstance().getCurrentLogadata();
handlerDamage.add(handler);
if (logdata != null && logdata.contains("Damage")) {
CombatDamageEvent event = new CombatDamageEvent(this, logdata);
handler.handle(event);
}
}
@Override
public void setOnCombatEnter(EventHandler<CombatEnterEvent> handler) {
String logdata = RecountApp.getInstance().getCurrentLogadata();
if (logdata != null && logdata.contains("CombatEnter")) {
CombatEnterEvent event = new CombatEnterEvent(this, logdata);
handler.handle(event);
}
}
@Override
public void setOnCombatExit(EventHandler<CombatExitEvent> handler) {
String logdata = RecountApp.getInstance().getCurrentLogadata();
if (logdata != null && logdata.contains("CombatExit")) {
CombatExitEvent event = new CombatExitEvent(this, logdata);
handler.handle(event);
}
}
public void handleEvent(String logdata) {
try {
if (!equals(new Actor(logdata))) {
return;
}
} catch (DoesNotExist e) {
return;
}
if (logdata != null && logdata.contains("EnterCombat")) {
abilities.clear();
CombatEnterEvent event = new CombatEnterEvent(this, logdata);
// handler.handle(event);
Fight.create();
events.add(event);
}
if (logdata != null && logdata.contains("Heal")) {
if (handlerHeal != null) {
CombatHealEvent healEvent = new CombatHealEvent(this, logdata);
if (Fight.inFight()) {
healEvent.setFight(Fight.current());
if (abilities.contains(healEvent.getAbility())) {
Iterator<Ability> iterAbility = abilities.iterator();
while(iterAbility.hasNext()) {
Ability ability = iterAbility.next();
if (ability.equals(healEvent.getAbility())) {
ability.incrementHealDone(healEvent.getValue());
}
}
} else {
abilities.add(healEvent.getAbility());
}
}
Iterator<EventHandler<Combat.Event>> iter = handlerHeal.iterator();
while(iter.hasNext()) {
iter.next().handle(healEvent);
}
events.add(healEvent);
}
}
if (logdata != null && logdata.contains("Damage")) {
if (handlerDamage != null) {
CombatDamageEvent damageEvent = new CombatDamageEvent(this, logdata);
if (Fight.inFight()) {
damageEvent.setFight(Fight.current());
if (abilities.contains(damageEvent.getAbility())) {
Iterator<Ability> iterAbility = abilities.iterator();
while(iterAbility.hasNext()) {
Ability ability = iterAbility.next();
if (ability.equals(damageEvent.getAbility())) {
ability.incrementValueDone(damageEvent.getValue());
}
}
} else {
abilities.add(damageEvent.getAbility());
}
}
Iterator<EventHandler<Combat.Event>> iter = handlerDamage.iterator();
while(iter.hasNext()) {
iter.next().handle(damageEvent);
}
events.add(damageEvent);
}
}
if (logdata != null && logdata.contains("ExitCombat")) {
CombatExitEvent event2 = new CombatExitEvent(this, logdata);
Fight.finish();
events.add(event2);
}
if (Fight.inFight()) {
// try {
// abilities.add(new Ability(combatEvent));
// } catch (DoesNotExist e) {
// //e.printStackTrace();
// //do nothing
// }
Fight.addActor((Actor) this);
RecountApp.getInstance().getFights().add(Fight.current());
}
}
public ArrayList<Combat.Event> getEvents() {
return events;
}
public HashSet<Ability> getAbilities() {
return abilities;
}
public void setAbilities(HashSet<Ability> abilities) {
this.abilities = abilities;
}
}