diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index fac4fc88cf7..05d772b4c00 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -791,6 +791,10 @@ public final class CMatchUI public void showPromptMessage(final PlayerView playerView, final String message) { cPrompt.setMessage(message); } + // no override for now + public void showPromptMessage(final PlayerView playerView, final String message, final SpellAbilityView sav ) { + cPrompt.setMessage(message,sav); + } @Override public void showManaPool(final PlayerView player) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java index 38abff52424..cd2a83801e5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java @@ -28,6 +28,8 @@ import javax.swing.JButton; import forge.FThreads; import forge.game.GameView; +import forge.game.card.CardView; +import forge.game.spellability.SpellAbilityView; import forge.gui.framework.ICDoc; import forge.gui.framework.SDisplayUtil; import forge.screens.match.CMatchUI; @@ -47,6 +49,9 @@ public class CPrompt implements ICDoc { this.view = new VPrompt(this); } + public final CMatchUI getMatchUI() { + return matchUI; + } public final VPrompt getView() { return view; } @@ -100,6 +105,11 @@ public class CPrompt implements ICDoc { public void setMessage(final String s0) { view.getTarMessage().setText(FSkin.encodeSymbols(s0, false)); + view.setSpellAbilityView(null); + } + public void setMessage(final String s0, final SpellAbilityView sav) { + view.getTarMessage().setText(FSkin.encodeSymbols(s0, false)); + view.setSpellAbilityView(sav); } /** diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java index ef63a8634e8..7fa9f4f14d8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPrompt.java @@ -17,6 +17,8 @@ */ package forge.screens.match.views; +import forge.game.card.CardView; +import forge.game.spellability.SpellAbilityView; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -33,6 +35,8 @@ import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; /** * Assembles Swing components of message report. @@ -52,6 +56,11 @@ public class VPrompt implements IVDoc { private final FScrollPane messageScroller = new FScrollPane(tarMessage, false, ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); private final JLabel lblGames; + private SpellAbilityView sav = null ; + + public void setSpellAbilityView(final SpellAbilityView sav) { + this.sav = sav ; + } private KeyAdapter buttonKeyAdapter = new KeyAdapter() { @Override @@ -84,6 +93,15 @@ public class VPrompt implements IVDoc { tarMessage.setForeground(FSkin.getColor(FSkin.Colors.CLR_TEXT)); tarMessage.setMargin(new Insets(3, 3, 3, 3)); + + messageScroller.getViewport().getView().addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(final MouseEvent e) { + if ( sav != null ) { + controller.getMatchUI().setCard(sav.getHostCard()); + } + } + }); } //========== Overridden methods diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 23aa49a89f9..46de8c9c85f 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -155,6 +155,11 @@ public class MatchController extends AbstractGuiGame { public void showPromptMessage(final PlayerView player, final String message) { view.getPrompt(player).setMessage(message); } + + @Override + public void showPromptMessage(final PlayerView player, final String message, final SpellAbilityView sav) { + view.getPrompt(player).setMessage(message); + } @Override public void updateButtons(final PlayerView owner, final String label1, final String label2, final boolean enable1, final boolean enable2, final boolean focus1) { diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java index e2373441926..daaeb2d6d65 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiGame.java @@ -32,6 +32,7 @@ public interface IGuiGame { void afterGameEnd(); void showCombat(); void showPromptMessage(PlayerView playerView, String message); + void showPromptMessage(PlayerView playerView, String message, SpellAbilityView sav); void updateButtons(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk); void updateButtons(PlayerView owner, String label1, String label2, boolean enable1, boolean enable2, boolean focus1); void flashIncorrectAction(); diff --git a/forge-gui/src/main/java/forge/match/input/InputBase.java b/forge-gui/src/main/java/forge/match/input/InputBase.java index fb6537ae5f2..10bfaf8f5ae 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputBase.java @@ -25,6 +25,7 @@ import forge.game.phase.PhaseHandler; import forge.game.player.Player; import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; +import forge.game.spellability.SpellAbilityView; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; @@ -117,6 +118,9 @@ public abstract class InputBase implements java.io.Serializable, Input { protected final void showMessage(final String message) { controller.getGui().showPromptMessage(getOwner(), message); } + protected final void showMessage(final String message, final SpellAbilityView sav) { + controller.getGui().showPromptMessage(getOwner(), message, sav); + } protected String getTurnPhasePriorityMessage(final Game game) { final PhaseHandler ph = game.getPhaseHandler(); diff --git a/forge-gui/src/main/java/forge/match/input/InputConfirm.java b/forge-gui/src/main/java/forge/match/input/InputConfirm.java index a80d3feaa39..2960f2c4714 100644 --- a/forge-gui/src/main/java/forge/match/input/InputConfirm.java +++ b/forge-gui/src/main/java/forge/match/input/InputConfirm.java @@ -19,7 +19,9 @@ package forge.match.input; import forge.game.card.Card; import forge.game.spellability.SpellAbility; +import forge.model.FModel; import forge.player.PlayerControllerHuman; +import forge.properties.ForgePreferences; /** *

