package net.mostlyoriginal.game.system;
import com.artemis.Aspect;
import com.artemis.ComponentMapper;
import com.artemis.Entity;
import com.artemis.annotations.Wire;
import com.artemis.systems.EntityProcessingSystem;
import net.mostlyoriginal.api.component.graphics.Anim;
import net.mostlyoriginal.game.component.Incappable;
import net.mostlyoriginal.game.component.Questee;
import net.mostlyoriginal.game.component.agent.Focusable;
/**
* Updates actor depending on damage.
*
* @author Daan van Yperen
*/
@Wire
public class IncapacitateSystem extends EntityProcessingSystem {
ComponentMapper<Incappable> dm;
ComponentMapper<Focusable> fm;
ComponentMapper<Anim> am;
ComponentMapper<Questee> qm;
public IncapacitateSystem() {
super(Aspect.getAspectForAll(Incappable.class, Anim.class));
}
@Override
protected void process(Entity e) {
Incappable incappable = dm.get(e);
Anim anim = am.get(e);
final Questee questee = qm.get(e);
boolean onQuest = !(questee.quest == null || !questee.quest.isActive());
anim.id = incappable.incapacitated ? incappable.animIncappedId : incappable.animId;
anim.color.a = incappable.incapacitated && !onQuest ? 0.6f : 1.0f;
// don't allow focus during damage.
if (incappable.incapacitated && fm.has(e)) e.edit().remove(Focusable.class);
// not currently on quest.
if (!onQuest) {
// cooldown damage.
incappable.cooldown -= world.delta;
if ( incappable.cooldown <= 0) {
incappable.incapacitated = false;
// allow focus after damage has been resolved.
if (!fm.has(e)) {
e.edit().add(new Focusable());
}
}
}
}
public void makeDamaged(Entity actor) {
Incappable incappable = dm.get(actor);
incappable.incapacitated = true;
incappable.cooldown = incappable.normalIncapDuration;
}
}