forked from External/mage
* no need to specify mana cost, just add cost * handle all mana costs through addcost method only * eliminate another constructor * more constructor cleanup
112 lines
3.7 KiB
Java
112 lines
3.7 KiB
Java
package mage.abilities.common;
|
|
|
|
import mage.abilities.Ability;
|
|
import mage.abilities.SpellAbility;
|
|
import mage.abilities.costs.mana.ManaCostsImpl;
|
|
import mage.abilities.effects.ContinuousEffectImpl;
|
|
import mage.abilities.keyword.TransformAbility;
|
|
import mage.cards.Card;
|
|
import mage.constants.*;
|
|
import mage.game.Game;
|
|
import mage.game.stack.Spell;
|
|
|
|
import java.util.UUID;
|
|
|
|
/**
|
|
* @author weirddan455, JayDi85, notgreat
|
|
*/
|
|
public class SpellTransformedAbility extends SpellAbility {
|
|
|
|
protected final String manaCost; //This variable is only used for rules text
|
|
|
|
public SpellTransformedAbility(Card card, String manaCost) {
|
|
super(card.getSecondFaceSpellAbility());
|
|
this.newId();
|
|
|
|
// getSecondFaceSpellAbility() already verified that second face exists
|
|
this.setCardName(card.getSecondCardFace().getName());
|
|
|
|
this.spellAbilityType = SpellAbilityType.BASE_ALTERNATE;
|
|
this.setSpellAbilityCastMode(SpellAbilityCastMode.TRANSFORMED);
|
|
|
|
this.manaCost = manaCost;
|
|
this.clearManaCosts();
|
|
this.clearManaCostsToPay();
|
|
this.addCost(new ManaCostsImpl<>(manaCost));
|
|
this.addSubAbility(new TransformAbility());
|
|
}
|
|
|
|
public SpellTransformedAbility(final SpellAbility ability) {
|
|
super(ability);
|
|
this.newId();
|
|
|
|
this.manaCost = null;
|
|
this.getManaCosts().clear();
|
|
this.getManaCostsToPay().clear();
|
|
|
|
this.spellAbilityType = SpellAbilityType.BASE_ALTERNATE;
|
|
this.setSpellAbilityCastMode(SpellAbilityCastMode.TRANSFORMED);
|
|
//when casting this way, the card must have the TransformAbility from elsewhere
|
|
}
|
|
protected SpellTransformedAbility(final SpellTransformedAbility ability) {
|
|
super(ability);
|
|
this.manaCost = ability.manaCost;
|
|
}
|
|
|
|
@Override
|
|
public SpellTransformedAbility copy() {
|
|
return new SpellTransformedAbility(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean activate(Game game, boolean noMana) {
|
|
if (super.activate(game, noMana)) {
|
|
game.getState().setValue(TransformAbility.VALUE_KEY_ENTER_TRANSFORMED + getSourceId(), Boolean.TRUE);
|
|
// TODO: must be removed after transform cards (one side) migrated to MDF engine (multiple sides)
|
|
TransformedEffect effect = new TransformedEffect();
|
|
game.addEffect(effect, this);
|
|
effect.apply(game, this); //Apply the effect immediately
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
@Override
|
|
public ActivationStatus canActivate(UUID playerId, Game game) {
|
|
if (super.canActivate(playerId, game).canActivate()) {
|
|
Card card = game.getCard(getSourceId());
|
|
if (card != null) {
|
|
return card.getSpellAbility().canActivate(playerId, game);
|
|
}
|
|
}
|
|
return ActivationStatus.getFalse();
|
|
}
|
|
}
|
|
|
|
class TransformedEffect extends ContinuousEffectImpl {
|
|
|
|
public TransformedEffect() {
|
|
super(Duration.WhileOnStack, Layer.CopyEffects_1, SubLayer.CopyEffects_1a, Outcome.BecomeCreature);
|
|
staticText = "";
|
|
}
|
|
|
|
private TransformedEffect(final TransformedEffect effect) {
|
|
super(effect);
|
|
}
|
|
|
|
@Override
|
|
public TransformedEffect copy() {
|
|
return new TransformedEffect(this);
|
|
}
|
|
|
|
@Override
|
|
public boolean apply(Game game, Ability source) {
|
|
Spell spell = game.getSpell(source.getSourceId());
|
|
if (spell == null || spell.getCard().getSecondCardFace() == null) {
|
|
return false;
|
|
}
|
|
// simulate another side as new card (another code part in spell constructor)
|
|
TransformAbility.transformCardSpellDynamic(spell, spell.getCard().getSecondCardFace(), game);
|
|
return true;
|
|
}
|
|
}
|