From 286f84c861d380b445b2424f6edb9cc708511de0 Mon Sep 17 00:00:00 2001 From: cg5 Date: Sat, 17 Sep 2016 00:27:46 +0200 Subject: [PATCH 1/4] Add 3 red cards --- .../sets/kaladesh/IncendiarySabotage.java | 65 +++++++++++++++ .../sets/kaladesh/InventorsApprentice.java | 73 +++++++++++++++++ .../src/mage/sets/kaladesh/LathnuHellion.java | 79 +++++++++++++++++++ 3 files changed, 217 insertions(+) create mode 100644 Mage.Sets/src/mage/sets/kaladesh/IncendiarySabotage.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/InventorsApprentice.java create mode 100644 Mage.Sets/src/mage/sets/kaladesh/LathnuHellion.java diff --git a/Mage.Sets/src/mage/sets/kaladesh/IncendiarySabotage.java b/Mage.Sets/src/mage/sets/kaladesh/IncendiarySabotage.java new file mode 100644 index 00000000000..311d025cdcf --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/IncendiarySabotage.java @@ -0,0 +1,65 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.abilities.costs.common.SacrificeTargetCost; +import mage.abilities.effects.common.DamageAllEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.filter.common.FilterControlledArtifactPermanent; +import mage.filter.common.FilterCreaturePermanent; +import mage.target.common.TargetControlledPermanent; + +/** + * + * @author cg5 + */ +public class IncendiarySabotage extends CardImpl { + + public IncendiarySabotage(UUID ownerId) { + super(ownerId, 119, "Incendiary Sabotage", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{2}{R}{R}"); + this.expansionSetCode = "KLD"; + + // As an additional cost to cast Incendiary Sabotage, sacrifice an artifact. + this.getSpellAbility().addCost(new SacrificeTargetCost(new TargetControlledPermanent(new FilterControlledArtifactPermanent("an artifact")))); + + // Incendiary Sabotage deals 3 damage to each creature. + this.getSpellAbility().addEffect(new DamageAllEffect(3, new FilterCreaturePermanent())); + } + + public IncendiarySabotage(final IncendiarySabotage card) { + super(card); + } + + @Override + public IncendiarySabotage copy() { + return new IncendiarySabotage(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/InventorsApprentice.java b/Mage.Sets/src/mage/sets/kaladesh/InventorsApprentice.java new file mode 100644 index 00000000000..419637507fb --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/InventorsApprentice.java @@ -0,0 +1,73 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.SimpleStaticAbility; +import mage.abilities.condition.common.PermanentsOnTheBattlefieldCondition; +import mage.abilities.decorator.ConditionalContinuousEffect; +import mage.abilities.effects.common.continuous.BoostSourceEffect; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Duration; +import mage.constants.Rarity; +import mage.constants.Zone; +import mage.filter.common.FilterControlledArtifactPermanent; + +/** + * + * @author cg5 + */ +public class InventorsApprentice extends CardImpl { + + private static final String rule = "{this} gets +1/+1 as long as you control an artifact"; + + public InventorsApprentice(UUID ownerId) { + super(ownerId, 120, "Inventor's Apprentice", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Human"); + this.subtype.add("Artificer"); + this.power = new MageInt(1); + this.toughness = new MageInt(2); + + // Inventor's Apprentice gets +1/+1 as long as you control an artifact. + this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, + new ConditionalContinuousEffect(new BoostSourceEffect(1, 1, Duration.WhileOnBattlefield), + new PermanentsOnTheBattlefieldCondition(new FilterControlledArtifactPermanent()), rule))); + } + + public InventorsApprentice(final InventorsApprentice card) { + super(card); + } + + @Override + public InventorsApprentice copy() { + return new InventorsApprentice(this); + } +} diff --git a/Mage.Sets/src/mage/sets/kaladesh/LathnuHellion.java b/Mage.Sets/src/mage/sets/kaladesh/LathnuHellion.java new file mode 100644 index 00000000000..14677abfa86 --- /dev/null +++ b/Mage.Sets/src/mage/sets/kaladesh/LathnuHellion.java @@ -0,0 +1,79 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package mage.sets.kaladesh; + +import java.util.UUID; +import mage.MageInt; +import mage.abilities.common.BeginningOfEndStepTriggeredAbility; +import mage.abilities.common.EntersBattlefieldTriggeredAbility; +import mage.abilities.costs.Cost; +import mage.abilities.costs.common.PayEnergyCost; +import mage.abilities.effects.Effect; +import mage.abilities.effects.common.SacrificeSourceUnlessPaysEffect; +import mage.abilities.effects.common.counter.GetEnergyCountersControllerEffect; +import mage.abilities.keyword.HasteAbility; +import mage.cards.CardImpl; +import mage.constants.CardType; +import mage.constants.Rarity; +import mage.constants.TargetController; + +/** + * + * @author cg5 + */ +public class LathnuHellion extends CardImpl { + + public LathnuHellion(UUID ownerId) { + super(ownerId, 121, "Lathnu Hellion", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{2}{R}"); + this.expansionSetCode = "KLD"; + this.subtype.add("Hellion"); + this.power = new MageInt(4); + this.toughness = new MageInt(4); + + // Haste + this.addAbility(HasteAbility.getInstance()); + + // When Lathnu Hellion enters the battlefield, you get {E}{E}. + this.addAbility(new EntersBattlefieldTriggeredAbility(new GetEnergyCountersControllerEffect(2))); + + // At the beginning of your end step, sacrifice Lathnu Hellion unless you pay {E}{E}. + Cost cost = new PayEnergyCost(2); + cost.setText("{E}{E}"); + Effect effect = new SacrificeSourceUnlessPaysEffect(cost); + this.addAbility(new BeginningOfEndStepTriggeredAbility(effect, TargetController.YOU, false)); + } + + public LathnuHellion(final LathnuHellion card) { + super(card); + } + + @Override + public LathnuHellion copy() { + return new LathnuHellion(this); + } +} From 274bdfa33f1523ccee0ad2d6cd916f04266b4c4b Mon Sep 17 00:00:00 2001 From: Mark Langen Date: Fri, 16 Sep 2016 14:28:02 -0600 Subject: [PATCH 2/4] Fix Issue #2277 * Changes the white color used to a brighter white so that it shows up on the gray background. --- Mage/src/main/java/mage/util/GameLog.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage/src/main/java/mage/util/GameLog.java b/Mage/src/main/java/mage/util/GameLog.java index 06e7495e788..86345f481e0 100644 --- a/Mage/src/main/java/mage/util/GameLog.java +++ b/Mage/src/main/java/mage/util/GameLog.java @@ -52,7 +52,7 @@ public class GameLog { static final String LOG_TT_COLOR_GREEN = "Green"; // LightGreen static final String LOG_TT_COLOR_BLUE = "Blue"; static final String LOG_TT_COLOR_BLACK = "Black"; - static final String LOG_TT_COLOR_WHITE = "#CCDB00"; + static final String LOG_TT_COLOR_WHITE = "#FDFFE6"; static final String LOG_TT_COLOR_MULTI = "#FFAC40"; static final String LOG_TT_COLOR_COLORLESS = "#94A4BA"; static final String LOG_COLOR_NEUTRAL = "#F0F8FF"; // AliceBlue From 28c04e2009615eea7bf3199523b123650b3f26fa Mon Sep 17 00:00:00 2001 From: Mark Langen Date: Fri, 16 Sep 2016 14:29:55 -0600 Subject: [PATCH 3/4] Fix cards still not showing selectable highlight in some cases * Simply invalidating the image render is not enough, a repaint call is also needed in a few cases where a repaint hadn't already been scheduled by the same change that trigged the selectable/chosen status change. --- .../main/java/org/mage/card/arcane/CardPanelRenderImpl.java | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java index 11b6599972b..f22fc7d1127 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardPanelRenderImpl.java @@ -398,8 +398,9 @@ public class CardPanelRenderImpl extends CardPanel { public void setSelected(boolean selected) { if (selected != isSelected()) { super.setSelected(selected); - // Invalidate our render + // Invalidate our render and trigger a repaint cardImage = null; + repaint(); } } @@ -407,8 +408,9 @@ public class CardPanelRenderImpl extends CardPanel { public void setChoosable(boolean choosable) { if (choosable != isChoosable()) { super.setChoosable(choosable); - // Invalidate our render + // Invalidate our render and trigger a repaint cardImage = null; + repaint(); } } From 7feb237c069872c8eb1458beccef8d1aa13b5c52 Mon Sep 17 00:00:00 2001 From: Mark Langen Date: Fri, 16 Sep 2016 16:38:45 -0600 Subject: [PATCH 4/4] Fixed card stacking offset in Editor / Library / etc. * Rather than respecting the spacing setting from Preferences, the spacing is now calculated from the card size if characteristic based rendering is enabled, since from the renderer we know exactly what spacing is actually needed. --- .../java/mage/client/util/GUISizeHelper.java | 19 +++++++++--- .../org/mage/card/arcane/CardRenderer.java | 29 +++++++++++++++++-- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/Mage.Client/src/main/java/mage/client/util/GUISizeHelper.java b/Mage.Client/src/main/java/mage/client/util/GUISizeHelper.java index 9dccd138897..885d6daca90 100644 --- a/Mage.Client/src/main/java/mage/client/util/GUISizeHelper.java +++ b/Mage.Client/src/main/java/mage/client/util/GUISizeHelper.java @@ -13,6 +13,9 @@ import javax.swing.JMenuItem; import javax.swing.JPopupMenu; import mage.client.MageFrame; import mage.client.dialog.PreferencesDialog; +import mage.sets.avacynrestored.GuiseOfFire; +import org.apache.log4j.Logger; +import org.mage.card.arcane.CardRenderer; /** * @@ -140,10 +143,14 @@ public class GUISizeHelper { int otherZonesCardSize = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GUI_CARD_OTHER_ZONES_SIZE, 14); otherZonesCardDimension = new Dimension(CARD_IMAGE_WIDTH * otherZonesCardSize / 42, CARD_IMAGE_HEIGHT * otherZonesCardSize / 42); - if (otherZonesCardSize > 29) { - otherZonesCardVerticalOffset = otherZonesCardDimension.height / 8; + if (PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_RENDERING_FALLBACK, "false").equals("false")) { + otherZonesCardVerticalOffset = CardRenderer.getCardTopHeight(otherZonesCardDimension.width); } else { - otherZonesCardVerticalOffset = otherZonesCardDimension.height / 10; + if (otherZonesCardSize > 29) { + otherZonesCardVerticalOffset = otherZonesCardDimension.height / 8; + } else { + otherZonesCardVerticalOffset = otherZonesCardDimension.height / 10; + } } int battlefieldCardMinSize = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GUI_CARD_BATTLEFIELD_MIN_SIZE, 10); @@ -153,7 +160,11 @@ public class GUISizeHelper { int editorCardSize = PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GUI_CARD_EDITOR_SIZE, 14); editorCardDimension = new Dimension(CARD_IMAGE_WIDTH * editorCardSize / 42, CARD_IMAGE_HEIGHT * editorCardSize / 42); - editorCardOffsetSize = 2 * PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GUI_CARD_OFFSET_SIZE, 14) - 10; + if (PreferencesDialog.getCachedValue(PreferencesDialog.KEY_CARD_RENDERING_FALLBACK, "false").equals("false")) { + editorCardOffsetSize = CardRenderer.getCardTopHeight(editorCardDimension.width); + } else { + editorCardOffsetSize = 2 * PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GUI_CARD_OFFSET_SIZE, 14) - 10; + } enlargedImageHeight = 25 * PreferencesDialog.getCachedValue(PreferencesDialog.KEY_GUI_ENLARGED_IMAGE_SIZE, 20); } diff --git a/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java b/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java index 3236c785957..3e29d6f30ce 100644 --- a/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java +++ b/Mage.Client/src/main/java/org/mage/card/arcane/CardRenderer.java @@ -149,6 +149,12 @@ public abstract class CardRenderer { } } + private static int getBorderWidth(int cardWidth) { + return (int) Math.max( + BORDER_WIDTH_MIN, + BORDER_WIDTH_FRAC * cardWidth); + } + // Layout operation // Calculate common layout metrics that will be used by several // of the operations in the template method. @@ -162,9 +168,26 @@ public abstract class CardRenderer { CORNER_RADIUS_MIN, CORNER_RADIUS_FRAC * cardWidth); - borderWidth = (int) Math.max( - BORDER_WIDTH_MIN, - BORDER_WIDTH_FRAC * cardWidth); + borderWidth = getBorderWidth(cardWidth); + } + + /** + * How far does a card have to be spaced down from + * a rendered card to show it's entire name line? + * This function is a bit of a hack, as different card faces need + * slightly different spacing, but we need it in a static context + * so that spacing is consistent in GY / deck views etc. + * @return + */ + public static int getCardTopHeight(int cardWidth) { + // Constants copied over from ModernCardRenderer and tweaked + float BOX_HEIGHT_FRAC = 0.065f; // x cardHeight + int BOX_HEIGHT_MIN = 16; + int boxHeight = (int) Math.max( + BOX_HEIGHT_MIN, + BOX_HEIGHT_FRAC * cardWidth * 1.4f); + int borderWidth = getBorderWidth(cardWidth); + return 2*borderWidth + boxHeight; } // The Draw Method