Fixed a bug of cost paying handling not showing only the left over unpaid part of mana cost (fixes #185). Added the name of the object the cost is paid for to the feedback panel.

This commit is contained in:
LevelX2 2015-02-26 13:52:02 +01:00
parent 972fe78898
commit 4a5140d0ab
6 changed files with 43 additions and 29 deletions

View file

@ -1011,7 +1011,7 @@ public class ComputerPlayer extends PlayerImpl implements Player {
} }
@Override @Override
public boolean playMana(ManaCost unpaid, Game game) { public boolean playMana(ManaCost unpaid, String promptText, Game game) {
payManaMode = true; payManaMode = true;
boolean result = playManaHandling(unpaid, game); boolean result = playManaHandling(unpaid, game);
payManaMode = false; payManaMode = false;

View file

@ -606,17 +606,17 @@ public class HumanPlayer extends PlayerImpl {
@Override @Override
public boolean playMana(ManaCost unpaid, Game game) { public boolean playMana(ManaCost unpaid, String promptText, Game game) {
payManaMode = true; payManaMode = true;
boolean result = playManaHandling(unpaid, game); boolean result = playManaHandling(unpaid, promptText, game);
payManaMode = false; payManaMode = false;
return result; return result;
} }
protected boolean playManaHandling(ManaCost unpaid, Game game) { protected boolean playManaHandling(ManaCost unpaid, String promptText, Game game) {
updateGameStatePriority("playMana", game); updateGameStatePriority("playMana", game);
game.firePlayManaEvent(playerId, "Pay " + unpaid.getText()); game.firePlayManaEvent(playerId, "Pay " + promptText);
waitForResponse(game); waitForResponse(game);
if (!this.isInGame()) { if (!this.isInGame()) {
return false; return false;

View file

@ -39,6 +39,7 @@ import mage.filter.Filter;
import mage.game.Game; import mage.game.Game;
import mage.players.ManaPool; import mage.players.ManaPool;
import mage.players.Player; import mage.players.Player;
import mage.util.ManaUtil;
public abstract class ManaCostImpl extends CostImpl implements ManaCost { public abstract class ManaCostImpl extends CostImpl implements ManaCost {
@ -218,12 +219,15 @@ public abstract class ManaCostImpl extends CostImpl implements ManaCost {
Player player = game.getPlayer(controllerId); Player player = game.getPlayer(controllerId);
assignPayment(game, ability, player.getManaPool()); assignPayment(game, ability, player.getManaPool());
while (!isPaid()) { while (!isPaid()) {
if (player.playMana(this, game)) { ManaCost unpaid = this.getUnpaid();
String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid);
if (player.playMana(unpaid, promptText, game)) {
assignPayment(game, ability, player.getManaPool()); assignPayment(game, ability, player.getManaPool());
} }
else { else {
return false; return false;
} }
game.getState().getSpecialActions().removeManaActions();
} }
return true; return true;
} }

View file

@ -37,7 +37,6 @@ import mage.MageObject;
import mage.Mana; import mage.Mana;
import mage.abilities.Ability; import mage.abilities.Ability;
import mage.abilities.costs.VariableCost; import mage.abilities.costs.VariableCost;
import mage.abilities.keyword.DelveAbility;
import mage.abilities.mana.ManaOptions; import mage.abilities.mana.ManaOptions;
import mage.constants.ColoredManaSymbol; import mage.constants.ColoredManaSymbol;
import mage.filter.Filter; import mage.filter.Filter;
@ -45,6 +44,7 @@ import mage.game.Game;
import mage.players.ManaPool; import mage.players.ManaPool;
import mage.players.Player; import mage.players.Player;
import mage.target.Targets; import mage.target.Targets;
import mage.util.ManaUtil;
/** /**
* @author BetaSteward_at_googlemail.com * @author BetaSteward_at_googlemail.com
@ -121,8 +121,9 @@ public class ManaCostsImpl<T extends ManaCost> extends ArrayList<T> implements M
Player player = game.getPlayer(controllerId); Player player = game.getPlayer(controllerId);
assignPayment(game, ability, player.getManaPool()); assignPayment(game, ability, player.getManaPool());
while (!isPaid()) { while (!isPaid()) {
addSpecialManaPayAbilities(ability, game); ManaCost unpaid = this.getUnpaid();
if (player.playMana(this.getUnpaid(), game)) { String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid);
if (player.playMana(unpaid, promptText, game)) {
assignPayment(game, ability, player.getManaPool()); assignPayment(game, ability, player.getManaPool());
} else { } else {
return false; return false;
@ -132,25 +133,6 @@ public class ManaCostsImpl<T extends ManaCost> extends ArrayList<T> implements M
return true; return true;
} }
/**
* This activates the special button if there exists special ways to pay the mana (Delve, Convoke)
*
* @param ability
* @param game
*/
private void addSpecialManaPayAbilities(Ability source, Game game) {
// check for special mana payment possibilities
MageObject mageObject = source.getSourceObject(game);
if (mageObject != null) {
for (Ability ability :mageObject.getAbilities()) {
if (ability instanceof AlternateManaPaymentAbility) {
((AlternateManaPaymentAbility) ability).addSpecialAction(source, game, getUnpaid());
}
}
}
}
/** /**
* bookmarks the current state and restores it if player doesn't pay the mana cost * bookmarks the current state and restores it if player doesn't pay the mana cost
* *

View file

@ -299,7 +299,7 @@ public interface Player extends MageItem, Copyable<Player> {
boolean chooseUse(Outcome outcome, String message, Game game); boolean chooseUse(Outcome outcome, String message, Game game);
boolean choose(Outcome outcome, Choice choice, Game game); boolean choose(Outcome outcome, Choice choice, Game game);
boolean choosePile(Outcome outcome, String message, List<? extends Card> pile1, List<? extends Card> pile2, Game game); boolean choosePile(Outcome outcome, String message, List<? extends Card> pile1, List<? extends Card> pile2, Game game);
boolean playMana(ManaCost unpaid, Game game); boolean playMana(ManaCost unpaid, String promptText, Game game);
/** /**
* Moves the cards from cards to the bottom of the players library. * Moves the cards from cards to the bottom of the players library.

View file

@ -10,6 +10,10 @@ import java.util.HashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.Set; import java.util.Set;
import java.util.UUID; import java.util.UUID;
import mage.MageObject;
import mage.abilities.Ability;
import mage.abilities.costs.mana.AlternateManaPaymentAbility;
import mage.game.Game;
/** /**
* @author noxx * @author noxx
@ -334,4 +338,28 @@ public class ManaUtil {
return useableAbilities; return useableAbilities;
} }
/**
* This activates the special button inthe feedback panel of the client
* if there exists special ways to pay the mana (e.g. Delve, Convoke)
*
* @param source ability the mana costs have to be paid for
* @param game
* @param unpaid mana that has still to be paid
* @return message to be shown in human players feedback area
*/
public static String addSpecialManaPayAbilities(Ability source, Game game, ManaCost unpaid) {
// check for special mana payment possibilities
MageObject mageObject = source.getSourceObject(game);
if (mageObject != null) {
for (Ability ability :mageObject.getAbilities()) {
if (ability instanceof AlternateManaPaymentAbility) {
((AlternateManaPaymentAbility) ability).addSpecialAction(source, game, unpaid);
}
}
return unpaid.getText() + "<div style='font-size:11pt'>" + mageObject.getLogName() + "</div>";
} else {
return unpaid.getText();
}
}
} }