mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 02:38:02 +00:00
Support setting auto-yields in desktop game like in mobile game
Support showing stack ability menu on left click
This commit is contained in:
@@ -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());
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user