refactor Friends Forever ability to be a Partner variant

This commit is contained in:
theelk801 2026-01-09 12:02:26 -05:00
parent ab885be2d5
commit c2ba51af88
11 changed files with 14 additions and 73 deletions

View file

@ -28,7 +28,6 @@ public abstract class AbstractCommander extends Constructed {
private static List<CommanderValidator> validators = Arrays.asList(
PartnerValidator.instance,
PartnerVariantValidator.instance,
FriendsForeverValidator.instance,
PartnerWithValidator.instance,
ChooseABackgroundValidator.instance,
DoctorsCompanionValidator.instance

View file

@ -7,14 +7,13 @@ import mage.abilities.costs.common.SacrificeTargetCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.combat.GoadTargetEffect;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PartnerVariantType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.StaticFilters;
import mage.target.common.TargetControlledPermanent;
import mage.target.common.TargetCreaturePermanent;
import java.util.UUID;
@ -40,7 +39,7 @@ public final class BjornaNightfallAlchemist extends CardImpl {
this.addAbility(ability);
// Friends forever
this.addAbility(FriendsForeverAbility.getInstance());
this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility());
}
private BjornaNightfallAlchemist(final BjornaNightfallAlchemist card) {

View file

@ -6,7 +6,6 @@ import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.continuous.MaximumHandSizeControllerEffect;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.*;
@ -40,7 +39,7 @@ public final class CecilyHauntedMage extends CardImpl {
this.addAbility(new AttacksTriggeredAbility(new CecilyHauntedMageEffect()));
// Friends forever
this.addAbility(FriendsForeverAbility.getInstance());
this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility());
}
private CecilyHauntedMage(final CecilyHauntedMage card) {

View file

@ -5,11 +5,11 @@ import mage.abilities.Ability;
import mage.abilities.common.CastSecondSpellTriggeredAbility;
import mage.abilities.effects.common.UntapTargetEffect;
import mage.abilities.effects.keyword.InvestigateEffect;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.abilities.keyword.HasteAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PartnerVariantType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.target.common.TargetCreaturePermanent;
@ -39,7 +39,7 @@ public final class ElmarUlvenwaldInformant extends CardImpl {
this.addAbility(ability);
// Friends forever
this.addAbility(FriendsForeverAbility.getInstance());
this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility());
}
private ElmarUlvenwaldInformant(final ElmarUlvenwaldInformant card) {

View file

@ -7,12 +7,12 @@ import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.abilities.mana.ConditionalColorlessManaAbility;
import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PartnerVariantType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.game.Game;
@ -38,7 +38,7 @@ public final class HargildeKindlyRunechanter extends CardImpl {
));
// Friends forever
this.addAbility(FriendsForeverAbility.getInstance());
this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility());
}
private HargildeKindlyRunechanter(final HargildeKindlyRunechanter card) {

View file

@ -6,10 +6,10 @@ import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.ReturnFromGraveyardToBattlefieldTargetEffect;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PartnerVariantType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterCard;
@ -54,7 +54,7 @@ public final class OthelmSigardianOutcast extends CardImpl {
this.addAbility(ability, new CardsPutIntoGraveyardWatcher());
// Friends forever
this.addAbility(FriendsForeverAbility.getInstance());
this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility());
}
private OthelmSigardianOutcast(final OthelmSigardianOutcast card) {

View file

@ -5,11 +5,11 @@ import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.dynamicvalue.DynamicValue;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.keyword.InvestigateEffect;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.abilities.keyword.MenaceAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.PartnerVariantType;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.filter.FilterPermanent;
@ -48,7 +48,7 @@ public final class SophinaSpearsageDeserter extends CardImpl {
.setText("investigate once for each nontoken attacking creature")));
// Friends forever
this.addAbility(FriendsForeverAbility.getInstance());
this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility());
}
private SophinaSpearsageDeserter(final SophinaSpearsageDeserter card) {

View file

@ -6,13 +6,9 @@ import mage.abilities.common.EntersBattlefieldOrLeavesSourceTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.keyword.InvestigateEffect;
import mage.abilities.effects.keyword.InvestigateTargetEffect;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.cards.CardImpl;
import mage.cards.CardSetInfo;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.SubType;
import mage.constants.SuperType;
import mage.constants.*;
import mage.game.Game;
import mage.players.Player;
import mage.target.targetpointer.FixedTarget;
@ -36,7 +32,7 @@ public final class WernogRidersChaplain extends CardImpl {
this.addAbility(new EntersBattlefieldOrLeavesSourceTriggeredAbility(new WernogRidersChaplainEffect(), false));
// Friends forever
this.addAbility(FriendsForeverAbility.getInstance());
this.addAbility(PartnerVariantType.FRIENDS_FOREVER.makeAbility());
}
private WernogRidersChaplain(final WernogRidersChaplain card) {

View file

@ -1,37 +0,0 @@
package mage.abilities.keyword;
import mage.abilities.MageSingleton;
import mage.abilities.StaticAbility;
import mage.constants.Zone;
import java.io.ObjectStreamException;
/**
* @author TheElk801
*/
public class FriendsForeverAbility extends StaticAbility implements MageSingleton {
private static final FriendsForeverAbility instance = new FriendsForeverAbility();
private Object readResolve() throws ObjectStreamException {
return instance;
}
public static FriendsForeverAbility getInstance() {
return instance;
}
private FriendsForeverAbility() {
super(Zone.BATTLEFIELD, null);
}
@Override
public String getRule() {
return "Friends forever <i>(You can have two commanders if both have friends forever.)</i>";
}
@Override
public FriendsForeverAbility copy() {
return instance;
}
}

View file

@ -12,6 +12,7 @@ import java.util.stream.Collectors;
*/
public enum PartnerVariantType {
FATHER_AND_SON("Father & son"),
FRIENDS_FOREVER("Friends forever"),
SURVIVORS("Survivors"),
CHARACTER_SELECT("Character select");

View file

@ -1,16 +0,0 @@
package mage.util.validation;
import mage.abilities.keyword.FriendsForeverAbility;
import mage.cards.Card;
/**
* @author TheElk801
*/
public enum FriendsForeverValidator implements CommanderValidator {
instance;
@Override
public boolean checkPartner(Card commander1, Card commander2) {
return commander1.getAbilities().containsClass(FriendsForeverAbility.class);
}
}