package net.demilich.metastone.game.spells.trigger;
import net.demilich.metastone.game.Player;
import net.demilich.metastone.game.entities.Entity;
import net.demilich.metastone.game.events.GameEvent;
import net.demilich.metastone.game.events.GameEventType;
import net.demilich.metastone.game.logic.CustomCloneable;
import net.demilich.metastone.game.spells.TargetPlayer;
import net.demilich.metastone.game.spells.desc.condition.Condition;
import net.demilich.metastone.game.spells.desc.trigger.EventTriggerArg;
import net.demilich.metastone.game.spells.desc.trigger.EventTriggerDesc;
import net.demilich.metastone.game.targeting.TargetType;
public abstract class GameEventTrigger extends CustomCloneable {
private int owner = -1;
protected final EventTriggerDesc desc;
private int triggerCount;
public GameEventTrigger(EventTriggerDesc desc) {
this.desc = desc;
this.triggerCount = desc.getTriggerCount();
}
@Override
public GameEventTrigger clone() {
return (GameEventTrigger) super.clone();
}
protected boolean determineTargetPlayer(GameEvent event, TargetPlayer targetPlayer, Entity host, int targetPlayerId) {
if (targetPlayerId == -1 || targetPlayer == null) {
return true;
}
switch (targetPlayer) {
case ACTIVE:
return event.getGameContext().getActivePlayerId() == targetPlayerId;
case INACTIVE:
return event.getGameContext().getActivePlayerId() != targetPlayerId;
case BOTH:
return true;
case OPPONENT:
return getOwner() != targetPlayerId;
case OWNER:
return host.getOwner() == targetPlayerId;
case SELF:
return getOwner() == targetPlayerId;
default:
break;
}
return false;
}
protected abstract boolean fire(GameEvent event, Entity host);
public final boolean fires(GameEvent event, Entity host) {
TargetPlayer targetPlayer = desc.getTargetPlayer();
if (targetPlayer != null && !determineTargetPlayer(event, targetPlayer, host, event.getTargetPlayerId())) {
return false;
}
TargetPlayer sourcePlayer = desc.getSourcePlayer();
if (sourcePlayer != null && !determineTargetPlayer(event, sourcePlayer, host, event.getSourcePlayerId())) {
return false;
}
TargetType hostTargetType = (TargetType) desc.get(EventTriggerArg.HOST_TARGET_TYPE);
if (hostTargetType == TargetType.IGNORE_AS_TARGET && event.getEventTarget() == host) {
return false;
} else if (hostTargetType == TargetType.IGNORE_AS_SOURCE && event.getEventSource() == host) {
return false;
} else if (hostTargetType == TargetType.IGNORE_OTHER_TARGETS && event.getEventTarget() != host) {
return false;
} else if (hostTargetType == TargetType.IGNORE_OTHER_SOURCES && event.getEventSource() != host) {
return false;
}
Condition condition = (Condition) desc.get(EventTriggerArg.QUEUE_CONDITION);
Player owner = event.getGameContext().getPlayer(getOwner());
if (condition != null && !condition.isFulfilled(event.getGameContext(), owner, event.getEventSource(), event.getEventTarget())) {
return false;
}
return fire(event, host);
}
public int getOwner() {
return owner;
}
public int getTriggerCount() {
return triggerCount;
}
public void countDown() {
triggerCount--;
if (triggerCount < 0) {
triggerCount = 0;
}
}
public void countDown(int num) {
triggerCount -= num;
if (triggerCount < 0) {
triggerCount = 0;
}
}
public abstract GameEventType interestedIn();
public void setOwner(int playerIndex) {
this.owner = playerIndex;
}
@Override
public String toString() {
return "[" + getClass().getSimpleName() + " owner:" + owner + "]";
}
public boolean canFireCondition(GameEvent event) {
Condition condition = (Condition) desc.get(EventTriggerArg.FIRE_CONDITION);
Player owner = event.getGameContext().getPlayer(getOwner());
if (condition != null && !condition.isFulfilled(event.getGameContext(), owner, event.getEventSource(), event.getEventTarget())) {
return false;
}
return true;
}
}