forked from External/mage
84 lines
2.5 KiB
Java
84 lines
2.5 KiB
Java
package mage.abilities.costs.common;
|
|
|
|
import mage.abilities.Ability;
|
|
import mage.abilities.LoyaltyAbility;
|
|
import mage.abilities.costs.Cost;
|
|
import mage.abilities.costs.VariableCostImpl;
|
|
import mage.abilities.costs.VariableCostType;
|
|
import mage.counters.CounterType;
|
|
import mage.game.Game;
|
|
import mage.game.permanent.Permanent;
|
|
|
|
import java.util.UUID;
|
|
|
|
/**
|
|
* @author BetaSteward_at_googlemail.com
|
|
*/
|
|
public class PayVariableLoyaltyCost extends VariableCostImpl {
|
|
|
|
// dynamic x cost modification from effects like Carth the Lion
|
|
// GUI only (applies to -X value on X announce)
|
|
// Example:
|
|
// - counters: 3
|
|
// - cost modification: +1
|
|
// - max possible X to pay: 4
|
|
private int costModification = 0;
|
|
|
|
public PayVariableLoyaltyCost() {
|
|
super(VariableCostType.NORMAL, "loyality counters to remove");
|
|
this.text = "-X";
|
|
}
|
|
|
|
public PayVariableLoyaltyCost(final PayVariableLoyaltyCost cost) {
|
|
super(cost);
|
|
this.costModification = cost.costModification;
|
|
}
|
|
|
|
@Override
|
|
public PayVariableLoyaltyCost copy() {
|
|
return new PayVariableLoyaltyCost(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean canPay(Ability ability, Ability source, UUID controllerId, Game game) {
|
|
Permanent planeswalker = game.getPermanent(source.getSourceId());
|
|
return planeswalker != null && planeswalker.canLoyaltyBeUsed(game);
|
|
}
|
|
|
|
@Override
|
|
public Cost getFixedCostsFromAnnouncedValue(int xValue) {
|
|
return new PayLoyaltyCost(-xValue);
|
|
}
|
|
|
|
@Override
|
|
public int getMaxValue(Ability source, Game game) {
|
|
Permanent permanent = game.getPermanent(source.getSourceId());
|
|
if (permanent == null) {
|
|
return 0;
|
|
}
|
|
|
|
int maxValue = permanent.getCounters(game).getCount(CounterType.LOYALTY.getName());
|
|
|
|
// apply cost modification
|
|
if (source instanceof LoyaltyAbility) {
|
|
LoyaltyAbility copiedAbility = ((LoyaltyAbility) source).copy();
|
|
copiedAbility.adjustCosts(game);
|
|
game.getContinuousEffects().costModification(copiedAbility, game);
|
|
for (Cost cost : copiedAbility.getCosts()) {
|
|
if (cost instanceof PayVariableLoyaltyCost) {
|
|
maxValue += ((PayVariableLoyaltyCost) cost).getCostModification();
|
|
}
|
|
}
|
|
}
|
|
|
|
return Math.max(0, maxValue);
|
|
}
|
|
|
|
public int getCostModification() {
|
|
return costModification;
|
|
}
|
|
|
|
public void setCostModification(int costModification) {
|
|
this.costModification = costModification;
|
|
}
|
|
}
|