diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index 60791745830..5525f7603fd 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -756,9 +756,9 @@ public class AiController { } // state needs to be switched here so API checks evaluate the right face - CardStateName currentState = sa.getCardState() != null && sa.getHostCard().getCurrentStateName() != sa.getCardState().getStateName() && !sa.getHostCard().isInPlay() ? sa.getHostCard().getCurrentStateName() : null; + CardStateName currentState = sa.getCardState() != null && sa.getHostCard().getCurrentStateName() != sa.getCardStateName() && !sa.getHostCard().isInPlay() ? sa.getHostCard().getCurrentStateName() : null; if (currentState != null) { - sa.getHostCard().setState(sa.getCardState().getStateName(), false); + sa.getHostCard().setState(sa.getCardStateName(), false); } AiPlayDecision canPlay = canPlaySa(sa); // this is the "heaviest" check, which also sets up targets, defines X, etc. diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index 6db4a682d3d..78b575930fe 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -299,7 +299,7 @@ public class ControlGainAi extends SpellAbilityAi { final Game game = ai.getGame(); // Special card logic that is processed elsewhere - if (sa.getParam("AILogic").equals("DonateTargetPerm")) { + if (("DonateTargetPerm").equals(sa.getParam("AILogic"))) { // Donate step 2 - target a donatable permanent. return SpecialCardAi.Donate.considerDonatingPermanent(ai, sa); } diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 3656e81da9d..d7adc209271 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -186,7 +186,7 @@ public final class PaperCard implements Comparable, InventoryItemFro artIndex = Math.max(artIndex0, IPaperCard.DEFAULT_ART_INDEX); foil = foil0; rarity = rarity0; - artist = (artist0 != null ? TextUtil.normalizeText(artist0) : IPaperCard.NO_ARTIST_NAME); + artist = artist0 != null ? TextUtil.normalizeText(artist0) : IPaperCard.NO_ARTIST_NAME; collectorNumber = (collectorNumber0 != null) && (collectorNumber0.length() > 0) ? collectorNumber0 : IPaperCard.NO_COLLECTOR_NUMBER; // If the user changes the language this will make cards sort by the old language until they restart the game. // This is a good tradeoff diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java index 242df235f0c..ff5ea348c42 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1601,15 +1601,11 @@ public class AbilityUtils { if (sa.hasParam("ForgetOtherTargets")) { host.clearRemembered(); } - for (final GameObject o : sa.getTargets()) { - host.addRemembered(o); - } + host.addRemembered(sa.getTargets()); } if (sa.hasParam("ImprintTargets") && sa.usesTargeting()) { - for (final Card c : sa.getTargets().getTargetCards()) { - host.addImprintedCard(c); - } + host.addImprintedCards(sa.getTargets().getTargetCards()); } if (sa.hasParam("RememberCostMana")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java index c066116aea1..51a845748e4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java @@ -142,9 +142,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect { } host.setChosenCards(chosen); if (sa.hasParam("RememberChosen")) { - for (final Card rem : chosen) { - host.addRemembered(rem); - } + host.addRemembered(chosen); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 665516a989a..da80741c5b4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -168,9 +168,7 @@ public class DigEffect extends SpellAbilityEffect { if (!toReveal.isEmpty()) { game.getAction().reveal(toReveal, cont); if (sa.hasParam("RememberRevealed")) { - for (final Card one : toReveal) { - host.addRemembered(one); - } + host.addRemembered(toReveal); } } } @@ -329,7 +327,7 @@ public class DigEffect extends SpellAbilityEffect { } List chosen = new ArrayList<>(); - int max = anyNumber ? valid.size() : Math.min(valid.size(),destZone1ChangeNum); + int max = anyNumber ? valid.size() : Math.min(valid.size(), destZone1ChangeNum); int min = (anyNumber || optional) ? 0 : max; if (max > 0) { // if max is 0 don't make a choice chosen = chooser.getController().chooseEntitiesForEffect(valid, min, max, delayedReveal, sa, prompt, p, null); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index f2c1ca2a6bb..b4f7d1f9545 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -29,10 +29,7 @@ public class DigUntilEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - String desc = "Card"; - if (sa.hasParam("ValidDescription")) { - desc = sa.getParam("ValidDescription"); - } + String desc = sa.getParamOrDefault("ValidDescription", "Card"); int untilAmount = 1; if (sa.hasParam("Amount")) { @@ -57,7 +54,6 @@ public class DigUntilEffect extends SpellAbilityEffect { final ZoneType found = ZoneType.smartValueOf(sa.getParam("FoundDestination")); final ZoneType revealed = ZoneType.smartValueOf(sa.getParam("RevealedDestination")); if (found != null) { - sb.append(untilAmount > 1 ? "those cards" : "that card"); sb.append(" "); diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java index 62761fdc301..66d595cab19 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java @@ -198,9 +198,7 @@ public class EffectEffect extends SpellAbilityEffect { // Set Remembered if (rememberList != null) { - for (final Object o : rememberList) { - eff.addRemembered(o); - } + eff.addRemembered(rememberList); if (sa.hasParam("ForgetOnMoved")) { addForgetOnMovedTrigger(eff, sa.getParam("ForgetOnMoved")); if (!"Stack".equals(sa.getParam("ForgetOnMoved"))) { @@ -219,9 +217,7 @@ public class EffectEffect extends SpellAbilityEffect { // Set Imprinted if (effectImprinted != null) { - for (final Card c : AbilityUtils.getDefinedCards(hostCard, effectImprinted, sa)) { - eff.addImprintedCard(c); - } + eff.addImprintedCards(AbilityUtils.getDefinedCards(hostCard, effectImprinted, sa)); } // Note counters on defined diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipOntoBattlefieldEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipOntoBattlefieldEffect.java index 4c8d52f1c6e..9e73af3ba86 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FlipOntoBattlefieldEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FlipOntoBattlefieldEffect.java @@ -79,9 +79,7 @@ public class FlipOntoBattlefieldEffect extends SpellAbilityEffect { } // Remember whatever was hit - for (Card c : hit) { - host.addRemembered(c); - } + host.addRemembered(hit); } @Override diff --git a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java index 30821255082..75339ec2180 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MultiplePilesEffect.java @@ -92,9 +92,7 @@ public class MultiplePilesEffect extends SpellAbilityEffect { if (randomChosen) { for (Entry> ev : record.entrySet()) { CardCollectionView chosen = Aggregates.random(ev.getValue()); - for (Card c : chosen) { - source.addRemembered(c); - } + source.addRemembered(chosen); } SpellAbility sub = sa.getAdditionalAbility("ChosenPile"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/SubgameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SubgameEffect.java index 2dd0f0c3685..7ec64259baf 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SubgameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SubgameEffect.java @@ -193,13 +193,9 @@ public class SubgameEffect extends SpellAbilityEffect { if (sa.hasParam("RememberPlayers")) { final String param = sa.getParam("RememberPlayers"); if (param.equals("Win")) { - for (Player p : winPlayers) { - hostCard.addRemembered(p); - } + hostCard.addRemembered(winPlayers); } else if (param.equals("NotWin")) { - for (Player p : notWinPlayers) { - hostCard.addRemembered(p); - } + hostCard.addRemembered(notWinPlayers); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java index e175658c782..5ef63f3ba3b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/VoteEffect.java @@ -117,9 +117,7 @@ public class VoteEffect extends SpellAbilityEffect { if (sa.hasParam("Tied") && mostVotes.size() > 1) { subAbs.add(sa.getParam("Tied")); } else if (sa.hasParam("VoteSubAbility")) { - for (final Object o : mostVotes) { - host.addRemembered(o); - } + host.addRemembered(mostVotes); subAbs.add(sa.getParam("VoteSubAbility")); } else { for (Object type : mostVotes) { diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 7e167e738ac..9ac0a3d3b00 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -784,13 +784,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return false; } - CardStateName destState = transformCard.backside ? CardStateName.Original : CardStateName.Transformed; - // below only when in play if (!isInPlay()) { return true; } + CardStateName destState = transformCard.backside ? CardStateName.Original : CardStateName.Transformed; + // use Original State for the transform check if (!transformCard.getOriginalState(destState).getType().isPermanent()) { return false; @@ -887,7 +887,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final boolean hasAlternateState() { // Note: Since FaceDown state is created lazily (whereas previously // it was always created), adjust threshold based on its existence. - int threshold = (states.containsKey(CardStateName.FaceDown) ? 2 : 1); + int threshold = states.containsKey(CardStateName.FaceDown) ? 2 : 1; int numStates = states.keySet().size(); @@ -6451,6 +6451,11 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return c.getCardForUi(); } + //allow special cards to override this function to return another card for the sake of UI logic + public Card getCardForUi() { + return this; + } + public IPaperCard getPaperCard() { IPaperCard cp = paperCard; if (cp != null) { @@ -6486,11 +6491,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { staticCommandList.add(objects); } - //allow special cards to override this function to return another card for the sake of UI logic - public Card getCardForUi() { - return this; - } - public String getOracleText() { CardRules rules = cardRules; if (copiedPermanent != null) { //return oracle text of copied permanent if applicable diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 540ebe740ec..8f4df50d767 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -96,12 +96,8 @@ public class CardFactory { out.setAttachedCards(in.getAttachedCards()); out.setEntityAttachedTo(in.getEntityAttachedTo()); - for (final Object o : in.getRemembered()) { - out.addRemembered(o); - } - for (final Card o : in.getImprintedCards()) { - out.addImprintedCard(o); - } + out.addRemembered(in.getRemembered()); + out.addImprintedCards(in.getImprintedCards()); out.setCommander(in.isRealCommander()); //out.setFaceDown(in.isFaceDown()); @@ -125,11 +121,9 @@ public class CardFactory { private final static Card copySpellHost(final SpellAbility sourceSA, final SpellAbility targetSA, Player controller) { final Card source = sourceSA.getHostCard(); final Card original = targetSA.getHostCard(); - final Card c = copyCard(original, true); - - // clear remember/imprint for copied spells - c.clearRemembered(); - c.clearImprintedCards(); + final Game game = source.getGame(); + final Card c = new Card(game.nextCardId(), original.getPaperCard(), game); + copyCopiableCharacteristics(original, c); if (sourceSA.hasParam("NonLegendary")) { c.removeType(CardType.Supertype.Legendary); @@ -524,8 +518,6 @@ public class CardFactory { public static void copyState(final Card from, final CardStateName fromState, final Card to, final CardStateName toState, boolean updateView) { // copy characteristics not associated with a state - to.setBasePowerString(from.getBasePowerString()); - to.setBaseToughnessString(from.getBaseToughnessString()); to.setText(from.getSpellText()); // get CardCharacteristics for desired state @@ -753,7 +745,7 @@ public class CardFactory { if (sa.hasParam("GainThisAbility") && (sa instanceof SpellAbility)) { SpellAbility root = ((SpellAbility) sa).getRootAbility(); - if (root.isTrigger() && root.getTrigger() != null) { + if (root.isTrigger()) { state.addTrigger(root.getTrigger().copy(out, false)); } else if (root.isReplacementAbility()) { state.addReplacementEffect(root.getReplacementEffect().copy(out, false)); diff --git a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java index 079ca1ecc7a..cc5265b62d8 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPartWithList.java +++ b/forge-game/src/main/java/forge/game/cost/CostPartWithList.java @@ -173,8 +173,7 @@ public abstract class CostPartWithList extends CostPart { } // copy table because the original get cleaned after the cost is done - final CardZoneTable copyTable = new CardZoneTable(); - copyTable.putAll(table); + final CardZoneTable copyTable = new CardZoneTable(table); copyTable.triggerChangesZoneAll(payer.getGame(), ability); } diff --git a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java index 1e64301de07..8b8ed940eb5 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPutCounter.java +++ b/forge-game/src/main/java/forge/game/cost/CostPutCounter.java @@ -195,8 +195,7 @@ public class CostPutCounter extends CostPartWithList { return; } - GameEntityCounterTable tempTable = new GameEntityCounterTable(); - tempTable.putAll(counterTable); + GameEntityCounterTable tempTable = new GameEntityCounterTable(counterTable); tempTable.replaceCounterEffect(ability.getHostCard().getGame(), ability, effect); } diff --git a/forge-game/src/main/java/forge/game/spellability/AbilitySub.java b/forge-game/src/main/java/forge/game/spellability/AbilitySub.java index f858fc15982..43007a57a05 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilitySub.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilitySub.java @@ -19,6 +19,8 @@ package forge.game.spellability; import java.util.Map; +import forge.card.CardStateName; +import forge.game.IHasSVars; import forge.game.ability.AbilityFactory; import forge.game.ability.ApiType; import forge.game.ability.SpellAbilityEffect; @@ -103,6 +105,14 @@ public final class AbilitySub extends SpellAbility implements java.io.Serializab effect.resolve(this); } + @Override + protected IHasSVars getSVarFallback() { + if (getCardState() != null && getCardStateName().equals(CardStateName.RightSplit)) { + return getCardState(); + } + return super.getSVarFallback(); + } + /** {@inheritDoc} */ @Override public final Object clone() { diff --git a/forge-game/src/main/java/forge/game/spellability/Spell.java b/forge-game/src/main/java/forge/game/spellability/Spell.java index e3d7e3a4adb..71fe6fa9879 100644 --- a/forge-game/src/main/java/forge/game/spellability/Spell.java +++ b/forge-game/src/main/java/forge/game/spellability/Spell.java @@ -174,11 +174,11 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable } source.turnFaceDownNoUpdate(); lkicheck = true; - } else if (getCardState() != null && source.getCurrentStateName() != getCardStateName()) { + } else if (getCardState() != null && source.getCurrentStateName() != getCardStateName() && getHostCard().getState(getCardStateName()) != null) { if (!source.isLKI()) { source = CardUtil.getLKICopy(source); } - CardStateName stateName = getCardState().getStateName(); + CardStateName stateName = getCardStateName(); if (!source.hasState(stateName)) { source.addAlternateState(stateName, false); source.getState(stateName).copyFrom(getHostCard().getState(stateName), true); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 5bfc375139f..4cc4345efce 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -1104,8 +1104,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit clone.counterTable = new GameEntityCounterTable(counterTable); } if (changeZoneTable != null) { - clone.changeZoneTable = new CardZoneTable(); - clone.changeZoneTable.putAll(changeZoneTable); + clone.changeZoneTable = new CardZoneTable(changeZoneTable); } clone.payingMana = Lists.newArrayList(payingMana);