From fb9e591c17870a6001a9cf10e607e6fe912dc86b Mon Sep 17 00:00:00 2001 From: LevelX2 Date: Wed, 15 Jan 2014 22:48:18 +0100 Subject: [PATCH] [BNG] Added TributeAbility. --- .../common/TributeNotPaidCondition.java | 58 ++++++++ .../ConditionalTriggeredAbility.java | 4 +- .../abilities/keyword/TributeAbility.java | 130 ++++++++++++++++++ Utils/keywords.txt | 3 +- 4 files changed, 191 insertions(+), 4 deletions(-) create mode 100644 Mage/src/mage/abilities/condition/common/TributeNotPaidCondition.java create mode 100644 Mage/src/mage/abilities/keyword/TributeAbility.java diff --git a/Mage/src/mage/abilities/condition/common/TributeNotPaidCondition.java b/Mage/src/mage/abilities/condition/common/TributeNotPaidCondition.java new file mode 100644 index 0000000000..0a4fcf4c8d --- /dev/null +++ b/Mage/src/mage/abilities/condition/common/TributeNotPaidCondition.java @@ -0,0 +1,58 @@ +/* +* 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.abilities.condition.common; + +import mage.abilities.Ability; +import mage.abilities.condition.Condition; +import mage.game.Game; + + +/** + * Checks if permanent was paid tribute to as it entered the battlefield + * + * @author LevelX2 + */ +public class TributeNotPaidCondition implements Condition { + + private static TributeNotPaidCondition fInstance = null; + + private TributeNotPaidCondition() {} + + public static Condition getInstance() { + if (fInstance == null) { + fInstance = new TributeNotPaidCondition(); + } + return fInstance; + } + + @Override + public boolean apply(Game game, Ability source) { + return !(Boolean) game.getState().getValue(new StringBuilder("tributeValue").append(source.getSourceId()).toString()); + } +} diff --git a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java index 2306256481..f523136990 100644 --- a/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java +++ b/Mage/src/mage/abilities/decorator/ConditionalTriggeredAbility.java @@ -52,9 +52,7 @@ public class ConditionalTriggeredAbility extends TriggeredAbilityImpl(As this creature enters the battlefield, an opponent of your choice may put "); + sb.append(tributeValue); + sb.append(" +1/+1 counter on it.)"); + return sb.toString(); + } +} + +class TributeEffect extends OneShotEffect { + + private int tributeValue; + + public TributeEffect(int tributeValue) { + super(Outcome.Detriment); + this.tributeValue = tributeValue; + } + + public TributeEffect(final TributeEffect effect) { + super(effect); + this.tributeValue = effect.tributeValue; + } + + @Override + public TributeEffect copy() { + return new TributeEffect(this); + } + + @Override + public boolean apply(Game game, Ability source) { + Player controller = game.getPlayer(source.getControllerId()); + Permanent sourcePermanent = game.getPermanent(source.getSourceId()); + if (controller != null && sourcePermanent != null) { + UUID opponentId; + if (game.getOpponents(controller.getId()).size() == 1) { + opponentId = game.getOpponents(controller.getId()).iterator().next(); + } else { + Target target = new TargetOpponent(true); + controller.choose(outcome, target, source.getSourceId(), game); + opponentId = target.getFirstTarget(); + } + if (opponentId != null) { + Player opponent = game.getPlayer(opponentId); + if (opponent != null) { + StringBuilder sb = new StringBuilder("Pay tribute to "); + sb.append(sourcePermanent.getName()); + sb.append(" (add ").append(tributeValue).append(" +1/+1 counters to it)?"); + if (opponent.chooseUse(outcome, sb.toString(), game)) { + sourcePermanent.addCounters(CounterType.P1P1.createInstance(tributeValue), game); + game.getState().setValue(new StringBuilder("tributeValue").append(source.getSourceId()).toString(), Boolean.TRUE); + } else { + game.getState().setValue(new StringBuilder("tributeValue").append(source.getSourceId()).toString(), Boolean.FALSE); + } + return true; + } + } + } + return false; + } +} diff --git a/Utils/keywords.txt b/Utils/keywords.txt index 701979ac2a..5677d6df82 100644 --- a/Utils/keywords.txt +++ b/Utils/keywords.txt @@ -55,4 +55,5 @@ Shroud|instance| Soulbond|instance| Trample|instance| Vigilance|instance| -Wither|instance| \ No newline at end of file +Wither|instance| +Tribute|number| \ No newline at end of file