Panglacial Wurm: support altcosts (#5243)

This commit is contained in:
tool4ever
2024-05-15 17:06:21 +02:00
committed by GitHub
parent dfaba28acc
commit 8614d05456
21 changed files with 29 additions and 73 deletions

View File

@@ -12,8 +12,8 @@ import forge.game.ability.AbilityUtils;
import forge.game.ability.SpellAbilityEffect;
import forge.game.card.*;
import forge.game.player.Player;
import forge.game.player.PlayerCollection;
import forge.game.spellability.SpellAbility;
import forge.game.trigger.TriggerType;
import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.util.Lang;
@@ -45,56 +45,14 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
final List<ZoneType> origin = ZoneType.listValueOf(sa.getParam("Origin"));
CardCollection cards;
List<Player> tgtPlayers = getTargetPlayers(sa);
PlayerCollection tgtPlayers = getTargetPlayers(sa);
final Game game = sa.getActivatingPlayer().getGame();
if ((!sa.usesTargeting() && !sa.hasParam("Defined")) || sa.hasParam("UseAllOriginZones")) {
cards = new CardCollection(game.getCardsIn(origin));
tgtPlayers = game.getPlayers();
} else {
cards = new CardCollection();
for (final Player p : tgtPlayers) {
cards.addAll(p.getCardsIn(origin));
if (origin.contains(ZoneType.Library) && sa.hasParam("Search") && !sa.getActivatingPlayer().canSearchLibraryWith(sa, p)) {
cards.removeAll(p.getCardsIn(ZoneType.Library));
}
}
if (origin.contains(ZoneType.Library) && sa.hasParam("Search")) {
// Search library using changezoneall effect need a param "Search"
if (sa.getActivatingPlayer().hasKeyword("LimitSearchLibrary")) {
for (final Player p : tgtPlayers) {
cards.removeAll(p.getCardsIn(ZoneType.Library));
int fetchNum = Math.min(p.getCardsIn(ZoneType.Library).size(), 4);
cards.addAll(p.getCardsIn(ZoneType.Library, fetchNum));
}
}
if (!sa.getActivatingPlayer().canSearchLibraryWith(sa, null)) {
// all these cards have "then that player shuffles", mandatory shuffle
cards.removeAll(game.getCardsIn(ZoneType.Library));
}
}
}
if (origin.contains(ZoneType.Library) && sa.hasParam("Search") && sa.getActivatingPlayer().canSearchLibraryWith(sa, null)) {
CardCollection libCards = CardLists.getValidCards(cards, "Card.inZoneLibrary", sa.getActivatingPlayer(), source, sa);
CardCollection libCardsYouOwn = CardLists.filterControlledBy(libCards, sa.getActivatingPlayer());
if (!libCardsYouOwn.isEmpty()) { // Only searching one's own library would fire Archive Trap's altcost
sa.getActivatingPlayer().incLibrarySearched();
}
if (!libCards.isEmpty()) {
sa.getActivatingPlayer().getController().reveal(libCards, ZoneType.Library, libCards.get(0).getOwner());
}
final Map<AbilityKey, Object> runParams = AbilityKey.mapFromPlayer(sa.getActivatingPlayer());
runParams.put(AbilityKey.Target, tgtPlayers);
game.getTriggerHandler().runTrigger(TriggerType.SearchedLibrary, runParams, false);
}
if (origin.contains(ZoneType.Hand) && sa.hasParam("Search")) {
CardCollection handCards = CardLists.filterControlledBy(CardLists.getValidCards(cards, "Card.inZoneHand", sa.getActivatingPlayer(), source, sa),
sa.getActivatingPlayer().getOpponents());
if (!handCards.isEmpty()) {
sa.getActivatingPlayer().getController().reveal(handCards, ZoneType.Hand, handCards.get(0).getOwner());
}
cards = tgtPlayers.getCardsIn(origin);
}
if (sa.hasParam("Optional")) {

View File

@@ -4,6 +4,8 @@ import com.google.common.base.Predicates;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import forge.card.CardStateName;
import forge.card.CardType;
import forge.game.*;
import forge.game.ability.AbilityKey;
@@ -877,14 +879,9 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
Player chooser = null;
if (sa.hasParam("Chooser")) {
final String choose = sa.getParam("Chooser");
if (choose.equals("Targeted") && sa.getTargets().isTargetingAnyPlayer()) {
chooser = sa.getTargets().getFirstTargetedPlayer();
} else {
final FCollectionView<Player> choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Chooser"), sa);
if (!choosers.isEmpty()) {
chooser = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(choosers, null, sa, Localizer.getInstance().getMessage("lblChooser") + ":", false, null, null);
}
final FCollectionView<Player> choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Chooser"), sa);
if (!choosers.isEmpty()) {
chooser = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(choosers, null, sa, Localizer.getInstance().getMessage("lblChooser") + ":", false, null, null);
}
}
@@ -1052,7 +1049,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect {
"While you're searching your library, you may cast CARDNAME from your library.");
decider.getController().tempShowCards(canCastWhileSearching);
for (final Card tgtCard : canCastWhileSearching) {
List<SpellAbility> sas = AbilityUtils.getBasicSpellsFromPlayEffect(tgtCard, decider);
List<SpellAbility> sas = AbilityUtils.getSpellsFromPlayEffect(tgtCard, decider, CardStateName.Original, true);
if (sas.isEmpty()) {
continue;
}

View File

@@ -1594,7 +1594,7 @@ public class CardFactoryUtil {
final String effect = "DB$ ChangeZone | ValidTgts$ Player | TgtPrompt$ Select target player" +
" | Origin$ Library | Destination$ Hand | ChangeType$ Card.named" + k[1] +
" | Hidden$ True | Chooser$ Targeted | Optional$ Targeted";
" | Hidden$ True | Chooser$ Targeted | Optional$ True";
final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic);
trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card));