This commit is contained in:
Northmoc
2022-10-31 22:06:09 -04:00
parent c79888c238
commit a316b9ce23
7 changed files with 66 additions and 48 deletions

View File

@@ -17,13 +17,7 @@
*/ */
package forge.card; package forge.card;
import java.util.Collection; import java.util.*;
import java.util.Collections;
import java.util.EnumSet;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Set;
import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.EnumUtils;
import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.NotImplementedException;
@@ -74,6 +68,15 @@ public final class CardType implements Comparable<CardType>, CardTypeView {
private static Map<String, CoreType> stringToCoreType = EnumUtils.getEnumMap(CoreType.class); private static Map<String, CoreType> stringToCoreType = EnumUtils.getEnumMap(CoreType.class);
private static final Set<String> allCoreTypeNames = stringToCoreType.keySet(); private static final Set<String> allCoreTypeNames = stringToCoreType.keySet();
public static final Set<CoreType> spellTypes = ImmutableSet.of(Instant, Sorcery); public static final Set<CoreType> spellTypes = ImmutableSet.of(Instant, Sorcery);
public static final Set<String> permanentTypeNames() {
Set<String> permanentTypes = new HashSet<>();
for (CoreType c : CoreType.values()) {
if (c.isPermanent) {
permanentTypes.add(c.name());
}
}
return permanentTypes;
}
public static CoreType getEnum(String name) { public static CoreType getEnum(String name) {
return stringToCoreType.get(name); return stringToCoreType.get(name);

View File

@@ -224,9 +224,17 @@ public class ChooseCardEffect extends SpellAbilityEffect {
dontRevealToOwner = false; dontRevealToOwner = false;
} else { } else {
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " "; String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " ";
if (sa.hasParam ("ChoiceTitleAppendDefined")) { if (sa.hasParam ("ChoiceTitleAppend")) {
String defined = AbilityUtils.getDefinedPlayers(host, sa.getParam("ChoiceTitleAppendDefined"), sa).toString(); String tag = "";
title = title + " " + defined; String value = sa.getParam("ChoiceTitleAppend");
if (value.startsWith("Defined ")) {
tag = AbilityUtils.getDefinedPlayers(host, value.substring(8), sa).toString();
} else if (value.equals("ChosenType")) {
tag = host.getChosenType();
}
if (!tag.equals("")) {
title = title + " (" + tag +")";
}
} }
if (sa.hasParam("QuasiLibrarySearch")) { if (sa.hasParam("QuasiLibrarySearch")) {
final Player searched = AbilityUtils.getDefinedPlayers(host, final Player searched = AbilityUtils.getDefinedPlayers(host,

View File

@@ -136,26 +136,41 @@ public class RepeatEachEffect extends SpellAbilityEffect {
} }
} }
if (sa.hasParam("RepeatTypesFromDefined")) { if (sa.hasParam("RepeatTypes") || sa.hasParam("RepeatTypesFrom")) {
final String def = sa.getParam("RepeatTypesFromDefined");
final Set<String> validTypes = new HashSet<>(); final Set<String> validTypes = new HashSet<>();
final List<Card> res; if (sa.hasParam("RepeatTypes")) {
if (def.startsWith("ThisTurnCast")) { final String def = sa.getParam("RepeatTypes");
final String[] workingCopy = def.split("_"); if (def.equals("Permanent")) {
final String validFilter = workingCopy[1]; validTypes.addAll(CardType.CoreType.permanentTypeNames());
res = CardUtil.getThisTurnCast(validFilter, source, sa); } else {
} else { validTypes.addAll(Arrays.asList(sa.getParam("RepeatTypes").split(",")));
res = AbilityUtils.getDefinedCards(source, def, sa); }
} } else if (sa.hasParam("RepeatTypesFrom")) {
for (final Card c : res) { final String def = sa.getParam("RepeatTypesFrom");
for (CardType.CoreType type : c.getType().getCoreTypes()) { final List<Card> res;
validTypes.add(type.name()); if (def.startsWith("ThisTurnCast")) {
final String[] workingCopy = def.split("_");
final String validFilter = workingCopy[1];
res = CardUtil.getThisTurnCast(validFilter, source, sa);
} else if (def.startsWith("Defined ")) {
res = AbilityUtils.getDefinedCards(source, def.substring(8), sa);
} else {
res = CardLists.getValidCards(game.getCardsInGame(), def, source.getController(), source, sa);
}
for (final Card c : res) {
for (CardType.CoreType type : c.getType().getCoreTypes()) {
validTypes.add(type.name());
}
} }
} }
final String storedType = source.getChosenType(); final String storedType = source.getChosenType();
Player chooser = player;
if (sa.hasParam("ChooseOrder") && !sa.getParam("ChooseOrder").equals("True")) {
chooser = AbilityUtils.getDefinedPlayers(source, sa.getParam("ChooseOrder"), sa).get(0);
}
while (validTypes.size() > 0) { while (validTypes.size() > 0) {
String chosenT = player.getController().chooseSomeType("card", sa, validTypes, null); String chosenT = chooser.getController().chooseSomeType("card", sa, validTypes, null);
source.setChosenType(chosenT); source.setChosenType(chosenT);
AbilityUtils.resolve(repeat); AbilityUtils.resolve(repeat);
validTypes.remove(chosenT); validTypes.remove(chosenT);

View File

@@ -3,17 +3,12 @@ ManaCost:2 B G
Types:Creature Horror Types:Creature Horror
PT:3/3 PT:3/3
K:Menace K:Menace
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile up to one card of each card type from defending player's graveyard. Put a +1/+1 counter on CARDNAME for each card exiled this way. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigRepeatTypes | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, exile up to one card of each card type from defending player's graveyard. Put a +1/+1 counter on CARDNAME for each card exiled this way.
SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Land.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileCreature SVar:TrigRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ Card.inZoneGraveyard+OwnedBy TriggeredDefendingPlayer | RepeatSubAbility$ ChooseCard | SubAbility$ DBPutCounter
SVar:ExileCreature:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Creature.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExilePlaneswalker SVar:ChooseCard:DB$ ChooseCard | ChoiceZone$ Graveyard | Choices$ Card.ChosenType+OwnedBy TriggeredDefendingPlayer | ChoiceTitle$ You may choose a card of this type from defending player's graveyard to exile | ChoiceTitleAppend$ ChosenType | AILogic$ BestCard | SubAbility$ DBExile
SVar:ExilePlaneswalker:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Planeswalker.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileArtifact SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ ChosenCard | RememberChanged$ True
SVar:ExileArtifact:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Artifact.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileEnchantment
SVar:ExileEnchantment:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Enchantment.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileInstant
SVar:ExileInstant:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Instant.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileSorcery
SVar:ExileSorcery:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Sorcery.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileTribal
SVar:ExileTribal:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Tribal.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ DBPutCounter
SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True
SVar:X:Remembered$Amount SVar:X:Remembered$Amount
SVar:HasAttackEffect:TRUE SVar:HasAttackEffect:TRUE
DeckHas:Ability$Counters DeckHas:Ability$Counters

View File

@@ -3,17 +3,14 @@ ManaCost:4 B B
Types:Legendary Planeswalker Liliana Types:Legendary Planeswalker Liliana
Loyalty:6 Loyalty:6
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a creature you control dies, draw a card. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever a creature you control dies, draw a card.
SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 SVar:TrigDraw:DB$ Draw
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenOwner$ You | Planeswalker$ True | SpellDescription$ Create a 2/2 black Zombie creature token. A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TokenScript$ b_2_2_zombie | SpellDescription$ Create a 2/2 black Zombie creature token.
A:AB$ Sacrifice | Cost$ SubCounter<4/LOYALTY> | Amount$ 2 | SacValid$ Creature | Defined$ Player | Planeswalker$ True | SpellDescription$ Each player sacrifices two creatures. A:AB$ Sacrifice | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Amount$ 2 | SacValid$ Creature | Defined$ Player | SpellDescription$ Each player sacrifices two creatures.
A:AB$ RepeatEach | Cost$ SubCounter<9/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ ChooseArtf | SubAbility$ SacAllOthers | SpellDescription$ Each opponent chooses a permanent they control of each permanent type and sacrifices the rest. A:AB$ RepeatEach | Cost$ SubCounter<9/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ ChoosePerms | SubAbility$ SacAllOthers | SpellDescription$ Each opponent chooses a permanent they control of each permanent type and sacrifices the rest.
SVar:ChooseArtf:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Artifact.RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True SVar:ChoosePerms:DB$ RepeatEach | RepeatTypes$ Permanent | ChooseOrder$ RememberedPlayer | RepeatSubAbility$ ChooseCard
SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | RememberChosen$ True | Mandatory$ True SVar:ChooseCard:DB$ ChooseCard | Defined$ RememberedPlayer | Choices$ Card.ChosenType+RememberedPlayerCtrl | ChoiceTitle$ Choose a card of this type to keep | ChoiceTitleAppend$ ChosenType | AILogic$ BestCard | RememberChosen$ True | Mandatory$ True
SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Enchantment.RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChooseLand | RememberChosen$ True | Mandatory$ True SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered+OppCtrl | SubAbility$ DBCleanup | StackDescription$ None
SVar:ChooseLand:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Land.RememberedPlayerCtrl | ChoiceTitle$ Choose a land to keep | SubAbility$ ChoosePW | RememberChosen$ True | Mandatory$ True
SVar:ChoosePW:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Planeswalker.RememberedPlayerCtrl | ChoiceTitle$ Choose a planeswalker to keep | RememberChosen$ True | Mandatory$ True
SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered+OppCtrl | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token|Sacrifice DeckHas:Ability$Token|Sacrifice & Type$Zombie
SVar:PlayMain1:TRUE SVar:PlayMain1:TRUE
Oracle:Whenever a creature you control dies, draw a card.\n[+1]: Create a 2/2 black Zombie creature token.\n[-4]: Each player sacrifices two creatures.\n[-9]: Each opponent chooses a permanent they control of each permanent type and sacrifices the rest. Oracle:Whenever a creature you control dies, draw a card.\n[+1]: Create a 2/2 black Zombie creature token.\n[-4]: Each player sacrifices two creatures.\n[-9]: Each opponent chooses a permanent they control of each permanent type and sacrifices the rest.

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Horror
PT:3/5 PT:3/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBRepeat | TriggerDescription$ When CARDNAME enters the battlefield, for each opponent, tap up to one untapped creature you control. When you do, gain control of target creature that player controls with power less than or equal to the tapped creature's power for as long as you control CARDNAME. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBRepeat | TriggerDescription$ When CARDNAME enters the battlefield, for each opponent, tap up to one untapped creature you control. When you do, gain control of target creature that player controls with power less than or equal to the tapped creature's power for as long as you control CARDNAME.
SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBCleanup SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ DBChoose | SubAbility$ DBCleanup
SVar:DBChoose:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ 1 | Choices$ Creature.untapped+YouCtrl | ChoiceTitle$ Choose up to one untapped creature you control to tap | ChoiceTitleAppendDefined$ Player.IsRemembered | ChoiceZone$ Battlefield | SubAbility$ DBTap SVar:DBChoose:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ 1 | Choices$ Creature.untapped+YouCtrl | ChoiceTitle$ Choose up to one untapped creature you control to tap | ChoiceTitleAppend$ Defined Player.IsRemembered | ChoiceZone$ Battlefield | SubAbility$ DBTap
SVar:DBTap:DB$ Tap | Defined$ ChosenCard | SubAbility$ DBImmediateTrigger SVar:DBTap:DB$ Tap | Defined$ ChosenCard | SubAbility$ DBImmediateTrigger
SVar:DBImmediateTrigger:DB$ ImmediateTrigger | RememberObjects$ ChosenCard,Player.IsRemembered | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 | Execute$ TrigGainControl | TrigDescReminderDefined$ Player.IsRemembered | TriggerDescription$ When you do, gain control of target creature that player controls with power less than or equal to the tapped creature's power for as long as you control CARDNAME. SVar:DBImmediateTrigger:DB$ ImmediateTrigger | RememberObjects$ ChosenCard,Player.IsRemembered | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 | Execute$ TrigGainControl | TrigDescReminderDefined$ Player.IsRemembered | TriggerDescription$ When you do, gain control of target creature that player controls with power less than or equal to the tapped creature's power for as long as you control CARDNAME.
SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Creature.powerLEX+ControlledBy DelayTriggerRemembered | LoseControl$ LeavesPlay,LoseControl | TgtPrompt$ Select target creature that opponent controls SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Creature.powerLEX+ControlledBy DelayTriggerRemembered | LoseControl$ LeavesPlay,LoseControl | TgtPrompt$ Select target creature that opponent controls

View File

@@ -4,8 +4,8 @@ Types:Legendary Creature Human Wizard Advisor
PT:2/4 PT:2/4
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigDig | TriggerDescription$ At the beginning of your end step, if you've cast a noncreature spell this turn, reveal the top five cards of your library. For each card type among noncreature spells you've cast this turn, you may put a card of that type from among the revealed cards into your hand. Put the rest on the bottom of your library in a random order. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigDig | TriggerDescription$ At the beginning of your end step, if you've cast a noncreature spell this turn, reveal the top five cards of your library. For each card type among noncreature spells you've cast this turn, you may put a card of that type from among the revealed cards into your hand. Put the rest on the bottom of your library in a random order.
SVar:TrigDig:DB$ Dig | DigNum$ 5 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach SVar:TrigDig:DB$ Dig | DigNum$ 5 | Reveal$ True | NoMove$ True | RememberRevealed$ True | SubAbility$ DBRepeatEach
SVar:DBRepeatEach:DB$ RepeatEach | RepeatTypesFromDefined$ ThisTurnCast_Card.nonCreature+YouCtrl | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll SVar:DBRepeatEach:DB$ RepeatEach | RepeatTypesFrom$ ThisTurnCast_Card.nonCreature+YouCtrl | RepeatSubAbility$ ChooseCard | SubAbility$ DBChangeZoneAll
SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.IsRemembered+ChosenType | ImprintChosen$ True | ForgetChosen$ True | ChoiceTitle$ You may choose a card of this type to put into your hand | ChoiceZone$ Library | AILogic$ BestCard SVar:ChooseCard:DB$ ChooseCard | Choices$ Card.IsRemembered+ChosenType | ImprintChosen$ True | ForgetChosen$ True | ChoiceTitle$ You may choose a card of this type to put into your hand | ChoiceTitleAppend$ ChosenType | ChoiceZone$ Library | AILogic$ BestCard
SVar:DBChangeZoneAll:DB$ ChangeZone | Defined$ Imprinted | Origin$ Library | Destination$ Hand | SubAbility$ DBRestRandomOrder SVar:DBChangeZoneAll:DB$ ChangeZone | Defined$ Imprinted | Origin$ Library | Destination$ Hand | SubAbility$ DBRestRandomOrder
SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup SVar:DBRestRandomOrder:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True