From 9b47a7fee2ae286a23fe45936a0b6494a67edabe Mon Sep 17 00:00:00 2001 From: tool4ever Date: Wed, 15 Mar 2023 13:37:22 +0100 Subject: [PATCH] Remove some obsolete stuff (#2685) * Remove obsolete code * Fix uncounterable being invisible * Fix CantHappen requiring choice --- .../main/java/forge/ai/ComputerUtilMana.java | 2 +- .../java/forge/card/CardRulesPredicates.java | 3 +- .../java/forge/game/ability/AbilityUtils.java | 2 +- .../game/ability/effects/CounterEffect.java | 4 +-- .../src/main/java/forge/game/card/Card.java | 16 ++-------- .../java/forge/game/card/CardFactoryUtil.java | 10 +++++-- .../java/forge/game/card/CardProperty.java | 2 +- .../main/java/forge/game/mana/ManaPool.java | 9 ++---- .../game/replacement/ReplacementHandler.java | 8 ++++- .../game/spellability/AbilityManaPart.java | 29 +++++++++++++++++++ .../forge/game/spellability/SpellAbility.java | 4 +-- .../spellability/SpellAbilityRestriction.java | 4 +-- .../main/java/forge/game/zone/MagicStack.java | 5 ---- .../screens/match/controllers/CField.java | 4 +-- .../gamemodes/match/input/InputPayMana.java | 2 +- .../forge/player/HumanPlaySpellAbility.java | 2 +- 16 files changed, 62 insertions(+), 44 deletions(-) diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index 72c139ed4af..1dcf360858e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -590,7 +590,7 @@ public class ComputerUtilMana { final Mana mana = CostPayment.getMana(ai, part, sa, cost.getSourceRestriction(), (byte) -1, cost.getXManaCostPaidByColor()); if (mana != null) { if (ai.getManaPool().tryPayCostWithMana(sa, cost, mana, false)) { - manaSpentToPay.add(0, mana); + manaSpentToPay.add(mana); } } } diff --git a/forge-core/src/main/java/forge/card/CardRulesPredicates.java b/forge-core/src/main/java/forge/card/CardRulesPredicates.java index ea772e340df..131b6c738cf 100644 --- a/forge-core/src/main/java/forge/card/CardRulesPredicates.java +++ b/forge-core/src/main/java/forge/card/CardRulesPredicates.java @@ -6,7 +6,6 @@ import java.util.Set; import com.google.common.base.Predicate; import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; import forge.util.CardTranslation; import forge.util.ComparableOp; @@ -185,7 +184,7 @@ public final class CardRulesPredicates { return new Predicate() { @Override public boolean apply(final CardRules card) { - return Iterables.contains(card.getMainPart().getKeywords(), keyword); + return card.hasKeyword(keyword); } }; } 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 8c43e1ed456..e9dda43f38b 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1580,7 +1580,7 @@ public class AbilityUtils { List payingMana = sa.getPayingMana(); // even if the cost was raised, we only care about mana from activation part // let's just assume the first shards spent are that for easy handling - List activationPaid = payingMana.subList(payingMana.size() - activationShards, payingMana.size()); + List activationPaid = payingMana.subList(0, activationShards); StringBuilder sb = new StringBuilder(); int nMana = 0; for (Mana m : activationPaid) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java index 6f593ba648a..bdfef8be78d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CounterEffect.java @@ -287,9 +287,7 @@ public class CounterEffect extends SpellAbilityEffect { game.getStack().remove(si); // if the target card on stack was a spell with Bestow, then unbestow it - if (c.isBestowed()) { - c.unanimateBestow(true); - } + c.unanimateBestow(); Map params = AbilityKey.newMap(); params.put(AbilityKey.StackSa, tgtSA); 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 e6b63664805..b4b73af4580 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -199,8 +199,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private Card copiedPermanent; private boolean copiedSpell = false; - private boolean canCounter = true; - private boolean unearthed; private boolean monstrous; @@ -2927,7 +2925,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final SpellAbility getFirstSpellAbility() { - return currentState.getNonManaAbilities().isEmpty() ? null : currentState.getNonManaAbilities().getFirst(); + return Iterables.getFirst(currentState.getNonManaAbilities(), null); } /** @@ -3247,13 +3245,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { flipped = value; } - public final void setCanCounter(final boolean b) { - canCounter = b; - } - public final boolean getCanCounter() { - return canCounter; - } - public final void addLeavesPlayCommand(final GameCommand c) { leavePlayCommandList.add(c); } @@ -3669,9 +3660,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { entity.removeAttachedCard(this); // Handle Bestowed Aura part - if (isBestowed()) { - unanimateBestow(); - } + unanimateBestow(); + getGame().fireEvent(new GameEventCardAttachment(this, entity, null)); // Run triggers diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index e2dba01db83..f8e90375aea 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -60,6 +60,7 @@ import forge.game.player.Player; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementLayer; +import forge.game.replacement.ReplacementType; import forge.game.spellability.AbilityStatic; import forge.game.spellability.AbilitySub; import forge.game.spellability.AlternativeCost; @@ -258,8 +259,13 @@ public class CardFactoryUtil { * @return a boolean. */ public static boolean isCounterable(final Card c) { - return !(c.hasKeyword("CARDNAME can't be countered.") || c.hasKeyword("This spell can't be countered.")) - && c.getCanCounter(); + if (c.hasKeyword("CARDNAME can't be countered.") || c.hasKeyword("This spell can't be countered.")) { + return false; + } + + final Map repParams = AbilityKey.mapFromAffected(c); + List list = c.getGame().getReplacementHandler().getReplacementList(ReplacementType.Counter, repParams, ReplacementLayer.CantHappen); + return list.isEmpty(); } /** diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 98f6ae8c7ab..f588ba131f1 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -695,7 +695,7 @@ public class CardProperty { List payingMana = castSA.getPayingMana(); // even if the cost was raised, we only care about mana from activation part // since this can only be 1 currently with Protective Sphere, let's just assume it's the first shard spent for easy handling - if (payingMana.isEmpty() || !card.getColor().hasAnyColor(payingMana.get(payingMana.size() - 1).getColor())) { + if (payingMana.isEmpty() || !card.getColor().hasAnyColor(payingMana.get(0).getColor())) { return false; } break; diff --git a/forge-game/src/main/java/forge/game/mana/ManaPool.java b/forge-game/src/main/java/forge/game/mana/ManaPool.java index 631a1949103..910558fd898 100644 --- a/forge-game/src/main/java/forge/game/mana/ManaPool.java +++ b/forge-game/src/main/java/forge/game/mana/ManaPool.java @@ -210,7 +210,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { for (AbilityManaPart mp : saPayment.getAllManaParts()) { for (final Mana mana : mp.getLastManaProduced()) { if (tryPayCostWithMana(saPaidFor, manaCost, mana, false)) { - saPaidFor.getPayingMana().add(0, mana); + saPaidFor.getPayingMana().add(mana); } } } @@ -235,7 +235,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } if (manaFound != null && tryPayCostWithMana(saPaidFor, manaCost, manaFound, false)) { - manaSpentToPay.add(0, manaFound); + manaSpentToPay.add(manaFound); return true; } return false; @@ -300,9 +300,6 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { } public static void refundMana(List manaSpent, Player player, SpellAbility sa) { - if (sa.getHostCard() != null) { - sa.getHostCard().setCanCounter(true); - } player.getManaPool().add(manaSpent); manaSpent.clear(); } @@ -383,7 +380,7 @@ public class ManaPool extends ManaConversionMatrix implements Iterable { final Mana mana = CostPayment.getMana(player, part, sa, cost.getSourceRestriction(), hasConverge ? cost.getColorsPaid() : -1, cost.getXManaCostPaidByColor()); if (mana != null) { if (player.getManaPool().tryPayCostWithMana(sa, cost, mana, test)) { - manaSpentToPay.add(0, mana); + manaSpentToPay.add(mana); } } } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java index 4ce101274cb..fc779815dae 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -227,7 +227,13 @@ public class ReplacementHandler { return ReplacementResult.NotReplaced; } - ReplacementEffect chosenRE = decider.getController().chooseSingleReplacementEffect(Localizer.getInstance().getMessage("lblChooseFirstApplyReplacementEffect"), possibleReplacers); + ReplacementEffect chosenRE; + // "can't" is never a choice + if (layer == ReplacementLayer.CantHappen) { + chosenRE = possibleReplacers.get(0); + } else { + chosenRE = decider.getController().chooseSingleReplacementEffect(Localizer.getInstance().getMessage("lblChooseFirstApplyReplacementEffect"), possibleReplacers); + } possibleReplacers.remove(chosenRE); diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index effcc1535e3..8a5a8ce3120 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -33,11 +33,14 @@ import forge.game.GameActionUtil; import forge.game.IHasSVars; import forge.game.ability.AbilityKey; import forge.game.ability.ApiType; +import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardUtil; import forge.game.mana.Mana; import forge.game.mana.ManaPool; import forge.game.player.Player; +import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementLayer; import forge.game.replacement.ReplacementType; import forge.game.trigger.Trigger; @@ -223,6 +226,32 @@ public class AbilityManaPart implements java.io.Serializable { return source.isValid(cannotCounterSpell, sourceCard.getController(), sourceCard, null); } + public void addNoCounterEffect(SpellAbility saBeingPaid) { + final Game game = sourceCard.getGame(); + final Card eff = new Card(game.nextCardId(), game); + eff.setTimestamp(game.getNextTimestamp()); + eff.setName(sourceCard + "'s Effect"); + eff.setOwner(sourceCard.getController()); + + eff.setImageKey(sourceCard.getImageKey()); + eff.setColor(MagicColor.COLORLESS); + eff.setImmutable(true); + + String cantcounterstr = "Event$ Counter | ValidCard$ Card.IsRemembered | Description$ That spell can't be countered."; + ReplacementEffect re = ReplacementHandler.parseReplacement(cantcounterstr, eff, true); + re.setLayer(ReplacementLayer.CantHappen); + eff.addReplacementEffect(re); + + eff.addRemembered(saBeingPaid.getHostCard()); + + SpellAbilityEffect.addForgetOnMovedTrigger(eff, "Stack"); + + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + game.getAction().moveTo(ZoneType.Command, eff, null, null); + eff.updateStateForView(); + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + } + /** *

* addKeywords. 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 165398f6bfc..be2f2bb8796 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -645,8 +645,8 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit mana.getManaAbility().createETBCounters(host, getActivatingPlayer()); } - if (mana.addsNoCounterMagic(this) && host != null) { - host.setCanCounter(false); + if (mana.addsNoCounterMagic(this)) { + mana.getManaAbility().addNoCounterEffect(this); } if (isSpell() && host != null) { diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index 498a3e2c8bf..6c23fad580a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -219,9 +219,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { cp = CardUtil.getLKICopy(c); } - if (!cp.isBestowed()) { - cp.animateBestow(!cp.isLKI()); - } + cp.animateBestow(!cp.isLKI()); } } diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 3e200ded840..2dd330f274f 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -572,11 +572,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable manaAction = new Function() { @Override public final Boolean apply(final Byte colorCode) { @@ -113,4 +113,4 @@ public class CField implements ICDoc { public void update() { } -} // End class CField +} diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java index 8d5593ad286..be6f7675197 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java @@ -362,7 +362,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { } if (restrictionsMet) { - player.getManaPool().payManaFromAbility(saPaidFor, InputPayMana.this.manaCost, chosen); + player.getManaPool().payManaFromAbility(saPaidFor, manaCost, chosen); } onManaAbilityPaid(); } diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index bbe5cf80488..40a0e80cba8 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -193,7 +193,7 @@ public class HumanPlaySpellAbility { if (isFree || payment.isFullyPaid()) { //track when planeswalker ultimates are activated - ability.getActivatingPlayer().getAchievementTracker().onSpellAbilityPlayed(ability); + human.getAchievementTracker().onSpellAbilityPlayed(ability); if (skipStack) { AbilityUtils.resolve(ability);