Support setting auto-yields in desktop game like in mobile game

Support showing stack ability menu on left click
This commit is contained in:
drdev
2014-08-16 17:53:20 +00:00
parent 84d8f003fd
commit 0c56a561e0
3 changed files with 95 additions and 54 deletions

View File

@@ -475,8 +475,17 @@ public enum FControl implements KeyEventDispatcher {
LobbyPlayer humanLobbyPlayer = getGuiPlayer(); LobbyPlayer humanLobbyPlayer = getGuiPlayer();
// The UI controls should use these game data as models // The UI controls should use these game data as models
CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer); CMatchUI.SINGLETON_INSTANCE.initMatch(game.getRegisteredPlayers(), humanLobbyPlayer);
Player localPlayer = null;
for (Player p : game.getPlayers()) {
if (p.getLobbyPlayer() == humanLobbyPlayer) {
localPlayer = p;
break;
}
}
CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer); CDock.SINGLETON_INSTANCE.setModel(game, humanLobbyPlayer);
CStack.SINGLETON_INSTANCE.setModel(game.getStack(), humanLobbyPlayer); CStack.SINGLETON_INSTANCE.setModel(game.getStack(), localPlayer);
CPlayers.SINGLETON_INSTANCE.setModel(game); CPlayers.SINGLETON_INSTANCE.setModel(game);
CLog.SINGLETON_INSTANCE.setModel(game.getGameLog()); CLog.SINGLETON_INSTANCE.setModel(game.getGameLog());

View File

