foul-magics/Mage/src/main/java/mage/abilities/SpecialAction.java
Oleg Agafonov c2e7b02e13 Reworked and improved special mana payment abilities (convoke, delve, assist, improvise):
* now it can be used to calc and find available mana and playable abilities;
* now tests and AI can use that abilities;
* now it follows mtg's rules and restrictions for mana activation order (rule 601.2f, see #768);
2020-06-19 13:09:45 +04:00

78 lines
2.3 KiB
Java

package mage.abilities;
import mage.abilities.costs.mana.AlternateManaPaymentAbility;
import mage.abilities.costs.mana.ManaCost;
import mage.abilities.mana.ManaOptions;
import mage.constants.AbilityType;
import mage.constants.Zone;
import mage.game.Game;
import mage.game.stack.Spell;
import mage.game.stack.StackObject;
import java.util.UUID;
/**
* @author BetaSteward_at_googlemail.com, JayDi85
*/
public abstract class SpecialAction extends ActivatedAbilityImpl {
private final AlternateManaPaymentAbility manaAbility; // mana actions generates on every pay cycle, no need to copy it
protected ManaCost unpaidMana;
public SpecialAction() {
this(Zone.ALL);
}
public SpecialAction(Zone zone) {
this(zone, null);
}
public SpecialAction(Zone zone, AlternateManaPaymentAbility manaAbility) {
super(AbilityType.SPECIAL_ACTION, zone);
this.usesStack = false;
this.manaAbility = manaAbility;
}
public SpecialAction(final SpecialAction action) {
super(action);
this.unpaidMana = action.unpaidMana;
this.manaAbility = action.manaAbility;
}
public boolean isManaAction() {
return manaAbility != null;
}
public void setUnpaidMana(ManaCost manaCost) {
this.unpaidMana = manaCost;
}
public ManaCost getUnpaidMana() {
return unpaidMana;
}
public ManaOptions getManaOptions(Ability source, Game game, ManaCost unpaid) {
if (manaAbility != null) {
return manaAbility.getManaOptions(source, game, unpaid);
}
return null;
}
@Override
public ActivationStatus canActivate(UUID playerId, Game game) {
if (isManaAction()) {
// limit play mana abilities by steps
int currentStepOrder = 0;
if (!game.getStack().isEmpty()) {
StackObject stackObject = game.getStack().getFirst();
if (stackObject instanceof Spell) {
currentStepOrder = ((Spell) stackObject).getCurrentActivatingManaAbilitiesStep().getStepOrder();
}
}
if (currentStepOrder > manaAbility.useOnActivationManaAbilityStep().getStepOrder()) {
return ActivationStatus.getFalse();
}
}
return super.canActivate(playerId, game);
}
}