From e1a48ef01568858882c3d4e426901e8316eaf22d Mon Sep 17 00:00:00 2001 From: melvinzhang Date: Tue, 29 Dec 2015 18:26:09 +0800 Subject: [PATCH] add support for static effects that increase/decrease mana cost does not work on additional mana costs such as kicker and {X} in cost --- src/magic/model/MagicCardDefinition.java | 7 +++++-- src/magic/model/MagicGame.java | 11 +++++++++++ src/magic/model/MagicManaCost.java | 9 ++++++++- src/magic/model/mstatic/MagicDummyModifier.java | 12 ++++++++++++ src/magic/model/mstatic/MagicLayer.java | 2 ++ src/magic/model/mstatic/MagicModifier.java | 6 ++++++ 6 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/magic/model/MagicCardDefinition.java b/src/magic/model/MagicCardDefinition.java index 6710d3ceb5..cc437e2708 100644 --- a/src/magic/model/MagicCardDefinition.java +++ b/src/magic/model/MagicCardDefinition.java @@ -18,6 +18,7 @@ import magic.model.event.MagicTiming; import magic.model.mstatic.MagicCDA; import magic.model.mstatic.MagicStatic; import magic.model.trigger.MagicTrigger; +import magic.model.trigger.MagicTriggerType; import magic.model.trigger.EntersBattlefieldTrigger; import magic.model.trigger.EntersWithCounterTrigger; import magic.model.trigger.ThisDrawnTrigger; @@ -661,10 +662,12 @@ public class MagicCardDefinition implements MagicAbilityStore, IRenderableCard { public List getCostEvent(final MagicCard source) { final List costEvent = new ArrayList(); - if (cost != MagicManaCost.ZERO) { + final MagicManaCost modCost = source.getGame().modCost(source, cost); + + if (modCost != MagicManaCost.ZERO) { costEvent.add(new MagicPayManaCostEvent( source, - cost + modCost )); } costEvent.addAll(getAdditionalCostEvent(source)); diff --git a/src/magic/model/MagicGame.java b/src/magic/model/MagicGame.java index 8afbb84927..5695dd0b01 100644 --- a/src/magic/model/MagicGame.java +++ b/src/magic/model/MagicGame.java @@ -583,6 +583,17 @@ public class MagicGame { doDelayedActions(); } + public MagicManaCost modCost(final MagicCard card, final MagicManaCost cost) { + MagicManaCost currCost = cost; + for (final MagicPermanentStatic mps : getStatics(MagicLayer.CostIncrease)) { + currCost = mps.getStatic().increaseCost(mps.getPermanent(), card, cost); + } + for (final MagicPermanentStatic mps : getStatics(MagicLayer.CostReduction)) { + currCost = mps.getStatic().reduceCost(mps.getPermanent(), card, cost); + } + return currCost; + } + public void apply(final MagicLayer layer) { switch (layer) { case Game: diff --git a/src/magic/model/MagicManaCost.java b/src/magic/model/MagicManaCost.java index c2e886a97d..49ffc88a52 100644 --- a/src/magic/model/MagicManaCost.java +++ b/src/magic/model/MagicManaCost.java @@ -346,6 +346,13 @@ public class MagicManaCost { final int[] reducedAmounts = Arrays.copyOf(amounts, amounts.length); final int idx = type.ordinal(); reducedAmounts[idx] -= Math.min(amounts[idx], amt); - return MagicManaCost.create(getCanonicalText(reducedAmounts, 0)); + return MagicManaCost.create(getCanonicalText(reducedAmounts, XCount)); + } + + public MagicManaCost increase(final MagicCostManaType type, final int amt) { + final int[] reducedAmounts = Arrays.copyOf(amounts, amounts.length); + final int idx = type.ordinal(); + reducedAmounts[idx] += amt; + return MagicManaCost.create(getCanonicalText(reducedAmounts, XCount)); } } diff --git a/src/magic/model/mstatic/MagicDummyModifier.java b/src/magic/model/mstatic/MagicDummyModifier.java index 7d7919293a..d598c5c5c8 100644 --- a/src/magic/model/mstatic/MagicDummyModifier.java +++ b/src/magic/model/mstatic/MagicDummyModifier.java @@ -4,6 +4,8 @@ import magic.model.MagicAbility; import magic.model.MagicGame; import magic.model.MagicPermanent; import magic.model.MagicPlayer; +import magic.model.MagicCard; +import magic.model.MagicManaCost; import magic.model.MagicPowerToughness; import magic.model.MagicSubType; @@ -50,4 +52,14 @@ public class MagicDummyModifier implements MagicModifier { public void modGame(final MagicPermanent source, final MagicGame game) { //leave game unchanged } + + @Override + public MagicManaCost reduceCost(final MagicPermanent source, final MagicCard card, final MagicManaCost cost) { + return cost; + } + + @Override + public MagicManaCost increaseCost(final MagicPermanent source, final MagicCard card, final MagicManaCost cost) { + return cost; + } } diff --git a/src/magic/model/mstatic/MagicLayer.java b/src/magic/model/mstatic/MagicLayer.java index d0bd5a75ce..6d7ea2dc0e 100644 --- a/src/magic/model/mstatic/MagicLayer.java +++ b/src/magic/model/mstatic/MagicLayer.java @@ -18,5 +18,7 @@ public enum MagicLayer { SwitchPT, //7e. switch p/t Player, //8. affect player, e.g. you have hexproof Game, //9. affect game rules, e.g. modify maximum hand size, creature is Indestructible + CostIncrease, + CostReduction, ; } diff --git a/src/magic/model/mstatic/MagicModifier.java b/src/magic/model/mstatic/MagicModifier.java index 7cf7124de2..693aee890b 100644 --- a/src/magic/model/mstatic/MagicModifier.java +++ b/src/magic/model/mstatic/MagicModifier.java @@ -4,8 +4,10 @@ import magic.model.MagicAbility; import magic.model.MagicGame; import magic.model.MagicPermanent; import magic.model.MagicPlayer; +import magic.model.MagicCard; import magic.model.MagicPowerToughness; import magic.model.MagicSubType; +import magic.model.MagicManaCost; import java.util.Set; @@ -27,4 +29,8 @@ public interface MagicModifier { void modPlayer(final MagicPermanent source, final MagicPlayer player); void modGame(final MagicPermanent source, final MagicGame game); + + MagicManaCost reduceCost(final MagicPermanent source, final MagicCard card, final MagicManaCost cost); + + MagicManaCost increaseCost(final MagicPermanent source, final MagicCard card, final MagicManaCost cost); }