diff --git a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java index 746850ff9f2..dba0a92f38c 100644 --- a/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java +++ b/forge-gui-desktop/src/main/java/forge/control/KeyboardShortcuts.java @@ -159,10 +159,10 @@ public void actionPerformed(final ActionEvent e) { if (matchUI == null) { return; } StackItemView si = matchUI.getGameView().peekStack(); if (si != null && si.isAbility()) { - matchUI.setShouldAutoYield(si.getKey(), true); + matchUI.getGameController().setShouldAutoYield(si.getKey(), true); int triggerID = si.getSourceTrigger(); if (si.isOptionalTrigger() && matchUI.isLocalPlayer(si.getActivatingPlayer())) { - matchUI.setShouldAlwaysAcceptTrigger(triggerID); + matchUI.getGameController().setShouldAlwaysAcceptTrigger(triggerID); } matchUI.getGameController().passPriority(); } @@ -177,10 +177,10 @@ public void actionPerformed(final ActionEvent e) { if (matchUI == null) { return; } StackItemView si = matchUI.getGameView().peekStack(); if (si != null && si.isAbility()) { - matchUI.setShouldAutoYield(si.getKey(), true); + matchUI.getGameController().setShouldAutoYield(si.getKey(), true); int triggerID = si.getSourceTrigger(); if (si.isOptionalTrigger() && matchUI.isLocalPlayer(si.getActivatingPlayer())) { - matchUI.setShouldAlwaysDeclineTrigger(triggerID); + matchUI.getGameController().setShouldAlwaysDeclineTrigger(triggerID); } matchUI.getGameController().passPriority(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java index 7ed632d2e24..e27710722b5 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java @@ -34,7 +34,7 @@ public VAutoYields(final CMatchUI matchUI) { setTitle(Localizer.getInstance().getMessage("lblAutoYields")); autoYields = new ArrayList<>(); - for (final String autoYield : matchUI.getAutoYields()) { + for (final String autoYield : matchUI.getGameController().getAutoYields()) { autoYields.add(autoYield); } lstAutoYields = new FList<>(new AutoYieldsListModel()); @@ -46,8 +46,8 @@ public VAutoYields(final CMatchUI matchUI) { listScroller = new FScrollPane(lstAutoYields, true); - chkDisableAll = new FCheckBox(Localizer.getInstance().getMessage("lblDisableAllAutoYields"), matchUI.getDisableAutoYields()); - chkDisableAll.addChangeListener(e -> matchUI.setDisableAutoYields(chkDisableAll.isSelected())); + chkDisableAll = new FCheckBox(Localizer.getInstance().getMessage("lblDisableAllAutoYields"), matchUI.getGameController().getDisableAutoYields()); + chkDisableAll.addChangeListener(e -> matchUI.getGameController().setDisableAutoYields(chkDisableAll.isSelected())); btnOk = new FButton(Localizer.getInstance().getMessage("lblOK")); btnOk.setCommand((UiCommand) () -> setVisible(false)); @@ -57,7 +57,7 @@ public VAutoYields(final CMatchUI matchUI) { if (selected != null) { autoYields.remove(selected); btnRemove.setEnabled(autoYields.size() > 0); - matchUI.setShouldAutoYield(selected, false); + matchUI.getGameController().setShouldAutoYield(selected, false); VAutoYields.this.revalidate(); lstAutoYields.repaint(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java index 34443a344f4..024c9ba74af 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java @@ -292,8 +292,8 @@ public AbilityMenu(){ jmiAutoYield = new JCheckBoxMenuItem(Localizer.getInstance().getMessage("cbpAutoYieldMode")); jmiAutoYield.addActionListener(arg0 -> { final String key = item.getKey(); - final boolean autoYield = controller.getMatchUI().shouldAutoYield(key); - controller.getMatchUI().setShouldAutoYield(key, !autoYield); + final boolean autoYield = controller.getMatchUI().getGameController().shouldAutoYield(key); + controller.getMatchUI().getGameController().setShouldAutoYield(key, !autoYield); if (!autoYield && controller.getMatchUI().getGameView().peekStack() == item) { //auto-pass priority if ability is on top of stack controller.getMatchUI().getGameController().passPriority(); @@ -303,22 +303,22 @@ public AbilityMenu(){ jmiAlwaysYes = new JCheckBoxMenuItem(Localizer.getInstance().getMessage("lblAlwaysYes")); jmiAlwaysYes.addActionListener(arg0 -> { - if (controller.getMatchUI().shouldAlwaysAcceptTrigger(triggerID)) { - controller.getMatchUI().setShouldAlwaysAskTrigger(triggerID); + if (controller.getMatchUI().getGameController().shouldAlwaysAcceptTrigger(triggerID)) { + controller.getMatchUI().getGameController().setShouldAlwaysAskTrigger(triggerID); } else { - controller.getMatchUI().setShouldAlwaysAcceptTrigger(triggerID); + controller.getMatchUI().getGameController().setShouldAlwaysAcceptTrigger(triggerID); } }); add(jmiAlwaysYes); jmiAlwaysNo = new JCheckBoxMenuItem(Localizer.getInstance().getMessage("lblAlwaysNo")); jmiAlwaysNo.addActionListener(arg0 -> { - if (controller.getMatchUI().shouldAlwaysDeclineTrigger(triggerID)) { - controller.getMatchUI().setShouldAlwaysAskTrigger(triggerID); + if (controller.getMatchUI().getGameController().shouldAlwaysDeclineTrigger(triggerID)) { + controller.getMatchUI().getGameController().setShouldAlwaysAskTrigger(triggerID); } else { - controller.getMatchUI().setShouldAlwaysDeclineTrigger(triggerID); + controller.getMatchUI().getGameController().setShouldAlwaysDeclineTrigger(triggerID); } }); add(jmiAlwaysNo); @@ -328,11 +328,11 @@ public void setStackInstance(final StackItemView item0) { item = item0; triggerID = item.getSourceTrigger(); - jmiAutoYield.setSelected(controller.getMatchUI().shouldAutoYield(item.getKey())); + jmiAutoYield.setSelected(controller.getMatchUI().getGameController().shouldAutoYield(item.getKey())); if (item.isOptionalTrigger() && controller.getMatchUI().isLocalPlayer(item.getActivatingPlayer())) { - jmiAlwaysYes.setSelected(controller.getMatchUI().shouldAlwaysAcceptTrigger(triggerID)); - jmiAlwaysNo.setSelected(controller.getMatchUI().shouldAlwaysDeclineTrigger(triggerID)); + jmiAlwaysYes.setSelected(controller.getMatchUI().getGameController().shouldAlwaysAcceptTrigger(triggerID)); + jmiAlwaysNo.setSelected(controller.getMatchUI().getGameController().shouldAlwaysDeclineTrigger(triggerID)); jmiAlwaysYes.setVisible(true); jmiAlwaysNo.setVisible(true); } else { diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index df099dc1e9a..da89a41d7ff 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -15,7 +15,6 @@ import forge.card.CardRenderer; import forge.card.CardZoom; import forge.game.spellability.StackItemView; -import forge.gui.interfaces.IGuiGame; import forge.screens.match.views.VField; import forge.screens.match.views.VReveal; import forge.toolbox.FDisplayObject; @@ -664,7 +663,6 @@ public boolean keyDown(int keyCode) { break; case Keys.Y: //auto-yield, always yes, Ctrl+Y on Android, Y when running on desktop if (KeyInputAdapter.isCtrlKeyDown() || GuiBase.getInterface().isRunningOnDesktop()) { - final IGuiGame gui = MatchController.instance; final IGameController controller = MatchController.instance.getGameController(); final GameView gameView = MatchController.instance.getGameView(); final FCollectionView stack = MatchController.instance.getGameView().getStack(); @@ -677,10 +675,10 @@ public boolean keyDown(int keyCode) { } final int triggerID = stackInstance.getSourceTrigger(); - if (gui.shouldAlwaysAcceptTrigger(triggerID)) { - gui.setShouldAlwaysAskTrigger(triggerID); + if (controller.shouldAlwaysAcceptTrigger(triggerID)) { + controller.setShouldAlwaysAskTrigger(triggerID); } else { - gui.setShouldAlwaysAcceptTrigger(triggerID); + controller.setShouldAlwaysAcceptTrigger(triggerID); if (stackInstance.equals(gameView.peekStack())) { //auto-yes if ability is on top of stack controller.selectButtonOk(); @@ -688,7 +686,7 @@ public boolean keyDown(int keyCode) { } final String key = stackInstance.getKey(); - gui.setShouldAutoYield(key, true); + controller.setShouldAutoYield(key, true); if (stackInstance.equals(gameView.peekStack())) { //auto-pass priority if ability is on top of stack controller.passPriority(); @@ -697,7 +695,6 @@ public boolean keyDown(int keyCode) { break; case Keys.N: //auto-yield, always no, Ctrl+N on Android, N when running on desktop if (KeyInputAdapter.isCtrlKeyDown() || GuiBase.getInterface().isRunningOnDesktop()) { - final IGuiGame gui = MatchController.instance; final IGameController controller = MatchController.instance.getGameController(); final GameView gameView = MatchController.instance.getGameView(); final FCollectionView stack = MatchController.instance.getGameView().getStack(); @@ -710,10 +707,10 @@ public boolean keyDown(int keyCode) { } final int triggerID = stackInstance.getSourceTrigger(); - if (gui.shouldAlwaysDeclineTrigger(triggerID)) { - gui.setShouldAlwaysAskTrigger(triggerID); + if (controller.shouldAlwaysDeclineTrigger(triggerID)) { + controller.setShouldAlwaysAskTrigger(triggerID); } else { - gui.setShouldAlwaysDeclineTrigger(triggerID); + controller.setShouldAlwaysDeclineTrigger(triggerID); if (stackInstance.equals(gameView.peekStack())) { //auto-no if ability is on top of stack controller.selectButtonCancel(); @@ -721,7 +718,7 @@ public boolean keyDown(int keyCode) { } final String key = stackInstance.getKey(); - gui.setShouldAutoYield(key, true); + controller.setShouldAutoYield(key, true); if (stackInstance.equals(gameView.peekStack())) { //auto-pass priority if ability is on top of stack controller.passPriority(); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java b/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java index fc619af914a..d6307f177ab 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAutoYields.java @@ -18,7 +18,7 @@ public class VAutoYields extends FDialog { public VAutoYields() { super(Forge.getLocalizer().getMessage("lblAutoYields"), 2); List autoYields = new ArrayList<>(); - for (String autoYield : MatchController.instance.getAutoYields()) { + for (String autoYield : MatchController.instance.getGameController().getAutoYields()) { autoYields.add(autoYield); } lstAutoYields = add(new FChoiceList(autoYields) { @@ -32,14 +32,14 @@ protected boolean allowDefaultItemWrap() { return true; } }); - chkDisableAll = add(new FCheckBox(Forge.getLocalizer().getMessage("lblDisableAllAutoYields"), MatchController.instance.getDisableAutoYields())); - chkDisableAll.setCommand(e -> MatchController.instance.setDisableAutoYields(chkDisableAll.isSelected())); + chkDisableAll = add(new FCheckBox(Forge.getLocalizer().getMessage("lblDisableAllAutoYields"), MatchController.instance.getGameController().getDisableAutoYields())); + chkDisableAll.setCommand(e -> MatchController.instance.getGameController().setDisableAutoYields(chkDisableAll.isSelected())); initButton(0, Forge.getLocalizer().getMessage("lblOK"), e -> hide()); initButton(1, Forge.getLocalizer().getMessage("lblRemoveYield"), e -> { String selected = lstAutoYields.getSelectedItem(); if (selected != null) { lstAutoYields.removeItem(selected); - MatchController.instance.setShouldAutoYield(selected, false); + MatchController.instance.getGameController().setShouldAutoYield(selected, false); setButtonEnabled(1, lstAutoYields.getCount() > 0); lstAutoYields.cleanUpSelections(); VAutoYields.this.revalidate(); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java index 8d3c3312b5d..fdf73c452f1 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java @@ -36,19 +36,19 @@ public void handleEvent(FEvent e) { addItem(new FMenuItem(Forge.getLocalizer().getMessage("lblAutoYields"), Forge.hdbuttons ? FSkinImage.HDYIELD : FSkinImage.WARNING, new FEventHandler() { @Override public void handleEvent(FEvent e) { - final boolean autoYieldsDisabled = MatchController.instance.getDisableAutoYields(); + final boolean autoYieldsDisabled = MatchController.instance.getGameController().getDisableAutoYields(); final VAutoYields autoYields = new VAutoYields() { @Override public void setVisible(boolean b0) { super.setVisible(b0); if (!b0) { - if (autoYieldsDisabled && !MatchController.instance.getDisableAutoYields()) { + if (autoYieldsDisabled && !MatchController.instance.getGameController().getDisableAutoYields()) { //if re-enabling auto-yields, auto-yield to current ability on stack if applicable if (MatchController.instance.getGameView().peekStack() != null) { final String key = MatchController.instance.getGameView().peekStack().getKey(); - final boolean autoYield = MatchController.instance.shouldAutoYield(key); - MatchController.instance.setShouldAutoYield(key, !autoYield); - if (!autoYield && MatchController.instance.shouldAutoYield(key)) { + final boolean autoYield = MatchController.instance.getGameController().shouldAutoYield(key); + MatchController.instance.getGameController().setShouldAutoYield(key, !autoYield); + if (!autoYield && MatchController.instance.getGameController().shouldAutoYield(key)) { //auto-pass priority if ability is on top of stack MatchController.instance.getGameController().passPriority(); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index 22fa22d1771..b24a0baa3e7 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -24,7 +24,6 @@ import forge.game.zone.ZoneType; import forge.gui.card.CardDetailUtil; import forge.gui.card.CardDetailUtil.DetailColors; -import forge.gui.interfaces.IGuiGame; import forge.interfaces.IGameController; import forge.menu.FCheckBoxMenuItem; import forge.menu.FDropDown; @@ -282,7 +281,6 @@ public boolean tap(float x, float y, int count) { return true; } final GameView gameView = MatchController.instance.getGameView(); - final IGuiGame gui = MatchController.instance; final IGameController controller = MatchController.instance.getGameController(); final PlayerView player = MatchController.instance.getCurrentPlayer(); if (player != null) { //don't show menu if tapping on art @@ -291,10 +289,10 @@ public boolean tap(float x, float y, int count) { @Override protected void buildMenu() { final String key = stackInstance.getKey(); - final boolean autoYield = gui.shouldAutoYield(key); + final boolean autoYield = controller.shouldAutoYield(key); addItem(new FCheckBoxMenuItem(Forge.getLocalizer().getMessage("cbpAutoYieldMode"), autoYield, e -> { - gui.setShouldAutoYield(key, !autoYield); + controller.setShouldAutoYield(key, !autoYield); if (!autoYield && stackInstance.equals(gameView.peekStack())) { //auto-pass priority if ability is on top of stack controller.passPriority(); @@ -303,13 +301,13 @@ protected void buildMenu() { if (stackInstance.isOptionalTrigger() && stackInstance.getActivatingPlayer().equals(player)) { final int triggerID = stackInstance.getSourceTrigger(); addItem(new FCheckBoxMenuItem(Forge.getLocalizer().getMessage("lblAlwaysYes"), - gui.shouldAlwaysAcceptTrigger(triggerID), + controller.shouldAlwaysAcceptTrigger(triggerID), e -> { - if (gui.shouldAlwaysAcceptTrigger(triggerID)) { - gui.setShouldAlwaysAskTrigger(triggerID); + if (controller.shouldAlwaysAcceptTrigger(triggerID)) { + controller.setShouldAlwaysAskTrigger(triggerID); } else { - gui.setShouldAlwaysAcceptTrigger(triggerID); + controller.setShouldAlwaysAcceptTrigger(triggerID); if (stackInstance.equals(gameView.peekStack())) { //auto-yes if ability is on top of stack controller.selectButtonOk(); @@ -317,13 +315,13 @@ protected void buildMenu() { } })); addItem(new FCheckBoxMenuItem(Forge.getLocalizer().getMessage("lblAlwaysNo"), - gui.shouldAlwaysDeclineTrigger(triggerID), + controller.shouldAlwaysDeclineTrigger(triggerID), e -> { - if (gui.shouldAlwaysDeclineTrigger(triggerID)) { - gui.setShouldAlwaysAskTrigger(triggerID); + if (controller.shouldAlwaysDeclineTrigger(triggerID)) { + controller.setShouldAlwaysAskTrigger(triggerID); } else { - gui.setShouldAlwaysDeclineTrigger(triggerID); + controller.setShouldAlwaysDeclineTrigger(triggerID); if (stackInstance.equals(gameView.peekStack())) { //auto-no if ability is on top of stack controller.selectButtonCancel(); diff --git a/forge-gui/src/main/java/forge/gamemodes/match/AbstractGuiGame.java b/forge-gui/src/main/java/forge/gamemodes/match/AbstractGuiGame.java index f520efcde2b..243deee6d8d 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/AbstractGuiGame.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/AbstractGuiGame.java @@ -18,10 +18,7 @@ import forge.gui.interfaces.IGuiGame; import forge.gui.interfaces.IMayViewCards; import forge.interfaces.IGameController; -import forge.localinstance.properties.ForgeConstants; -import forge.localinstance.properties.ForgePreferences; import forge.localinstance.skin.FSkinProp; -import forge.model.FModel; import forge.player.PlayerControllerHuman; import forge.player.PlayerZoneUpdate; import forge.trackable.TrackableCollection; @@ -589,72 +586,6 @@ public final void updateAutoPassPrompt() { } // End auto-yield/input code - // Abilities to auto-yield to - private final Set autoYields = Sets.newHashSet(); - - public final Iterable getAutoYields() { - return autoYields; - } - - @Override - public final boolean shouldAutoYield(final String key) { - String abilityKey = key.contains("): ") ? key.substring(key.indexOf("): ") + 3) : key; - boolean yieldPerAbility = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_AUTO_YIELD_MODE).equals(ForgeConstants.AUTO_YIELD_PER_ABILITY); - - return !getDisableAutoYields() && autoYields.contains(yieldPerAbility ? abilityKey : key); - } - @Override - public final void setShouldAutoYield(final String key, final boolean autoYield) { - String abilityKey = key.contains("): ") ? key.substring(key.indexOf("): ") + 3) : key; - boolean yieldPerAbility = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_AUTO_YIELD_MODE).equals(ForgeConstants.AUTO_YIELD_PER_ABILITY); - - if (autoYield) { - autoYields.add(yieldPerAbility ? abilityKey : key); - } else { - autoYields.remove(yieldPerAbility ? abilityKey : key); - } - } - - private boolean disableAutoYields; - public final boolean getDisableAutoYields() { - return disableAutoYields; - } - public final void setDisableAutoYields(final boolean b0) { - disableAutoYields = b0; - } - - @Override - public final void clearAutoYields() { - autoYields.clear(); - triggersAlwaysAccept.clear(); - } - - // Triggers preliminary choice: ask, decline or play - private final Map triggersAlwaysAccept = Maps.newTreeMap(); - - @Override - public final boolean shouldAlwaysAcceptTrigger(final int trigger) { - return Boolean.TRUE.equals(triggersAlwaysAccept.get(trigger)); - } - @Override - public final boolean shouldAlwaysDeclineTrigger(final int trigger) { - return Boolean.FALSE.equals(triggersAlwaysAccept.get(trigger)); - } - @Override - public final void setShouldAlwaysAcceptTrigger(final int trigger) { - triggersAlwaysAccept.put(trigger, Boolean.TRUE); - } - @Override - public final void setShouldAlwaysDeclineTrigger(final int trigger) { - triggersAlwaysAccept.put(trigger, Boolean.FALSE); - } - @Override - public final void setShouldAlwaysAskTrigger(final int trigger) { - triggersAlwaysAccept.remove(trigger); - } - - // End of Triggers preliminary choice - /** * Convenience for getChoices(message, 0, 1, choices). * diff --git a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java index 7d31c9383bf..97332d881a4 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/HostedMatch.java @@ -371,7 +371,7 @@ public void endCurrentGame() { humanController.getGui().setGameSpeed(PlaybackSpeed.NORMAL); if (FModel.getPreferences().getPref(FPref.UI_AUTO_YIELD_MODE).equals(ForgeConstants.AUTO_YIELD_PER_CARD) || isMatchOver()) { // when autoyielding per card, we need to clear auto yields between games since card IDs change - humanController.getGui().clearAutoYields(); + humanController.clearAutoYields(); } if (humanCount > 0) //conceded diff --git a/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java index 156ca8289ff..3ea4c4f64c9 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java @@ -95,7 +95,10 @@ public enum ProtocolMethod implements IHasForgeLog { alphaStrike (Mode.CLIENT, Void.TYPE), reorderHand (Mode.CLIENT, Void.TYPE, CardView.class, Integer.TYPE), requestResync (Mode.CLIENT, Void.TYPE), - ; + setShouldAutoYield (Mode.CLIENT, Void.TYPE, String.class, Boolean.TYPE), + setShouldAlwaysAcceptTrigger (Mode.CLIENT, Void.TYPE, Integer.TYPE), + setShouldAlwaysDeclineTrigger (Mode.CLIENT, Void.TYPE, Integer.TYPE), + setShouldAlwaysAskTrigger (Mode.CLIENT, Void.TYPE, Integer.TYPE); private enum Mode { SERVER(IGuiGame.class), diff --git a/forge-gui/src/main/java/forge/gamemodes/net/client/NetGameController.java b/forge-gui/src/main/java/forge/gamemodes/net/client/NetGameController.java index e90a5768bc5..0044ede05e4 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/client/NetGameController.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/client/NetGameController.java @@ -1,5 +1,7 @@ package forge.gamemodes.net.client; +import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import forge.game.card.CardView; import forge.game.player.PlayerView; import forge.game.player.actions.PlayerAction; @@ -10,13 +12,24 @@ import forge.interfaces.IDevModeCheats; import forge.interfaces.IGameController; import forge.interfaces.IMacroSystem; +import forge.localinstance.properties.ForgeConstants; +import forge.localinstance.properties.ForgePreferences; +import forge.model.FModel; import forge.util.ITriggerEvent; import java.util.List; +import java.util.Map; +import java.util.Set; public class NetGameController implements IGameController { private final GameProtocolSender sender; + + // Local mirror of yield state for UI display + private final Set autoYields = Sets.newHashSet(); + private final Map triggersAlwaysAccept = Maps.newTreeMap(); + private boolean disableAutoYields; + public NetGameController(final IToServer server) { this.sender = new GameProtocolSender(server); } @@ -126,6 +139,76 @@ public void requestResync() { send(ProtocolMethod.requestResync); } + @Override + public boolean shouldAutoYield(final String key) { + String abilityKey = key.contains("): ") ? key.substring(key.indexOf("): ") + 3) : key; + boolean yieldPerAbility = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_AUTO_YIELD_MODE) + .equals(ForgeConstants.AUTO_YIELD_PER_ABILITY); + return !disableAutoYields && autoYields.contains(yieldPerAbility ? abilityKey : key); + } + + @Override + public void setShouldAutoYield(final String key, final boolean autoYield) { + String abilityKey = key.contains("): ") ? key.substring(key.indexOf("): ") + 3) : key; + boolean yieldPerAbility = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_AUTO_YIELD_MODE) + .equals(ForgeConstants.AUTO_YIELD_PER_ABILITY); + if (autoYield) { + autoYields.add(yieldPerAbility ? abilityKey : key); + } else { + autoYields.remove(yieldPerAbility ? abilityKey : key); + } + send(ProtocolMethod.setShouldAutoYield, key, autoYield); + } + + @Override + public Iterable getAutoYields() { + return autoYields; + } + + @Override + public void clearAutoYields() { + autoYields.clear(); + triggersAlwaysAccept.clear(); + } + + @Override + public boolean getDisableAutoYields() { + return disableAutoYields; + } + + @Override + public void setDisableAutoYields(final boolean disable) { + disableAutoYields = disable; + } + + @Override + public boolean shouldAlwaysAcceptTrigger(final int trigger) { + return Boolean.TRUE.equals(triggersAlwaysAccept.get(trigger)); + } + + @Override + public boolean shouldAlwaysDeclineTrigger(final int trigger) { + return Boolean.FALSE.equals(triggersAlwaysAccept.get(trigger)); + } + + @Override + public void setShouldAlwaysAcceptTrigger(final int trigger) { + triggersAlwaysAccept.put(trigger, Boolean.TRUE); + send(ProtocolMethod.setShouldAlwaysAcceptTrigger, trigger); + } + + @Override + public void setShouldAlwaysDeclineTrigger(final int trigger) { + triggersAlwaysAccept.put(trigger, Boolean.FALSE); + send(ProtocolMethod.setShouldAlwaysDeclineTrigger, trigger); + } + + @Override + public void setShouldAlwaysAskTrigger(final int trigger) { + triggersAlwaysAccept.remove(trigger); + send(ProtocolMethod.setShouldAlwaysAskTrigger, trigger); + } + private IMacroSystem macros; @Override public IMacroSystem macros() { diff --git a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java index 53d64686f36..c05334de5a4 100644 --- a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java @@ -272,18 +272,6 @@ default void handleGameEvents(List events) { void updateAutoPassPrompt(); - boolean shouldAutoYield(String key); - void setShouldAutoYield(String key, boolean autoYield); - - boolean shouldAlwaysAcceptTrigger(int trigger); - boolean shouldAlwaysDeclineTrigger(int trigger); - - void setShouldAlwaysAcceptTrigger(int trigger); - void setShouldAlwaysDeclineTrigger(int trigger); - void setShouldAlwaysAskTrigger(int trigger); - - void clearAutoYields(); - void setCurrentPlayer(PlayerView player); /** diff --git a/forge-gui/src/main/java/forge/interfaces/IGameController.java b/forge-gui/src/main/java/forge/interfaces/IGameController.java index 9db5d278396..d13992a9dc0 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGameController.java +++ b/forge-gui/src/main/java/forge/interfaces/IGameController.java @@ -52,4 +52,18 @@ public interface IGameController { */ void requestResync(); + // --- Auto-yield preferences (per-player) --- + boolean shouldAutoYield(String key); + void setShouldAutoYield(String key, boolean autoYield); + Iterable getAutoYields(); + void clearAutoYields(); + boolean getDisableAutoYields(); + void setDisableAutoYields(boolean disable); + + // --- Trigger accept/decline preferences (per-player) --- + boolean shouldAlwaysAcceptTrigger(int trigger); + boolean shouldAlwaysDeclineTrigger(int trigger); + void setShouldAlwaysAcceptTrigger(int trigger); + void setShouldAlwaysDeclineTrigger(int trigger); + void setShouldAlwaysAskTrigger(int trigger); } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index bb1764ec01b..4e48e147b42 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -95,10 +95,13 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont * library. */ private boolean mayLookAtAllCards = false; - private boolean disableAutoYields = false; private IGuiGame gui; + private final Set autoYields = Sets.newHashSet(); + private final Map triggersAlwaysAccept = Maps.newTreeMap(); + private boolean disableAutoYields; + protected final InputQueue inputQueue; protected final InputProxy inputProxy; @@ -139,13 +142,6 @@ public PlayerView getLocalPlayerView() { return player == null ? null : player.getView(); } - public boolean getDisableAutoYields() { - return disableAutoYields; - } - public void setDisableAutoYields(final boolean disableAutoYields0) { - disableAutoYields = disableAutoYields0; - } - @Override public boolean mayLookAtAllCards() { return mayLookAtAllCards; @@ -777,10 +773,10 @@ public boolean confirmStaticApplication(final Card hostCard, PlayerActionConfirm public boolean confirmTrigger(final WrappedAbility wrapper) { final SpellAbility sa = wrapper.getWrappedAbility(); final Trigger regtrig = wrapper.getTrigger(); - if (getGui().shouldAlwaysAcceptTrigger(regtrig.getId())) { + if (shouldAlwaysAcceptTrigger(regtrig.getId())) { return true; } - if (getGui().shouldAlwaysDeclineTrigger(regtrig.getId())) { + if (shouldAlwaysDeclineTrigger(regtrig.getId())) { return false; } @@ -1538,7 +1534,7 @@ public List chooseSpellAbilityToPlay() { } } else { final SpellAbility ability = stack.peekAbility(); - if (ability != null && ability.isAbility() && getGui().shouldAutoYield(ability.yieldKey())) { + if (ability != null && ability.isAbility() && shouldAutoYield(ability.yieldKey())) { // avoid prompt for input if top ability of stack is set to auto-yield try { Thread.sleep(FControlGamePlayback.resolveDelay); @@ -3481,4 +3477,69 @@ public void requestResync() { // No-op for local games - resync is only used for network play } + @Override + public boolean shouldAutoYield(final String key) { + String abilityKey = key.contains("): ") ? key.substring(key.indexOf("): ") + 3) : key; + boolean yieldPerAbility = FModel.getPreferences().getPref(FPref.UI_AUTO_YIELD_MODE) + .equals(ForgeConstants.AUTO_YIELD_PER_ABILITY); + return !disableAutoYields && autoYields.contains(yieldPerAbility ? abilityKey : key); + } + + @Override + public void setShouldAutoYield(final String key, final boolean autoYield) { + String abilityKey = key.contains("): ") ? key.substring(key.indexOf("): ") + 3) : key; + boolean yieldPerAbility = FModel.getPreferences().getPref(FPref.UI_AUTO_YIELD_MODE) + .equals(ForgeConstants.AUTO_YIELD_PER_ABILITY); + if (autoYield) { + autoYields.add(yieldPerAbility ? abilityKey : key); + } else { + autoYields.remove(yieldPerAbility ? abilityKey : key); + } + } + + @Override + public Iterable getAutoYields() { + return autoYields; + } + + @Override + public void clearAutoYields() { + autoYields.clear(); + triggersAlwaysAccept.clear(); + } + + @Override + public boolean getDisableAutoYields() { + return disableAutoYields; + } + + @Override + public void setDisableAutoYields(final boolean disable) { + disableAutoYields = disable; + } + + @Override + public boolean shouldAlwaysAcceptTrigger(final int trigger) { + return Boolean.TRUE.equals(triggersAlwaysAccept.get(trigger)); + } + + @Override + public boolean shouldAlwaysDeclineTrigger(final int trigger) { + return Boolean.FALSE.equals(triggersAlwaysAccept.get(trigger)); + } + + @Override + public void setShouldAlwaysAcceptTrigger(final int trigger) { + triggersAlwaysAccept.put(trigger, Boolean.TRUE); + } + + @Override + public void setShouldAlwaysDeclineTrigger(final int trigger) { + triggersAlwaysAccept.put(trigger, Boolean.FALSE); + } + + @Override + public void setShouldAlwaysAskTrigger(final int trigger) { + triggersAlwaysAccept.remove(trigger); + } }