foul-magics/Mage/src/main/java/mage/abilities/keyword/WardAbility.java

142 lines
4.5 KiB
Java

package mage.abilities.keyword;
import mage.abilities.TriggeredAbilityImpl;
import mage.abilities.costs.Cost;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.effects.common.CounterUnlessPaysEffect;
import mage.abilities.icon.CardIconImpl;
import mage.abilities.icon.CardIconType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.events.GameEvent;
import mage.game.stack.StackObject;
import mage.target.targetpointer.FixedTarget;
import mage.util.CardUtil;
/**
* @author TheElk801
*/
public class WardAbility extends TriggeredAbilityImpl {
private final Cost cost;
private final DynamicValue genericMana;
private final boolean showAbilityHint;
private final String whereXIs;
public WardAbility(Cost cost) {
this(cost, true);
}
public WardAbility(Cost cost, boolean showAbilityHint) {
super(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(cost), false);
this.cost = cost;
this.genericMana = null;
this.showAbilityHint = showAbilityHint;
this.whereXIs = null;
this.addIcon(new CardIconImpl(CardIconType.ABILITY_HEXPROOF,
CardUtil.getTextWithFirstCharUpperCase(getRuleWithoutHint())));
}
public WardAbility(DynamicValue genericMana) {
this(genericMana, null);
}
public WardAbility(DynamicValue genericMana, String whereXIs) {
super(Zone.BATTLEFIELD, new CounterUnlessPaysEffect(genericMana), false);
this.genericMana = genericMana;
this.whereXIs = whereXIs;
this.cost = null;
this.showAbilityHint = false;
this.addIcon(new CardIconImpl(CardIconType.ABILITY_HEXPROOF,
CardUtil.getTextWithFirstCharUpperCase(getRuleWithoutHint())));
}
private WardAbility(final WardAbility ability) {
super(ability);
if (ability.cost != null) {
this.cost = ability.cost.copy();
this.genericMana = null;
} else {
this.genericMana = ability.genericMana.copy();
this.cost = null;
}
this.showAbilityHint = ability.showAbilityHint;
this.whereXIs = ability.whereXIs;
}
@Override
public boolean checkEventType(GameEvent event, Game game) {
return event.getType() == GameEvent.EventType.TARGETED;
}
@Override
public boolean checkTrigger(GameEvent event, Game game) {
if (!getSourceId().equals(event.getTargetId())) {
return false;
}
StackObject targetingObject = CardUtil.getTargetingStackObject(event, game);
if (targetingObject == null || !game.getOpponents(getControllerId()).contains(targetingObject.getControllerId())) {
return false;
}
if (CardUtil.checkTargetedEventAlreadyUsed(this.id.toString(), targetingObject, event, game)) {
return false;
}
getEffects().setTargetPointer(new FixedTarget(targetingObject.getId()));
return true;
}
@Override
public WardAbility copy() {
return new WardAbility(this);
}
public String getRuleWithoutHint() {
StringBuilder sb = new StringBuilder("ward");
if (cost != null) {
if (cost instanceof ManaCost) {
sb.append(' ').append(cost.getText());
} else {
sb.append("—").append(CardUtil.getTextWithFirstCharUpperCase(cost.getText())).append('.');
}
} else {
sb.append(" {X}");
if (whereXIs != null) {
sb.append(", where X is ").append(whereXIs).append('.');
}
}
return sb.toString();
}
@Override
public String getRule() {
String rule = getRuleWithoutHint();
if (!showAbilityHint) {
return rule;
}
StringBuilder sb = new StringBuilder(rule);
sb.append(" <i>(Whenever this creature becomes the target of a spell or ability an opponent controls, " +
"counter it unless that player ");
if (cost != null) {
if (cost instanceof ManaCost) {
sb.append("pays ").append(cost.getText());
} else {
sb.append(cost.getText().replace("pay ", "pays "));
}
sb.append(".)</i>");
} else {
sb.append("pays {X}");
if (whereXIs != null) {
sb.append(whereXIs);
}
sb.append(".)</i>");
}
return sb.toString();
}
}