[FIN] Implement Cloud, Planet's Champion

This commit is contained in:
theelk801 2025-04-17 09:43:33 -04:00
parent 1ae73e6376
commit 6932a798d8
4 changed files with 124 additions and 51 deletions

View file

@ -0,0 +1,53 @@
package mage.cards.c;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.condition.CompoundCondition;
import mage.abilities.condition.Condition;
import mage.abilities.condition.common.EquippedSourceCondition;
import mage.abilities.condition.common.MyTurnCondition;
import mage.abilities.decorator.ConditionalContinuousEffect;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.effects.common.cost.ReduceCostEquipTargetSourceEffect;
import mage.abilities.keyword.DoubleStrikeAbility;
import mage.abilities.keyword.IndestructibleAbility;
import mage.cards.f.CloudPlanetsChampion;
import mage.constants.*;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
/**
*
* @author TheElk801
*/
public final class CloudPlanetsChampion extends CardImpl {
private static final Condition condition=new CompoundCondition(EquippedSourceCondition.instance, MyTurnCondition.instance);
public CloudPlanetsChampion(UUID ownerId, CardSetInfo setInfo) {
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{3}{R}{W}");
this.supertype.add(SuperType.LEGENDARY);
this.subtype.add(SubType.HUMAN);
this.subtype.add(SubType.SOLDIER);
this.subtype.add(SubType.MERCENARY);
this.power = new MageInt(4);
this.toughness = new MageInt(4);
// During your turn, as long as Cloud is equipped, it has double strike and indestructible.
Ability ability=new SimpleStaticAbility(new ConditionalContinuousEffect(new GainAbilitySourceEffect(DoubleStrikeAbility.getInstance()),condition,"during your turn, as long as {this} is equipped, it has double strike"));ability.addEffect(new ConditionalContinuousEffect(new GainAbilitySourceEffect(IndestructibleAbility.getInstance()),condition,"and indestructible"));this.addAbility(ability);
// Equip abilities you activate that target Cloud cost {2} less to activate.
this.addAbility(new SimpleStaticAbility(new ReduceCostEquipTargetSourceEffect(2)));
}
private CloudPlanetsChampion(final CloudPlanetsChampion card) {
super(card);
}
@Override
public CloudPlanetsChampion copy() {
return new CloudPlanetsChampion(this);
}
}

View file

