From f3729d005977f701c6906a88e97037ea617b517b Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Mon, 13 Apr 2020 11:57:43 +0000 Subject: [PATCH 1/3] SpellAbility: fix MaxTotalTargetCMC --- .../forge/game/spellability/SpellAbility.java | 12 +++++++-- .../forge/match/input/InputSelectTargets.java | 26 ++++++++++++++----- 2 files changed, 30 insertions(+), 8 deletions(-) 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 9680f81d482..256bbf07a3a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -32,6 +32,7 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardDamageMap; import forge.game.card.CardFactory; +import forge.game.card.CardPredicates; import forge.game.card.CardZoneTable; import forge.game.cost.Cost; import forge.game.cost.CostPart; @@ -46,6 +47,7 @@ import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.trigger.WrappedAbility; import forge.game.zone.ZoneType; +import forge.util.Aggregates; import forge.util.Expressions; import forge.util.TextUtil; import org.apache.commons.lang3.StringUtils; @@ -1099,8 +1101,14 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } if (hasParam("MaxTotalTargetCMC") && entity instanceof Card) { - final Card c = (Card) entity; - if (c.getCMC() > tr.getMaxTotalCMC(c, this)) { + int soFar = Aggregates.sum(getTargets().getTargetCards(), CardPredicates.Accessors.fnGetCmc); + // only add if it isn't already targeting + if (!isTargeting(entity)) { + final Card c = (Card) entity; + soFar += c.getCMC(); + } + + if (soFar > tr.getMaxTotalCMC(getHostCard(), this)) { return false; } } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java index 547b185b681..e6ba852fce2 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java @@ -6,6 +6,7 @@ import forge.game.GameEntity; import forge.game.GameObject; import forge.game.ability.ApiType; import forge.game.card.Card; +import forge.game.card.CardPredicates; import forge.game.card.CardView; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -16,6 +17,7 @@ import forge.player.PlayerZoneUpdate; import forge.player.PlayerZoneUpdates; import forge.properties.ForgeConstants; import forge.properties.ForgePreferences; +import forge.util.Aggregates; import forge.util.ITriggerEvent; import forge.util.TextUtil; @@ -148,6 +150,9 @@ public final class InputSelectTargets extends InputSyncronizedBase { return false; } + // TODO should use sa.canTarget(card) instead? + // it doesn't have messages + //If the card is not a valid target if (!card.canBeTargetedBy(sa)) { showMessage(sa.getHostCard() + " - Cannot target this card (Shroud? Protection? Restrictions)."); @@ -170,6 +175,20 @@ public final class InputSelectTargets extends InputSyncronizedBase { return false; } + if (sa.hasParam("MaxTotalTargetCMC")) { + int maxTotalCMC = tgt.getMaxTotalCMC(sa.getHostCard(), sa); + if (maxTotalCMC > 0) { + int soFar = Aggregates.sum(sa.getTargets().getTargetCards(), CardPredicates.Accessors.fnGetCmc); + if (!sa.isTargeting(card)) { + soFar += card.getCMC(); + } + if (soFar > maxTotalCMC) { + showMessage(sa.getHostCard() + " - Cannot target this card (CMC limit exceeded)"); + return false; + } + } + } + // If all cards must have different controllers if (tgt.isDifferentControllers()) { final List targetedControllers = new ArrayList<>(); @@ -186,12 +205,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { } if (!choices.contains(card)) { - if (card.isPlaneswalker() && sa.getApi() == ApiType.DealDamage) { - showMessage(sa.getHostCard() + " - To deal an opposing Planeswalker direct damage, target its controller and then redirect the damage on resolution."); - } - else { - showMessage(sa.getHostCard() + " - The selected card is not a valid choice to be targeted."); - } + showMessage(sa.getHostCard() + " - The selected card is not a valid choice to be targeted."); return false; } From d1cc5472398e4a3332f93e43263b5e955329a576 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 13 Apr 2020 12:51:23 +0000 Subject: [PATCH 2/3] Update ImageKeys.java to support .full images first art variant renaming optional --- forge-core/src/main/java/forge/ImageKeys.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index f2b976f3008..986535b0ea8 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -116,9 +116,12 @@ public final class ImageKeys { String fullborderFile = TextUtil.fastReplace(filename, ".full", ".fullborder"); file = findFile(dir, fullborderFile); if (file != null) { return file; } - // if there's an art variant try without it + // if there's a 1st art variant try without it for .fullborder images file = findFile(dir, TextUtil.fastReplace(fullborderFile, "1.fullborder", ".fullborder")); if (file != null) { return file; } + // if there's a 1st art variant try without it for .full images + file = findFile(dir, TextUtil.fastReplace(fullborderFile, "1.full", ".full")); + if (file != null) { return file; } } //if an image, like phenomenon or planes is missing .full in their filenames but you have an existing images that have .full/.fullborder if (!filename.contains(".full")) { From 5649ac6d7d2941ecb3351da3f59b0a781b5fbde1 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Mon, 13 Apr 2020 12:55:13 +0000 Subject: [PATCH 3/3] Update ImageKeys.java --- forge-core/src/main/java/forge/ImageKeys.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index 986535b0ea8..37b1ba34128 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -120,7 +120,7 @@ public final class ImageKeys { file = findFile(dir, TextUtil.fastReplace(fullborderFile, "1.fullborder", ".fullborder")); if (file != null) { return file; } // if there's a 1st art variant try without it for .full images - file = findFile(dir, TextUtil.fastReplace(fullborderFile, "1.full", ".full")); + file = findFile(dir, TextUtil.fastReplace(filename, "1.full", ".full")); if (file != null) { return file; } } //if an image, like phenomenon or planes is missing .full in their filenames but you have an existing images that have .full/.fullborder