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;
import java.util.Collection;
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 java.util.*;
import org.apache.commons.lang3.EnumUtils;
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 final Set<String> allCoreTypeNames = stringToCoreType.keySet();
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) {
return stringToCoreType.get(name);

View File

@@ -224,9 +224,17 @@ public class ChooseCardEffect extends SpellAbilityEffect {
dontRevealToOwner = false;
} else {
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " ";
if (sa.hasParam ("ChoiceTitleAppendDefined")) {
String defined = AbilityUtils.getDefinedPlayers(host, sa.getParam("ChoiceTitleAppendDefined"), sa).toString();
title = title + " " + defined;
if (sa.hasParam ("ChoiceTitleAppend")) {
String tag = "";
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")) {
final Player searched = AbilityUtils.getDefinedPlayers(host,

View File

@@ -136,26 +136,41 @@ public class RepeatEachEffect extends SpellAbilityEffect {
}
}
if (sa.hasParam("RepeatTypesFromDefined")) {
final String def = sa.getParam("RepeatTypesFromDefined");
if (sa.hasParam("RepeatTypes") || sa.hasParam("RepeatTypesFrom")) {
final Set<String> validTypes = new HashSet<>();
final List<Card> res;
if (def.startsWith("ThisTurnCast")) {
final String[] workingCopy = def.split("_");
final String validFilter = workingCopy[1];
res = CardUtil.getThisTurnCast(validFilter, source, sa);
} else {
res = AbilityUtils.getDefinedCards(source, def, sa);
}
for (final Card c : res) {
for (CardType.CoreType type : c.getType().getCoreTypes()) {
validTypes.add(type.name());
if (sa.hasParam("RepeatTypes")) {
final String def = sa.getParam("RepeatTypes");
if (def.equals("Permanent")) {
validTypes.addAll(CardType.CoreType.permanentTypeNames());
} else {
validTypes.addAll(Arrays.asList(sa.getParam("RepeatTypes").split(",")));
}
} else if (sa.hasParam("RepeatTypesFrom")) {
final String def = sa.getParam("RepeatTypesFrom");
final List<Card> res;
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();
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) {
String chosenT = player.getController().chooseSomeType("card", sa, validTypes, null);
String chosenT = chooser.getController().chooseSomeType("card", sa, validTypes, null);
source.setChosenType(chosenT);
AbilityUtils.resolve(repeat);
validTypes.remove(chosenT);

View File

@@ -3,17 +3,12 @@ ManaCost:2 B G
Types:Creature Horror
PT:3/3
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.
SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Land.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileCreature
SVar:ExileCreature:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Creature.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExilePlaneswalker
SVar:ExilePlaneswalker:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Hidden$ True | ChangeType$ Planeswalker.OwnedBy TriggeredDefendingPlayer | RememberChanged$ True | SubAbility$ ExileArtifact
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
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:TrigRepeatTypes:DB$ RepeatEach | RepeatTypesFrom$ Card.inZoneGraveyard+OwnedBy TriggeredDefendingPlayer | RepeatSubAbility$ ChooseCard | SubAbility$ DBPutCounter
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:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ ChosenCard | RememberChanged$ True
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:HasAttackEffect:TRUE
DeckHas:Ability$Counters

View File

@@ -3,17 +3,14 @@ ManaCost:4 B B
Types:Legendary Planeswalker Liliana
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.
SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1
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$ Sacrifice | Cost$ SubCounter<4/LOYALTY> | Amount$ 2 | SacValid$ Creature | Defined$ Player | Planeswalker$ True | 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.
SVar:ChooseArtf:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Artifact.RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True
SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | 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: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:TrigDraw:DB$ Draw
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> | 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$ ChoosePerms | SubAbility$ SacAllOthers | SpellDescription$ Each opponent chooses a permanent they control of each permanent type and sacrifices the rest.
SVar:ChoosePerms:DB$ RepeatEach | RepeatTypes$ Permanent | ChooseOrder$ RememberedPlayer | RepeatSubAbility$ ChooseCard
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:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered+OppCtrl | SubAbility$ DBCleanup | StackDescription$ None
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
DeckHas:Ability$Token|Sacrifice
DeckHas:Ability$Token|Sacrifice & Type$Zombie
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.

View File

@@ -4,7 +4,7 @@ Types:Legendary Creature Horror
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.
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: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

View File

@@ -4,8 +4,8 @@ Types:Legendary Creature Human Wizard Advisor
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.
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: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: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 | ChoiceTitleAppend$ ChosenType | ChoiceZone$ Library | AILogic$ BestCard
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:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True