1
0
Fork 0
mirror of https://github.com/correl/mage.git synced 2025-04-10 17:00:08 -09:00
This commit is contained in:
Jeff Wadsworth 2021-09-20 15:54:52 -05:00
parent b756fd0e72
commit 77845bd1df
3 changed files with 74 additions and 10 deletions
Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai
Mage.Sets/src/mage/cards/a
Mage/src/main/java/mage/target

View file

@ -113,7 +113,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
if (hand.size() < 6 if (hand.size() < 6
|| isTestsMode() // ignore mulligan in tests || isTestsMode() // ignore mulligan in tests
|| game.getClass().getName().contains("Momir") // ignore mulligan in Momir games || game.getClass().getName().contains("Momir") // ignore mulligan in Momir games
) { ) {
return false; return false;
} }
Set<Card> lands = hand.getCards(new FilterLandCard(), game); Set<Card> lands = hand.getCards(new FilterLandCard(), game);
@ -540,6 +540,58 @@ public class ComputerPlayer extends PlayerImpl implements Player {
return setTargetPlayer(outcome, target, source, sourceId, abilityControllerId, randomOpponentId, game, required); return setTargetPlayer(outcome, target, source, sourceId, abilityControllerId, randomOpponentId, game, required);
} }
// Angel of Serenity trigger
if (target.getOriginalTarget() instanceof TargetCardInGraveyardOrBattlefield) {
Cards cards = new CardsImpl(possibleTargets);
List<Card> possibleCards = new ArrayList<>(cards.getCards(game));
for (Card card : possibleCards) {
// check permanents first; they have more intrinsic worth
if (card instanceof Permanent) {
Permanent p = ((Permanent) card);
if (outcome.isGood()
&& p.isControlledBy(abilityControllerId)) {
if (target.canTarget(abilityControllerId, p.getId(), source, game)) {
if (target.getTargets().size() >= target.getMaxNumberOfTargets()) {
break;
}
target.addTarget(p.getId(), source, game);
}
}
if (!outcome.isGood()
&& !p.isControlledBy(abilityControllerId)) {
if (target.canTarget(abilityControllerId, p.getId(), source, game)) {
if (target.getTargets().size() >= target.getMaxNumberOfTargets()) {
break;
}
target.addTarget(p.getId(), source, game);
}
}
}
// check the graveyards last
if (game.getState().getZone(card.getId()) == Zone.GRAVEYARD) {
if (outcome.isGood()
&& card.isOwnedBy(abilityControllerId)) {
if (target.canTarget(abilityControllerId, card.getId(), source, game)) {
if (target.getTargets().size() >= target.getMaxNumberOfTargets()) {
break;
}
target.addTarget(card.getId(), source, game);
}
}
if (!outcome.isGood()
&& !card.isOwnedBy(abilityControllerId)) {
if (target.canTarget(abilityControllerId, card.getId(), source, game)) {
if (target.getTargets().size() >= target.getMaxNumberOfTargets()) {
break;
}
target.addTarget(card.getId(), source, game);
}
}
}
}
return target.isChosen();
}
if (target.getOriginalTarget() instanceof TargetDiscard if (target.getOriginalTarget() instanceof TargetDiscard
|| target.getOriginalTarget() instanceof TargetCardInHand) { || target.getOriginalTarget() instanceof TargetCardInHand) {
if (outcome.isGood()) { if (outcome.isGood()) {
@ -2659,7 +2711,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
} }
protected void findBestPermanentTargets(Outcome outcome, UUID abilityControllerId, UUID sourceId, FilterPermanent filter, Game game, Target target, protected void findBestPermanentTargets(Outcome outcome, UUID abilityControllerId, UUID sourceId, FilterPermanent filter, Game game, Target target,
List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) { List<Permanent> goodList, List<Permanent> badList, List<Permanent> allList) {
// searching for most valuable/powerfull permanents // searching for most valuable/powerfull permanents
goodList.clear(); goodList.clear();
badList.clear(); badList.clear();

View file

@ -12,13 +12,12 @@ import mage.cards.CardSetInfo;
import mage.constants.CardType; import mage.constants.CardType;
import mage.constants.SubType; import mage.constants.SubType;
import mage.constants.Zone; import mage.constants.Zone;
import mage.filter.FilterPermanent;
import mage.filter.StaticFilters;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.AnotherPredicate; import mage.filter.predicate.mageobject.AnotherPredicate;
import mage.target.common.TargetCardInGraveyardOrBattlefield; import mage.target.common.TargetCardInGraveyardOrBattlefield;
import java.util.UUID; import java.util.UUID;
import mage.filter.common.FilterCreatureCard;
import mage.filter.common.FilterCreaturePermanent;
/** /**
* @author LevelX2 * @author LevelX2
@ -27,10 +26,13 @@ public final class AngelOfSerenity extends CardImpl {
private static final String rule = "you may exile up to three other target creatures " + private static final String rule = "you may exile up to three other target creatures " +
"from the battlefield and/or creature cards from graveyards."; "from the battlefield and/or creature cards from graveyards.";
private static final FilterPermanent filter = new FilterCreaturePermanent("other target creatures");
private static final FilterCreatureCard filterCreatureCard = new FilterCreatureCard("creature card in a graveyard");
private static final FilterCreaturePermanent filterCreaturePermanent = new FilterCreaturePermanent("other target creature");
static { static {
filter.add(AnotherPredicate.instance); filterCreaturePermanent.add(AnotherPredicate.instance);
} }
public AngelOfSerenity(UUID ownerId, CardSetInfo setInfo) { public AngelOfSerenity(UUID ownerId, CardSetInfo setInfo) {
@ -48,7 +50,7 @@ public final class AngelOfSerenity extends CardImpl {
new ExileTargetForSourceEffect().setText(rule), true new ExileTargetForSourceEffect().setText(rule), true
); );
ability.addTarget(new TargetCardInGraveyardOrBattlefield( ability.addTarget(new TargetCardInGraveyardOrBattlefield(
0, 3, StaticFilters.FILTER_CARD_CREATURE, filter 0, 3, filterCreatureCard, filterCreaturePermanent
)); ));
this.addAbility(ability); this.addAbility(ability);

View file

@ -14,6 +14,7 @@ import mage.util.CardUtil;
import mage.util.RandomUtil; import mage.util.RandomUtil;
import java.util.*; import java.util.*;
import mage.game.permanent.Permanent;
/** /**
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
@ -332,7 +333,16 @@ public abstract class TargetImpl implements Target {
for (UUID targetId : targets.keySet()) { for (UUID targetId : targets.keySet()) {
Card card = game.getCard(targetId); Card card = game.getCard(targetId);
if (card != null) { if (card != null) {
if (zoneChangeCounters.containsKey(targetId) && zoneChangeCounters.get(targetId) != card.getZoneChangeCounter(game)) { // if a permanent, verify it is phased in, otherwise it is illegal
Permanent p = game.getPermanent(targetId);
if (p != null
&& !p.isPhasedIn()) {
illegalTargets.add(targetId);
continue; // it's not legal so continue to have a look at other targeted objects
}
// check if the card moved to another zone
if (zoneChangeCounters.containsKey(targetId)
&& zoneChangeCounters.get(targetId) != card.getZoneChangeCounter(game)) {
illegalTargets.add(targetId); illegalTargets.add(targetId);
continue; // it's not legal so continue to have a look at other targeted objects continue; // it's not legal so continue to have a look at other targeted objects
} }