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();
// The UI controls should use these game data as models
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);
CStack.SINGLETON_INSTANCE.setModel(game.getStack(), humanLobbyPlayer);
CStack.SINGLETON_INSTANCE.setModel(game.getStack(), localPlayer);
CPlayers.SINGLETON_INSTANCE.setModel(game);
CLog.SINGLETON_INSTANCE.setModel(game.getGameLog());

View File

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

View File

@@ -18,18 +18,22 @@
package forge.screens.match.views;
import forge.ImageCache;
import forge.Singletons;
import forge.card.CardDetailUtil;
import forge.card.CardDetailUtil.DetailColors;
import forge.LobbyPlayer;
import forge.game.card.Card;
import forge.game.player.Player;
import forge.game.player.PlayerController;
import forge.game.spellability.SpellAbility;
import forge.game.spellability.SpellAbilityStackInstance;
import forge.game.zone.MagicStack;
import forge.gui.framework.DragCell;
import forge.gui.framework.DragTab;
import forge.gui.framework.EDocID;
import forge.gui.framework.IVDoc;
import forge.match.input.InputConfirm;
import forge.screens.match.CMatchUI;
import forge.screens.match.controllers.CPrompt;
import forge.screens.match.controllers.CStack;
import forge.toolbox.FMouseAdapter;
import forge.toolbox.FScrollPanel;
@@ -66,7 +70,7 @@ public enum VStack implements IVDoc<CStack> {
ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED, ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER);
// Other fields
private static OptionalTriggerMenu otMenu = new OptionalTriggerMenu();
private static AbilityMenu abilityMenu = new AbilityMenu();
private VStack() {
}
@@ -127,7 +131,7 @@ public enum VStack implements IVDoc<CStack> {
/**
* @param stack
* @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());
// No need to update the rest unless it's showing
@@ -137,7 +141,7 @@ public enum VStack implements IVDoc<CStack> {
boolean isFirst = true;
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"));
@@ -167,12 +171,12 @@ public enum VStack implements IVDoc<CStack> {
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();
String txt = spell.getStackDescription();
if (spell.getSpellAbility().isOptionalTrigger()
&& spell.getSourceCard().getController().getController().getLobbyPlayer().equals(viewer)) {
&& spell.getSourceCard().getController().equals(localPlayer)) {
txt = "(OPTIONAL) " + 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() {
@Override
public void onLeftClick(MouseEvent e) {
onClick(e);
}
@Override
public void onRightClick(MouseEvent e) {
otMenu.setStackInstance(spell);
otMenu.show(e.getComponent(), e.getX(), e.getY());
onClick(e);
}
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
private final static class OptionalTriggerMenu extends JPopupMenu {
private final static class AbilityMenu extends JPopupMenu {
private static final long serialVersionUID = 1548494191627807962L;
private final JCheckBoxMenuItem jmiAccept;
private final JCheckBoxMenuItem jmiDecline;
private final JCheckBoxMenuItem jmiAsk;
private PlayerController localPlayer;
private final JCheckBoxMenuItem jmiAutoYield;
private final JCheckBoxMenuItem jmiAlwaysYes;
private final JCheckBoxMenuItem jmiAlwaysNo;
private MagicStack stack;
private SpellAbility ability;
private PlayerController controller;
private Integer triggerID = 0;
public OptionalTriggerMenu(){
jmiAccept = new JCheckBoxMenuItem("Always Yes");
jmiDecline = new JCheckBoxMenuItem("Always No");
jmiAsk = new JCheckBoxMenuItem("Always Ask");
jmiAccept.addActionListener(new ActionListener() {
public AbilityMenu(){
jmiAutoYield = new JCheckBoxMenuItem("Auto-Yield");
jmiAutoYield.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (localPlayer == null) { return; }
localPlayer.setShouldAlwaysAcceptTrigger(triggerID);
final String key = ability.toUnsuppressedString();
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
public void actionPerformed(ActionEvent arg0) {
if (localPlayer == null) { return; }
localPlayer.setShouldAlwaysDeclineTrigger(triggerID);
}
});
jmiAsk.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (localPlayer == null) { return; }
localPlayer.setShouldAlwaysAskTrigger(triggerID);
}
});
add(jmiAccept);
add(jmiDecline);
add(jmiAsk);
}
public void setStackInstance(final SpellAbilityStackInstance SI) {
localPlayer = SI.getSpellAbility().getActivatingPlayer().getController();
triggerID = SI.getSpellAbility().getSourceTrigger();
if (localPlayer.shouldAlwaysAcceptTrigger(triggerID)) {
jmiAccept.setSelected(true);
jmiDecline.setSelected(false);
jmiAsk.setSelected(false);
}
else if (localPlayer.shouldAlwaysDeclineTrigger(triggerID)) {
jmiDecline.setSelected(true);
jmiAccept.setSelected(false);
jmiAsk.setSelected(false);
if (controller.shouldAlwaysAcceptTrigger(triggerID)) {
controller.setShouldAlwaysAskTrigger(triggerID);
}
else {
jmiAsk.setSelected(true);
jmiAccept.setSelected(false);
jmiDecline.setSelected(false);
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);
jmiAlwaysNo = new JCheckBoxMenuItem("Always No");
jmiAlwaysNo.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent arg0) {
if (controller.shouldAlwaysDeclineTrigger(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);
}
public void setStackInstance(final MagicStack stack0, final SpellAbility ability0, final Player localPlayer) {
stack = stack0;
ability = ability0;
controller = localPlayer.getController();
triggerID = ability.getSourceTrigger();
jmiAutoYield.setSelected(controller.shouldAutoYield(ability.toUnsuppressedString()));
if (ability.isOptionalTrigger() && ability.getActivatingPlayer() == localPlayer) {
jmiAlwaysYes.setSelected(controller.shouldAlwaysAcceptTrigger(triggerID));
jmiAlwaysNo.setSelected(controller.shouldAlwaysDeclineTrigger(triggerID));
jmiAlwaysYes.setVisible(true);
jmiAlwaysNo.setVisible(true);
}
else {
jmiAlwaysYes.setVisible(false);
jmiAlwaysNo.setVisible(false);
}
}
}