From b52e526c0f3c86ed215c557de20b33404a1f6e84 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Thu, 24 Jul 2014 12:18:20 +0400 Subject: [PATCH 1/4] Fixed Issue#454: offset for enchanted permanents --- .../main/java/org/mage/card/arcane/CardPanel.java | 14 ++------------ .../java/org/mage/plugins/card/CardPluginImpl.java | 8 ++++---- 2 files changed, 6 insertions(+), 16 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java index 9f58408671d..ec171577bab 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanel.java @@ -9,6 +9,7 @@ import mage.client.plugins.adapters.MageActionCallback; import mage.client.plugins.impl.Plugins; import mage.client.util.audio.AudioManager; import mage.components.ImagePanel; +import mage.constants.AbilityType; import mage.constants.CardType; import mage.constants.EnlargeMode; import mage.utils.CardUtil; @@ -31,8 +32,6 @@ import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.UUID; -import mage.constants.AbilityType; -import mage.constants.MageObjectType; /** * Main class for drawing Mage card object. @@ -310,16 +309,7 @@ public class CardPanel extends MagePermanent implements MouseListener, MouseMoti } private void setText(CardView card) { - if (displayTitleAnyway) { - titleText.setText(card.getName()); - return; - } - - if (hasImage) { - titleText.setText(""); - } else { - titleText.setText(card.getName()); - } + titleText.setText(!displayTitleAnyway && hasImage ? "" : card.getName()); } private void setImage(Image srcImage) { diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java index 356c5498601..e56a9bfa920 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java @@ -47,14 +47,13 @@ public class CardPluginImpl implements CardPlugin { private static final Logger log = Logger.getLogger(CardPluginImpl.class); - private static final int ATTACHMENT_DY_OFFSET = 10; - private static final int GUTTER_Y = 15; private static final int GUTTER_X = 5; static final float EXTRA_CARD_SPACING_X = 0.04f; private static final float CARD_SPACING_Y = 0.03f; private static final float STACK_SPACING_X = 0.07f; private static final float STACK_SPACING_Y = 0.13f; + private static final float ATTACHMENT_SPACING_Y = 0.13f; private int landStackMax = 5; private int cardWidthMin = 50, cardWidthMax = Constants.CARD_SIZE_FULL.width; @@ -63,7 +62,7 @@ public class CardPluginImpl implements CardPlugin { private int playAreaWidth, playAreaHeight; private int cardWidth, cardHeight; private int extraCardSpacingX, cardSpacingX, cardSpacingY; - private int stackSpacingX, stackSpacingY; + private int stackSpacingX, stackSpacingY, attachmentSpacingY; private List rows = new ArrayList<>(); @Init @@ -185,6 +184,7 @@ public class CardPluginImpl implements CardPlugin { cardSpacingY = Math.round(cardHeight * CARD_SPACING_Y); stackSpacingX = stackVertical ? 0 : Math.round(cardWidth * STACK_SPACING_X); stackSpacingY = Math.round(cardHeight * STACK_SPACING_Y); + attachmentSpacingY = Math.round(cardHeight * ATTACHMENT_SPACING_Y); Row creatures = (Row) allCreatures.clone(); Row lands = (Row) allLands.clone(); Row others = (Row) allOthers.clone(); @@ -449,7 +449,7 @@ public class CardPluginImpl implements CardPlugin { } private int getHeight() { - return cardHeight + (size() - 1) * stackSpacingY + cardSpacingY + ATTACHMENT_DY_OFFSET*maxAttachedCount; + return cardHeight + (size() - 1) * stackSpacingY + cardSpacingY + attachmentSpacingY*maxAttachedCount; } public int getMaxAttachedCount() { From 1caaad831e9a984d29bc031ecee66c7e0b481a3a Mon Sep 17 00:00:00 2001 From: magenoxx Date: Thu, 24 Jul 2014 13:21:52 +0400 Subject: [PATCH 2/4] Issue#467: usable activated ability in hand now also displayed yellow (e.g. Cycling) --- Mage/src/mage/players/PlayerImpl.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Mage/src/mage/players/PlayerImpl.java b/Mage/src/mage/players/PlayerImpl.java index d86091bf859..aea62a101c7 100644 --- a/Mage/src/mage/players/PlayerImpl.java +++ b/Mage/src/mage/players/PlayerImpl.java @@ -1995,6 +1995,12 @@ public abstract class PlayerImpl implements Player, Serializable { break; } } + for (ActivatedAbility ability : card.getAbilities().getActivatedAbilities(Zone.HAND)) { + if (!playable.contains(ability) && canPlay(ability, available, game)) { + playable.add(card.getId()); + break; + } + } } } } From de71d9b1947aa3138f586d45935345d24f607d2c Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 24 Jul 2014 16:30:58 +0200 Subject: [PATCH 3/4] * Burrenton Forge-Tender - Fixed that damage prevention did not work for sources that were stack objects. This was a common problem of TargetSource class. --- .../common/PreventDamageByTargetEffect.java | 3 +++ Mage/src/mage/target/TargetImpl.java | 7 ++--- Mage/src/mage/target/TargetSource.java | 27 ++++++++++--------- 3 files changed, 21 insertions(+), 16 deletions(-) diff --git a/Mage/src/mage/abilities/effects/common/PreventDamageByTargetEffect.java b/Mage/src/mage/abilities/effects/common/PreventDamageByTargetEffect.java index 8f8547b7cfd..7552f393ea9 100644 --- a/Mage/src/mage/abilities/effects/common/PreventDamageByTargetEffect.java +++ b/Mage/src/mage/abilities/effects/common/PreventDamageByTargetEffect.java @@ -68,6 +68,9 @@ public class PreventDamageByTargetEffect extends PreventionEffectImpl { @Override public boolean applies(GameEvent event, Ability source, Game game) { if (!this.used && super.applies(event, source, game)) { + if (!game.getState().getStack().isEmpty()) { + + } return this.getTargetPointer().getTargets(game, source).contains(event.getSourceId()); } return false; diff --git a/Mage/src/mage/target/TargetImpl.java b/Mage/src/mage/target/TargetImpl.java index 785a8aa538b..8c32a57a897 100644 --- a/Mage/src/mage/target/TargetImpl.java +++ b/Mage/src/mage/target/TargetImpl.java @@ -83,6 +83,7 @@ public abstract class TargetImpl implements Target { this.targets.putAll(target.targets); this.zoneChangeCounters.putAll(target.zoneChangeCounters); this.atRandom = target.atRandom; + this.notTarget = target.notTarget; } @Override @@ -228,7 +229,7 @@ public abstract class TargetImpl implements Target { if (maxNumberOfTargets == 0 || targets.size() < maxNumberOfTargets) { if (!targets.containsKey(id)) { if (source != null) { - if (!game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getSourceId(), source.getControllerId()))) { + if (!skipEvent && !game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getSourceId(), source.getControllerId()))) { targets.put(id, 0); rememberZoneChangeCounter(id, game); chosen = targets.size() >= minNumberOfTargets; @@ -267,7 +268,7 @@ public abstract class TargetImpl implements Target { amount += targets.get(id); } if (source != null) { - if (!game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getId(), source.getControllerId()))) { + if (!skipEvent && !game.replaceEvent(GameEvent.getEvent(EventType.TARGET, id, source.getId(), source.getControllerId()))) { targets.put(id, amount); rememberZoneChangeCounter(id, game); chosen = targets.size() >= minNumberOfTargets; @@ -337,7 +338,7 @@ public abstract class TargetImpl implements Target { continue; // it's not legal so continue to have a look at other targeted objects } } - if (game.replaceEvent(GameEvent.getEvent(EventType.TARGET, targetId, source.getId(), source.getControllerId()))) { + if (!notTarget && game.replaceEvent(GameEvent.getEvent(EventType.TARGET, targetId, source.getId(), source.getControllerId()))) { replacedTargets++; continue; } diff --git a/Mage/src/mage/target/TargetSource.java b/Mage/src/mage/target/TargetSource.java index d33b526edeb..53cee0231b2 100644 --- a/Mage/src/mage/target/TargetSource.java +++ b/Mage/src/mage/target/TargetSource.java @@ -63,17 +63,14 @@ public class TargetSource extends TargetObject { } public TargetSource(int minNumTargets, int maxNumTargets, FilterObject filter) { - this.minNumberOfTargets = minNumTargets; - this.maxNumberOfTargets = maxNumTargets; - this.zone = Zone.ALL; + super(minNumTargets, maxNumTargets, Zone.ALL, true); this.filter = filter; - this.targetName = filter.getMessage(); + this.targetName = filter.getMessage(); } public TargetSource(final TargetSource target) { super(target); this.filter = target.filter.copy(); - setNotTarget(true); } @Override @@ -83,17 +80,21 @@ public class TargetSource extends TargetObject { @Override public void add(UUID id, Game game) { + addTarget(id, null, game); + } + + @Override + public void addTarget(UUID id, Ability source, Game game) { if (targets.size() < maxNumberOfTargets) { - if (!targets.containsKey(id)) { - MageObject object = game.getObject(id); - if (object != null && object instanceof StackObject) { - targets.put(((StackObject) object).getSourceId(), 0); - } - else { - targets.put(id, 0); - } + MageObject object = game.getObject(id); + if (object != null && object instanceof StackObject) { + addTarget(((StackObject) object).getSourceId(), source, game, notTarget); + } + else { + addTarget(id, source, game, notTarget); } } + } @Override From 5f1d92131fdb415b9a0aaa089e204af6d74913d6 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Thu, 24 Jul 2014 17:39:35 +0200 Subject: [PATCH 4/4] * Cursed Scroll - Fixed target and damge handling. --- .../src/mage/sets/tempest/CursedScroll.java | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/Mage.Sets/src/mage/sets/tempest/CursedScroll.java b/Mage.Sets/src/mage/sets/tempest/CursedScroll.java index b0c238e6619..e3a7e59528e 100644 --- a/Mage.Sets/src/mage/sets/tempest/CursedScroll.java +++ b/Mage.Sets/src/mage/sets/tempest/CursedScroll.java @@ -64,6 +64,7 @@ public class CursedScroll extends CardImpl { // {3}, {tap}: Name a card. Reveal a card at random from your hand. If it's the named card, Cursed Scroll deals 2 damage to target creature or player. Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new CursedScrollEffect(), new ManaCostsImpl("{3}")); ability.addCost(new TapSourceCost()); + ability.addTarget(new TargetCreatureOrPlayer()); this.addAbility(ability); } @@ -99,7 +100,6 @@ class CursedScrollEffect extends OneShotEffect { if (!you.isInGame()) { return false; } - } String cardName = cardChoice.getChoice(); game.informPlayers("Cursed Scroll, named card: [" + cardName + "]"); @@ -109,24 +109,20 @@ class CursedScrollEffect extends OneShotEffect { revealed.add(card); you.revealCards("Cursed Scroll", revealed, game); if (card.getName().equals(cardName)) { - TargetCreatureOrPlayer target = new TargetCreatureOrPlayer(); - if (target.canChoose(you.getId(), game)) { - if (you.chooseTarget(Outcome.Damage, target, source, game)) { - Permanent creature = game.getPermanent(target.getFirstTarget()); - if (creature != null) { - creature.damage(2, source.getSourceId(), game, false, true); - return true; - } - Player player = game.getPlayer(target.getFirstTarget()); - if (player != null) { - player.damage(2, source.getSourceId(), game, true, false); - return true; - } - return false; - } + Permanent creature = game.getPermanent(targetPointer.getFirst(game, source)); + if (creature != null) { + creature.damage(2, source.getSourceId(), game, false, true); + return true; } + Player player = game.getPlayer(targetPointer.getFirst(game, source)); + if (player != null) { + player.damage(2, source.getSourceId(), game, false, true); + return true; + } + return false; } } + return true; } return false; }