@ -5,23 +5,20 @@ import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility; import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility; import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.continuous.BoostTargetEffect; import mage.abilities.effects.common.continuous.BoostTargetEffect;
import mage.abilities.effects.common.cost.CostModificationEffectImpl; import mage.abilities.effects.common.cost.ReduceCostEquipTargetSourceEffect;
import mage.abilities.keyword.EquipAbility;
import mage.abilities.keyword.FirstStrikeAbility; import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.HasteAbility; import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl; import mage.cards.CardImpl;
import mage.cards.CardSetInfo; import mage.cards.CardSetInfo;
import mage.constants.*; import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.SubType;
import mage.filter.FilterPermanent; import mage.filter.FilterPermanent;
import mage.filter.common.FilterControlledPermanent; import mage.filter.common.FilterControlledPermanent;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.filter.predicate.permanent.AttackingPredicate; import mage.filter.predicate.permanent.AttackingPredicate;
import mage.game.Game;
import mage.target.Target;
import mage.target.TargetPermanent; import mage.target.TargetPermanent;
import mage.util.CardUtil;
import java.util.Collection;
import java.util.UUID; import java.util.UUID;
/** /**
@ -59,7 +56,7 @@ public final class FerventChampion extends CardImpl {
this.addAbility(ability); this.addAbility(ability);
// Equip abilities you activate that target Fervent Champion cost {3} less to activate. // Equip abilities you activate that target Fervent Champion cost {3} less to activate.
this.addAbility(new SimpleStaticAbility(new FerventChampionEffect())); this.addAbility(new SimpleStaticAbility(new ReduceCostEquipTargetSourceEffect(3)));
} }
private FerventChampion(final FerventChampion card) { private FerventChampion(final FerventChampion card) {
@ -71,46 +68,3 @@ public final class FerventChampion extends CardImpl {
return new FerventChampion(this); return new FerventChampion(this);
} }
} }
class FerventChampionEffect extends CostModificationEffectImpl {
FerventChampionEffect() {
super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST);
staticText = "equip abilities you activate that target {this} cost {3} less to activate";
}
private FerventChampionEffect(final FerventChampionEffect effect) {
super(effect);
}
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
CardUtil.reduceCost(abilityToModify, 3);
return true;
}
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (abilityToModify instanceof EquipAbility
&& abilityToModify.isControlledBy(source.getControllerId())) {
if (game != null && game.inCheckPlayableState()) {
return !abilityToModify.getTargets().isEmpty() &&
abilityToModify.getTargets().get(0).canTarget(source.getSourceId(), abilityToModify, game);
} else {
return abilityToModify
.getTargets()
.stream()
.map(Target::getTargets)
.flatMap(Collection::stream)
.anyMatch(source.getSourceId()::equals);
}
}
return false;
}
@Override
public FerventChampionEffect copy() {
return new FerventChampionEffect(this);
}
}

View file

@ -20,6 +20,7 @@ public final class FinalFantasy extends ExpansionSet {
this.blockName = "Final Fantasy"; // for sorting in GUI this.blockName = "Final Fantasy"; // for sorting in GUI
this.hasBasicLands = false; // temporary this.hasBasicLands = false; // temporary
cards.add(new SetCardInfo("Cloud, Planet's Champion", 552, Rarity.MYTHIC, mage.cards.c.CloudPlanetsChampion.class));
cards.add(new SetCardInfo("Cooking Campsite", 31, Rarity.UNCOMMON, mage.cards.c.CookingCampsite.class)); cards.add(new SetCardInfo("Cooking Campsite", 31, Rarity.UNCOMMON, mage.cards.c.CookingCampsite.class));
cards.add(new SetCardInfo("Gladiolus Amicitia", 224, Rarity.UNCOMMON, mage.cards.g.GladiolusAmicitia.class)); cards.add(new SetCardInfo("Gladiolus Amicitia", 224, Rarity.UNCOMMON, mage.cards.g.GladiolusAmicitia.class));
cards.add(new SetCardInfo("Jumbo Cactuar", 191, Rarity.RARE, mage.cards.j.JumboCactuar.class)); cards.add(new SetCardInfo("Jumbo Cactuar", 191, Rarity.RARE, mage.cards.j.JumboCactuar.class));

View file

@ -0,0 +1,65 @@
package mage.abilities.effects.common.cost;
import mage.abilities.Ability;
import mage.abilities.keyword.EquipAbility;
import mage.constants.CostModificationType;
import mage.constants.Duration;
import mage.constants.Outcome;
import mage.game.Game;
import mage.target.Target;
import mage.util.CardUtil;
import java.util.Collection;
/**
* @author TheElk801
*/
public class ReduceCostEquipTargetSourceEffect extends CostModificationEffectImpl {
private final int amount;
public ReduceCostEquipTargetSourceEffect(int amount) {
super(Duration.Custom, Outcome.Benefit, CostModificationType.REDUCE_COST);
this.amount = amount;
staticText = "equip abilities you activate that target {this} cost {" + amount + "} less to activate";
}
private ReduceCostEquipTargetSourceEffect(final ReduceCostEquipTargetSourceEffect effect) {
super(effect);
this.amount = effect.amount;
}
@Override
public boolean apply(Game game, Ability source, Ability abilityToModify) {
CardUtil.reduceCost(abilityToModify, amount);
return true;
}
@Override
public boolean applies(Ability abilityToModify, Ability source, Game game) {
if (!(abilityToModify instanceof EquipAbility)
|| !abilityToModify.isControlledBy(source.getControllerId())) {
return false;
}
if (game != null && game.inCheckPlayableState()) {
return !abilityToModify
.getTargets()
.isEmpty()
&& abilityToModify
.getTargets()
.get(0)
.canTarget(source.getSourceId(), abilityToModify, game);
}
return abilityToModify
.getTargets()
.stream()
.map(Target::getTargets)
.flatMap(Collection::stream)
.anyMatch(source.getSourceId()::equals);
}
@Override
public ReduceCostEquipTargetSourceEffect copy() {
return new ReduceCostEquipTargetSourceEffect(this);
}
}