mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 03:08:02 +00:00
Merge branch 'master' into 'master'
Basic support for auto-yield keyboard shortcuts on mobile Forge (Y / N) See merge request core-developers/forge!5477
This commit is contained in:
@@ -9,6 +9,9 @@ import java.util.Set;
|
|||||||
|
|
||||||
import forge.animation.ForgeAnimation;
|
import forge.animation.ForgeAnimation;
|
||||||
import forge.assets.FImage;
|
import forge.assets.FImage;
|
||||||
|
import forge.game.spellability.StackItemView;
|
||||||
|
import forge.gui.interfaces.IGuiGame;
|
||||||
|
import forge.util.collect.FCollectionView;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import com.badlogic.gdx.Input.Keys;
|
import com.badlogic.gdx.Input.Keys;
|
||||||
@@ -440,46 +443,109 @@ public class MatchScreen extends FScreen {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean keyDown(int keyCode) {
|
public boolean keyDown(int keyCode) {
|
||||||
|
// TODO: make the keyboard shortcuts configurable on Mobile
|
||||||
switch (keyCode) {
|
switch (keyCode) {
|
||||||
case Keys.ENTER:
|
case Keys.ENTER:
|
||||||
case Keys.SPACE:
|
case Keys.SPACE:
|
||||||
if (getActivePrompt().getBtnOk().trigger()) { //trigger OK on Enter or Space
|
if (getActivePrompt().getBtnOk().trigger()) { //trigger OK on Enter or Space
|
||||||
return true;
|
return true;
|
||||||
}
|
|
||||||
return getActivePrompt().getBtnCancel().trigger(); //trigger Cancel if can't trigger OK
|
|
||||||
case Keys.ESCAPE:
|
|
||||||
if (!FModel.getPreferences().getPrefBoolean(FPref.UI_ALLOW_ESC_TO_END_TURN)) {
|
|
||||||
if (getActivePrompt().getBtnCancel().getText().equals(Localizer.getInstance().getMessage("lblEndTurn"))) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
}
|
return getActivePrompt().getBtnCancel().trigger(); //trigger Cancel if can't trigger OK
|
||||||
return getActivePrompt().getBtnCancel().trigger(); //otherwise trigger Cancel
|
case Keys.ESCAPE:
|
||||||
case Keys.BACK:
|
if (!FModel.getPreferences().getPrefBoolean(FPref.UI_ALLOW_ESC_TO_END_TURN)) {
|
||||||
return true; //suppress Back button so it's not bumped when trying to press OK or Cancel buttons
|
if (getActivePrompt().getBtnCancel().getText().equals(Localizer.getInstance().getMessage("lblEndTurn"))) {
|
||||||
case Keys.A: //alpha strike on Ctrl+A on Android, A when running on desktop
|
return false;
|
||||||
if (KeyInputAdapter.isCtrlKeyDown() || GuiBase.getInterface().isRunningOnDesktop()) {
|
}
|
||||||
getGameController().alphaStrike();
|
}
|
||||||
return true;
|
return getActivePrompt().getBtnCancel().trigger(); //otherwise trigger Cancel
|
||||||
}
|
case Keys.BACK:
|
||||||
break;
|
return true; //suppress Back button so it's not bumped when trying to press OK or Cancel buttons
|
||||||
case Keys.E: //end turn on Ctrl+E on Android, E when running on desktop
|
case Keys.A: //alpha strike on Ctrl+A on Android, A when running on desktop
|
||||||
if (KeyInputAdapter.isCtrlKeyDown() || GuiBase.getInterface().isRunningOnDesktop()) {
|
if (KeyInputAdapter.isCtrlKeyDown() || GuiBase.getInterface().isRunningOnDesktop()) {
|
||||||
getGameController().passPriorityUntilEndOfTurn();
|
getGameController().alphaStrike();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Keys.Q: //concede game on Ctrl+Q
|
case Keys.E: //end turn on Ctrl+E on Android, E when running on desktop
|
||||||
if (KeyInputAdapter.isCtrlKeyDown()) {
|
if (KeyInputAdapter.isCtrlKeyDown() || GuiBase.getInterface().isRunningOnDesktop()) {
|
||||||
MatchController.instance.concede();
|
getGameController().passPriorityUntilEndOfTurn();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Keys.Z: //undo on Ctrl+Z
|
case Keys.Q: //concede game on Ctrl+Q
|
||||||
if (KeyInputAdapter.isCtrlKeyDown()) {
|
if (KeyInputAdapter.isCtrlKeyDown()) {
|
||||||
getGameController().undoLastAction();
|
MatchController.instance.concede();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
case Keys.Z: //undo on Ctrl+Z
|
||||||
|
if (KeyInputAdapter.isCtrlKeyDown()) {
|
||||||
|
getGameController().undoLastAction();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
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<StackItemView> stack = MatchController.instance.getGameView().getStack();
|
||||||
|
if (stack.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
StackItemView stackInstance = stack.getLast();
|
||||||
|
final int triggerID = stackInstance.getSourceTrigger();
|
||||||
|
|
||||||
|
if (gui.shouldAlwaysAcceptTrigger(triggerID)) {
|
||||||
|
gui.setShouldAlwaysAskTrigger(triggerID);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gui.setShouldAlwaysAcceptTrigger(triggerID);
|
||||||
|
if (stackInstance.equals(gameView.peekStack())) {
|
||||||
|
//auto-yes if ability is on top of stack
|
||||||
|
controller.selectButtonOk();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final String key = stackInstance.getKey();
|
||||||
|
gui.setShouldAutoYield(key, true);
|
||||||
|
if (stackInstance.equals(gameView.peekStack())) {
|
||||||
|
//auto-pass priority if ability is on top of stack
|
||||||
|
controller.passPriority();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
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<StackItemView> stack = MatchController.instance.getGameView().getStack();
|
||||||
|
if (stack.isEmpty()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
StackItemView stackInstance = stack.getLast();
|
||||||
|
final int triggerID = stackInstance.getSourceTrigger();
|
||||||
|
|
||||||
|
if (gui.shouldAlwaysDeclineTrigger(triggerID)) {
|
||||||
|
gui.setShouldAlwaysAskTrigger(triggerID);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
gui.setShouldAlwaysDeclineTrigger(triggerID);
|
||||||
|
if (stackInstance.equals(gameView.peekStack())) {
|
||||||
|
//auto-no if ability is on top of stack
|
||||||
|
controller.selectButtonCancel();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
final String key = stackInstance.getKey();
|
||||||
|
gui.setShouldAutoYield(key, true);
|
||||||
|
if (stackInstance.equals(gameView.peekStack())) {
|
||||||
|
//auto-pass priority if ability is on top of stack
|
||||||
|
controller.passPriority();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
return super.keyDown(keyCode);
|
return super.keyDown(keyCode);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user