@@ -61,7 +63,12 @@ public class InputConfirm extends InputSyncronizedBase { @Override protected final void showMessage() { getController().getGui().updateButtons(getOwner(), yesButtonText, noButtonText, true, true, defaultYes); - showMessage(message); + if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) && + (sa!=null) ) { + showMessage(sa.getStackDescription() + "\n" + message, sa.getView()); + } else { + showMessage(message, (sa!=null)?sa.getView():null); + } } /** {@inheritDoc} */ diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 73b852144ba..595428d37f5 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -422,7 +422,7 @@ public abstract class InputPayMana extends InputSyncronizedBase { getController().getGui().updateButtons(getOwner(), "Auto", "Cancel", true, true, true); } } - showMessage(getMessage()); + showMessage(getMessage(), saPaidFor.getView()); } @Override diff --git a/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java b/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java index 8100d17c90d..e601fbf7f83 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java @@ -51,9 +51,14 @@ public class InputPayManaOfCostPayment extends InputPayMana { msg.append(messagePrefix).append("\n"); } if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT)) { - msg.append(saPaidFor.getStackDescription().replace("(Targeting ERROR)", "")).append("\n"); + // msg.append(saPaidFor.getStackDescription().replace("(Targeting ERROR)", "")); + if ( saPaidFor.isSpell() ) { + msg.append(saPaidFor.getStackDescription().replace("(Targeting ERROR)", "")); + } else { + msg.append(saPaidFor.getHostCard()).append(" - ").append(saPaidFor.toString()); + } } - msg.append("Pay Mana Cost: ").append(displayMana); + msg.append("\n").append("Pay Mana Cost: ").append(displayMana); if (this.phyLifeToLose > 0) { msg.append(" ("); msg.append(this.phyLifeToLose); diff --git a/forge-gui/src/main/java/forge/match/input/InputProliferate.java b/forge-gui/src/main/java/forge/match/input/InputProliferate.java index 0c45c385bc1..12193b3644f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputProliferate.java +++ b/forge-gui/src/main/java/forge/match/input/InputProliferate.java @@ -7,6 +7,8 @@ import java.util.List; import java.util.Map; import java.util.Map.Entry; +import forge.model.FModel; +import forge.properties.ForgePreferences; import forge.game.GameEntity; import forge.game.card.Card; import forge.game.card.CounterType; @@ -27,7 +29,12 @@ public final class InputProliferate extends InputSelectManyBase { @Override protected String getMessage() { - final StringBuilder sb = new StringBuilder("Choose permanents and/or players with counters on them to add one more counter of that type."); + final StringBuilder sb = new StringBuilder(); + if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) && + sa != null ) { + sb.append(sa.getStackDescription()).append("\n"); + } + sb.append("Choose permanents and/or players with counters on them to add one more counter of that type."); sb.append("\n\nYou've selected so far:\n"); if (chosenCounters.isEmpty()) { sb.append("(none)"); diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java b/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java index f786c413b93..7c066437ca9 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectCardsForConvokeOrImprovise.java @@ -8,6 +8,8 @@ import java.util.Map.Entry; import org.apache.commons.lang3.tuple.ImmutablePair; +import forge.model.FModel; +import forge.properties.ForgePreferences; import forge.card.ColorSet; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostShard; @@ -33,20 +35,22 @@ public final class InputSelectCardsForConvokeOrImprovise extends InputSelectMany private SpellAbility sa; public InputSelectCardsForConvokeOrImprovise(final PlayerControllerHuman controller, final Player p, final ManaCost cost, final CardCollectionView untapped, boolean impr, final SpellAbility sa) { - super(controller, 0, Math.min(cost.getCMC(), untapped.size())); + super(controller, 0, Math.min(cost.getCMC(), untapped.size()), sa); remainingCost = new ManaCostBeingPaid(cost); player = p; availableCards = untapped; improvise = impr; cardType = impr ? "artifact" : "creature"; description = impr ? "Improvise" : "Convoke"; - this.sa = sa; } @Override protected String getMessage() { StringBuilder sb = new StringBuilder(); - if (sa != null) sb.append(sa.getStackDescription()); + if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) && + sa != null ) { + sb.append(sa.getStackDescription()).append("\n"); + } sb.append(String.format("Choose %s to tap for %s .\nRemaining mana cost is %s", cardType, description, remainingCost.toString())); return sb.toString(); } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java b/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java index 08ce4763fe5..1a4afe9f99c 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java @@ -8,7 +8,9 @@ import forge.game.GameEntity; import forge.game.card.Card; import forge.game.card.CardView; import forge.game.spellability.SpellAbility; +import forge.model.FModel; import forge.player.PlayerControllerHuman; +import forge.properties.ForgePreferences; public abstract class InputSelectManyBase extends InputSyncronizedBase { private static final long serialVersionUID = -2305549394512889450L; @@ -51,7 +53,12 @@ public abstract class InputSelectManyBase extends InputSyn @Override public final void showMessage() { - showMessage(getMessage()); + if ( FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT) && + (sa!=null) ) { + showMessage( sa.getStackDescription() + "\n" + getMessage(), sa.getView() ) ; + } else { + showMessage(getMessage(), (sa!=null)?sa.getView():null); + } getController().getGui().updateButtons(getOwner(), hasEnoughTargets(), allowCancel, true); } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java index f79b79c4715..8416066b1d4 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java @@ -49,7 +49,14 @@ public final class InputSelectTargets extends InputSyncronizedBase { // Display targeting card in cardDetailPane in case it's not obviously visible. getController().getGui().setCard(CardView.get(sa.getHostCard())); final StringBuilder sb = new StringBuilder(); - sb.append("Targeted:\n"); + if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT)) { + // sb.append(sa.getStackDescription().replace("(Targeting ERROR)", "")).append("\n").append(tgt.getVTSelection()).append("\n"); + if ( sa.isAbility() ) { sb.append(sa.getHostCard()).append(" - " ); } + sb.append(sa.toString()).append("\n").append(tgt.getVTSelection()).append("\n"); + } else { + sb.append(sa.getHostCard()).append(" - ").append(tgt.getVTSelection()).append("\n"); + } + if ( ! targetDepth.entrySet().isEmpty() ) { sb.append("Targeted:\n"); } for (final Entry o : targetDepth.entrySet()) { sb.append(o.getKey()); if (o.getValue() > 1) { @@ -61,11 +68,6 @@ public final class InputSelectTargets extends InputSyncronizedBase { sb.append("Parent Targeted:"); sb.append(sa.getUniqueTargets()).append("\n"); } - if (FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.UI_DETAILED_SPELLDESC_IN_PROMPT)) { - sb.append(sa.getStackDescription().replace("(Targeting ERROR)", "")).append("\n").append(tgt.getVTSelection()); - } else { - sb.append(sa.getHostCard() + " - " + tgt.getVTSelection()); - } final int maxTargets = tgt.getMaxTargets(sa.getHostCard(), sa); final int targeted = sa.getTargets().getNumTargeted(); @@ -73,7 +75,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { sb.append(String.format("\n(%d more can be targeted)", Integer.valueOf(maxTargets - targeted))); } - showMessage(sb.toString().replace("CARDNAME", sa.getHostCard().toString())); + showMessage(sb.toString().replace("CARDNAME", sa.getHostCard().toString()), sa.getView()); // If reached Minimum targets, enable OK button if (!tgt.isMinTargetsChosen(sa.getHostCard(), sa) || tgt.isDividedAsYouChoose()) { diff --git a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java index f5a40b64e3a..88fe4845220 100644 --- a/forge-gui/src/main/java/forge/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/net/server/NetGuiGame.java @@ -72,6 +72,12 @@ public class NetGuiGame extends AbstractGuiGame { updateGameView(); send(ProtocolMethod.showPromptMessage, playerView, message); } + + @Override + public void showPromptMessage(final PlayerView playerView, final String message, final SpellAbilityView sav) { + updateGameView(); + send(ProtocolMethod.showPromptMessage, playerView, message); + } @Override public void updateButtons(final PlayerView owner, final String label1, final String label2, final boolean enable1, final boolean enable2, final boolean focus1) { diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 315c1c80cb4..aa882a9366e 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -861,11 +861,10 @@ public class HumanCostDecision extends CostDecisionMakerBase { private final CardCollectionView validChoices; public InputSelectCardToRemoveCounter(final PlayerControllerHuman controller, final int cntCounters, final CounterType cType, final CardCollectionView validCards, final SpellAbility sa) { - super(controller, cntCounters, cntCounters); + super(controller, cntCounters, cntCounters, sa); this.validChoices = validCards; counterType = cType; cardsChosen = cntCounters > 0 ? new HashMap() : null; - this.sa = sa; } @Override