From c8d9006740573ba2b8cef70350236feca059eed0 Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 21 Nov 2012 23:29:27 +0100 Subject: [PATCH] Changes to kicker and multikicker, showing in log if spell was cast with kicker. Changed some effects and abilities to implement some cards. --- Mage/src/mage/abilities/AbilitiesImpl.java | 24 +++++++ .../mage/abilities/ActivatedAbilityImpl.java | 40 ++++++++++- .../common/EntersBattlefieldAbility.java | 46 ++++++++---- .../condition/common/KickedCostCondition.java | 38 ++++++++++ .../abilities/costs/mana/KickerManaCost.java | 9 +++ .../dynamicvalue/common/MultikickerCount.java | 72 +++++++++++++++++++ .../SacrificeCostCreaturesToughness.java | 2 +- .../effects/EntersBattlefieldEffect.java | 14 +++- .../common/ReturnToHandTargetEffect.java | 5 +- .../counter/AddCountersSourceEffect.java | 20 +++++- .../mage/abilities/keyword/KickerAbility.java | 8 ++- .../abilities/keyword/MultikickerAbility.java | 23 ++++-- 12 files changed, 272 insertions(+), 29 deletions(-) create mode 100644 Mage/src/mage/abilities/condition/common/KickedCostCondition.java create mode 100644 Mage/src/mage/abilities/dynamicvalue/common/MultikickerCount.java diff --git a/Mage/src/mage/abilities/AbilitiesImpl.java b/Mage/src/mage/abilities/AbilitiesImpl.java index b557cc3f970..0d0b9d289d4 100644 --- a/Mage/src/mage/abilities/AbilitiesImpl.java +++ b/Mage/src/mage/abilities/AbilitiesImpl.java @@ -41,6 +41,7 @@ import java.util.ArrayList; import java.util.Collections; import java.util.List; import java.util.UUID; +import mage.abilities.costs.mana.KickerManaCost; /** * @@ -76,6 +77,10 @@ public class AbilitiesImpl extends ArrayList implements Ab rules.add(ability.getRule()); } if (ability instanceof SpellAbility) { + String kickerRule = getKickerRule(ability); + if (!kickerRule.isEmpty()) { + rules.add(kickerRule); + } if (ability.getAlternativeCosts().size() > 0) { StringBuilder sbRule = new StringBuilder(); for (AlternativeCost cost: ability.getAlternativeCosts()) { @@ -113,6 +118,25 @@ public class AbilitiesImpl extends ArrayList implements Ab return rules; } + private String getKickerRule(Ability ability) { + StringBuilder sb = new StringBuilder(); + int numberKicker = 0; + for (Object cost : ability.getOptionalCosts()) { + if (cost instanceof KickerManaCost) { + if (numberKicker == 0) { + sb.append(((KickerManaCost)cost).getText(true)); + } else { + sb.append(" and/or ").append(((KickerManaCost)cost).getText(true)); + } + ++numberKicker; + } + } + if (numberKicker > 0) { + return "Kicker " + sb.toString() + " (You may pay an additional " + sb.toString() + " as you cast this spell.)"; + } + return sb.toString(); + } + @Override public Abilities getActivatedAbilities(Zone zone) { Abilities zonedAbilities = new AbilitiesImpl(); diff --git a/Mage/src/mage/abilities/ActivatedAbilityImpl.java b/Mage/src/mage/abilities/ActivatedAbilityImpl.java index 15a832cc2e7..cd2854a2653 100644 --- a/Mage/src/mage/abilities/ActivatedAbilityImpl.java +++ b/Mage/src/mage/abilities/ActivatedAbilityImpl.java @@ -44,6 +44,9 @@ import mage.game.stack.StackAbility; import mage.target.Target; import java.util.UUID; +import mage.abilities.costs.mana.KickerManaCost; +import mage.abilities.keyword.MultikickerAbility; +import mage.game.permanent.Permanent; import mage.game.stack.Spell; /** @@ -172,8 +175,9 @@ public abstract class ActivatedAbilityImpl> ex @Override public String getActivatedMessage(Game game) { - if (game.isSimulation()) + if (game.isSimulation()) { return ""; + } return " activates ability from " + getMessageText(game); } @@ -196,6 +200,7 @@ public abstract class ActivatedAbilityImpl> ex if (spell.getFromZone() == Zone.GRAVEYARD) { sb.append(" from graveyard"); } + sb.append(getKickerText(game, spell)); } else { sb.append(object.getName()); } @@ -212,4 +217,37 @@ public abstract class ActivatedAbilityImpl> ex return sb.toString(); } + String getKickerText(Game game, Spell spell) { + StringBuilder sb = new StringBuilder(); + int numberPaid = 0; + for (Object cost : spell.getSpellAbility().getOptionalCosts()) { + if (cost instanceof KickerManaCost) { + if (((KickerManaCost) cost).isPaid()) { + if (numberPaid == 0) { + sb.append(" with ").append(((KickerManaCost)cost).getText(true)); + } else { + sb.append(" and ").append(((KickerManaCost)cost).getText(true)); + } + ++numberPaid; + } + } + } + if (numberPaid > 0) { + sb.append(" kicker"); + } + // Multikicker + int multikickerCount = 0; + Card card = game.getCard(this.getSourceId()); + if (card != null) { + for (Ability ability : card.getAbilities()) { + if (ability instanceof MultikickerAbility) { + multikickerCount = ((MultikickerAbility)ability).getActivateCount(); + } + } + } + if (multikickerCount > 0) { + sb.append(" with ").append(multikickerCount).append(multikickerCount > 1? " times":" time").append(" multikicker"); + } + return sb.toString(); + } } diff --git a/Mage/src/mage/abilities/common/EntersBattlefieldAbility.java b/Mage/src/mage/abilities/common/EntersBattlefieldAbility.java index a92a6b126ea..7019262a840 100644 --- a/Mage/src/mage/abilities/common/EntersBattlefieldAbility.java +++ b/Mage/src/mage/abilities/common/EntersBattlefieldAbility.java @@ -30,6 +30,7 @@ package mage.abilities.common; import mage.Constants.Zone; import mage.abilities.StaticAbility; +import mage.abilities.condition.Condition; import mage.abilities.effects.Effect; import mage.abilities.effects.EntersBattlefieldEffect; @@ -38,27 +39,43 @@ import mage.abilities.effects.EntersBattlefieldEffect; * @author BetaSteward_at_googlemail.com */ public class EntersBattlefieldAbility extends StaticAbility { - - protected Boolean generateRule; + + protected String abilityRule; + protected Boolean showRule; public EntersBattlefieldAbility(Effect effect) { this(new EntersBattlefieldEffect(effect), true); } - - public EntersBattlefieldAbility(Effect effect, Boolean generateRule) { - super(Zone.BATTLEFIELD, new EntersBattlefieldEffect(effect)); - this.generateRule = generateRule; +/** + * + * @param effect effect that happens when the permanent enters the battlefield + * @param showRule show a rule for this ability + */ + public EntersBattlefieldAbility(Effect effect, Boolean showRule) { + this(effect, null, showRule, null, null); } - public EntersBattlefieldAbility(Effect effect, String rule) { - super(Zone.BATTLEFIELD, new EntersBattlefieldEffect(effect, rule)); - this.generateRule = true; + public EntersBattlefieldAbility(Effect effect, String effectText) { + this(effect, null, true, null, effectText); + } +/** + * + * @param effect effect that happens when the permanent enters the battlefield + * @param condition only if this condition is true, the effect will happen + * @param showRule show a rule for this ability + * @param abilityRule rule for this ability (no text from effects will be added) + * @param effectText this text will be used for the EnterBattlefieldEffect + */ + public EntersBattlefieldAbility(Effect effect, Condition condition, Boolean showRule, String abilityRule, String effectText) { + super(Zone.BATTLEFIELD, new EntersBattlefieldEffect(effect, condition, effectText)); + this.showRule = true; + this.abilityRule = abilityRule; } - public EntersBattlefieldAbility(EntersBattlefieldAbility ability) { super(ability); - this.generateRule = ability.generateRule; + this.showRule = ability.showRule; + this.abilityRule = ability.abilityRule; } @Override @@ -68,10 +85,11 @@ public class EntersBattlefieldAbility extends StaticAbility 0) { return "Return up to " + mode.getTargets().get(0).getMaxNumberOfTargets() +" target " + mode.getTargets().get(0).getTargetName() + " to their owners' hand"; } else { diff --git a/Mage/src/mage/abilities/effects/common/counter/AddCountersSourceEffect.java b/Mage/src/mage/abilities/effects/common/counter/AddCountersSourceEffect.java index f363807c0c7..aab99a2aa33 100644 --- a/Mage/src/mage/abilities/effects/common/counter/AddCountersSourceEffect.java +++ b/Mage/src/mage/abilities/effects/common/counter/AddCountersSourceEffect.java @@ -30,8 +30,9 @@ package mage.abilities.effects.common.counter; import mage.Constants.Outcome; import mage.abilities.Ability; +import mage.abilities.dynamicvalue.DynamicValue; +import mage.abilities.dynamicvalue.common.StaticValue; import mage.abilities.effects.OneShotEffect; -import mage.cards.Card; import mage.counters.Counter; import mage.game.Game; import mage.game.permanent.Permanent; @@ -44,15 +45,27 @@ public class AddCountersSourceEffect extends OneShotEffect { public boolean activate(Game game, boolean noMana) { Player player = game.getPlayer(this.getControllerId()); - String message = "Use kicker - " + getRule() + "?"; + String message = getKickerText(false) + "?"; Card card = game.getCard(sourceId); // replace by card name or just plain "this" String text = card == null ? "this" : card.getName(); @@ -94,8 +94,12 @@ public class KickerAbility extends StaticAbility { @Override public String getRule() { + return getKickerText(true); + } + + public String getKickerText(boolean withRemainder) { StringBuilder sb = new StringBuilder(); - sb.append("Kicker"); + sb.append("Kicker - "); if (manaCosts.size() > 0) { sb.append(manaCosts.getText()); if (costs.size() > 0) diff --git a/Mage/src/mage/abilities/keyword/MultikickerAbility.java b/Mage/src/mage/abilities/keyword/MultikickerAbility.java index baf7d48c32d..7a8ff2b1fd1 100644 --- a/Mage/src/mage/abilities/keyword/MultikickerAbility.java +++ b/Mage/src/mage/abilities/keyword/MultikickerAbility.java @@ -28,6 +28,8 @@ package mage.abilities.keyword; +import mage.abilities.common.EmptyEffect; +import mage.abilities.costs.mana.ManaCosts; import mage.abilities.effects.Effect; import mage.game.Game; @@ -43,6 +45,11 @@ public class MultikickerAbility extends KickerAbility { super(effect, replaces); } + public MultikickerAbility(ManaCosts manaCosts) { + super(new EmptyEffect(""), false); + this.addManaCost(manaCosts); + } + public MultikickerAbility(final MultikickerAbility ability) { super(ability); this.activateCount = ability.activateCount; @@ -77,19 +84,21 @@ public class MultikickerAbility extends KickerAbility { } @Override - public String getRule() { + public String getKickerText(boolean withRemainder) { StringBuilder sb = new StringBuilder(); - sb.append("Multikicker"); + sb.append("Multikicker "); if (manaCosts.size() > 0) { sb.append(manaCosts.getText()); - if (costs.size() > 0) + if (costs.size() > 0) { sb.append(","); + } } - if (costs.size() > 0) + if (costs.size() > 0) { sb.append(costs.getText()); - sb.append(":").append(modes.getText()); - if (replaces) - sb.append(" instead"); + } + if (withRemainder) { + sb.append(" (You may pay an additional ").append(manaCosts.getText()).append(" any number of times as you cast this spell.)"); + } return sb.toString(); }