mirror of
https://github.com/correl/mage.git
synced 2024-11-15 11:09:30 +00:00
fixed some abilities not being properly copiable
This commit is contained in:
parent
a317a875e7
commit
1c4de38b92
5 changed files with 104 additions and 45 deletions
|
@ -1,7 +1,5 @@
|
|||
|
||||
package mage.cards.a;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.effects.common.continuous.GainAbilityAllEffect;
|
||||
|
@ -11,18 +9,23 @@ import mage.cards.CardSetInfo;
|
|||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.permanent.BlockedByIdPredicate;
|
||||
import mage.filter.predicate.permanent.BlockingAttackerIdPredicate;
|
||||
import mage.filter.predicate.permanent.BlockingOrBlockedBySourcePredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author LevelX2
|
||||
*/
|
||||
public final class AlmsBeast extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterCreaturePermanent();
|
||||
|
||||
static {
|
||||
filter.add(BlockingOrBlockedBySourcePredicate.EITHER);
|
||||
}
|
||||
|
||||
public AlmsBeast(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{2}{W}{B}");
|
||||
this.subtype.add(SubType.BEAST);
|
||||
|
@ -31,11 +34,10 @@ public final class AlmsBeast extends CardImpl {
|
|||
this.toughness = new MageInt(6);
|
||||
|
||||
// Creatures blocking or blocked by Alms Beast have lifelink.
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent();
|
||||
filter.add(Predicates.or(new BlockedByIdPredicate(this.getId()),
|
||||
new BlockingAttackerIdPredicate(this.getId())));
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAllEffect(LifelinkAbility.getInstance(), Duration.WhileOnBattlefield, filter,
|
||||
"Creatures blocking or blocked by {this} have lifelink")));
|
||||
this.addAbility(new SimpleStaticAbility(new GainAbilityAllEffect(
|
||||
LifelinkAbility.getInstance(), Duration.WhileOnBattlefield,
|
||||
filter, "Creatures blocking or blocked by {this} have lifelink"
|
||||
)));
|
||||
}
|
||||
|
||||
public AlmsBeast(final AlmsBeast card) {
|
||||
|
|
|
@ -12,12 +12,10 @@ import mage.cards.CardSetInfo;
|
|||
import mage.constants.CardType;
|
||||
import mage.constants.SubType;
|
||||
import mage.constants.Zone;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.StaticFilters;
|
||||
import mage.filter.common.FilterCreatureCard;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.CardIdPredicate;
|
||||
import mage.target.Target;
|
||||
import mage.filter.predicate.permanent.AnotherPredicate;
|
||||
import mage.target.common.TargetCardInGraveyardOrBattlefield;
|
||||
|
||||
import java.util.UUID;
|
||||
|
@ -27,7 +25,13 @@ import java.util.UUID;
|
|||
*/
|
||||
public final class AngelOfSerenity extends CardImpl {
|
||||
|
||||
private static final String rule = "you may exile up to three other target creatures from the battlefield and/or creature cards from graveyards.";
|
||||
private static final String rule = "you may exile up to three other target creatures " +
|
||||
"from the battlefield and/or creature cards from graveyards.";
|
||||
private static final FilterPermanent filter = new FilterCreaturePermanent("other target creatures");
|
||||
|
||||
static {
|
||||
filter.add(AnotherPredicate.instance);
|
||||
}
|
||||
|
||||
public AngelOfSerenity(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{4}{W}{W}{W}");
|
||||
|
@ -40,12 +44,12 @@ public final class AngelOfSerenity extends CardImpl {
|
|||
this.addAbility(FlyingAbility.getInstance());
|
||||
|
||||
// When Angel of Serenity enters the battlefield, you may exile up to three other target creatures from the battlefield and/or creature cards from graveyards.
|
||||
FilterCreaturePermanent filterBattle = new FilterCreaturePermanent("other target creatures");
|
||||
filterBattle.add(Predicates.not(new CardIdPredicate(this.getId())));
|
||||
FilterCreatureCard filterGrave = StaticFilters.FILTER_CARD_CREATURE;
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(new ExileTargetForSourceEffect().setText(rule), true);
|
||||
Target target = new TargetCardInGraveyardOrBattlefield(0, 3, filterGrave, filterBattle);
|
||||
ability.addTarget(target);
|
||||
Ability ability = new EntersBattlefieldTriggeredAbility(
|
||||
new ExileTargetForSourceEffect().setText(rule), true
|
||||
);
|
||||
ability.addTarget(new TargetCardInGraveyardOrBattlefield(
|
||||
0, 3, StaticFilters.FILTER_CARD_CREATURE, filter
|
||||
));
|
||||
this.addAbility(ability);
|
||||
|
||||
// When Angel of Serenity leaves the battlefield, return the exiled cards to their owners' hands.
|
||||
|
|
|
@ -11,6 +11,7 @@ import mage.constants.Outcome;
|
|||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterArtifactPermanent;
|
||||
import mage.filter.common.FilterEquipmentPermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.mageobject.CardIdPredicate;
|
||||
import mage.filter.predicate.permanent.AttachedToPredicate;
|
||||
|
@ -78,9 +79,9 @@ class ArmoryAutomatonEffect extends OneShotEffect {
|
|||
if (player != null && sourcePermanent != null) {
|
||||
|
||||
// dynamic filter (can't selects own attaches and can't selects twice)
|
||||
FilterPermanent currentFilter = filter.copy();
|
||||
FilterPermanent currentFilter = new FilterEquipmentPermanent();
|
||||
FilterPermanent filterSourceId = new FilterPermanent();
|
||||
filterSourceId.add(new CardIdPredicate(this.getId()));
|
||||
filterSourceId.add(new CardIdPredicate(source.getSourceId()));
|
||||
currentFilter.add(Predicates.not(new AttachedToPredicate(filterSourceId)));
|
||||
|
||||
int countBattlefield = game.getBattlefield().getAllActivePermanents(currentFilter, game).size();
|
||||
|
|
|
@ -1,27 +1,35 @@
|
|||
|
||||
package mage.cards.b;
|
||||
|
||||
import java.util.UUID;
|
||||
import mage.MageInt;
|
||||
import mage.abilities.common.SimpleStaticAbility;
|
||||
import mage.abilities.dynamicvalue.DynamicValue;
|
||||
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
|
||||
import mage.abilities.effects.Effect;
|
||||
import mage.abilities.effects.common.continuous.BoostSourceEffect;
|
||||
import mage.abilities.keyword.TrampleAbility;
|
||||
import mage.cards.CardImpl;
|
||||
import mage.cards.CardSetInfo;
|
||||
import mage.constants.*;
|
||||
import mage.filter.common.FilterCreaturePermanent;
|
||||
import mage.filter.predicate.Predicates;
|
||||
import mage.filter.predicate.permanent.PermanentIdPredicate;
|
||||
import mage.constants.CardType;
|
||||
import mage.constants.Duration;
|
||||
import mage.constants.SubType;
|
||||
import mage.filter.FilterPermanent;
|
||||
import mage.filter.common.FilterControlledPermanent;
|
||||
import mage.filter.predicate.permanent.AnotherPredicate;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
*
|
||||
* @author fireshoes
|
||||
*/
|
||||
public final class BorderlandBehemoth extends CardImpl {
|
||||
|
||||
private static final FilterPermanent filter = new FilterControlledPermanent(SubType.GIANT);
|
||||
|
||||
static {
|
||||
filter.add(AnotherPredicate.instance);
|
||||
}
|
||||
|
||||
private static final DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, 4);
|
||||
|
||||
public BorderlandBehemoth(UUID ownerId, CardSetInfo setInfo) {
|
||||
super(ownerId, setInfo, new CardType[]{CardType.CREATURE}, "{5}{R}{R}");
|
||||
this.subtype.add(SubType.GIANT, SubType.WARRIOR);
|
||||
|
@ -32,17 +40,12 @@ public final class BorderlandBehemoth extends CardImpl {
|
|||
this.addAbility(TrampleAbility.getInstance());
|
||||
|
||||
// Borderland Behemoth gets +4/+4 for each other Giant you control.
|
||||
FilterCreaturePermanent filter = new FilterCreaturePermanent("other Giant you control");
|
||||
filter.add(SubType.GIANT.getPredicate());
|
||||
filter.add(Predicates.not(new PermanentIdPredicate(this.getId())));
|
||||
filter.add(TargetController.YOU.getControllerPredicate());
|
||||
DynamicValue xValue = new PermanentsOnBattlefieldCount(filter, 4);
|
||||
Effect effect = new BoostSourceEffect(xValue, xValue, Duration.WhileOnBattlefield, false);
|
||||
effect.setText("{this} gets +4/+4 for each other Giant you control");
|
||||
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
|
||||
this.addAbility(new SimpleStaticAbility(new BoostSourceEffect(
|
||||
xValue, xValue, Duration.WhileOnBattlefield, false
|
||||
).setText("{this} gets +4/+4 for each other Giant you control")));
|
||||
}
|
||||
|
||||
public BorderlandBehemoth(final BorderlandBehemoth card) {
|
||||
private BorderlandBehemoth(final BorderlandBehemoth card) {
|
||||
super(card);
|
||||
}
|
||||
|
||||
|
|
|
@ -0,0 +1,49 @@
|
|||
package mage.filter.predicate.permanent;
|
||||
|
||||
import mage.filter.predicate.ObjectSourcePlayer;
|
||||
import mage.filter.predicate.ObjectSourcePlayerPredicate;
|
||||
import mage.game.Game;
|
||||
import mage.game.combat.CombatGroup;
|
||||
import mage.game.permanent.Permanent;
|
||||
|
||||
import java.util.UUID;
|
||||
|
||||
/**
|
||||
* @author TheElk801
|
||||
*/
|
||||
public enum BlockingOrBlockedBySourcePredicate implements ObjectSourcePlayerPredicate<ObjectSourcePlayer<Permanent>> {
|
||||
BLOCKING,
|
||||
BLOCKED_BY,
|
||||
EITHER;
|
||||
|
||||
@Override
|
||||
public boolean apply(ObjectSourcePlayer<Permanent> input, Game game) {
|
||||
return game
|
||||
.getCombat()
|
||||
.getGroups()
|
||||
.stream()
|
||||
.anyMatch(combatGroup -> checkBlocks(combatGroup, input.getSourceId(), input.getObject().getId()));
|
||||
}
|
||||
|
||||
private boolean checkBlocks(CombatGroup combatGroup, UUID thisCreature, UUID otherCreature) {
|
||||
switch (this) {
|
||||
case BLOCKING:
|
||||
return isBlocking(combatGroup, otherCreature, thisCreature);
|
||||
case BLOCKED_BY:
|
||||
return isBlocking(combatGroup, thisCreature, otherCreature);
|
||||
case EITHER:
|
||||
return isBlocking(combatGroup, otherCreature, thisCreature)
|
||||
|| isBlocking(combatGroup, thisCreature, otherCreature);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
private static final boolean isBlocking(CombatGroup combatGroup, UUID id1, UUID id2) {
|
||||
return combatGroup.getBlockers().contains(id1) && combatGroup.getAttackers().contains(id2);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "Blocking or blocked by";
|
||||
}
|
||||
}
|
Loading…
Reference in a new issue