From 51e231a08e32d1e59776dee17083fee0121c658c Mon Sep 17 00:00:00 2001 From: Hanmac Date: Sat, 7 Sep 2019 17:36:55 +0200 Subject: [PATCH] CanBlockAdditional: moved to CardView for better display --- .../game/ability/effects/PumpEffect.java | 24 ++++++++++++++- .../src/main/java/forge/game/card/Card.java | 26 ++++++++-------- .../main/java/forge/game/card/CardView.java | 30 +++++++++++++++++++ .../forge/trackable/TrackableProperty.java | 2 ++ 4 files changed, 68 insertions(+), 14 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index e9c8012375d..1c89e3a66ff 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -203,7 +203,12 @@ public class PumpEffect extends SpellAbilityEffect { final int atk = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumAtt"), sa, true); final int def = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDef"), sa, true); - sb.append("gains "); + boolean gains = sa.hasParam("NumAtt") || sa.hasParam("NumDef") || !keywords.isEmpty(); + + if (gains) { + sb.append("gains "); + } + if (sa.hasParam("NumAtt") || sa.hasParam("NumDef")) { if (atk >= 0) { sb.append("+"); @@ -221,8 +226,25 @@ public class PumpEffect extends SpellAbilityEffect { sb.append(keywords.get(i)).append(" "); } + if (sa.hasParam("CanBlockAny")) { + if (gains) { + sb.append(" and "); + } + sb.append("can block any number of creatures "); + } else if (sa.hasParam("CanBlockAmount")) { + if (gains) { + sb.append(" and "); + } + String n = sa.getParam("CanBlockAmount"); + sb.append("can block an additional "); + sb.append("1".equals(n) ? "creature" : Lang.nounWithNumeral(n, "creature")); + sb.append(" each combat "); + } + if (!sa.hasParam("Permanent")) { sb.append("until end of turn."); + } else { + sb.append("."); } } 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 b62d6ab0312..9a10954b1f2 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2048,16 +2048,6 @@ public class Card extends GameEntity implements Comparable { sb.append("\r\n"); } - // maybe move to CardView for better output - if (canBlockAny()) { - sb.append("CARDNAME can block any number of creatures."); - sb.append("\r\n"); - } else if (!canBlockAdditional.isEmpty()){ - sb.append("CARDNAME can block an additional "); - sb.append(Lang.nounWithNumeral(canBlockAdditional(), "creature")); - sb.append(" creatures each combat."); - sb.append("\r\n"); - } // replace triple line feeds with double line feeds int start; final String s = "\r\n\r\n\r\n"; @@ -6243,12 +6233,17 @@ public class Card extends GameEntity implements Comparable { return; } canBlockAdditional.put(timestamp, n); + getView().updateBlockAdditional(this); } public boolean removeCanBlockAdditional(long timestamp) { - return canBlockAdditional.remove(timestamp) != null; + boolean result = canBlockAdditional.remove(timestamp) != null; + if (result) { + getView().updateBlockAdditional(this); + } + return result; } - + public int canBlockAdditional() { int result = 0; for (Integer v : canBlockAdditional.values()) { @@ -6259,10 +6254,15 @@ public class Card extends GameEntity implements Comparable { public void addCanBlockAny(long timestamp) { canBlockAny.add(timestamp); + getView().updateBlockAdditional(this); } public boolean removeCanBlockAny(long timestamp) { - return canBlockAny.remove(timestamp); + boolean result = canBlockAny.remove(timestamp); + if (result) { + getView().updateBlockAdditional(this); + } + return result; } public boolean canBlockAny() { diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 9636e19ff5a..732cb4374a8 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -18,6 +18,7 @@ import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; import forge.trackable.Tracker; +import forge.util.Lang; import forge.util.collect.FCollectionView; import org.apache.commons.lang3.StringUtils; @@ -608,6 +609,22 @@ public class CardView extends GameEntityView { sb.append("\r\n"); } + if (getCanBlockAny()) { + sb.append("\r\n\r\n"); + sb.append("CARDNAME can block any number of creatures.".replaceAll("CARDNAME", getName())); + sb.append("\r\n"); + } else { + int i = getBlockAdditional(); + if (i > 0) { + sb.append("\r\n\r\n"); + sb.append("CARDNAME can block an additional ".replaceAll("CARDNAME", getName())); + sb.append(i == 1 ? "creature" : Lang.nounWithNumeral(i, "creature")); + sb.append(" each combat."); + sb.append("\r\n"); + } + + } + String cloner = get(TrackableProperty.Cloner); if (!cloner.isEmpty()) { sb.append("\r\nCloned by: ").append(cloner); @@ -712,6 +729,19 @@ public class CardView extends GameEntityView { set(TrackableProperty.HiddenId, hiddenId); } + int getBlockAdditional() { + return get(TrackableProperty.BlockAdditional); + } + + boolean getCanBlockAny() { + return get(TrackableProperty.BlockAny); + } + + void updateBlockAdditional(Card c) { + set(TrackableProperty.BlockAdditional, c.canBlockAdditional()); + set(TrackableProperty.BlockAny, c.canBlockAny()); + } + @Override public String toString() { String name = getName(); diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 47b975554f9..1f446791f85 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -88,6 +88,8 @@ public enum TrackableProperty { HasTrample(TrackableTypes.BooleanType), YouMayLook(TrackableTypes.BooleanType), OpponentMayLook(TrackableTypes.BooleanType), + BlockAdditional(TrackableTypes.IntegerType), + BlockAny(TrackableTypes.BooleanType), AbilityText(TrackableTypes.StringType), NonAbilityText(TrackableTypes.StringType), FoilIndex(TrackableTypes.IntegerType),