@@ -1,7 +1,7 @@
package forge.screens.match.controllers; package forge.screens.match.controllers;
import forge.LobbyPlayer;
import forge.UiCommand; import forge.UiCommand;
import forge.game.player.Player;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
@@ -19,7 +19,7 @@ public enum CStack implements ICDoc {
SINGLETON_INSTANCE; SINGLETON_INSTANCE;
private MagicStack model; private MagicStack model;
private LobbyPlayer viewer; private Player localPlayer;
/* (non-Javadoc) /* (non-Javadoc)
* @see forge.gui.framework.ICDoc#getCommandOnSelect() * @see forge.gui.framework.ICDoc#getCommandOnSelect()
@@ -39,11 +39,11 @@ public enum CStack implements ICDoc {
@Override @Override
public void update() { public void update() {
SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc());
VStack.SINGLETON_INSTANCE.updateStack(model, viewer); VStack.SINGLETON_INSTANCE.updateStack(model, localPlayer);
} }
public void setModel(MagicStack model, LobbyPlayer guiPlayer) { public void setModel(MagicStack model0, Player localPlayer0) {
this.model = model; model = model0;
this.viewer = guiPlayer; localPlayer = localPlayer0;
} }
} }

View File

@@ -18,18 +18,22 @@
package forge.screens.match.views; package forge.screens.match.views;
import forge.ImageCache; import forge.ImageCache;
import forge.Singletons;
import forge.card.CardDetailUtil; import forge.card.CardDetailUtil;
import forge.card.CardDetailUtil.DetailColors; import forge.card.CardDetailUtil.DetailColors;
import forge.LobbyPlayer;
import forge.game.card.Card; import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.player.PlayerController; import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.MagicStack; import forge.game.zone.MagicStack;
import forge.gui.framework.DragCell; import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab; import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID; import forge.gui.framework.EDocID;
import forge.gui.framework.IVDoc; import forge.gui.framework.IVDoc;
import forge.match.input.InputConfirm;
import forge.screens.match.CMatchUI; import forge.screens.match.CMatchUI;
import forge.screens.match.controllers.CPrompt;
import forge.screens.match.controllers.CStack; import forge.screens.match.controllers.CStack;
import forge.toolbox.FMouseAdapter; import forge.toolbox.FMouseAdapter;
import forge.toolbox.FScrollPanel; import forge.toolbox.FScrollPanel;
@@ -66,7 +70,7 @@ public enum VStack implements IVDoc<CStack> {
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// Other fields // Other fields
private static OptionalTriggerMenu otMenu = new OptionalTriggerMenu(); private static AbilityMenu abilityMenu = new AbilityMenu();
private VStack() { private VStack() {
} }
@@ -127,7 +131,7 @@ public enum VStack implements IVDoc<CStack> {
/** /**
* @param stack * @param stack
* @param viewer */ * @param viewer */
public void updateStack(final MagicStack stack, final LobbyPlayer viewer) { public void updateStack(final MagicStack stack, final Player localPlayer) {
tab.setText("Stack : " + stack.size()); tab.setText("Stack : " + stack.size());
// No need to update the rest unless it's showing // No need to update the rest unless it's showing
@@ -137,7 +141,7 @@ public enum VStack implements IVDoc<CStack> {
boolean isFirst = true; boolean isFirst = true;
for (final SpellAbilityStackInstance spell : stack) { for (final SpellAbilityStackInstance spell : stack) {
StackInstanceTextArea tar = new StackInstanceTextArea(spell, viewer); StackInstanceTextArea tar = new StackInstanceTextArea(stack, spell, localPlayer);
scroller.add(tar, "pushx, growx" + (isFirst ? "" : ", gaptop 2px")); scroller.add(tar, "pushx, growx" + (isFirst ? "" : ", gaptop 2px"));
@@ -167,12 +171,12 @@ public enum VStack implements IVDoc<CStack> {
private final Card sourceCard; private final Card sourceCard;
public StackInstanceTextArea(final SpellAbilityStackInstance spell, final LobbyPlayer viewer) { public StackInstanceTextArea(final MagicStack stack, final SpellAbilityStackInstance spell, final Player localPlayer) {
sourceCard = spell.getSourceCard(); sourceCard = spell.getSourceCard();
String txt = spell.getStackDescription(); String txt = spell.getStackDescription();
if (spell.getSpellAbility().isOptionalTrigger() if (spell.getSpellAbility().isOptionalTrigger()
&& spell.getSourceCard().getController().getController().getLobbyPlayer().equals(viewer)) { && spell.getSourceCard().getController().equals(localPlayer)) {
txt = "(OPTIONAL) " + txt; txt = "(OPTIONAL) " + txt;
} }
setText(txt); setText(txt);
@@ -195,12 +199,19 @@ public enum VStack implements IVDoc<CStack> {
} }
}); });
if (spell.getSpellAbility().isOptionalTrigger() && spell.getSpellAbility().getActivatingPlayer().getLobbyPlayer() == viewer) { if (spell.getSpellAbility().isAbility() && localPlayer != null) {
addMouseListener(new FMouseAdapter() { addMouseListener(new FMouseAdapter() {
@Override
public void onLeftClick(MouseEvent e) {
onClick(e);
}
@Override @Override
public void onRightClick(MouseEvent e) { public void onRightClick(MouseEvent e) {
otMenu.setStackInstance(spell); onClick(e);
otMenu.show(e.getComponent(), e.getX(), e.getY()); }
private void onClick(MouseEvent e) {
abilityMenu.setStackInstance(stack, spell.getSpellAbility(), localPlayer);
abilityMenu.show(e.getComponent(), e.getX(), e.getY());
} }
}); });
} }
@@ -226,68 +237,89 @@ public enum VStack implements IVDoc<CStack> {
//========= Custom class handling //========= Custom class handling
private final static class OptionalTriggerMenu extends JPopupMenu { private final static class AbilityMenu extends JPopupMenu {
private static final long serialVersionUID = 1548494191627807962L; private static final long serialVersionUID = 1548494191627807962L;
private final JCheckBoxMenuItem jmiAccept; private final JCheckBoxMenuItem jmiAutoYield;
private final JCheckBoxMenuItem jmiDecline; private final JCheckBoxMenuItem jmiAlwaysYes;
private final JCheckBoxMenuItem jmiAsk; private final JCheckBoxMenuItem jmiAlwaysNo;
private PlayerController localPlayer; private MagicStack stack;
private SpellAbility ability;
private PlayerController controller;
private Integer triggerID = 0; private Integer triggerID = 0;
public OptionalTriggerMenu(){ public AbilityMenu(){
jmiAccept = new JCheckBoxMenuItem("Always Yes"); jmiAutoYield = new JCheckBoxMenuItem("Auto-Yield");
jmiDecline = new JCheckBoxMenuItem("Always No"); jmiAutoYield.addActionListener(new ActionListener() {
jmiAsk = new JCheckBoxMenuItem("Always Ask");
jmiAccept.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
if (localPlayer == null) { return; } final String key = ability.toUnsuppressedString();
localPlayer.setShouldAlwaysAcceptTrigger(triggerID); final boolean autoYield = controller.shouldAutoYield(key);
controller.setShouldAutoYield(key, !autoYield);
if (!autoYield && stack.peekAbility() == ability) {
//auto-pass priority if ability is on top of stack
CPrompt.SINGLETON_INSTANCE.getInputControl().passPriority();
}
} }
}); });
add(jmiAutoYield);
jmiDecline.addActionListener(new ActionListener() { jmiAlwaysYes = new JCheckBoxMenuItem("Always Yes");
jmiAlwaysYes.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
if (localPlayer == null) { return; } if (controller.shouldAlwaysAcceptTrigger(triggerID)) {
localPlayer.setShouldAlwaysDeclineTrigger(triggerID); controller.setShouldAlwaysAskTrigger(triggerID);
}
else {
controller.setShouldAlwaysAcceptTrigger(triggerID);
if (stack.peekAbility() == ability &&
Singletons.getControl().getInputQueue().getInput() instanceof InputConfirm) {
//auto-yes if ability is on top of stack
CPrompt.SINGLETON_INSTANCE.getInputControl().selectButtonOK();
}
}
} }
}); });
add(jmiAlwaysYes);
jmiAsk.addActionListener(new ActionListener() { jmiAlwaysNo = new JCheckBoxMenuItem("Always No");
jmiAlwaysNo.addActionListener(new ActionListener() {
@Override @Override
public void actionPerformed(ActionEvent arg0) { public void actionPerformed(ActionEvent arg0) {
if (localPlayer == null) { return; } if (controller.shouldAlwaysDeclineTrigger(triggerID)) {
localPlayer.setShouldAlwaysAskTrigger(triggerID); controller.setShouldAlwaysAskTrigger(triggerID);
}
else {
controller.setShouldAlwaysDeclineTrigger(triggerID);
if (stack.peekAbility() == ability &&
Singletons.getControl().getInputQueue().getInput() instanceof InputConfirm) {
//auto-no if ability is on top of stack
CPrompt.SINGLETON_INSTANCE.getInputControl().selectButtonOK();
}
}
} }
}); });
add(jmiAlwaysNo);
add(jmiAccept);
add(jmiDecline);
add(jmiAsk);
} }
public void setStackInstance(final SpellAbilityStackInstance SI) { public void setStackInstance(final MagicStack stack0, final SpellAbility ability0, final Player localPlayer) {
localPlayer = SI.getSpellAbility().getActivatingPlayer().getController(); stack = stack0;
ability = ability0;
controller = localPlayer.getController();
triggerID = ability.getSourceTrigger();
triggerID = SI.getSpellAbility().getSourceTrigger(); jmiAutoYield.setSelected(controller.shouldAutoYield(ability.toUnsuppressedString()));
if (localPlayer.shouldAlwaysAcceptTrigger(triggerID)) { if (ability.isOptionalTrigger() && ability.getActivatingPlayer() == localPlayer) {
jmiAccept.setSelected(true); jmiAlwaysYes.setSelected(controller.shouldAlwaysAcceptTrigger(triggerID));
jmiDecline.setSelected(false); jmiAlwaysNo.setSelected(controller.shouldAlwaysDeclineTrigger(triggerID));
jmiAsk.setSelected(false); jmiAlwaysYes.setVisible(true);
} jmiAlwaysNo.setVisible(true);
else if (localPlayer.shouldAlwaysDeclineTrigger(triggerID)) {
jmiDecline.setSelected(true);
jmiAccept.setSelected(false);
jmiAsk.setSelected(false);
} }
else { else {
jmiAsk.setSelected(true); jmiAlwaysYes.setVisible(false);
jmiAccept.setSelected(false); jmiAlwaysNo.setVisible(false);
jmiDecline.setSelected(false);
} }
} }
} }