forked from External/mage
* simplify LoyaltyAbility constructors * remove unused constructors in ActivatedAbilityImpl * cleanup * remove null rule setting * another unused constructor * fix escape ability reminder text * escape text adjustment * simplify Trigons, remove Costs constructor * rework Villainous Ogre, remove another class and constructor * fix test using wrong text for trigon ability
79 lines
3 KiB
Java
79 lines
3 KiB
Java
package mage.abilities;
|
||
|
||
import mage.abilities.costs.Cost;
|
||
import mage.abilities.costs.common.PayLoyaltyCost;
|
||
import mage.abilities.costs.common.PayVariableLoyaltyCost;
|
||
import mage.abilities.effects.Effect;
|
||
import mage.constants.TimingRule;
|
||
import mage.constants.Zone;
|
||
|
||
/**
|
||
* @author BetaSteward_at_googlemail.com
|
||
*/
|
||
public class LoyaltyAbility extends ActivatedAbilityImpl {
|
||
|
||
public LoyaltyAbility(Effect effect, int loyalty) {
|
||
super(Zone.BATTLEFIELD, effect, new PayLoyaltyCost(loyalty));
|
||
this.timing = TimingRule.SORCERY;
|
||
}
|
||
|
||
public LoyaltyAbility(Effect effect) {
|
||
super(Zone.BATTLEFIELD, effect, new PayVariableLoyaltyCost());
|
||
this.timing = TimingRule.SORCERY;
|
||
}
|
||
|
||
protected LoyaltyAbility(final LoyaltyAbility ability) {
|
||
super(ability);
|
||
}
|
||
|
||
@Override
|
||
public LoyaltyAbility copy() {
|
||
return new LoyaltyAbility(this);
|
||
}
|
||
|
||
/**
|
||
* Change loyalty cost by amount value
|
||
*
|
||
* @param amount
|
||
*/
|
||
public void increaseLoyaltyCost(int amount) {
|
||
|
||
// loyalty cost modification rules from Carth the Lion
|
||
|
||
// If a planeswalker’s loyalty ability normally has a cost of [+1], Carth’s ability makes it cost [+2] instead.
|
||
// A cost of [0] would become [+1], and a cost of [-6] would become [-5].
|
||
// (2021-06-18)
|
||
//
|
||
// If you somehow manage to control two Carths (perhaps because of Spark Double), the cost-changing effect is
|
||
// cumulative. In total, loyalty abilities will cost an additional [+2] to activate.
|
||
// (2021-06-18)
|
||
//
|
||
// The total cost of a planeswalker’s loyalty ability is calculated before any counters are added or removed.
|
||
// If a loyalty ability normally costs [-3] to activate, you do not remove three counters from it and then
|
||
// put one counter on it. You remove two counters at one time when you pay the cost.
|
||
// (2021-06-18)
|
||
//
|
||
// If an effect replaces the number of counters that would be placed on a planeswalker, such as that of
|
||
// Vorinclex, Monstrous Raider, that replacement happens only once, at the time payment is made.
|
||
// (2021-06-18)
|
||
|
||
// cost modification support only 1 cost item
|
||
int staticCount = 0;
|
||
for (Cost cost : getCosts()) {
|
||
if (cost instanceof PayLoyaltyCost) {
|
||
// static cost
|
||
PayLoyaltyCost staticCost = (PayLoyaltyCost) cost;
|
||
staticCost.setAmount(staticCost.getAmount() + amount);
|
||
staticCount++;
|
||
} else if (cost instanceof PayVariableLoyaltyCost) {
|
||
// x cost (after x announce: x cost + static cost)
|
||
PayVariableLoyaltyCost xCost = (PayVariableLoyaltyCost) cost;
|
||
xCost.setCostModification(xCost.getCostModification() + amount);
|
||
}
|
||
}
|
||
if (staticCount > 1) {
|
||
throw new IllegalArgumentException(String.format("Loyalty ability must have only 1 static cost, but has %d: %s",
|
||
staticCount, this.getRule()));
|
||
}
|
||
}
|
||
}
|