mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 11:48:02 +00:00
Refactor code to prevent duplication of match code
This commit is contained in:
5
.gitattributes
vendored
5
.gitattributes
vendored
@@ -1207,7 +1207,7 @@ forge-gui-mobile/src/forge/screens/draft/DraftScreen.java -text
|
|||||||
forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java -text
|
forge-gui-mobile/src/forge/screens/draft/DraftingProcessScreen.java -text
|
||||||
forge-gui-mobile/src/forge/screens/gauntlet/GauntletScreen.java -text
|
forge-gui-mobile/src/forge/screens/gauntlet/GauntletScreen.java -text
|
||||||
forge-gui-mobile/src/forge/screens/home/HomeScreen.java -text
|
forge-gui-mobile/src/forge/screens/home/HomeScreen.java -text
|
||||||
forge-gui-mobile/src/forge/screens/match/FControl.java -text
|
forge-gui-mobile/src/forge/screens/match/MatchController.java -text
|
||||||
forge-gui-mobile/src/forge/screens/match/MatchScreen.java -text
|
forge-gui-mobile/src/forge/screens/match/MatchScreen.java -text
|
||||||
forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java -text
|
forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java -text
|
||||||
forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java -text
|
forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java -text
|
||||||
@@ -16981,7 +16981,9 @@ forge-gui/src/main/java/forge/limited/SealedDeckBuilder.java svneol=native#text/
|
|||||||
forge-gui/src/main/java/forge/limited/WinstonDraft.java -text
|
forge-gui/src/main/java/forge/limited/WinstonDraft.java -text
|
||||||
forge-gui/src/main/java/forge/limited/WinstonDraftAI.java -text
|
forge-gui/src/main/java/forge/limited/WinstonDraftAI.java -text
|
||||||
forge-gui/src/main/java/forge/limited/package-info.java svneol=native#text/plain
|
forge-gui/src/main/java/forge/limited/package-info.java svneol=native#text/plain
|
||||||
|
forge-gui/src/main/java/forge/match/IMatchController.java -text
|
||||||
forge-gui/src/main/java/forge/match/MatchConstants.java -text
|
forge-gui/src/main/java/forge/match/MatchConstants.java -text
|
||||||
|
forge-gui/src/main/java/forge/match/MatchUtil.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/ButtonUtil.java -text
|
forge-gui/src/main/java/forge/match/input/ButtonUtil.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/Input.java -text
|
forge-gui/src/main/java/forge/match/input/Input.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/InputAttack.java -text
|
forge-gui/src/main/java/forge/match/input/InputAttack.java -text
|
||||||
@@ -16990,7 +16992,6 @@ forge-gui/src/main/java/forge/match/input/InputBlock.java -text
|
|||||||
forge-gui/src/main/java/forge/match/input/InputConfirm.java -text
|
forge-gui/src/main/java/forge/match/input/InputConfirm.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java -text
|
forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/InputLockUI.java -text
|
forge-gui/src/main/java/forge/match/input/InputLockUI.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/InputNone.java -text
|
|
||||||
forge-gui/src/main/java/forge/match/input/InputPassPriority.java -text
|
forge-gui/src/main/java/forge/match/input/InputPassPriority.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/InputPayMana.java -text
|
forge-gui/src/main/java/forge/match/input/InputPayMana.java -text
|
||||||
forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java -text
|
forge-gui/src/main/java/forge/match/input/InputPayManaOfCostPayment.java -text
|
||||||
|
|||||||
@@ -4,88 +4,48 @@ import java.awt.Desktop;
|
|||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Toolkit;
|
import java.awt.Toolkit;
|
||||||
import java.awt.datatransfer.StringSelection;
|
import java.awt.datatransfer.StringSelection;
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.lang.reflect.InvocationTargetException;
|
import java.lang.reflect.InvocationTargetException;
|
||||||
import java.net.URI;
|
import java.net.URI;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JFileChooser;
|
import javax.swing.JFileChooser;
|
||||||
import javax.swing.JPopupMenu;
|
|
||||||
import javax.swing.KeyStroke;
|
|
||||||
import javax.swing.MenuElement;
|
|
||||||
import javax.swing.MenuSelectionManager;
|
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.assets.ISkinImage;
|
import forge.assets.ISkinImage;
|
||||||
import forge.control.FControl;
|
|
||||||
import forge.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
import forge.error.BugReportDialog;
|
import forge.error.BugReportDialog;
|
||||||
import forge.events.UiEvent;
|
|
||||||
import forge.game.GameObject;
|
import forge.game.GameObject;
|
||||||
import forge.game.GameType;
|
|
||||||
import forge.game.Match;
|
|
||||||
import forge.game.phase.PhaseType;
|
|
||||||
import forge.game.player.IHasIcon;
|
import forge.game.player.IHasIcon;
|
||||||
import forge.game.player.RegisteredPlayer;
|
|
||||||
import forge.game.zone.ZoneType;
|
|
||||||
import forge.gui.BoxedProductCardListViewer;
|
import forge.gui.BoxedProductCardListViewer;
|
||||||
import forge.gui.CardListViewer;
|
import forge.gui.CardListViewer;
|
||||||
import forge.gui.FNetOverlay;
|
|
||||||
import forge.gui.GuiChoose;
|
import forge.gui.GuiChoose;
|
||||||
import forge.gui.GuiUtils;
|
|
||||||
import forge.gui.SOverlayUtils;
|
|
||||||
import forge.gui.framework.FScreen;
|
import forge.gui.framework.FScreen;
|
||||||
import forge.gui.framework.SDisplayUtil;
|
|
||||||
import forge.gui.framework.SLayoutIO;
|
|
||||||
import forge.interfaces.IButton;
|
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.screens.deckeditor.CDeckEditorUI;
|
import forge.screens.deckeditor.CDeckEditorUI;
|
||||||
import forge.screens.deckeditor.controllers.CEditorQuestCardShop;
|
import forge.screens.deckeditor.controllers.CEditorQuestCardShop;
|
||||||
import forge.screens.match.CMatchUI;
|
import forge.screens.match.CMatchUI;
|
||||||
import forge.screens.match.VMatchUI;
|
|
||||||
import forge.screens.match.ViewWinLose;
|
|
||||||
import forge.screens.match.controllers.CPrompt;
|
|
||||||
import forge.screens.match.controllers.CStack;
|
|
||||||
import forge.screens.match.views.VField;
|
|
||||||
import forge.screens.match.views.VHand;
|
|
||||||
import forge.screens.match.views.VPrompt;
|
|
||||||
import forge.sound.AltSoundSystem;
|
import forge.sound.AltSoundSystem;
|
||||||
import forge.sound.AudioClip;
|
import forge.sound.AudioClip;
|
||||||
import forge.sound.AudioMusic;
|
import forge.sound.AudioMusic;
|
||||||
import forge.sound.IAudioClip;
|
import forge.sound.IAudioClip;
|
||||||
import forge.sound.IAudioMusic;
|
import forge.sound.IAudioMusic;
|
||||||
import forge.toolbox.FButton;
|
|
||||||
import forge.toolbox.FOptionPane;
|
import forge.toolbox.FOptionPane;
|
||||||
import forge.toolbox.FSkin;
|
import forge.toolbox.FSkin;
|
||||||
import forge.toolbox.FSkin.SkinImage;
|
import forge.toolbox.FSkin.SkinImage;
|
||||||
import forge.toolbox.MouseTriggerEvent;
|
|
||||||
import forge.toolbox.special.PhaseLabel;
|
|
||||||
import forge.util.BuildInfo;
|
import forge.util.BuildInfo;
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
import forge.util.ITriggerEvent;
|
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
import forge.view.CombatView;
|
|
||||||
import forge.view.GameEntityView;
|
|
||||||
import forge.view.PlayerView;
|
|
||||||
import forge.view.SpellAbilityView;
|
|
||||||
|
|
||||||
public class GuiDesktop implements IGuiBase {
|
public class GuiDesktop implements IGuiBase {
|
||||||
private boolean showOverlay = true;
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean isRunningOnDesktop() {
|
public boolean isRunningOnDesktop() {
|
||||||
return true;
|
return true;
|
||||||
@@ -233,165 +193,6 @@ public class GuiDesktop implements IGuiBase {
|
|||||||
return viewer.skipTheRest();
|
return viewer.skipTheRest();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public IButton getBtnOK(PlayerView playerView) {
|
|
||||||
return VMatchUI.SINGLETON_INSTANCE.getBtnOK();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IButton getBtnCancel(PlayerView playerView) {
|
|
||||||
return VMatchUI.SINGLETON_INSTANCE.getBtnCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void focusButton(final IButton button) {
|
|
||||||
// ensure we don't steal focus from an overlay
|
|
||||||
if (!SOverlayUtils.overlayHasFocus()) {
|
|
||||||
FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
((FButton)button).requestFocusInWindow();
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void flashIncorrectAction() {
|
|
||||||
SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updatePhase() {
|
|
||||||
final PlayerView p = Singletons.getControl().getGameView().getPlayerTurn();
|
|
||||||
final PhaseType ph = Singletons.getControl().getGameView().getPhase();
|
|
||||||
final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE;
|
|
||||||
PhaseLabel lbl = matchUi.getFieldViewFor(p).getPhaseIndicator().getLabelFor(ph);
|
|
||||||
|
|
||||||
matchUi.resetAllPhaseButtons();
|
|
||||||
if (lbl != null) {
|
|
||||||
lbl.setActive(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateTurn(final PlayerView player) {
|
|
||||||
VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(player);
|
|
||||||
SDisplayUtil.showTab(nextField);
|
|
||||||
CPrompt.SINGLETON_INSTANCE.updateText();
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.repaintCardOverlays();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updatePlayerControl() {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.initHandViews();
|
|
||||||
SLayoutIO.loadLayout(null);
|
|
||||||
VMatchUI.SINGLETON_INSTANCE.populate();
|
|
||||||
for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) {
|
|
||||||
h.getLayoutControl().updateHand();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disableOverlay() {
|
|
||||||
showOverlay = false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void enableOverlay() {
|
|
||||||
showOverlay = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void finishGame() {
|
|
||||||
new ViewWinLose(Singletons.getControl().getGameView());
|
|
||||||
if (showOverlay) {
|
|
||||||
SOverlayUtils.showOverlay();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateStack() {
|
|
||||||
CStack.SINGLETON_INSTANCE.update();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void startMatch(GameType gameType, List<RegisteredPlayer> players) {
|
|
||||||
FControl.instance.startMatch(gameType, players);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPanelSelection(final CardView c) {
|
|
||||||
GuiUtils.setPanelSelection(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getAbilityToPlay(List<SpellAbilityView> abilities, ITriggerEvent triggerEvent) {
|
|
||||||
if (triggerEvent == null) {
|
|
||||||
if (abilities.isEmpty()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (abilities.size() == 1) {
|
|
||||||
return abilities.get(0).getId();
|
|
||||||
}
|
|
||||||
final SpellAbilityView choice = GuiChoose.oneOrNone("Choose ability to play", abilities);
|
|
||||||
return choice == null ? -1 : choice.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (abilities.isEmpty()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (abilities.size() == 1 && !abilities.get(0).isPromptIfOnlyPossibleAbility()) {
|
|
||||||
if (abilities.get(0).canPlay()) {
|
|
||||||
return abilities.get(0).getId(); //only return ability if it's playable, otherwise return null
|
|
||||||
}
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
//show menu if mouse was trigger for ability
|
|
||||||
final JPopupMenu menu = new JPopupMenu("Abilities");
|
|
||||||
|
|
||||||
boolean enabled;
|
|
||||||
boolean hasEnabled = false;
|
|
||||||
int shortcut = KeyEvent.VK_1; //use number keys as shortcuts for abilities 1-9
|
|
||||||
for (final SpellAbilityView ab : abilities) {
|
|
||||||
enabled = ab.canPlay();
|
|
||||||
if (enabled) {
|
|
||||||
hasEnabled = true;
|
|
||||||
}
|
|
||||||
GuiUtils.addMenuItem(menu, FSkin.encodeSymbols(ab.toString(), true),
|
|
||||||
shortcut > 0 ? KeyStroke.getKeyStroke(shortcut, 0) : null,
|
|
||||||
new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
CPrompt.SINGLETON_INSTANCE.selectAbility(ab);
|
|
||||||
}
|
|
||||||
}, enabled);
|
|
||||||
if (shortcut > 0) {
|
|
||||||
shortcut++;
|
|
||||||
if (shortcut > KeyEvent.VK_9) {
|
|
||||||
shortcut = 0; //stop adding shortcuts after 9
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (hasEnabled) { //only show menu if at least one ability can be played
|
|
||||||
SwingUtilities.invokeLater(new Runnable() { //use invoke later to ensure first ability selected by default
|
|
||||||
public void run() {
|
|
||||||
MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, menu.getSubElements()[0]});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
MouseEvent mouseEvent = ((MouseTriggerEvent)triggerEvent).getMouseEvent();
|
|
||||||
menu.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1; //delay ability until choice made
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void hear(LobbyPlayer player, String message) {
|
|
||||||
FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAvatarCount() {
|
public int getAvatarCount() {
|
||||||
if (FSkin.isLoaded()) {
|
if (FSkin.isLoaded()) {
|
||||||
@@ -400,105 +201,11 @@ public class GuiDesktop implements IGuiBase {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fireEvent(UiEvent e) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.fireEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCard(final CardView card) {
|
public void setCard(final CardView card) {
|
||||||
CMatchUI.SINGLETON_INSTANCE.setCard(card);
|
CMatchUI.SINGLETON_INSTANCE.setCard(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showCombat(final CombatView combat) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.showCombat(combat);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUsedToPay(final CardView card, final boolean b) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.setUsedToPay(card, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setHighlighted(final PlayerView player, final boolean b) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.setHighlighted(player, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showPromptMessage(final PlayerView playerView, final String message) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.showMessage(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean stopAtPhase(final PlayerView playerTurn, PhaseType phase) {
|
|
||||||
return CMatchUI.SINGLETON_INSTANCE.stopAtPhase(playerTurn, phase);
|
|
||||||
}
|
|
||||||
|
|
||||||
public Object showManaPool(final PlayerView player) {
|
|
||||||
return null; //not needed since mana pool icons are always visible
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void hideManaPool(final PlayerView player, final Object zoneToRestore) {
|
|
||||||
//not needed since mana pool icons are always visible
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean openZones(final Collection<ZoneType> zones, final Map<PlayerView, Object> players) {
|
|
||||||
if (zones.size() == 1) {
|
|
||||||
switch (zones.iterator().next()) {
|
|
||||||
case Battlefield:
|
|
||||||
case Hand:
|
|
||||||
return true; //don't actually need to open anything, but indicate that zone can be opened
|
|
||||||
default:
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void restoreOldZones(final Map<PlayerView, Object> playersToRestoreZonesFor) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateZones(final List<Pair<PlayerView, ZoneType>> zonesToUpdate) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.updateZones(zonesToUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateCards(final Iterable<CardView> cardsToUpdate) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.updateCards(cardsToUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void refreshCardDetails(final Iterable<CardView> cards) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.refreshCardDetails(cards);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateManaPool(final List<PlayerView> manaPoolUpdate) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.updateManaPool(manaPoolUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateLives(final List<PlayerView> livesUpdate) {
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.updateLives(livesUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void endCurrentGame() {
|
|
||||||
FControl.instance.endCurrentGame(false, false);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<CardView, Integer> getDamageToAssign(final CardView attacker,
|
|
||||||
final List<CardView> blockers, final int damageDealt,
|
|
||||||
final GameEntityView defender, final boolean overrideOrder) {
|
|
||||||
return CMatchUI.SINGLETON_INSTANCE.getDamageToAssign(attacker,
|
|
||||||
blockers, damageDealt, defender, overrideOrder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String showFileDialog(String title, String defaultDir) {
|
public String showFileDialog(String title, String defaultDir) {
|
||||||
@@ -554,24 +261,6 @@ public class GuiDesktop implements IGuiBase {
|
|||||||
ImageCache.clear();
|
ImageCache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void startGame(Match match) {
|
|
||||||
SOverlayUtils.startGameOverlay();
|
|
||||||
SOverlayUtils.showOverlay();
|
|
||||||
Singletons.getControl().startGameWithUi(match);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void continueMatch(Match match) {
|
|
||||||
Singletons.getControl().endCurrentGame(false, false);
|
|
||||||
if (match == null) {
|
|
||||||
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
Singletons.getControl().startGameWithUi(match);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showSpellShop() {
|
public void showSpellShop() {
|
||||||
Singletons.getControl().setCurrentScreen(FScreen.QUEST_CARD_SHOP);
|
Singletons.getControl().setCurrentScreen(FScreen.QUEST_CARD_SHOP);
|
||||||
|
|||||||
@@ -26,69 +26,40 @@ import java.awt.event.KeyEvent;
|
|||||||
import java.awt.event.WindowAdapter;
|
import java.awt.event.WindowAdapter;
|
||||||
import java.awt.event.WindowEvent;
|
import java.awt.event.WindowEvent;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
import javax.swing.JLayeredPane;
|
import javax.swing.JLayeredPane;
|
||||||
import javax.swing.SwingUtilities;
|
import javax.swing.SwingUtilities;
|
||||||
import javax.swing.WindowConstants;
|
import javax.swing.WindowConstants;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import forge.FThreads;
|
|
||||||
import forge.GuiBase;
|
|
||||||
import forge.ImageCache;
|
import forge.ImageCache;
|
||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.ai.LobbyPlayerAi;
|
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.control.KeyboardShortcuts.Shortcut;
|
import forge.control.KeyboardShortcuts.Shortcut;
|
||||||
import forge.game.Game;
|
|
||||||
import forge.game.GameRules;
|
|
||||||
import forge.game.GameType;
|
|
||||||
import forge.game.Match;
|
|
||||||
import forge.game.player.Player;
|
|
||||||
import forge.game.player.RegisteredPlayer;
|
|
||||||
import forge.gui.GuiDialog;
|
import forge.gui.GuiDialog;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.EDocID;
|
|
||||||
import forge.gui.framework.FScreen;
|
import forge.gui.framework.FScreen;
|
||||||
import forge.gui.framework.InvalidLayoutFileException;
|
import forge.gui.framework.InvalidLayoutFileException;
|
||||||
import forge.gui.framework.SDisplayUtil;
|
|
||||||
import forge.gui.framework.SLayoutIO;
|
import forge.gui.framework.SLayoutIO;
|
||||||
import forge.gui.framework.SOverflowUtil;
|
import forge.gui.framework.SOverflowUtil;
|
||||||
import forge.gui.framework.SResizingUtil;
|
import forge.gui.framework.SResizingUtil;
|
||||||
import forge.match.input.InputQueue;
|
import forge.match.MatchUtil;
|
||||||
import forge.match.input.InputSynchronized;
|
|
||||||
import forge.menus.ForgeMenu;
|
import forge.menus.ForgeMenu;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.player.LobbyPlayerHuman;
|
|
||||||
import forge.player.PlayerControllerHuman;
|
|
||||||
import forge.properties.ForgeConstants;
|
import forge.properties.ForgeConstants;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.quest.QuestController;
|
|
||||||
import forge.quest.data.QuestPreferences.QPref;
|
import forge.quest.data.QuestPreferences.QPref;
|
||||||
import forge.quest.io.QuestDataIO;
|
import forge.quest.io.QuestDataIO;
|
||||||
import forge.screens.deckeditor.CDeckEditorUI;
|
import forge.screens.deckeditor.CDeckEditorUI;
|
||||||
import forge.screens.match.CMatchUI;
|
import forge.screens.match.CMatchUI;
|
||||||
import forge.screens.match.VMatchUI;
|
|
||||||
import forge.screens.match.views.VField;
|
|
||||||
import forge.sound.MusicPlaylist;
|
|
||||||
import forge.sound.SoundSystem;
|
|
||||||
import forge.toolbox.FOptionPane;
|
import forge.toolbox.FOptionPane;
|
||||||
import forge.toolbox.FSkin;
|
import forge.toolbox.FSkin;
|
||||||
import forge.toolbox.special.PhaseIndicator;
|
|
||||||
import forge.view.FFrame;
|
import forge.view.FFrame;
|
||||||
import forge.view.FView;
|
import forge.view.FView;
|
||||||
import forge.view.LocalGameView;
|
|
||||||
import forge.view.PlayerView;
|
|
||||||
import forge.view.WatchLocalGame;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
@@ -101,8 +72,6 @@ import forge.view.WatchLocalGame;
|
|||||||
public enum FControl implements KeyEventDispatcher {
|
public enum FControl implements KeyEventDispatcher {
|
||||||
instance;
|
instance;
|
||||||
|
|
||||||
private Game game;
|
|
||||||
private List<LocalGameView> gameViews = new ArrayList<LocalGameView>();
|
|
||||||
private ForgeMenu forgeMenu;
|
private ForgeMenu forgeMenu;
|
||||||
private List<Shortcut> shortcuts;
|
private List<Shortcut> shortcuts;
|
||||||
private JLayeredPane display;
|
private JLayeredPane display;
|
||||||
@@ -116,8 +85,6 @@ public enum FControl implements KeyEventDispatcher {
|
|||||||
EXIT_FORGE
|
EXIT_FORGE
|
||||||
}
|
}
|
||||||
|
|
||||||
private SoundSystem soundSystem;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <p>
|
* <p>
|
||||||
* FControl.
|
* FControl.
|
||||||
@@ -184,10 +151,10 @@ public enum FControl implements KeyEventDispatcher {
|
|||||||
public boolean canExitForge(boolean forRestart) {
|
public boolean canExitForge(boolean forRestart) {
|
||||||
String action = (forRestart ? "Restart" : "Exit");
|
String action = (forRestart ? "Restart" : "Exit");
|
||||||
String userPrompt = "Are you sure you wish to " + (forRestart ? "restart" : "exit") + " Forge?";
|
String userPrompt = "Are you sure you wish to " + (forRestart ? "restart" : "exit") + " Forge?";
|
||||||
if (game != null) {
|
if (MatchUtil.getGame() != null) {
|
||||||
userPrompt = "A game is currently active. " + userPrompt;
|
userPrompt = "A game is currently active. " + userPrompt;
|
||||||
}
|
}
|
||||||
if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, "Cancel", game == null)) { //default Yes if no game active
|
if (!FOptionPane.showConfirmDialog(userPrompt, action + " Forge", action, "Cancel", MatchUtil.getGame() == null)) { //default Yes if no game active
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
if (!CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(true)) {
|
if (!CDeckEditorUI.SINGLETON_INSTANCE.canSwitchAway(true)) {
|
||||||
@@ -207,11 +174,11 @@ public enum FControl implements KeyEventDispatcher {
|
|||||||
|
|
||||||
/** After view and model have been initialized, control can start.*/
|
/** After view and model have been initialized, control can start.*/
|
||||||
public void initialize() {
|
public void initialize() {
|
||||||
|
MatchUtil.setController(CMatchUI.SINGLETON_INSTANCE);
|
||||||
|
|
||||||
// Preloads skin components (using progress bar).
|
// Preloads skin components (using progress bar).
|
||||||
FSkin.loadFull(true);
|
FSkin.loadFull(true);
|
||||||
|
|
||||||
soundSystem = new SoundSystem(GuiBase.getInterface());
|
|
||||||
|
|
||||||
shortcuts = KeyboardShortcuts.attachKeyboardShortcuts();
|
shortcuts = KeyboardShortcuts.attachKeyboardShortcuts();
|
||||||
display = FView.SINGLETON_INSTANCE.getLpnDocument();
|
display = FView.SINGLETON_INSTANCE.getLpnDocument();
|
||||||
|
|
||||||
@@ -364,212 +331,6 @@ public enum FControl implements KeyEventDispatcher {
|
|||||||
if (children.length != 0) { children[0].setSize(display.getSize()); }
|
if (children.length != 0) { children[0].setSize(display.getSize()); }
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Write javadoc for this method.
|
|
||||||
* @return
|
|
||||||
*/
|
|
||||||
public SoundSystem getSoundSystem() {
|
|
||||||
return soundSystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void stopGame() {
|
|
||||||
List<Player> pp = new ArrayList<Player>();
|
|
||||||
for (Player p : game.getPlayers()) {
|
|
||||||
if (p.getOriginalLobbyPlayer() == getGuiPlayer()) {
|
|
||||||
pp.add(p);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
boolean hasHuman = !pp.isEmpty();
|
|
||||||
|
|
||||||
if (pp.isEmpty()) {
|
|
||||||
pp.addAll(game.getPlayers()); // no human? then all players surrender!
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Player p: pp) {
|
|
||||||
p.concede();
|
|
||||||
}
|
|
||||||
|
|
||||||
Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer();
|
|
||||||
boolean humanHasPriority = priorityPlayer == null || priorityPlayer.getLobbyPlayer() == getGuiPlayer();
|
|
||||||
|
|
||||||
if (hasHuman && humanHasPriority) {
|
|
||||||
game.getAction().checkGameOverCondition();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
game.isGameOver(); // this is synchronized method - it's used to make Game-0 thread see changes made here
|
|
||||||
getInputQueue().onGameOver(false); //release any waiting input, effectively passing priority
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playbackControl != null) {
|
|
||||||
playbackControl.onGameStopRequested();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public Player getCurrentPlayer() {
|
|
||||||
if (game == null) { return null; }
|
|
||||||
|
|
||||||
LobbyPlayer lobbyPlayer = getGuiPlayer();
|
|
||||||
if (gameViews.size() > 1) {
|
|
||||||
//account for if second human player is currently being prompted
|
|
||||||
InputSynchronized activeInput = InputQueue.getActiveInput();
|
|
||||||
if (activeInput != null) {
|
|
||||||
lobbyPlayer = activeInput.getOwner().getLobbyPlayer();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (Player p : game.getPlayers()) {
|
|
||||||
if (p.getLobbyPlayer() == lobbyPlayer) {
|
|
||||||
return p;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public LocalGameView getGameView() {
|
|
||||||
return getGameView(getCurrentPlayer());
|
|
||||||
}
|
|
||||||
public LocalGameView getGameView(Player player) {
|
|
||||||
switch (gameViews.size()) {
|
|
||||||
case 1:
|
|
||||||
return gameViews.get(0);
|
|
||||||
case 0:
|
|
||||||
return null;
|
|
||||||
default:
|
|
||||||
if (player != null && player.getController() instanceof PlayerControllerHuman) {
|
|
||||||
return ((PlayerControllerHuman)player.getController()).getGameView();
|
|
||||||
}
|
|
||||||
return gameViews.get(0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public InputQueue getInputQueue() {
|
|
||||||
LocalGameView gameView = getGameView();
|
|
||||||
if (gameView != null) {
|
|
||||||
return gameView.getInputQueue();
|
|
||||||
}
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void startGameWithUi(final Match match) {
|
|
||||||
if (game != null) {
|
|
||||||
setCurrentScreen(FScreen.MATCH_SCREEN);
|
|
||||||
SOverlayUtils.hideOverlay();
|
|
||||||
FOptionPane.showMessageDialog("Cannot start a new game while another game is already in progress.");
|
|
||||||
return; //TODO: See if it's possible to run multiple games at once without crashing
|
|
||||||
}
|
|
||||||
|
|
||||||
setPlayerName(match.getPlayers());
|
|
||||||
|
|
||||||
getSoundSystem().setBackgroundMusic(MusicPlaylist.MATCH);
|
|
||||||
|
|
||||||
game = match.createGame();
|
|
||||||
|
|
||||||
if (game.getRules().getGameType() == GameType.Quest) {
|
|
||||||
QuestController qc = FModel.getQuest();
|
|
||||||
// Reset new list when the Match round starts, not when each game starts
|
|
||||||
if (game.getMatch().getPlayedGames().isEmpty()) {
|
|
||||||
qc.getCards().resetNewList();
|
|
||||||
}
|
|
||||||
game.subscribeToEvents(qc); // this one listens to player's mulligans ATM
|
|
||||||
}
|
|
||||||
|
|
||||||
game.subscribeToEvents(getSoundSystem());
|
|
||||||
|
|
||||||
final String[] indices = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",");
|
|
||||||
|
|
||||||
// Instantiate all required field slots (user at 0)
|
|
||||||
final List<Player> sortedPlayers = new ArrayList<Player>(game.getRegisteredPlayers());
|
|
||||||
Collections.sort(sortedPlayers, new Comparator<Player>() {
|
|
||||||
@Override
|
|
||||||
public int compare(Player p1, Player p2) {
|
|
||||||
int v1 = p1.getController() instanceof PlayerControllerHuman ? 0 : 1;
|
|
||||||
int v2 = p2.getController() instanceof PlayerControllerHuman ? 0 : 1;
|
|
||||||
return Integer.compare(v1, v2);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
gameViews.clear();
|
|
||||||
|
|
||||||
int i = 0;
|
|
||||||
int avatarIndex = 0;
|
|
||||||
int humanCount = 0;
|
|
||||||
for (Player p : sortedPlayers) {
|
|
||||||
if (i < indices.length) {
|
|
||||||
avatarIndex = Integer.parseInt(indices[i]);
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
p.getLobbyPlayer().setAvatarIndex(avatarIndex);
|
|
||||||
|
|
||||||
if (p.getController() instanceof PlayerControllerHuman) {
|
|
||||||
final PlayerControllerHuman controller = (PlayerControllerHuman) p.getController();
|
|
||||||
LocalGameView gameView = controller.getGameView();
|
|
||||||
game.subscribeToEvents(new FControlGameEventHandler(gameView));
|
|
||||||
gameViews.add(gameView);
|
|
||||||
humanCount++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (humanCount == 0) { //watch game but do not participate
|
|
||||||
LocalGameView gameView = new WatchLocalGame(GuiBase.getInterface(), game);
|
|
||||||
gameView.setLocalPlayer(sortedPlayers.get(0));
|
|
||||||
game.subscribeToEvents(new FControlGameEventHandler(gameView));
|
|
||||||
gameViews.add(gameView);
|
|
||||||
}
|
|
||||||
else if (humanCount == sortedPlayers.size()) {
|
|
||||||
//if there are no AI's, allow all players to see all cards (hotseat mode).
|
|
||||||
for (Player p : sortedPlayers) {
|
|
||||||
((PlayerControllerHuman) p.getController()).setMayLookAtAllCards(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
List<PlayerView> sortedPlayerViews = new ArrayList<PlayerView>();
|
|
||||||
for (Player p : sortedPlayers) {
|
|
||||||
sortedPlayerViews.add(getGameView().getPlayerView(p));
|
|
||||||
}
|
|
||||||
CMatchUI.SINGLETON_INSTANCE.initMatch(sortedPlayerViews, humanCount != 1);
|
|
||||||
|
|
||||||
actuateMatchPreferences();
|
|
||||||
|
|
||||||
setCurrentScreen(FScreen.MATCH_SCREEN);
|
|
||||||
SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc());
|
|
||||||
|
|
||||||
// per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch
|
|
||||||
//Set Field shown to current player.
|
|
||||||
if (humanCount > 0) {
|
|
||||||
final VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(sortedPlayerViews.get(0));
|
|
||||||
SDisplayUtil.showTab(nextField);
|
|
||||||
}
|
|
||||||
|
|
||||||
// It's important to run match in a different thread to allow GUI inputs to be invoked from inside game.
|
|
||||||
// Game is set on pause while gui player takes decisions
|
|
||||||
game.getAction().invoke(new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
match.startGame(game);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
SOverlayUtils.hideOverlay();
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void endCurrentGame(boolean nextGame, boolean restart) {
|
|
||||||
if (game == null) { return; }
|
|
||||||
|
|
||||||
Match match = game.getMatch();
|
|
||||||
game = null;
|
|
||||||
|
|
||||||
Singletons.getView().getNavigationBar().closeTab(FScreen.MATCH_SCREEN);
|
|
||||||
|
|
||||||
if (nextGame) {
|
|
||||||
startGameWithUi(match);
|
|
||||||
}
|
|
||||||
else if (restart) {
|
|
||||||
match.clearGamesPlayed();
|
|
||||||
startGameWithUi(match);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private FControlGamePlayback playbackControl;
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see java.awt.KeyEventDispatcher#dispatchKeyEvent(java.awt.event.KeyEvent)
|
* @see java.awt.KeyEventDispatcher#dispatchKeyEvent(java.awt.event.KeyEvent)
|
||||||
*/
|
*/
|
||||||
@@ -604,136 +365,6 @@ public enum FControl implements KeyEventDispatcher {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Prompts user for a name that will be used instead of "Human" during gameplay.
|
|
||||||
* <p>
|
|
||||||
* This is a one time only event that is triggered when starting a game and the
|
|
||||||
* PLAYER_NAME setting is blank. Does not apply to a hotseat game.
|
|
||||||
*/
|
|
||||||
private void setPlayerName(List<RegisteredPlayer> players) {
|
|
||||||
final ForgePreferences prefs = FModel.getPreferences();
|
|
||||||
if (StringUtils.isBlank(prefs.getPref(FPref.PLAYER_NAME))) {
|
|
||||||
boolean isPlayerOneHuman = players.get(0).getPlayer() instanceof LobbyPlayerHuman;
|
|
||||||
boolean isPlayerTwoComputer = players.get(1).getPlayer() instanceof LobbyPlayerAi;
|
|
||||||
if (isPlayerOneHuman && isPlayerTwoComputer) {
|
|
||||||
GamePlayerUtil.setPlayerName(GuiBase.getInterface());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startMatch(GameType gameType, List<RegisteredPlayer> players) {
|
|
||||||
startMatch(gameType, null, players);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void startMatch(GameType gameType, Set<GameType> appliedVariants, List<RegisteredPlayer> players) {
|
|
||||||
boolean useRandomFoil = FModel.getPreferences().getPrefBoolean(FPref.UI_RANDOM_FOIL);
|
|
||||||
for(RegisteredPlayer rp : players) {
|
|
||||||
rp.setRandomFoil(useRandomFoil);
|
|
||||||
}
|
|
||||||
|
|
||||||
GameRules rules = new GameRules(gameType);
|
|
||||||
if (null != appliedVariants && !appliedVariants.isEmpty())
|
|
||||||
rules.setAppliedVariants(appliedVariants);
|
|
||||||
rules.setPlayForAnte(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE));
|
|
||||||
rules.setMatchAnteRarity(FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE_MATCH_RARITY));
|
|
||||||
rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
|
||||||
rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
|
||||||
|
|
||||||
final Match mc = new Match(rules, players);
|
|
||||||
SOverlayUtils.startGameOverlay();
|
|
||||||
SOverlayUtils.showOverlay();
|
|
||||||
FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable(){
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
startGameWithUi(mc);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Needs to be reworked for efficiency with rest of prefs saves in
|
|
||||||
* codebase.
|
|
||||||
*/
|
|
||||||
public void writeMatchPreferences() {
|
|
||||||
final ForgePreferences prefs = FModel.getPreferences();
|
|
||||||
final List<VField> fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
|
|
||||||
|
|
||||||
// AI field is at index [1]
|
|
||||||
PhaseIndicator fvAi = fieldViews.get(1).getPhaseIndicator();
|
|
||||||
prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLblUpkeep().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLblDraw().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLblMain1().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLblBeginCombat().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLblDeclareAttackers().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLblDeclareBlockers().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLblFirstStrike().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLblCombatDamage().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLblEndCombat().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLblMain2().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLblEndTurn().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLblCleanup().getEnabled()));
|
|
||||||
|
|
||||||
// Human field is at index [0]
|
|
||||||
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLblUpkeep().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLblDraw().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLblMain1().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLblBeginCombat().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLblDeclareAttackers().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLblDeclareBlockers().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLblFirstStrike().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLblCombatDamage().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLblEndCombat().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLblMain2().getEnabled()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLblEndTurn().getEnabled());
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLblCleanup().getEnabled());
|
|
||||||
|
|
||||||
prefs.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* TODO: Needs to be reworked for efficiency with rest of prefs saves in
|
|
||||||
* codebase.
|
|
||||||
*/
|
|
||||||
private void actuateMatchPreferences() {
|
|
||||||
final ForgePreferences prefs = FModel.getPreferences();
|
|
||||||
final List<VField> fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
|
|
||||||
|
|
||||||
// Human field is at index [0]
|
|
||||||
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
|
|
||||||
fvHuman.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP));
|
|
||||||
fvHuman.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW));
|
|
||||||
fvHuman.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1));
|
|
||||||
fvHuman.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT));
|
|
||||||
fvHuman.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS));
|
|
||||||
fvHuman.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS));
|
|
||||||
fvHuman.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE));
|
|
||||||
fvHuman.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE));
|
|
||||||
fvHuman.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT));
|
|
||||||
fvHuman.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2));
|
|
||||||
fvHuman.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT));
|
|
||||||
fvHuman.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP));
|
|
||||||
|
|
||||||
// AI field is at index [1], ...
|
|
||||||
for (int i = 1; i < fieldViews.size(); i++) {
|
|
||||||
PhaseIndicator fvAi = fieldViews.get(i).getPhaseIndicator();
|
|
||||||
fvAi.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP));
|
|
||||||
fvAi.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW));
|
|
||||||
fvAi.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1));
|
|
||||||
fvAi.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT));
|
|
||||||
fvAi.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS));
|
|
||||||
fvAi.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS));
|
|
||||||
fvAi.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE));
|
|
||||||
fvAi.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE));
|
|
||||||
fvAi.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT));
|
|
||||||
fvAi.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2));
|
|
||||||
fvAi.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_EOT));
|
|
||||||
fvAi.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP));
|
|
||||||
}
|
|
||||||
|
|
||||||
//Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS));
|
|
||||||
}
|
|
||||||
|
|
||||||
public final LobbyPlayer getGuiPlayer() {
|
public final LobbyPlayer getGuiPlayer() {
|
||||||
return GamePlayerUtil.getGuiPlayer();
|
return GamePlayerUtil.getGuiPlayer();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,11 +4,11 @@ import forge.Singletons;
|
|||||||
import forge.gui.framework.EDocID;
|
import forge.gui.framework.EDocID;
|
||||||
import forge.gui.framework.FScreen;
|
import forge.gui.framework.FScreen;
|
||||||
import forge.gui.framework.SDisplayUtil;
|
import forge.gui.framework.SDisplayUtil;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.home.settings.VSubmenuPreferences.KeyboardShortcutField;
|
import forge.screens.home.settings.VSubmenuPreferences.KeyboardShortcutField;
|
||||||
import forge.screens.match.CMatchUI;
|
|
||||||
import forge.screens.match.controllers.CDock;
|
import forge.screens.match.controllers.CDock;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
@@ -97,7 +97,7 @@ public class KeyboardShortcuts {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(final ActionEvent e) {
|
public void actionPerformed(final ActionEvent e) {
|
||||||
if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; }
|
if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; }
|
||||||
CMatchUI.SINGLETON_INSTANCE.concede();
|
MatchUtil.concede();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -115,7 +115,7 @@ public class KeyboardShortcuts {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(final ActionEvent e) {
|
public void actionPerformed(final ActionEvent e) {
|
||||||
if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; }
|
if (Singletons.getControl().getCurrentScreen() != FScreen.MATCH_SCREEN) { return; }
|
||||||
Singletons.getControl().getGameView().alphaStrike();
|
MatchUtil.alphaStrike();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package forge.screens.home.gauntlet;
|
package forge.screens.home.gauntlet;
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
@@ -9,6 +8,7 @@ import forge.gauntlet.GauntletData;
|
|||||||
import forge.gauntlet.GauntletIO;
|
import forge.gauntlet.GauntletIO;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
|
|
||||||
@@ -106,7 +106,7 @@ public enum CSubmenuGauntletContests implements ICDoc {
|
|||||||
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
||||||
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
Singletons.getControl().startMatch(GameType.Gauntlet, starter);
|
MatchUtil.startMatch(GameType.Gauntlet, starter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
package forge.screens.home.gauntlet;
|
package forge.screens.home.gauntlet;
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckType;
|
import forge.deck.DeckType;
|
||||||
@@ -11,6 +10,7 @@ import forge.gauntlet.GauntletData;
|
|||||||
import forge.gauntlet.GauntletIO;
|
import forge.gauntlet.GauntletIO;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ public enum CSubmenuGauntletLoad implements ICDoc {
|
|||||||
starter.add(new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
starter.add(new RegisteredPlayer(userDeck).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
||||||
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
Singletons.getControl().startMatch(GameType.Gauntlet, starter);
|
MatchUtil.startMatch(GameType.Gauntlet, starter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
package forge.screens.home.gauntlet;
|
package forge.screens.home.gauntlet;
|
||||||
|
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.Singletons;
|
|
||||||
import forge.deck.DeckType;
|
import forge.deck.DeckType;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
@@ -9,6 +8,7 @@ import forge.gauntlet.GauntletData;
|
|||||||
import forge.gauntlet.GauntletUtil;
|
import forge.gauntlet.GauntletUtil;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
|
|
||||||
import javax.swing.*;
|
import javax.swing.*;
|
||||||
@@ -76,8 +76,8 @@ public enum CSubmenuGauntletQuick implements ICDoc {
|
|||||||
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
|
List<RegisteredPlayer> starter = new ArrayList<RegisteredPlayer>();
|
||||||
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
starter.add(new RegisteredPlayer(gd.getUserDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
||||||
starter.add(new RegisteredPlayer(gd.getDecks().get(gd.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
starter.add(new RegisteredPlayer(gd.getDecks().get(gd.getCompleted())).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
Singletons.getControl().startMatch(GameType.Gauntlet, starter);
|
MatchUtil.startMatch(GameType.Gauntlet, starter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -2,7 +2,6 @@ package forge.screens.home.sanctioned;
|
|||||||
|
|
||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.Singletons;
|
|
||||||
import forge.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckSection;
|
import forge.deck.DeckSection;
|
||||||
@@ -13,6 +12,7 @@ import forge.game.player.RegisteredPlayer;
|
|||||||
import forge.gui.GuiDialog;
|
import forge.gui.GuiDialog;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menus.IMenuProvider;
|
import forge.menus.IMenuProvider;
|
||||||
import forge.menus.MenuUtil;
|
import forge.menus.MenuUtil;
|
||||||
import forge.model.CardCollections;
|
import forge.model.CardCollections;
|
||||||
@@ -372,8 +372,8 @@ public enum CSubmenuConstructed implements ICDoc, IMenuProvider {
|
|||||||
}
|
}
|
||||||
view.getDeckChooser(i).saveState();
|
view.getDeckChooser(i).saveState();
|
||||||
}
|
}
|
||||||
|
|
||||||
Singletons.getControl().startMatch(GameType.Constructed, variantTypes, players);
|
MatchUtil.startMatch(GameType.Constructed, variantTypes, players);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import forge.gui.framework.ICDoc;
|
|||||||
import forge.itemmanager.ItemManagerConfig;
|
import forge.itemmanager.ItemManagerConfig;
|
||||||
import forge.limited.BoosterDraft;
|
import forge.limited.BoosterDraft;
|
||||||
import forge.limited.LimitedPoolType;
|
import forge.limited.LimitedPoolType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
@@ -115,11 +116,11 @@ public enum CSubmenuDraft implements ICDoc {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FModel.getGauntletMini(GuiBase.getInterface()).resetGauntletDraft();
|
FModel.getGauntletMini().resetGauntletDraft();
|
||||||
|
|
||||||
if (gauntlet) {
|
if (gauntlet) {
|
||||||
int rounds = FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size();
|
int rounds = FModel.getDecks().getDraft().get(humanDeck.getName()).getAiDecks().size();
|
||||||
FModel.getGauntletMini(GuiBase.getInterface()).launch(rounds, humanDeck.getDeck(), gameType);
|
FModel.getGauntletMini().launch(rounds, humanDeck.getDeck(), gameType);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -144,7 +145,7 @@ public enum CSubmenuDraft implements ICDoc {
|
|||||||
pl.assignConspiracies();
|
pl.assignConspiracies();
|
||||||
}
|
}
|
||||||
|
|
||||||
Singletons.getControl().startMatch(GameType.Draft, starter);
|
MatchUtil.startMatch(GameType.Draft, starter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
|
|||||||
@@ -110,7 +110,7 @@ public enum CSubmenuSealed implements ICDoc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
||||||
FModel.getGauntletMini(GuiBase.getInterface()).launch(matches, human.getDeck(), gameType);
|
FModel.getGauntletMini().launch(matches, human.getDeck(), gameType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@SuppressWarnings("unchecked")
|
@SuppressWarnings("unchecked")
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import forge.game.GameType;
|
|||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
import forge.gui.GuiChoose;
|
import forge.gui.GuiChoose;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.screens.deckeditor.CDeckEditorUI;
|
import forge.screens.deckeditor.CDeckEditorUI;
|
||||||
import forge.deck.DeckProxy;
|
import forge.deck.DeckProxy;
|
||||||
@@ -132,7 +133,7 @@ public enum CSubmenuWinston implements ICDoc {
|
|||||||
starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
starter.add(new RegisteredPlayer(humanDeck.getDeck()).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
||||||
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
starter.add(new RegisteredPlayer(aiDeck).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
Singletons.getControl().startMatch(GameType.Winston, starter);
|
MatchUtil.startMatch(GameType.Winston, starter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** */
|
/** */
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import forge.player.GamePlayerUtil;
|
|||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.properties.ForgeConstants;
|
import forge.properties.ForgeConstants;
|
||||||
|
import forge.sound.SoundSystem;
|
||||||
import forge.toolbox.FComboBox;
|
import forge.toolbox.FComboBox;
|
||||||
import forge.toolbox.FComboBoxPanel;
|
import forge.toolbox.FComboBoxPanel;
|
||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
@@ -79,7 +80,7 @@ public enum CSubmenuPreferences implements ICDoc {
|
|||||||
final boolean toggle = view.getCbEnableMusic().isSelected();
|
final boolean toggle = view.getCbEnableMusic().isSelected();
|
||||||
prefs.setPref(FPref.UI_ENABLE_MUSIC, String.valueOf(toggle));
|
prefs.setPref(FPref.UI_ENABLE_MUSIC, String.valueOf(toggle));
|
||||||
prefs.save();
|
prefs.save();
|
||||||
Singletons.getControl().getSoundSystem().changeBackgroundTrack();
|
SoundSystem.instance.changeBackgroundTrack();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -17,63 +17,78 @@
|
|||||||
*/
|
*/
|
||||||
package forge.screens.match;
|
package forge.screens.match;
|
||||||
|
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Set;
|
|
||||||
|
|
||||||
import javax.swing.JMenu;
|
import javax.swing.JMenu;
|
||||||
|
import javax.swing.JPopupMenu;
|
||||||
|
import javax.swing.KeyStroke;
|
||||||
|
import javax.swing.MenuElement;
|
||||||
|
import javax.swing.MenuSelectionManager;
|
||||||
|
import javax.swing.SwingUtilities;
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
|
||||||
import com.google.common.collect.Sets;
|
|
||||||
import com.google.common.eventbus.EventBus;
|
|
||||||
import com.google.common.eventbus.Subscribe;
|
|
||||||
|
|
||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.GuiBase;
|
import forge.GuiBase;
|
||||||
import forge.ImageCache;
|
import forge.ImageCache;
|
||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.events.IUiEventVisitor;
|
import forge.game.Match;
|
||||||
import forge.events.UiEvent;
|
|
||||||
import forge.events.UiEventAttackerDeclared;
|
|
||||||
import forge.events.UiEventBlockerAssigned;
|
|
||||||
import forge.game.phase.PhaseType;
|
import forge.game.phase.PhaseType;
|
||||||
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.gui.FNetOverlay;
|
||||||
|
import forge.gui.GuiChoose;
|
||||||
|
import forge.gui.GuiUtils;
|
||||||
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.EDocID;
|
import forge.gui.framework.EDocID;
|
||||||
import forge.gui.framework.FScreen;
|
import forge.gui.framework.FScreen;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.gui.framework.IVDoc;
|
import forge.gui.framework.IVDoc;
|
||||||
import forge.gui.framework.SDisplayUtil;
|
import forge.gui.framework.SDisplayUtil;
|
||||||
|
import forge.gui.framework.SLayoutIO;
|
||||||
|
import forge.interfaces.IButton;
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
|
import forge.match.IMatchController;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menus.IMenuProvider;
|
import forge.menus.IMenuProvider;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.LobbyPlayerHuman;
|
import forge.player.LobbyPlayerHuman;
|
||||||
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.quest.QuestDraftUtils;
|
|
||||||
import forge.screens.match.controllers.CAntes;
|
import forge.screens.match.controllers.CAntes;
|
||||||
import forge.screens.match.controllers.CCombat;
|
import forge.screens.match.controllers.CCombat;
|
||||||
import forge.screens.match.controllers.CDetail;
|
import forge.screens.match.controllers.CDetail;
|
||||||
import forge.screens.match.controllers.CPicture;
|
import forge.screens.match.controllers.CPicture;
|
||||||
import forge.screens.match.controllers.CPrompt;
|
import forge.screens.match.controllers.CPrompt;
|
||||||
|
import forge.screens.match.controllers.CStack;
|
||||||
import forge.screens.match.menus.CMatchUIMenus;
|
import forge.screens.match.menus.CMatchUIMenus;
|
||||||
import forge.screens.match.views.VCommand;
|
import forge.screens.match.views.VCommand;
|
||||||
import forge.screens.match.views.VField;
|
import forge.screens.match.views.VField;
|
||||||
import forge.screens.match.views.VHand;
|
import forge.screens.match.views.VHand;
|
||||||
import forge.screens.match.views.VPlayers;
|
import forge.screens.match.views.VPlayers;
|
||||||
|
import forge.screens.match.views.VPrompt;
|
||||||
|
import forge.toolbox.FButton;
|
||||||
import forge.toolbox.FOptionPane;
|
import forge.toolbox.FOptionPane;
|
||||||
import forge.toolbox.FOverlay;
|
|
||||||
import forge.toolbox.FSkin;
|
import forge.toolbox.FSkin;
|
||||||
|
import forge.toolbox.MouseTriggerEvent;
|
||||||
import forge.toolbox.FSkin.SkinImage;
|
import forge.toolbox.FSkin.SkinImage;
|
||||||
|
import forge.toolbox.special.PhaseIndicator;
|
||||||
import forge.toolbox.special.PhaseLabel;
|
import forge.toolbox.special.PhaseLabel;
|
||||||
|
import forge.util.ITriggerEvent;
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
import forge.view.CombatView;
|
import forge.view.CombatView;
|
||||||
import forge.view.GameEntityView;
|
import forge.view.GameEntityView;
|
||||||
|
import forge.view.LocalGameView;
|
||||||
import forge.view.PlayerView;
|
import forge.view.PlayerView;
|
||||||
|
import forge.view.SpellAbilityView;
|
||||||
import forge.view.ViewUtil;
|
import forge.view.ViewUtil;
|
||||||
import forge.view.arcane.CardPanel;
|
import forge.view.arcane.CardPanel;
|
||||||
import forge.view.arcane.PlayArea;
|
import forge.view.arcane.PlayArea;
|
||||||
@@ -86,24 +101,17 @@ import forge.view.arcane.PlayArea;
|
|||||||
*
|
*
|
||||||
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
* <br><br><i>(C at beginning of class name denotes a control class.)</i>
|
||||||
*/
|
*/
|
||||||
public enum CMatchUI implements ICDoc, IMenuProvider {
|
public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController {
|
||||||
SINGLETON_INSTANCE;
|
SINGLETON_INSTANCE;
|
||||||
|
|
||||||
private List<PlayerView> sortedPlayers;
|
private List<PlayerView> sortedPlayers;
|
||||||
private VMatchUI view;
|
private VMatchUI view;
|
||||||
private boolean allHands;
|
private boolean allHands;
|
||||||
|
private boolean showOverlay = true;
|
||||||
|
|
||||||
private EventBus uiEvents;
|
|
||||||
private IVDoc<? extends ICDoc> selectedDocBeforeCombat;
|
private IVDoc<? extends ICDoc> selectedDocBeforeCombat;
|
||||||
private MatchUiEventVisitor visitor = new MatchUiEventVisitor();
|
|
||||||
public final Map<LobbyPlayer, String> avatarImages = new HashMap<LobbyPlayer, String>();
|
public final Map<LobbyPlayer, String> avatarImages = new HashMap<LobbyPlayer, String>();
|
||||||
|
|
||||||
private CMatchUI() {
|
|
||||||
uiEvents = new EventBus("ui events");
|
|
||||||
uiEvents.register(Singletons.getControl().getSoundSystem());
|
|
||||||
uiEvents.register(visitor);
|
|
||||||
}
|
|
||||||
|
|
||||||
private SkinImage getPlayerAvatar(final LobbyPlayer p, final int defaultIndex) {
|
private SkinImage getPlayerAvatar(final LobbyPlayer p, final int defaultIndex) {
|
||||||
if (avatarImages.containsKey(p)) {
|
if (avatarImages.containsKey(p)) {
|
||||||
return ImageCache.getIcon(avatarImages.get(p));
|
return ImageCache.getIcon(avatarImages.get(p));
|
||||||
@@ -206,40 +214,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
|
|||||||
return idx < 0 || idx >= allHands.size() ? null : allHands.get(idx);
|
return idx < 0 || idx >= allHands.size() ? null : allHands.get(idx);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* Fires up trample dialog. Very old code, due for refactoring with new UI.
|
|
||||||
* Could possibly move to view.
|
|
||||||
*
|
|
||||||
* @param attacker   {@link forge.game.card.Card}
|
|
||||||
* @param blockers   {@link forge.CardList}
|
|
||||||
* @param damage   int
|
|
||||||
* @param overrideOrder overriding combatant order
|
|
||||||
*/
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
public Map<CardView, Integer> getDamageToAssign(final CardView attacker, final List<CardView> blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) {
|
|
||||||
if (damage <= 0) {
|
|
||||||
return Maps.newHashMap();
|
|
||||||
}
|
|
||||||
|
|
||||||
// If the first blocker can absorb all of the damage, don't show the Assign Damage Frame
|
|
||||||
final CardView firstBlocker = blockers.get(0);
|
|
||||||
if (!overrideOrder && !attacker.getOriginal().hasDeathtouch() && firstBlocker.getLethalDamage() >= damage) {
|
|
||||||
final Map<CardView, Integer> res = Maps.newHashMap();
|
|
||||||
res.put(firstBlocker, damage);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
final Object[] result = { null }; // how else can I extract a value from EDT thread?
|
|
||||||
FThreads.invokeInEdtAndWait(GuiBase.getInterface(), new Runnable() {
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder);
|
|
||||||
result[0] = v.getDamageMap();
|
|
||||||
}});
|
|
||||||
return (Map<CardView, Integer>)result[0];
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
*
|
*
|
||||||
* Checks if game control should stop at a phase, for either
|
* Checks if game control should stop at a phase, for either
|
||||||
@@ -275,7 +249,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void showCombat(final CombatView combat) {
|
public void showCombat(final CombatView combat) {
|
||||||
if (combat != null && combat.getNumAttackers() > 0 && Singletons.getControl().getGameView().peekStack() == null) {
|
if (combat != null && combat.getNumAttackers() > 0 && MatchUtil.getGameView().peekStack() == null) {
|
||||||
if (selectedDocBeforeCombat == null) {
|
if (selectedDocBeforeCombat == null) {
|
||||||
IVDoc<? extends ICDoc> combatDoc = EDocID.REPORT_COMBAT.getDoc();
|
IVDoc<? extends ICDoc> combatDoc = EDocID.REPORT_COMBAT.getDoc();
|
||||||
if (combatDoc.getParentCell() != null) {
|
if (combatDoc.getParentCell() != null) {
|
||||||
@@ -297,31 +271,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
|
|||||||
CCombat.SINGLETON_INSTANCE.update();
|
CCombat.SINGLETON_INSTANCE.update();
|
||||||
} // showCombat(CombatView)
|
} // showCombat(CombatView)
|
||||||
|
|
||||||
final Set<PlayerView> highlightedPlayers = Sets.newHashSet();
|
|
||||||
public void setHighlighted(PlayerView ge, boolean b) {
|
|
||||||
if (b) highlightedPlayers.add(ge);
|
|
||||||
else highlightedPlayers.remove(ge);
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isHighlighted(final PlayerView player) {
|
|
||||||
return highlightedPlayers.contains(player);
|
|
||||||
}
|
|
||||||
|
|
||||||
Set<CardView> highlightedCards = Sets.newHashSet();
|
|
||||||
// used to highlight cards in UI
|
|
||||||
public void setUsedToPay(CardView card, boolean value) {
|
|
||||||
FThreads.assertExecutedByEdt(GuiBase.getInterface(), true);
|
|
||||||
|
|
||||||
boolean hasChanged = value ? highlightedCards.add(card) : highlightedCards.remove(card);
|
|
||||||
if (hasChanged) { // since we are in UI thread, may redraw the card right now
|
|
||||||
updateSingleCard(card);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public boolean isUsedToPay(CardView card) {
|
|
||||||
return highlightedCards.contains(card);
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate) {
|
public void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate) {
|
||||||
//System.out.println("updateZones " + zonesToUpdate);
|
//System.out.println("updateZones " + zonesToUpdate);
|
||||||
for (Pair<PlayerView, ZoneType> kv : zonesToUpdate) {
|
for (Pair<PlayerView, ZoneType> kv : zonesToUpdate) {
|
||||||
@@ -362,13 +311,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
|
|||||||
for (final PlayerView p : livesUpdate) {
|
for (final PlayerView p : livesUpdate) {
|
||||||
getFieldViewFor(p).updateDetails();
|
getFieldViewFor(p).updateDetails();
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public void updateCards(final Iterable<CardView> cardsToUpdate) {
|
|
||||||
for (final CardView c : cardsToUpdate) {
|
|
||||||
updateSingleCard(c);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void updateSingleCard(final CardView c) {
|
public void updateSingleCard(final CardView c) {
|
||||||
@@ -390,35 +332,6 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private final static boolean LOG_UIEVENTS = false;
|
|
||||||
|
|
||||||
// UI-related events should arrive here
|
|
||||||
public void fireEvent(UiEvent uiEvent) {
|
|
||||||
if (LOG_UIEVENTS) {
|
|
||||||
System.out.println("UI: " + uiEvent.toString() + " \t\t " + FThreads.debugGetStackTraceItem(GuiBase.getInterface(), 4, true));
|
|
||||||
}
|
|
||||||
uiEvents.post(uiEvent);
|
|
||||||
}
|
|
||||||
|
|
||||||
public class MatchUiEventVisitor implements IUiEventVisitor<Void> {
|
|
||||||
@Override
|
|
||||||
public Void visit(UiEventBlockerAssigned event) {
|
|
||||||
updateSingleCard(event.blocker);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Void visit(UiEventAttackerDeclared event) {
|
|
||||||
updateSingleCard(event.attacker);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void receiveEvent(UiEvent evt) {
|
|
||||||
evt.visit(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.gui.menubar.IMenuProvider#getMenus()
|
* @see forge.gui.menubar.IMenuProvider#getMenus()
|
||||||
*/
|
*/
|
||||||
@@ -469,19 +382,339 @@ public enum CMatchUI implements ICDoc, IMenuProvider {
|
|||||||
return panels;
|
return panels;
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Concede game, bring up WinLose UI. */
|
@Override
|
||||||
public void concede() {
|
public boolean resetForNewGame() {
|
||||||
if (FOverlay.SINGLETON_INSTANCE.getPanel().isShowing() || QuestDraftUtils.aiMatchInProgress) {
|
if (MatchUtil.getGame() != null) {
|
||||||
return;
|
Singletons.getControl().setCurrentScreen(FScreen.MATCH_SCREEN);
|
||||||
|
SOverlayUtils.hideOverlay();
|
||||||
|
FOptionPane.showMessageDialog("Cannot start a new game while another game is already in progress.");
|
||||||
|
return false; //TODO: See if it's possible to run multiple games at once without crashing
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
Singletons.getControl().ensureScreenActive(FScreen.MATCH_SCREEN);
|
@Override
|
||||||
|
public IButton getBtnOK(PlayerView playerView) {
|
||||||
|
return VMatchUI.SINGLETON_INSTANCE.getBtnOK();
|
||||||
|
}
|
||||||
|
|
||||||
String userPrompt =
|
@Override
|
||||||
"This will end the current game and you will not be able to resume.\n\n" +
|
public IButton getBtnCancel(PlayerView playerView) {
|
||||||
"Concede anyway?";
|
return VMatchUI.SINGLETON_INSTANCE.getBtnCancel();
|
||||||
if (FOptionPane.showConfirmDialog(userPrompt, "Concede Game?", "Concede", "Cancel", false)) {
|
}
|
||||||
Singletons.getControl().stopGame();
|
|
||||||
|
@Override
|
||||||
|
public void focusButton(final IButton button) {
|
||||||
|
// ensure we don't steal focus from an overlay
|
||||||
|
if (!SOverlayUtils.overlayHasFocus()) {
|
||||||
|
FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
((FButton)button).requestFocusInWindow();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flashIncorrectAction() {
|
||||||
|
SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updatePhase() {
|
||||||
|
LocalGameView gameView = MatchUtil.getGameView();
|
||||||
|
final PlayerView p = gameView.getPlayerTurn();
|
||||||
|
final PhaseType ph = gameView.getPhase();
|
||||||
|
final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE;
|
||||||
|
PhaseLabel lbl = matchUi.getFieldViewFor(p).getPhaseIndicator().getLabelFor(ph);
|
||||||
|
|
||||||
|
matchUi.resetAllPhaseButtons();
|
||||||
|
if (lbl != null) {
|
||||||
|
lbl.setActive(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTurn(final PlayerView player) {
|
||||||
|
VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(player);
|
||||||
|
SDisplayUtil.showTab(nextField);
|
||||||
|
CPrompt.SINGLETON_INSTANCE.updateText();
|
||||||
|
CMatchUI.SINGLETON_INSTANCE.repaintCardOverlays();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updatePlayerControl() {
|
||||||
|
CMatchUI.SINGLETON_INSTANCE.initHandViews();
|
||||||
|
SLayoutIO.loadLayout(null);
|
||||||
|
VMatchUI.SINGLETON_INSTANCE.populate();
|
||||||
|
for (VHand h : VMatchUI.SINGLETON_INSTANCE.getHands()) {
|
||||||
|
h.getLayoutControl().updateHand();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disableOverlay() {
|
||||||
|
showOverlay = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableOverlay() {
|
||||||
|
showOverlay = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void finishGame() {
|
||||||
|
new ViewWinLose(MatchUtil.getGameView());
|
||||||
|
if (showOverlay) {
|
||||||
|
SOverlayUtils.showOverlay();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateStack() {
|
||||||
|
CStack.SINGLETON_INSTANCE.update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPanelSelection(final CardView c) {
|
||||||
|
GuiUtils.setPanelSelection(c);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAbilityToPlay(List<SpellAbilityView> abilities, ITriggerEvent triggerEvent) {
|
||||||
|
if (triggerEvent == null) {
|
||||||
|
if (abilities.isEmpty()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (abilities.size() == 1) {
|
||||||
|
return abilities.get(0).getId();
|
||||||
|
}
|
||||||
|
final SpellAbilityView choice = GuiChoose.oneOrNone("Choose ability to play", abilities);
|
||||||
|
return choice == null ? -1 : choice.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
if (abilities.isEmpty()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (abilities.size() == 1 && !abilities.get(0).isPromptIfOnlyPossibleAbility()) {
|
||||||
|
if (abilities.get(0).canPlay()) {
|
||||||
|
return abilities.get(0).getId(); //only return ability if it's playable, otherwise return null
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
//show menu if mouse was trigger for ability
|
||||||
|
final JPopupMenu menu = new JPopupMenu("Abilities");
|
||||||
|
|
||||||
|
boolean enabled;
|
||||||
|
boolean hasEnabled = false;
|
||||||
|
int shortcut = KeyEvent.VK_1; //use number keys as shortcuts for abilities 1-9
|
||||||
|
for (final SpellAbilityView ab : abilities) {
|
||||||
|
enabled = ab.canPlay();
|
||||||
|
if (enabled) {
|
||||||
|
hasEnabled = true;
|
||||||
|
}
|
||||||
|
GuiUtils.addMenuItem(menu, FSkin.encodeSymbols(ab.toString(), true),
|
||||||
|
shortcut > 0 ? KeyStroke.getKeyStroke(shortcut, 0) : null,
|
||||||
|
new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
CPrompt.SINGLETON_INSTANCE.selectAbility(ab);
|
||||||
|
}
|
||||||
|
}, enabled);
|
||||||
|
if (shortcut > 0) {
|
||||||
|
shortcut++;
|
||||||
|
if (shortcut > KeyEvent.VK_9) {
|
||||||
|
shortcut = 0; //stop adding shortcuts after 9
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (hasEnabled) { //only show menu if at least one ability can be played
|
||||||
|
SwingUtilities.invokeLater(new Runnable() { //use invoke later to ensure first ability selected by default
|
||||||
|
public void run() {
|
||||||
|
MenuSelectionManager.defaultManager().setSelectedPath(new MenuElement[]{menu, menu.getSubElements()[0]});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
MouseEvent mouseEvent = ((MouseTriggerEvent)triggerEvent).getMouseEvent();
|
||||||
|
menu.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY());
|
||||||
|
}
|
||||||
|
|
||||||
|
return -1; //delay ability until choice made
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showPromptMessage(final PlayerView playerView, final String message) {
|
||||||
|
CMatchUI.SINGLETON_INSTANCE.showMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
public Object showManaPool(final PlayerView player) {
|
||||||
|
return null; //not needed since mana pool icons are always visible
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void hideManaPool(final PlayerView player, final Object zoneToRestore) {
|
||||||
|
//not needed since mana pool icons are always visible
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean openZones(final Collection<ZoneType> zones, final Map<PlayerView, Object> players) {
|
||||||
|
if (zones.size() == 1) {
|
||||||
|
switch (zones.iterator().next()) {
|
||||||
|
case Battlefield:
|
||||||
|
case Hand:
|
||||||
|
return true; //don't actually need to open anything, but indicate that zone can be opened
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void restoreOldZones(final Map<PlayerView, Object> playersToRestoreZonesFor) {
|
||||||
|
}
|
||||||
|
|
||||||
|
@SuppressWarnings("unchecked")
|
||||||
|
@Override
|
||||||
|
public Map<CardView, Integer> assignDamage(final CardView attacker,
|
||||||
|
final List<CardView> blockers, final int damage,
|
||||||
|
final GameEntityView defender, final boolean overrideOrder) {
|
||||||
|
final Object[] result = { null }; // how else can I extract a value from EDT thread?
|
||||||
|
FThreads.invokeInEdtAndWait(GuiBase.getInterface(), new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder);
|
||||||
|
result[0] = v.getDamageMap();
|
||||||
|
}});
|
||||||
|
return (Map<CardView, Integer>)result[0];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void hear(LobbyPlayer player, String message) {
|
||||||
|
FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startNewMatch(final Match match) {
|
||||||
|
FThreads.invokeInEdtLater(GuiBase.getInterface(), new Runnable(){
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
SOverlayUtils.startGameOverlay();
|
||||||
|
SOverlayUtils.showOverlay();
|
||||||
|
MatchUtil.startGame(match);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openView(List<Player> sortedPlayers, int humanCount) {
|
||||||
|
List<PlayerView> sortedPlayerViews = new ArrayList<PlayerView>();
|
||||||
|
for (Player p : sortedPlayers) {
|
||||||
|
sortedPlayerViews.add(MatchUtil.getGameView().getPlayerView(p));
|
||||||
|
}
|
||||||
|
CMatchUI.SINGLETON_INSTANCE.initMatch(sortedPlayerViews, humanCount != 1);
|
||||||
|
|
||||||
|
actuateMatchPreferences();
|
||||||
|
|
||||||
|
Singletons.getControl().setCurrentScreen(FScreen.MATCH_SCREEN);
|
||||||
|
SDisplayUtil.showTab(EDocID.REPORT_LOG.getDoc());
|
||||||
|
|
||||||
|
// per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch
|
||||||
|
//Set Field shown to current player.
|
||||||
|
if (humanCount > 0) {
|
||||||
|
final VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(sortedPlayerViews.get(0));
|
||||||
|
SDisplayUtil.showTab(nextField);
|
||||||
|
}
|
||||||
|
SOverlayUtils.hideOverlay();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterGameEnd() {
|
||||||
|
Singletons.getView().getNavigationBar().closeTab(FScreen.MATCH_SCREEN);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Needs to be reworked for efficiency with rest of prefs saves in
|
||||||
|
* codebase.
|
||||||
|
*/
|
||||||
|
public void writeMatchPreferences() {
|
||||||
|
final ForgePreferences prefs = FModel.getPreferences();
|
||||||
|
final List<VField> fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
|
||||||
|
|
||||||
|
// AI field is at index [1]
|
||||||
|
PhaseIndicator fvAi = fieldViews.get(1).getPhaseIndicator();
|
||||||
|
prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLblUpkeep().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLblDraw().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLblMain1().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLblBeginCombat().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLblDeclareAttackers().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLblDeclareBlockers().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLblFirstStrike().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLblCombatDamage().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLblEndCombat().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLblMain2().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLblEndTurn().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLblCleanup().getEnabled()));
|
||||||
|
|
||||||
|
// Human field is at index [0]
|
||||||
|
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLblUpkeep().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLblDraw().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLblMain1().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLblBeginCombat().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLblDeclareAttackers().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLblDeclareBlockers().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLblFirstStrike().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLblCombatDamage().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLblEndCombat().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLblMain2().getEnabled()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLblEndTurn().getEnabled());
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLblCleanup().getEnabled());
|
||||||
|
|
||||||
|
prefs.save();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* TODO: Needs to be reworked for efficiency with rest of prefs saves in
|
||||||
|
* codebase.
|
||||||
|
*/
|
||||||
|
private void actuateMatchPreferences() {
|
||||||
|
final ForgePreferences prefs = FModel.getPreferences();
|
||||||
|
final List<VField> fieldViews = VMatchUI.SINGLETON_INSTANCE.getFieldViews();
|
||||||
|
|
||||||
|
// Human field is at index [0]
|
||||||
|
PhaseIndicator fvHuman = fieldViews.get(0).getPhaseIndicator();
|
||||||
|
fvHuman.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP));
|
||||||
|
fvHuman.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW));
|
||||||
|
fvHuman.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1));
|
||||||
|
fvHuman.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT));
|
||||||
|
fvHuman.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS));
|
||||||
|
fvHuman.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS));
|
||||||
|
fvHuman.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE));
|
||||||
|
fvHuman.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE));
|
||||||
|
fvHuman.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT));
|
||||||
|
fvHuman.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2));
|
||||||
|
fvHuman.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT));
|
||||||
|
fvHuman.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP));
|
||||||
|
|
||||||
|
// AI field is at index [1], ...
|
||||||
|
for (int i = 1; i < fieldViews.size(); i++) {
|
||||||
|
PhaseIndicator fvAi = fieldViews.get(i).getPhaseIndicator();
|
||||||
|
fvAi.getLblUpkeep().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP));
|
||||||
|
fvAi.getLblDraw().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW));
|
||||||
|
fvAi.getLblMain1().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1));
|
||||||
|
fvAi.getLblBeginCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT));
|
||||||
|
fvAi.getLblDeclareAttackers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS));
|
||||||
|
fvAi.getLblDeclareBlockers().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS));
|
||||||
|
fvAi.getLblFirstStrike().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE));
|
||||||
|
fvAi.getLblCombatDamage().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE));
|
||||||
|
fvAi.getLblEndCombat().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT));
|
||||||
|
fvAi.getLblMain2().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2));
|
||||||
|
fvAi.getLblEndTurn().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_EOT));
|
||||||
|
fvAi.getLblCleanup().setEnabled(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP));
|
||||||
|
}
|
||||||
|
|
||||||
|
//Singletons.getView().getViewMatch().setLayoutParams(prefs.getPref(FPref.UI_LAYOUT_PARAMS));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import javax.swing.JButton;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.FScreen;
|
import forge.gui.framework.FScreen;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.view.IGameView;
|
import forge.view.IGameView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -57,22 +58,21 @@ public class ControlWinLose {
|
|||||||
public void actionOnContinue() {
|
public void actionOnContinue() {
|
||||||
SOverlayUtils.hideOverlay();
|
SOverlayUtils.hideOverlay();
|
||||||
saveOptions();
|
saveOptions();
|
||||||
|
MatchUtil.continueMatch();
|
||||||
Singletons.getControl().endCurrentGame(true, false);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Action performed when "restart" button is pressed in default win/lose UI. */
|
/** Action performed when "restart" button is pressed in default win/lose UI. */
|
||||||
public void actionOnRestart() {
|
public void actionOnRestart() {
|
||||||
SOverlayUtils.hideOverlay();
|
SOverlayUtils.hideOverlay();
|
||||||
saveOptions();
|
saveOptions();
|
||||||
Singletons.getControl().endCurrentGame(false, true);
|
MatchUtil.restartMatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Action performed when "quit" button is pressed in default win/lose UI. */
|
/** Action performed when "quit" button is pressed in default win/lose UI. */
|
||||||
public void actionOnQuit() {
|
public void actionOnQuit() {
|
||||||
// Reset other stuff
|
// Reset other stuff
|
||||||
saveOptions();
|
saveOptions();
|
||||||
Singletons.getControl().endCurrentGame(false, false);
|
MatchUtil.endCurrentGame();
|
||||||
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
|
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
|
||||||
SOverlayUtils.hideOverlay();
|
SOverlayUtils.hideOverlay();
|
||||||
}
|
}
|
||||||
@@ -82,7 +82,7 @@ public class ControlWinLose {
|
|||||||
* with other game modes.
|
* with other game modes.
|
||||||
*/
|
*/
|
||||||
public void saveOptions() {
|
public void saveOptions() {
|
||||||
Singletons.getControl().writeMatchPreferences();
|
CMatchUI.SINGLETON_INSTANCE.writeMatchPreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -48,7 +48,7 @@ public class GauntletWinLose extends ControlWinLose {
|
|||||||
*/
|
*/
|
||||||
public GauntletWinLose(final ViewWinLose view0, final IGameView game0, final IGuiBase gui) {
|
public GauntletWinLose(final ViewWinLose view0, final IGameView game0, final IGuiBase gui) {
|
||||||
super(view0, game0);
|
super(view0, game0);
|
||||||
controller = new GauntletWinLoseController(view0, game0, gui) {
|
controller = new GauntletWinLoseController(view0, game0) {
|
||||||
@Override
|
@Override
|
||||||
protected void showOutcome(String message1, String message2, FSkinProp icon, List<String> lstEventNames, List<String> lstEventRecords, int len, int num) {
|
protected void showOutcome(String message1, String message2, FSkinProp icon, List<String> lstEventNames, List<String> lstEventRecords, int len, int num) {
|
||||||
final JLabel lblTitle = new FLabel.Builder().text("Gauntlet Progress")
|
final JLabel lblTitle = new FLabel.Builder().text("Gauntlet Progress")
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import forge.Singletons;
|
|||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.FScreen;
|
import forge.gui.framework.FScreen;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.quest.QuestController;
|
import forge.quest.QuestController;
|
||||||
@@ -76,7 +77,6 @@ public class QuestDraftWinLose extends ControlWinLose {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public final boolean populateCustomPanel() {
|
public final boolean populateCustomPanel() {
|
||||||
|
|
||||||
QuestController quest = FModel.getQuest();
|
QuestController quest = FModel.getQuest();
|
||||||
|
|
||||||
final LobbyPlayer questLobbyPlayer = GamePlayerUtil.getQuestPlayer();
|
final LobbyPlayer questLobbyPlayer = GamePlayerUtil.getQuestPlayer();
|
||||||
@@ -125,7 +125,7 @@ public class QuestDraftWinLose extends ControlWinLose {
|
|||||||
view.getBtnQuit().addActionListener(new ActionListener() {
|
view.getBtnQuit().addActionListener(new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(final ActionEvent e) {
|
public void actionPerformed(final ActionEvent e) {
|
||||||
GuiBase.getInterface().endCurrentGame();
|
MatchUtil.endCurrentGame();
|
||||||
QuestDraftUtils.matchInProgress = false;
|
QuestDraftUtils.matchInProgress = false;
|
||||||
QuestDraftUtils.continueMatches(GuiBase.getInterface());
|
QuestDraftUtils.continueMatches(GuiBase.getInterface());
|
||||||
}
|
}
|
||||||
@@ -140,7 +140,7 @@ public class QuestDraftWinLose extends ControlWinLose {
|
|||||||
@Override
|
@Override
|
||||||
public void actionPerformed(final ActionEvent e) {
|
public void actionPerformed(final ActionEvent e) {
|
||||||
if (FOptionPane.showOptionDialog("Quitting the match now will forfeit the tournament!\n\nReally quit?", "Really Quit Tournament?", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2), new String[] { "Yes", "No" }, 1) == 0) {
|
if (FOptionPane.showOptionDialog("Quitting the match now will forfeit the tournament!\n\nReally quit?", "Really Quit Tournament?", FSkin.getImage(FSkinProp.ICO_WARNING).scale(2), new String[] { "Yes", "No" }, 1) == 0) {
|
||||||
GuiBase.getInterface().endCurrentGame();
|
MatchUtil.endCurrentGame();
|
||||||
QuestDraftUtils.matchInProgress = false;
|
QuestDraftUtils.matchInProgress = false;
|
||||||
QuestDraftUtils.continueMatches(GuiBase.getInterface());
|
QuestDraftUtils.continueMatches(GuiBase.getInterface());
|
||||||
}
|
}
|
||||||
@@ -152,24 +152,20 @@ public class QuestDraftWinLose extends ControlWinLose {
|
|||||||
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
|
VSubmenuQuestDraft.SINGLETON_INSTANCE.populate();
|
||||||
|
|
||||||
return false; //We're not awarding anything, so never display the custom panel.
|
return false; //We're not awarding anything, so never display the custom panel.
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void actionOnQuitMatch() {
|
public final void actionOnQuitMatch() {
|
||||||
|
|
||||||
CSubmenuDuels.SINGLETON_INSTANCE.update();
|
CSubmenuDuels.SINGLETON_INSTANCE.update();
|
||||||
CSubmenuChallenges.SINGLETON_INSTANCE.update();
|
CSubmenuChallenges.SINGLETON_INSTANCE.update();
|
||||||
|
|
||||||
qData.setCurrentEvent(null);
|
qData.setCurrentEvent(null);
|
||||||
qData.save();
|
qData.save();
|
||||||
FModel.getQuestPreferences().save();
|
FModel.getQuestPreferences().save();
|
||||||
Singletons.getControl().writeMatchPreferences();
|
CMatchUI.SINGLETON_INSTANCE.writeMatchPreferences();
|
||||||
|
|
||||||
Singletons.getControl().endCurrentGame(false, false);
|
MatchUtil.endCurrentGame();
|
||||||
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
|
Singletons.getControl().setCurrentScreen(FScreen.HOME_SCREEN);
|
||||||
|
|
||||||
SOverlayUtils.hideOverlay();
|
SOverlayUtils.hideOverlay();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -36,6 +36,7 @@ import com.google.common.collect.Lists;
|
|||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.gui.framework.FScreen;
|
import forge.gui.framework.FScreen;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.screens.match.controllers.CDock;
|
import forge.screens.match.controllers.CDock;
|
||||||
import forge.screens.match.views.VField;
|
import forge.screens.match.views.VField;
|
||||||
import forge.toolbox.FSkin;
|
import forge.toolbox.FSkin;
|
||||||
@@ -363,7 +364,7 @@ public enum TargetingOverlay {
|
|||||||
if (overlaystate == 0) { return; }
|
if (overlaystate == 0) { return; }
|
||||||
|
|
||||||
// Arc drawing
|
// Arc drawing
|
||||||
assembleArcs(Singletons.getControl().getGameView().getCombat());
|
assembleArcs(MatchUtil.getGameView().getCombat());
|
||||||
|
|
||||||
if (arcsCombat.isEmpty() && arcsOther.isEmpty()) { return; }
|
if (arcsCombat.isEmpty() && arcsOther.isEmpty()) { return; }
|
||||||
|
|
||||||
|
|||||||
@@ -37,8 +37,8 @@ import net.miginfocom.swing.MigLayout;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
import forge.control.FControl;
|
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.toolbox.FButton;
|
import forge.toolbox.FButton;
|
||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
import forge.toolbox.FScrollPane;
|
import forge.toolbox.FScrollPane;
|
||||||
@@ -445,7 +445,7 @@ public class VAssignDamage {
|
|||||||
if (card == null) {
|
if (card == null) {
|
||||||
if (defender instanceof PlayerView) {
|
if (defender instanceof PlayerView) {
|
||||||
final PlayerView p = (PlayerView)defender;
|
final PlayerView p = (PlayerView)defender;
|
||||||
lethalDamage = attackerHasInfect ? FControl.instance.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife();
|
lethalDamage = attackerHasInfect ? MatchUtil.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife();
|
||||||
} else if (defender instanceof CardView) { // planeswalker
|
} else if (defender instanceof CardView) { // planeswalker
|
||||||
final CardView pw = (CardView)defender;
|
final CardView pw = (CardView)defender;
|
||||||
lethalDamage = pw.getOriginal().getLoyalty();
|
lethalDamage = pw.getOriginal().getLoyalty();
|
||||||
|
|||||||
@@ -1,10 +1,11 @@
|
|||||||
package forge.screens.match;
|
package forge.screens.match;
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.gui.framework.*;
|
import forge.gui.framework.*;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.screens.match.views.*;
|
import forge.screens.match.views.*;
|
||||||
import forge.sound.MusicPlaylist;
|
import forge.sound.MusicPlaylist;
|
||||||
|
import forge.sound.SoundSystem;
|
||||||
import forge.toolbox.FButton;
|
import forge.toolbox.FButton;
|
||||||
import forge.view.FView;
|
import forge.view.FView;
|
||||||
|
|
||||||
@@ -93,7 +94,7 @@ public enum VMatchUI implements IVTopLevelUI {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Singletons.getControl().getGameView().isCommandZoneNeeded()) {
|
if (MatchUtil.getGameView().isCommandZoneNeeded()) {
|
||||||
// Add extra players alternatively to existing user/AI field panels.
|
// Add extra players alternatively to existing user/AI field panels.
|
||||||
for (int i = 2; i < lstCommands.size(); i++) {
|
for (int i = 2; i < lstCommands.size(); i++) {
|
||||||
// If already in layout, no need to add again.
|
// If already in layout, no need to add again.
|
||||||
@@ -102,7 +103,8 @@ public enum VMatchUI implements IVTopLevelUI {
|
|||||||
lstCommands.get(i % 2).getParentCell().addDoc(cmdView);
|
lstCommands.get(i % 2).getParentCell().addDoc(cmdView);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
}
|
||||||
|
else {
|
||||||
//If game goesn't need command zone, remove it from existing field panels
|
//If game goesn't need command zone, remove it from existing field panels
|
||||||
for (int i = 0; i < 2; i++) {
|
for (int i = 0; i < 2; i++) {
|
||||||
VCommand cmdView = lstCommands.get(i);
|
VCommand cmdView = lstCommands.get(i);
|
||||||
@@ -205,13 +207,13 @@ public enum VMatchUI implements IVTopLevelUI {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public boolean onClosing(FScreen screen) {
|
public boolean onClosing(FScreen screen) {
|
||||||
if (!Singletons.getControl().getGameView().isGameOver()) {
|
if (!MatchUtil.getGameView().isGameOver()) {
|
||||||
CMatchUI.SINGLETON_INSTANCE.concede();
|
MatchUtil.concede();
|
||||||
return false; //delay hiding tab even if concede successful
|
return false; //delay hiding tab even if concede successful
|
||||||
}
|
}
|
||||||
|
|
||||||
//switch back to menus music when closing screen
|
//switch back to menus music when closing screen
|
||||||
Singletons.getControl().getSoundSystem().setBackgroundMusic(MusicPlaylist.MENUS);
|
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS);
|
||||||
|
|
||||||
wasClosed = true;
|
wasClosed = true;
|
||||||
return true;
|
return true;
|
||||||
|
|||||||
@@ -69,7 +69,7 @@ public class ViewWinLose implements IWinLoseView<FButton> {
|
|||||||
control = new QuestDraftWinLose(this, game0);
|
control = new QuestDraftWinLose(this, game0);
|
||||||
break;
|
break;
|
||||||
case Draft:
|
case Draft:
|
||||||
if (!FModel.getGauntletMini(GuiBase.getInterface()).isGauntletDraft()) {
|
if (!FModel.getGauntletMini().isGauntletDraft()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Sealed:
|
case Sealed:
|
||||||
|
|||||||
@@ -4,9 +4,9 @@ import java.awt.event.MouseAdapter;
|
|||||||
import java.awt.event.MouseEvent;
|
import java.awt.event.MouseEvent;
|
||||||
import java.awt.event.MouseListener;
|
import java.awt.event.MouseListener;
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.screens.match.views.VDev;
|
import forge.screens.match.views.VDev;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -27,7 +27,7 @@ public enum CDev implements ICDoc {
|
|||||||
public void togglePlayManyLandsPerTurn() {
|
public void togglePlayManyLandsPerTurn() {
|
||||||
boolean newValue = !VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().getToggled();
|
boolean newValue = !VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().getToggled();
|
||||||
VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(newValue);
|
VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(newValue);
|
||||||
Singletons.getControl().getGameView().cheat().setCanPlayUnlimitedLands(newValue);
|
MatchUtil.getGameView().cheat().setCanPlayUnlimitedLands(newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madViewAll = new MouseAdapter() {
|
private final MouseListener madViewAll = new MouseAdapter() {
|
||||||
@@ -39,7 +39,7 @@ public enum CDev implements ICDoc {
|
|||||||
public void toggleViewAllCards() {
|
public void toggleViewAllCards() {
|
||||||
boolean newValue = !VDev.SINGLETON_INSTANCE.getLblViewAll().getToggled();
|
boolean newValue = !VDev.SINGLETON_INSTANCE.getLblViewAll().getToggled();
|
||||||
VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(newValue);
|
VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(newValue);
|
||||||
Singletons.getControl().getGameView().cheat().setViewAllCards(newValue);
|
MatchUtil.getGameView().cheat().setViewAllCards(newValue);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madMana = new MouseAdapter() {
|
private final MouseListener madMana = new MouseAdapter() {
|
||||||
@@ -49,7 +49,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void generateMana() {
|
public void generateMana() {
|
||||||
Singletons.getControl().getGameView().cheat().generateMana();
|
MatchUtil.getGameView().cheat().generateMana();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madSetup = new MouseAdapter() {
|
private final MouseListener madSetup = new MouseAdapter() {
|
||||||
@@ -59,7 +59,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void setupGameState() {
|
public void setupGameState() {
|
||||||
Singletons.getControl().getGameView().cheat().setupGameState();
|
MatchUtil.getGameView().cheat().setupGameState();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madTutor = new MouseAdapter() {
|
private final MouseListener madTutor = new MouseAdapter() {
|
||||||
@@ -69,7 +69,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void tutorForCard() {
|
public void tutorForCard() {
|
||||||
Singletons.getControl().getGameView().cheat().tutorForCard();
|
MatchUtil.getGameView().cheat().tutorForCard();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madCardToHand = new MouseAdapter() {
|
private final MouseListener madCardToHand = new MouseAdapter() {
|
||||||
@@ -79,7 +79,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void addCardToHand() {
|
public void addCardToHand() {
|
||||||
Singletons.getControl().getGameView().cheat().addCardToHand();
|
MatchUtil.getGameView().cheat().addCardToHand();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madCounter = new MouseAdapter() {
|
private final MouseListener madCounter = new MouseAdapter() {
|
||||||
@@ -89,7 +89,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void addCounterToPermanent() {
|
public void addCounterToPermanent() {
|
||||||
Singletons.getControl().getGameView().cheat().addCountersToPermanent();
|
MatchUtil.getGameView().cheat().addCountersToPermanent();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madTap = new MouseAdapter() {
|
private final MouseListener madTap = new MouseAdapter() {
|
||||||
@@ -99,7 +99,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void tapPermanent() {
|
public void tapPermanent() {
|
||||||
Singletons.getControl().getGameView().cheat().tapPermanents();
|
MatchUtil.getGameView().cheat().tapPermanents();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madUntap = new MouseAdapter() {
|
private final MouseListener madUntap = new MouseAdapter() {
|
||||||
@@ -109,7 +109,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void untapPermanent() {
|
public void untapPermanent() {
|
||||||
Singletons.getControl().getGameView().cheat().untapPermanents();
|
MatchUtil.getGameView().cheat().untapPermanents();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madLife = new MouseAdapter() {
|
private final MouseListener madLife = new MouseAdapter() {
|
||||||
@@ -119,7 +119,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void setPlayerLife() {
|
public void setPlayerLife() {
|
||||||
Singletons.getControl().getGameView().cheat().setPlayerLife();
|
MatchUtil.getGameView().cheat().setPlayerLife();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madWinGame = new MouseAdapter() {
|
private final MouseListener madWinGame = new MouseAdapter() {
|
||||||
@@ -129,7 +129,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void winGame() {
|
public void winGame() {
|
||||||
Singletons.getControl().getGameView().cheat().winGame();
|
MatchUtil.getGameView().cheat().winGame();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madCardToBattlefield = new MouseAdapter() {
|
private final MouseListener madCardToBattlefield = new MouseAdapter() {
|
||||||
@@ -139,7 +139,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void addCardToBattlefield() {
|
public void addCardToBattlefield() {
|
||||||
Singletons.getControl().getGameView().cheat().addCardToBattlefield();
|
MatchUtil.getGameView().cheat().addCardToBattlefield();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madRiggedRoll = new MouseAdapter() {
|
private final MouseListener madRiggedRoll = new MouseAdapter() {
|
||||||
@@ -149,7 +149,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void riggedPlanerRoll() {
|
public void riggedPlanerRoll() {
|
||||||
Singletons.getControl().getGameView().cheat().riggedPlanarRoll();
|
MatchUtil.getGameView().cheat().riggedPlanarRoll();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final MouseListener madWalkToPlane = new MouseAdapter() {
|
private final MouseListener madWalkToPlane = new MouseAdapter() {
|
||||||
@@ -159,7 +159,7 @@ public enum CDev implements ICDoc {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
public void planeswalkTo() {
|
public void planeswalkTo() {
|
||||||
Singletons.getControl().getGameView().cheat().planeswalkTo();
|
MatchUtil.getGameView().cheat().planeswalkTo();
|
||||||
}
|
}
|
||||||
|
|
||||||
//========== End mouse listener inits
|
//========== End mouse listener inits
|
||||||
@@ -198,7 +198,7 @@ public enum CDev implements ICDoc {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public void update() {
|
public void update() {
|
||||||
VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(Singletons.getControl().getGameView().canPlayUnlimitedLands());
|
VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(MatchUtil.getGameView().canPlayUnlimitedLands());
|
||||||
VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(Singletons.getControl().getGameView().canViewAllCards());
|
VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(MatchUtil.getGameView().canViewAllCards());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -24,17 +24,16 @@ import forge.GuiBase;
|
|||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.control.FControl;
|
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deckchooser.FDeckViewer;
|
import forge.deckchooser.FDeckViewer;
|
||||||
import forge.gui.SOverlayUtils;
|
import forge.gui.SOverlayUtils;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.gui.framework.SLayoutIO;
|
import forge.gui.framework.SLayoutIO;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.properties.FileLocation;
|
import forge.properties.FileLocation;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.CMatchUI;
|
|
||||||
import forge.screens.match.views.VDock;
|
import forge.screens.match.views.VDock;
|
||||||
import forge.toolbox.FSkin;
|
import forge.toolbox.FSkin;
|
||||||
import forge.toolbox.SaveOpenDialog;
|
import forge.toolbox.SaveOpenDialog;
|
||||||
@@ -110,7 +109,7 @@ public enum CDock implements ICDoc {
|
|||||||
* View deck list.
|
* View deck list.
|
||||||
*/
|
*/
|
||||||
public void viewDeckList() {
|
public void viewDeckList() {
|
||||||
final Deck deck = FControl.instance.getGameView().getDeck(GamePlayerUtil.getGuiPlayer());
|
final Deck deck = MatchUtil.getGameView().getDeck(GamePlayerUtil.getGuiPlayer());
|
||||||
if (deck != null) {
|
if (deck != null) {
|
||||||
FDeckViewer.show(deck);
|
FDeckViewer.show(deck);
|
||||||
}
|
}
|
||||||
@@ -196,7 +195,7 @@ public enum CDock implements ICDoc {
|
|||||||
VDock.SINGLETON_INSTANCE.getBtnConcede().setCommand(new UiCommand() {
|
VDock.SINGLETON_INSTANCE.getBtnConcede().setCommand(new UiCommand() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
CMatchUI.SINGLETON_INSTANCE.concede();
|
MatchUtil.concede();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
VDock.SINGLETON_INSTANCE.getBtnSettings().setCommand(new UiCommand() {
|
VDock.SINGLETON_INSTANCE.getBtnSettings().setCommand(new UiCommand() {
|
||||||
@@ -238,7 +237,7 @@ public enum CDock implements ICDoc {
|
|||||||
VDock.SINGLETON_INSTANCE.getBtnAlphaStrike().setCommand(new UiCommand() {
|
VDock.SINGLETON_INSTANCE.getBtnAlphaStrike().setCommand(new UiCommand() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
Singletons.getControl().getGameView().alphaStrike();
|
MatchUtil.getGameView().alphaStrike();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
VDock.SINGLETON_INSTANCE.getBtnTargeting().setCommand(new UiCommand() {
|
VDock.SINGLETON_INSTANCE.getBtnTargeting().setCommand(new UiCommand() {
|
||||||
|
|||||||
@@ -28,6 +28,7 @@ import forge.UiCommand;
|
|||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.match.MatchConstants;
|
import forge.match.MatchConstants;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.screens.match.ZoneAction;
|
import forge.screens.match.ZoneAction;
|
||||||
import forge.screens.match.views.VField;
|
import forge.screens.match.views.VField;
|
||||||
import forge.toolbox.MouseTriggerEvent;
|
import forge.toolbox.MouseTriggerEvent;
|
||||||
@@ -85,7 +86,7 @@ public class CField implements ICDoc {
|
|||||||
Function<Byte, Void> manaAction = new Function<Byte, Void>() {
|
Function<Byte, Void> manaAction = new Function<Byte, Void>() {
|
||||||
public Void apply(Byte colorCode) {
|
public Void apply(Byte colorCode) {
|
||||||
if (CField.this.player.getLobbyPlayer() == Singletons.getControl().getGuiPlayer()) {
|
if (CField.this.player.getLobbyPlayer() == Singletons.getControl().getGuiPlayer()) {
|
||||||
Singletons.getControl().getGameView().useMana(colorCode.byteValue());
|
MatchUtil.getGameView().useMana(colorCode.byteValue());
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -28,10 +28,10 @@ import javax.swing.JButton;
|
|||||||
|
|
||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.GuiBase;
|
import forge.GuiBase;
|
||||||
import forge.Singletons;
|
|
||||||
import forge.UiCommand;
|
import forge.UiCommand;
|
||||||
import forge.gui.framework.ICDoc;
|
import forge.gui.framework.ICDoc;
|
||||||
import forge.gui.framework.SDisplayUtil;
|
import forge.gui.framework.SDisplayUtil;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.screens.match.views.VPrompt;
|
import forge.screens.match.views.VPrompt;
|
||||||
import forge.toolbox.FSkin;
|
import forge.toolbox.FSkin;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
@@ -90,31 +90,31 @@ public enum CPrompt implements ICDoc {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void selectButtonOk() {
|
public void selectButtonOk() {
|
||||||
Singletons.getControl().getGameView().selectButtonOk();
|
MatchUtil.getGameView().selectButtonOk();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void selectButtonCancel() {
|
public void selectButtonCancel() {
|
||||||
Singletons.getControl().getGameView().selectButtonCancel();
|
MatchUtil.getGameView().selectButtonCancel();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean passPriority() {
|
public boolean passPriority() {
|
||||||
return Singletons.getControl().getGameView().passPriority();
|
return MatchUtil.getGameView().passPriority();
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean passPriorityUntilEndOfTurn() {
|
public boolean passPriorityUntilEndOfTurn() {
|
||||||
return Singletons.getControl().getGameView().passPriorityUntilEndOfTurn();
|
return MatchUtil.getGameView().passPriorityUntilEndOfTurn();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void selectPlayer(final PlayerView player, final ITriggerEvent triggerEvent) {
|
public void selectPlayer(final PlayerView player, final ITriggerEvent triggerEvent) {
|
||||||
Singletons.getControl().getGameView().selectPlayer(player, triggerEvent);
|
MatchUtil.getGameView().selectPlayer(player, triggerEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void selectCard(final CardView card, final ITriggerEvent triggerEvent) {
|
public void selectCard(final CardView card, final ITriggerEvent triggerEvent) {
|
||||||
Singletons.getControl().getGameView().selectCard(card, triggerEvent);
|
MatchUtil.getGameView().selectCard(card, triggerEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void selectAbility(final SpellAbilityView sa) {
|
public void selectAbility(final SpellAbilityView sa) {
|
||||||
Singletons.getControl().getGameView().selectAbility(sa);
|
MatchUtil.getGameView().selectAbility(sa);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @param s0   {@link java.lang.String} */
|
/** @param s0   {@link java.lang.String} */
|
||||||
@@ -148,7 +148,7 @@ public enum CPrompt implements ICDoc {
|
|||||||
|
|
||||||
public void updateText() {
|
public void updateText() {
|
||||||
FThreads.assertExecutedByEdt(GuiBase.getInterface(), true);
|
FThreads.assertExecutedByEdt(GuiBase.getInterface(), true);
|
||||||
final IGameView game = Singletons.getControl().getGameView();
|
final IGameView game = MatchUtil.getGameView();
|
||||||
final String text = String.format("T:%d G:%d/%d [%s]", game.getTurnNumber(), game.getNumPlayedGamesInMatch() + 1, game.getNumGamesInMatch(), game.getGameType());
|
final String text = String.format("T:%d G:%d/%d [%s]", game.getTurnNumber(), game.getNumPlayedGamesInMatch() + 1, game.getNumGamesInMatch(), game.getGameType());
|
||||||
view.getLblGames().setText(text);
|
view.getLblGames().setText(text);
|
||||||
view.getLblGames().setToolTipText(String.format("%s: Game #%d of %d, turn %d", game.getGameType(), game.getNumPlayedGamesInMatch() + 1, game.getNumGamesInMatch(), game.getTurnNumber()));
|
view.getLblGames().setToolTipText(String.format("%s: Game #%d of %d, turn %d", game.getGameType(), game.getNumPlayedGamesInMatch() + 1, game.getNumGamesInMatch(), game.getTurnNumber()));
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
package forge.screens.match.menus;
|
package forge.screens.match.menus;
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.match.MatchUtil;
|
||||||
import forge.menus.MenuUtil;
|
import forge.menus.MenuUtil;
|
||||||
import forge.screens.match.controllers.CDev;
|
import forge.screens.match.controllers.CDev;
|
||||||
|
|
||||||
@@ -67,8 +67,8 @@ public class DevModeMenu implements ActionListener {
|
|||||||
menu.add(getMenuItem(DevMenuItem.WIN_GAME));
|
menu.add(getMenuItem(DevMenuItem.WIN_GAME));
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.add(getMenuItem(DevMenuItem.SETUP_GAME_STATE));
|
menu.add(getMenuItem(DevMenuItem.SETUP_GAME_STATE));
|
||||||
menu.add(getCheckboxMenuItem(DevMenuItem.PLAY_UNLIMITED_LANDS, Singletons.getControl().getGameView().canPlayUnlimitedLands()));
|
menu.add(getCheckboxMenuItem(DevMenuItem.PLAY_UNLIMITED_LANDS, MatchUtil.getGameView().canPlayUnlimitedLands()));
|
||||||
menu.add(getCheckboxMenuItem(DevMenuItem.VIEW_ALL, Singletons.getControl().getGameView().canViewAllCards()));
|
menu.add(getCheckboxMenuItem(DevMenuItem.VIEW_ALL, MatchUtil.getGameView().canViewAllCards()));
|
||||||
menu.add(getMenuItem(DevMenuItem.ADD_COUNTER));
|
menu.add(getMenuItem(DevMenuItem.ADD_COUNTER));
|
||||||
menu.addSeparator();
|
menu.addSeparator();
|
||||||
menu.add(getMenuItem(DevMenuItem.TAP_PERMANENT));
|
menu.add(getMenuItem(DevMenuItem.TAP_PERMANENT));
|
||||||
|
|||||||
@@ -8,14 +8,12 @@ import javax.swing.ButtonGroup;
|
|||||||
import javax.swing.JMenu;
|
import javax.swing.JMenu;
|
||||||
import javax.swing.JPopupMenu;
|
import javax.swing.JPopupMenu;
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.control.FControl;
|
import forge.match.MatchUtil;
|
||||||
import forge.menus.MenuUtil;
|
import forge.menus.MenuUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.CMatchUI;
|
|
||||||
import forge.screens.match.VAutoYields;
|
import forge.screens.match.VAutoYields;
|
||||||
import forge.screens.match.controllers.CDock;
|
import forge.screens.match.controllers.CDock;
|
||||||
import forge.toolbox.FSkin.SkinIcon;
|
import forge.toolbox.FSkin.SkinIcon;
|
||||||
@@ -85,7 +83,7 @@ public final class GameMenu {
|
|||||||
return new ActionListener() {
|
return new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
Singletons.getControl().getGameView().tryUndoLastAction();
|
MatchUtil.getGameView().tryUndoLastAction();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -102,7 +100,7 @@ public final class GameMenu {
|
|||||||
return new ActionListener() {
|
return new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
CMatchUI.SINGLETON_INSTANCE.concede();
|
MatchUtil.concede();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -119,7 +117,7 @@ public final class GameMenu {
|
|||||||
return new ActionListener() {
|
return new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
Singletons.getControl().getGameView().alphaStrike();
|
MatchUtil.alphaStrike();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -203,8 +201,7 @@ public final class GameMenu {
|
|||||||
return new ActionListener() {
|
return new ActionListener() {
|
||||||
@Override
|
@Override
|
||||||
public void actionPerformed(ActionEvent e) {
|
public void actionPerformed(ActionEvent e) {
|
||||||
final FControl control = Singletons.getControl();
|
final VAutoYields autoYields = new VAutoYields(MatchUtil.getGameView());
|
||||||
final VAutoYields autoYields = new VAutoYields(control.getGameView());
|
|
||||||
autoYields.showAutoYields();
|
autoYields.showAutoYields();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ import javax.swing.JPanel;
|
|||||||
import javax.swing.SwingConstants;
|
import javax.swing.SwingConstants;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.Singletons;
|
|
||||||
import forge.gui.CardPicturePanel;
|
import forge.gui.CardPicturePanel;
|
||||||
import forge.gui.WrapLayout;
|
import forge.gui.WrapLayout;
|
||||||
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.MatchUtil;
|
||||||
import forge.screens.match.controllers.CAntes;
|
import forge.screens.match.controllers.CAntes;
|
||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
import forge.toolbox.FScrollPane;
|
import forge.toolbox.FScrollPane;
|
||||||
@@ -120,7 +120,7 @@ public enum VAntes implements IVDoc<CAntes> {
|
|||||||
allAntes.clear();
|
allAntes.clear();
|
||||||
pnl.removeAll();
|
pnl.removeAll();
|
||||||
|
|
||||||
for (final PlayerView p : Singletons.getControl().getGameView().getPlayers()) {
|
for (final PlayerView p : MatchUtil.getGameView().getPlayers()) {
|
||||||
for (final CardView c : p.getAnteCards()) {
|
for (final CardView c : p.getAnteCards()) {
|
||||||
final AntePanel pnlTemp = new AntePanel(c);
|
final AntePanel pnlTemp = new AntePanel(c);
|
||||||
allAntes.add(pnlTemp);
|
allAntes.add(pnlTemp);
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ 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.screens.match.CMatchUI;
|
import forge.match.MatchUtil;
|
||||||
import forge.screens.match.controllers.CField;
|
import forge.screens.match.controllers.CField;
|
||||||
import forge.toolbox.FLabel;
|
import forge.toolbox.FLabel;
|
||||||
import forge.toolbox.FScrollPane;
|
import forge.toolbox.FScrollPane;
|
||||||
@@ -110,15 +110,17 @@ public class VField implements IVDoc<CField> {
|
|||||||
@Override
|
@Override
|
||||||
public void mouseEntered(final MouseEvent e) {
|
public void mouseEntered(final MouseEvent e) {
|
||||||
avatarArea.setOpaque(true);
|
avatarArea.setOpaque(true);
|
||||||
if (!isHighlighted())
|
if (!isHighlighted()) {
|
||||||
avatarArea.setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
|
avatarArea.setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_BORDERS)));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void mouseExited(final MouseEvent e) {
|
public void mouseExited(final MouseEvent e) {
|
||||||
avatarArea.setOpaque(false);
|
avatarArea.setOpaque(false);
|
||||||
if (!isHighlighted())
|
if (!isHighlighted()) {
|
||||||
avatarArea.setBorder(borderAvatarSimple);
|
avatarArea.setBorder(borderAvatarSimple);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -243,7 +245,7 @@ public class VField implements IVDoc<CField> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isHighlighted() {
|
public boolean isHighlighted() {
|
||||||
return CMatchUI.SINGLETON_INSTANCE.isHighlighted(player);
|
return MatchUtil.isHighlighted(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -25,13 +25,13 @@ import net.miginfocom.swing.MigLayout;
|
|||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.game.GameLogEntry;
|
import forge.game.GameLogEntry;
|
||||||
import forge.game.GameLogEntryType;
|
import forge.game.GameLogEntryType;
|
||||||
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.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.GameLogPanel;
|
import forge.screens.match.GameLogPanel;
|
||||||
@@ -128,7 +128,7 @@ public enum VLog implements IVDoc<CLog> {
|
|||||||
*/
|
*/
|
||||||
public void updateConsole() {
|
public void updateConsole() {
|
||||||
if (isGameLogConsoleVisible()) {
|
if (isGameLogConsoleVisible()) {
|
||||||
LocalGameView model = Singletons.getControl().getGameView();
|
LocalGameView model = MatchUtil.getGameView();
|
||||||
resetDisplayIfNewGame(model);
|
resetDisplayIfNewGame(model);
|
||||||
displayNewGameLogEntries(model);
|
displayNewGameLogEntries(model);
|
||||||
// Important : refreshLayout() needs to be called every update.
|
// Important : refreshLayout() needs to be called every update.
|
||||||
|
|||||||
@@ -28,11 +28,11 @@ import javax.swing.ScrollPaneConstants;
|
|||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
import forge.Singletons;
|
|
||||||
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.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.controllers.CPlayers;
|
import forge.screens.match.controllers.CPlayers;
|
||||||
@@ -145,7 +145,7 @@ public enum VPlayers implements IVDoc<CPlayers> {
|
|||||||
public void update() {
|
public void update() {
|
||||||
// No need to update if this panel isn't showing
|
// No need to update if this panel isn't showing
|
||||||
if (parentCell == null || !this.equals(parentCell.getSelected())) { return; }
|
if (parentCell == null || !this.equals(parentCell.getSelected())) { return; }
|
||||||
boolean isCommander = Singletons.getControl().getGameView().isCommander();
|
boolean isCommander = MatchUtil.getGameView().isCommander();
|
||||||
|
|
||||||
for(final Entry<PlayerView, JLabel[]> rr : infoLBLs.entrySet()) {
|
for(final Entry<PlayerView, JLabel[]> rr : infoLBLs.entrySet()) {
|
||||||
PlayerView p0 = rr.getKey();
|
PlayerView p0 = rr.getKey();
|
||||||
|
|||||||
@@ -36,7 +36,6 @@ import javax.swing.border.EmptyBorder;
|
|||||||
|
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
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.game.player.Player;
|
import forge.game.player.Player;
|
||||||
@@ -44,6 +43,7 @@ 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.MatchUtil;
|
||||||
import forge.screens.match.CMatchUI;
|
import forge.screens.match.CMatchUI;
|
||||||
import forge.screens.match.controllers.CPrompt;
|
import forge.screens.match.controllers.CPrompt;
|
||||||
import forge.screens.match.controllers.CStack;
|
import forge.screens.match.controllers.CStack;
|
||||||
@@ -137,7 +137,7 @@ public enum VStack implements IVDoc<CStack> {
|
|||||||
* @param models
|
* @param models
|
||||||
* @param viewer */
|
* @param viewer */
|
||||||
public void updateStack() {
|
public void updateStack() {
|
||||||
final LocalGameView model = Singletons.getControl().getGameView();
|
final LocalGameView model = MatchUtil.getGameView();
|
||||||
final List<StackItemView> items = model.getStack();
|
final List<StackItemView> items = model.getStack();
|
||||||
tab.setText("Stack : " + items.size());
|
tab.setText("Stack : " + items.size());
|
||||||
|
|
||||||
@@ -181,7 +181,7 @@ public enum VStack implements IVDoc<CStack> {
|
|||||||
public StackInstanceTextArea(final IGameView game, final StackItemView item) {
|
public StackInstanceTextArea(final IGameView game, final StackItemView item) {
|
||||||
sourceCard = item.getSource();
|
sourceCard = item.getSource();
|
||||||
|
|
||||||
final Player localPlayer = Singletons.getControl().getCurrentPlayer();
|
final Player localPlayer = MatchUtil.getCurrentPlayer();
|
||||||
final String txt = (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer)
|
final String txt = (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer)
|
||||||
? "(OPTIONAL) " : "") + item.getText();
|
? "(OPTIONAL) " : "") + item.getText();
|
||||||
|
|
||||||
|
|||||||
@@ -1,8 +1,8 @@
|
|||||||
package forge.view;
|
package forge.view;
|
||||||
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.gui.framework.SDisplayUtil;
|
import forge.gui.framework.SDisplayUtil;
|
||||||
import forge.gui.framework.SResizingUtil;
|
import forge.gui.framework.SResizingUtil;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
@@ -78,14 +78,14 @@ public class FFrame extends SkinnedFrame implements ITitleBarOwner {
|
|||||||
private void pause() {
|
private void pause() {
|
||||||
if (paused || !isMainFrame) { return; }
|
if (paused || !isMainFrame) { return; }
|
||||||
|
|
||||||
Singletons.getControl().getSoundSystem().pause();
|
MatchUtil.pause();
|
||||||
paused = true;
|
paused = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resume() {
|
private void resume() {
|
||||||
if (!paused || !isMainFrame) { return; }
|
if (!paused || !isMainFrame) { return; }
|
||||||
|
|
||||||
Singletons.getControl().getSoundSystem().resume();
|
MatchUtil.resume();
|
||||||
paused = false;
|
paused = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,6 +16,7 @@ import forge.screens.home.VHomeUI;
|
|||||||
import forge.screens.match.TargetingOverlay;
|
import forge.screens.match.TargetingOverlay;
|
||||||
import forge.screens.match.VMatchUI;
|
import forge.screens.match.VMatchUI;
|
||||||
import forge.sound.MusicPlaylist;
|
import forge.sound.MusicPlaylist;
|
||||||
|
import forge.sound.SoundSystem;
|
||||||
import forge.toolbox.*;
|
import forge.toolbox.*;
|
||||||
import forge.toolbox.FSkin.SkinnedLayeredPane;
|
import forge.toolbox.FSkin.SkinnedLayeredPane;
|
||||||
import forge.util.BuildInfo;
|
import forge.util.BuildInfo;
|
||||||
@@ -223,7 +224,7 @@ public enum FView {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//start background music
|
//start background music
|
||||||
Singletons.getControl().getSoundSystem().setBackgroundMusic(MusicPlaylist.MENUS);
|
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS);
|
||||||
}
|
}
|
||||||
|
|
||||||
// will populate remainingFiles with remaining files if not null, returns whether any files have
|
// will populate remainingFiles with remaining files if not null, returns whether any files have
|
||||||
|
|||||||
@@ -38,9 +38,9 @@ import forge.ImageCache;
|
|||||||
import forge.card.CardEdition;
|
import forge.card.CardEdition;
|
||||||
import forge.card.mana.ManaCost;
|
import forge.card.mana.ManaCost;
|
||||||
import forge.gui.CardContainer;
|
import forge.gui.CardContainer;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.CMatchUI;
|
|
||||||
import forge.toolbox.CardFaceSymbols;
|
import forge.toolbox.CardFaceSymbols;
|
||||||
import forge.toolbox.FSkin.SkinnedPanel;
|
import forge.toolbox.FSkin.SkinnedPanel;
|
||||||
import forge.toolbox.IDisposable;
|
import forge.toolbox.IDisposable;
|
||||||
@@ -310,7 +310,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
|
|||||||
final int offset = this.isTapped() ? 1 : 0;
|
final int offset = this.isTapped() ? 1 : 0;
|
||||||
|
|
||||||
// Magenta outline for when card was chosen to pay
|
// Magenta outline for when card was chosen to pay
|
||||||
if (CMatchUI.SINGLETON_INSTANCE.isUsedToPay(this.getCard())) {
|
if (MatchUtil.isUsedToPay(this.getCard())) {
|
||||||
g2d.setColor(Color.magenta);
|
g2d.setColor(Color.magenta);
|
||||||
final int n2 = Math.max(1, Math.round(2 * this.cardWidth * CardPanel.SELECTED_BORDER_SIZE));
|
final int n2 = Math.max(1, Math.round(2 * this.cardWidth * CardPanel.SELECTED_BORDER_SIZE));
|
||||||
g2d.fillRoundRect(this.cardXOffset - n2, (this.cardYOffset - n2) + offset, this.cardWidth + (n2 * 2), this.cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2);
|
g2d.fillRoundRect(this.cardXOffset - n2, (this.cardYOffset - n2) + offset, this.cardWidth + (n2 * 2), this.cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2);
|
||||||
@@ -480,7 +480,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl
|
|||||||
CardFaceSymbols.drawSymbol("phasing", g, stateXSymbols, ySymbols);
|
CardFaceSymbols.drawSymbol("phasing", g, stateXSymbols, ySymbols);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (CMatchUI.SINGLETON_INSTANCE.isUsedToPay(card)) {
|
if (MatchUtil.isUsedToPay(card)) {
|
||||||
CardFaceSymbols.drawSymbol("sacrifice", g, (this.cardXOffset + (this.cardWidth / 2)) - 20,
|
CardFaceSymbols.drawSymbol("sacrifice", g, (this.cardXOffset + (this.cardWidth / 2)) - 20,
|
||||||
(this.cardYOffset + (this.cardHeight / 2)) - 20);
|
(this.cardYOffset + (this.cardHeight / 2)) - 20);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import forge.error.BugReporter;
|
|||||||
import forge.error.ExceptionHandler;
|
import forge.error.ExceptionHandler;
|
||||||
import forge.interfaces.IDeviceAdapter;
|
import forge.interfaces.IDeviceAdapter;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgeConstants;
|
import forge.properties.ForgeConstants;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
@@ -25,7 +26,7 @@ import forge.properties.ForgePreferences.FPref;
|
|||||||
import forge.screens.FScreen;
|
import forge.screens.FScreen;
|
||||||
import forge.screens.SplashScreen;
|
import forge.screens.SplashScreen;
|
||||||
import forge.screens.home.HomeScreen;
|
import forge.screens.home.HomeScreen;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.sound.MusicPlaylist;
|
import forge.sound.MusicPlaylist;
|
||||||
import forge.sound.SoundSystem;
|
import forge.sound.SoundSystem;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
@@ -50,7 +51,6 @@ public class Forge implements ApplicationListener {
|
|||||||
private static SplashScreen splashScreen;
|
private static SplashScreen splashScreen;
|
||||||
private static KeyInputAdapter keyInputAdapter;
|
private static KeyInputAdapter keyInputAdapter;
|
||||||
private static boolean exited;
|
private static boolean exited;
|
||||||
private static SoundSystem soundSystem;
|
|
||||||
private static final Stack<FScreen> screens = new Stack<FScreen>();
|
private static final Stack<FScreen> screens = new Stack<FScreen>();
|
||||||
|
|
||||||
public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0) {
|
public static ApplicationListener getApp(Clipboard clipboard0, IDeviceAdapter deviceAdapter0, String assetDir0) {
|
||||||
@@ -59,7 +59,6 @@ public class Forge implements ApplicationListener {
|
|||||||
deviceAdapter = deviceAdapter0;
|
deviceAdapter = deviceAdapter0;
|
||||||
final IGuiBase gui = new GuiMobile(assetDir0);
|
final IGuiBase gui = new GuiMobile(assetDir0);
|
||||||
GuiBase.setInterface(gui);
|
GuiBase.setInterface(gui);
|
||||||
soundSystem = new SoundSystem(gui);
|
|
||||||
}
|
}
|
||||||
return app;
|
return app;
|
||||||
}
|
}
|
||||||
@@ -72,6 +71,8 @@ public class Forge implements ApplicationListener {
|
|||||||
//install our error handler
|
//install our error handler
|
||||||
ExceptionHandler.registerErrorHandling(GuiBase.getInterface());
|
ExceptionHandler.registerErrorHandling(GuiBase.getInterface());
|
||||||
|
|
||||||
|
MatchUtil.setController(MatchController.instance);
|
||||||
|
|
||||||
graphics = new Graphics();
|
graphics = new Graphics();
|
||||||
splashScreen = new SplashScreen();
|
splashScreen = new SplashScreen();
|
||||||
Gdx.input.setInputProcessor(new MainInputProcessor());
|
Gdx.input.setInputProcessor(new MainInputProcessor());
|
||||||
@@ -115,7 +116,7 @@ public class Forge implements ApplicationListener {
|
|||||||
|
|
||||||
FSkin.loadFull(splashScreen);
|
FSkin.loadFull(splashScreen);
|
||||||
|
|
||||||
soundSystem.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
|
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS); //start background music
|
||||||
|
|
||||||
Gdx.input.setCatchBackKey(true);
|
Gdx.input.setCatchBackKey(true);
|
||||||
Gdx.input.setCatchMenuKey(true);
|
Gdx.input.setCatchMenuKey(true);
|
||||||
@@ -218,10 +219,6 @@ public class Forge implements ApplicationListener {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static SoundSystem getSoundSystem() {
|
|
||||||
return soundSystem;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void render() {
|
public void render() {
|
||||||
try {
|
try {
|
||||||
@@ -272,12 +269,12 @@ public class Forge implements ApplicationListener {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void pause() {
|
public void pause() {
|
||||||
FControl.pause();
|
MatchUtil.pause();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void resume() {
|
public void resume() {
|
||||||
FControl.resume();
|
MatchUtil.resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -289,7 +286,7 @@ public class Forge implements ApplicationListener {
|
|||||||
}
|
}
|
||||||
screens.clear();
|
screens.clear();
|
||||||
graphics.dispose();
|
graphics.dispose();
|
||||||
soundSystem.dispose();
|
SoundSystem.instance.dispose();
|
||||||
}
|
}
|
||||||
|
|
||||||
//log message to Forge.log file
|
//log message to Forge.log file
|
||||||
|
|||||||
@@ -3,11 +3,6 @@ package forge;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import com.badlogic.gdx.Gdx;
|
import com.badlogic.gdx.Gdx;
|
||||||
import com.badlogic.gdx.Application.ApplicationType;
|
import com.badlogic.gdx.Application.ApplicationType;
|
||||||
import com.badlogic.gdx.graphics.Texture;
|
import com.badlogic.gdx.graphics.Texture;
|
||||||
@@ -26,22 +21,11 @@ import forge.deck.Deck;
|
|||||||
import forge.deck.FDeckViewer;
|
import forge.deck.FDeckViewer;
|
||||||
import forge.deck.FSideboardDialog;
|
import forge.deck.FSideboardDialog;
|
||||||
import forge.error.BugReportDialog;
|
import forge.error.BugReportDialog;
|
||||||
import forge.events.UiEvent;
|
|
||||||
import forge.game.GameType;
|
|
||||||
import forge.game.Match;
|
|
||||||
import forge.game.phase.PhaseType;
|
|
||||||
import forge.game.player.IHasIcon;
|
import forge.game.player.IHasIcon;
|
||||||
import forge.game.player.RegisteredPlayer;
|
|
||||||
import forge.game.zone.ZoneType;
|
|
||||||
import forge.interfaces.IButton;
|
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.properties.ForgeConstants;
|
import forge.properties.ForgeConstants;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.screens.match.views.VPlayerPanel;
|
|
||||||
import forge.screens.match.views.VPhaseIndicator.PhaseLabel;
|
|
||||||
import forge.screens.match.views.VPlayerPanel.InfoTab;
|
|
||||||
import forge.screens.match.winlose.ViewWinLose;
|
|
||||||
import forge.screens.quest.QuestMenu;
|
import forge.screens.quest.QuestMenu;
|
||||||
import forge.sound.AudioClip;
|
import forge.sound.AudioClip;
|
||||||
import forge.sound.AudioMusic;
|
import forge.sound.AudioMusic;
|
||||||
@@ -50,16 +34,10 @@ import forge.sound.IAudioMusic;
|
|||||||
import forge.toolbox.FOptionPane;
|
import forge.toolbox.FOptionPane;
|
||||||
import forge.toolbox.GuiChoose;
|
import forge.toolbox.GuiChoose;
|
||||||
import forge.util.FileUtil;
|
import forge.util.FileUtil;
|
||||||
import forge.util.ITriggerEvent;
|
|
||||||
import forge.util.ThreadUtil;
|
import forge.util.ThreadUtil;
|
||||||
import forge.util.WaitCallback;
|
import forge.util.WaitCallback;
|
||||||
import forge.util.WaitRunnable;
|
import forge.util.WaitRunnable;
|
||||||
import forge.util.gui.SGuiChoose;
|
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
import forge.view.CombatView;
|
|
||||||
import forge.view.GameEntityView;
|
|
||||||
import forge.view.PlayerView;
|
|
||||||
import forge.view.SpellAbilityView;
|
|
||||||
|
|
||||||
public class GuiMobile implements IGuiBase {
|
public class GuiMobile implements IGuiBase {
|
||||||
private final String assetsDir;
|
private final String assetsDir;
|
||||||
@@ -236,100 +214,6 @@ public class GuiMobile implements IGuiBase {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public IButton getBtnOK(PlayerView player) {
|
|
||||||
return FControl.getView().getPrompt(player).getBtnOk();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IButton getBtnCancel(PlayerView player) {
|
|
||||||
return FControl.getView().getPrompt(player).getBtnCancel();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showPromptMessage(final PlayerView player, String message) {
|
|
||||||
FControl.getView().getPrompt(player).setMessage(message);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void focusButton(final IButton button) {
|
|
||||||
//not needed for mobile game
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void flashIncorrectAction() {
|
|
||||||
//SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE); //TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updatePhase() {
|
|
||||||
final PlayerView p = FControl.getGameView().getPlayerTurn();
|
|
||||||
final PhaseType ph = FControl.getGameView().getPhase();
|
|
||||||
|
|
||||||
PhaseLabel lbl = FControl.getPlayerPanel(p).getPhaseIndicator().getLabel(ph);
|
|
||||||
|
|
||||||
FControl.resetAllPhaseButtons();
|
|
||||||
if (lbl != null) {
|
|
||||||
lbl.setActive(true);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateTurn(final PlayerView player) {
|
|
||||||
//VField nextField = FControl.getFieldViewFor(event.turnOwner);
|
|
||||||
//SDisplayUtil.showTab(nextField);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updatePlayerControl() {
|
|
||||||
//TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void disableOverlay() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void enableOverlay() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void finishGame() {
|
|
||||||
new ViewWinLose(FControl.getGameView()).setVisible(true);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateStack() {
|
|
||||||
FControl.getView().getStack().update();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void startMatch(GameType gameType, List<RegisteredPlayer> players) {
|
|
||||||
FControl.startMatch(gameType, players);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setPanelSelection(final CardView c) {
|
|
||||||
//GuiUtils.setPanelSelection(c); //TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getAbilityToPlay(List<SpellAbilityView> abilities, ITriggerEvent triggerEvent) {
|
|
||||||
if (abilities.isEmpty()) {
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
if (abilities.size() == 1) {
|
|
||||||
return abilities.get(0).getId();
|
|
||||||
}
|
|
||||||
final SpellAbilityView choice = SGuiChoose.oneOrNone(this, "Choose ability to play", abilities);
|
|
||||||
return choice == null ? -1 : choice.getId();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void hear(LobbyPlayer player, String message) {
|
|
||||||
//FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message); //TODO
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAvatarCount() {
|
public int getAvatarCount() {
|
||||||
if (FSkin.isLoaded()) {
|
if (FSkin.isLoaded()) {
|
||||||
@@ -338,130 +222,11 @@ public class GuiMobile implements IGuiBase {
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void fireEvent(UiEvent e) {
|
|
||||||
FControl.fireEvent(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setCard(final CardView card) {
|
public void setCard(final CardView card) {
|
||||||
//doesn't need to do anything
|
//doesn't need to do anything
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showCombat(final CombatView combat) {
|
|
||||||
FControl.showCombat(combat);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setUsedToPay(final CardView card, final boolean b) {
|
|
||||||
FControl.setUsedToPay(card, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void setHighlighted(final PlayerView player, boolean b) {
|
|
||||||
FControl.setHighlighted(player, b);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean stopAtPhase(final PlayerView playerTurn, final PhaseType phase) {
|
|
||||||
return FControl.stopAtPhase(playerTurn, phase);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Object showManaPool(final PlayerView player) {
|
|
||||||
VPlayerPanel playerPanel = FControl.getPlayerPanel(player);
|
|
||||||
InfoTab oldSelectedTab = playerPanel.getSelectedTab();
|
|
||||||
playerPanel.setSelectedTab(playerPanel.getManaPoolTab());
|
|
||||||
return oldSelectedTab;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void hideManaPool(final PlayerView player, final Object zoneToRestore) {
|
|
||||||
VPlayerPanel playerPanel = FControl.getPlayerPanel(player);
|
|
||||||
if (zoneToRestore == playerPanel.getManaPoolTab()) {
|
|
||||||
return; //if mana pool was selected previously, we don't need to switch back to anything
|
|
||||||
}
|
|
||||||
if (playerPanel.getSelectedTab() != playerPanel.getManaPoolTab()) {
|
|
||||||
return; //if player switch away from mana pool already, don't change anything
|
|
||||||
}
|
|
||||||
playerPanel.setSelectedTab((InfoTab)zoneToRestore);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean openZones(Collection<ZoneType> zones, Map<PlayerView, Object> players) {
|
|
||||||
if (zones.size() == 1) {
|
|
||||||
ZoneType zoneType = zones.iterator().next();
|
|
||||||
switch (zoneType) {
|
|
||||||
case Battlefield:
|
|
||||||
case Command:
|
|
||||||
players.clear(); //clear since no zones need to be restored
|
|
||||||
return true; //Battlefield is always open
|
|
||||||
default:
|
|
||||||
//open zone tab for given zone if needed
|
|
||||||
boolean result = true;
|
|
||||||
for (PlayerView player : players.keySet()) {
|
|
||||||
VPlayerPanel playerPanel = FControl.getPlayerPanel(player);
|
|
||||||
players.put(player, playerPanel.getSelectedTab()); //backup selected tab before changing it
|
|
||||||
InfoTab zoneTab = playerPanel.getZoneTab(zoneType);
|
|
||||||
if (zoneTab == null) {
|
|
||||||
result = false;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
playerPanel.setSelectedTab(zoneTab);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void restoreOldZones(Map<PlayerView, Object> playersToRestoreZonesFor) {
|
|
||||||
for (Entry<PlayerView, Object> player : playersToRestoreZonesFor.entrySet()) {
|
|
||||||
VPlayerPanel playerPanel = FControl.getPlayerPanel(player.getKey());
|
|
||||||
playerPanel.setSelectedTab((InfoTab)player.getValue());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate) {
|
|
||||||
FControl.updateZones(zonesToUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateCards(Iterable<CardView> cardsToUpdate) {
|
|
||||||
FControl.updateCards(cardsToUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void refreshCardDetails(Iterable<CardView> cards) {
|
|
||||||
FControl.refreshCardDetails(cards);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateManaPool(List<PlayerView> manaPoolUpdate) {
|
|
||||||
FControl.updateManaPool(manaPoolUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void updateLives(List<PlayerView> livesUpdate) {
|
|
||||||
FControl.updateLives(livesUpdate);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void endCurrentGame() {
|
|
||||||
FControl.endCurrentGame();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Map<CardView, Integer> getDamageToAssign(CardView attacker, List<CardView> blockers,
|
|
||||||
int damageDealt, GameEntityView defender, boolean overrideOrder) {
|
|
||||||
return FControl.getDamageToAssign(attacker, blockers,
|
|
||||||
damageDealt, defender, overrideOrder);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public String showFileDialog(String title, String defaultDir) {
|
public String showFileDialog(String title, String defaultDir) {
|
||||||
return ForgeConstants.USER_GAMES_DIR + "Test.fgs"; //TODO: Show dialog
|
return ForgeConstants.USER_GAMES_DIR + "Test.fgs"; //TODO: Show dialog
|
||||||
@@ -502,22 +267,6 @@ public class GuiMobile implements IGuiBase {
|
|||||||
ImageCache.clear();
|
ImageCache.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void startGame(Match match) {
|
|
||||||
FControl.startGame(match);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void continueMatch(Match match) {
|
|
||||||
FControl.endCurrentGame();
|
|
||||||
if (match == null) {
|
|
||||||
Forge.back();
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
FControl.startGame(match);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void showSpellShop() {
|
public void showSpellShop() {
|
||||||
QuestMenu.showSpellShop();
|
QuestMenu.showSpellShop();
|
||||||
@@ -530,6 +279,6 @@ public class GuiMobile implements IGuiBase {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi) {
|
public void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi) {
|
||||||
FControl.setPlayerAvatar(player, ImageCache.getIcon(ihi));
|
MatchController.setPlayerAvatar(player, ImageCache.getIcon(ihi));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -25,9 +25,10 @@ import forge.card.CardDetailUtil.DetailColors;
|
|||||||
import forge.card.mana.ManaCost;
|
import forge.card.mana.ManaCost;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.item.IPaperCard;
|
import forge.item.IPaperCard;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.toolbox.FCardPanel;
|
||||||
import forge.toolbox.FDialog;
|
import forge.toolbox.FDialog;
|
||||||
import forge.toolbox.FList;
|
import forge.toolbox.FList;
|
||||||
@@ -540,7 +541,7 @@ public class CardRenderer {
|
|||||||
w -= 2 * padding;
|
w -= 2 * padding;
|
||||||
h -= 2 * padding;
|
h -= 2 * padding;
|
||||||
|
|
||||||
CardStateView details = FControl.getCardDetails(card);
|
CardStateView details = MatchController.getCardDetails(card);
|
||||||
DetailColors borderColor = CardDetailUtil.getBorderColor(details);
|
DetailColors borderColor = CardDetailUtil.getBorderColor(details);
|
||||||
Color color = FSkinColor.fromRGB(borderColor.r, borderColor.g, borderColor.b);
|
Color color = FSkinColor.fromRGB(borderColor.r, borderColor.g, borderColor.b);
|
||||||
color = FSkinColor.tintColor(Color.WHITE, color, CardRenderer.PT_BOX_TINT);
|
color = FSkinColor.tintColor(Color.WHITE, color, CardRenderer.PT_BOX_TINT);
|
||||||
@@ -598,7 +599,7 @@ public class CardRenderer {
|
|||||||
final float stateXSymbols = (x + (w / 2)) - otherSymbolsSize / 2;
|
final float stateXSymbols = (x + (w / 2)) - otherSymbolsSize / 2;
|
||||||
final float ySymbols = (y + h) - (h / 8) - otherSymbolsSize / 2;
|
final float ySymbols = (y + h) - (h / 8) - otherSymbolsSize / 2;
|
||||||
|
|
||||||
final IGameView game = FControl.getGameView();
|
final IGameView game = MatchUtil.getGameView();
|
||||||
if (game != null) {
|
if (game != null) {
|
||||||
final CombatView combat = game.getCombat();
|
final CombatView combat = game.getCombat();
|
||||||
if (combat != null) {
|
if (combat != null) {
|
||||||
@@ -619,7 +620,7 @@ public class CardRenderer {
|
|||||||
CardFaceSymbols.drawSymbol("phasing", g, stateXSymbols, ySymbols, otherSymbolsSize, otherSymbolsSize);
|
CardFaceSymbols.drawSymbol("phasing", g, stateXSymbols, ySymbols, otherSymbolsSize, otherSymbolsSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FControl.isUsedToPay(card)) {
|
if (MatchUtil.isUsedToPay(card)) {
|
||||||
float sacSymbolSize = otherSymbolsSize * 1.2f;
|
float sacSymbolSize = otherSymbolsSize * 1.2f;
|
||||||
CardFaceSymbols.drawSymbol("sacrifice", g, (x + (w / 2)) - sacSymbolSize / 2, (y + (h / 2)) - sacSymbolSize / 2, otherSymbolsSize, otherSymbolsSize);
|
CardFaceSymbols.drawSymbol("sacrifice", g, (x + (w / 2)) - sacSymbolSize / 2, (y + (h / 2)) - sacSymbolSize / 2, otherSymbolsSize, otherSymbolsSize);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,9 +7,9 @@ import java.util.Set;
|
|||||||
|
|
||||||
import com.badlogic.gdx.Input.Keys;
|
import com.badlogic.gdx.Input.Keys;
|
||||||
|
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menu.FPopupMenu;
|
import forge.menu.FPopupMenu;
|
||||||
import forge.screens.FScreen;
|
import forge.screens.FScreen;
|
||||||
import forge.screens.match.FControl;
|
|
||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.assets.FSkinImage;
|
import forge.assets.FSkinImage;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
@@ -71,7 +71,7 @@ public abstract class LaunchScreen extends FScreen {
|
|||||||
throw new RuntimeException("Must add at least one player to launchParams.players");
|
throw new RuntimeException("Must add at least one player to launchParams.players");
|
||||||
}
|
}
|
||||||
|
|
||||||
FControl.startMatch(launchParams.gameType, launchParams.appliedVariants, launchParams.players);
|
MatchUtil.startMatch(launchParams.gameType, launchParams.appliedVariants, launchParams.players);
|
||||||
}
|
}
|
||||||
creatingMatch = false;
|
creatingMatch = false;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -145,8 +145,8 @@ public class DraftScreen extends LaunchScreen {
|
|||||||
LoadingOverlay.show("Loading new game...", new Runnable() {
|
LoadingOverlay.show("Loading new game...", new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FModel.getGauntletMini(GuiBase.getInterface()).resetGauntletDraft();
|
FModel.getGauntletMini().resetGauntletDraft();
|
||||||
FModel.getGauntletMini(GuiBase.getInterface()).launch(rounds, humanDeck.getDeck(), GameType.Draft);
|
FModel.getGauntletMini().launch(rounds, humanDeck.getDeck(), GameType.Draft);
|
||||||
creatingMatch = false;
|
creatingMatch = false;
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
419
forge-gui-mobile/src/forge/screens/match/MatchController.java
Normal file
419
forge-gui-mobile/src/forge/screens/match/MatchController.java
Normal file
@@ -0,0 +1,419 @@
|
|||||||
|
package forge.screens.match;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.HashSet;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Set;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
import forge.Forge;
|
||||||
|
import forge.Graphics;
|
||||||
|
import forge.GuiBase;
|
||||||
|
import forge.LobbyPlayer;
|
||||||
|
import forge.assets.FImage;
|
||||||
|
import forge.assets.FSkin;
|
||||||
|
import forge.assets.FTextureRegionImage;
|
||||||
|
import forge.game.Match;
|
||||||
|
import forge.game.phase.PhaseType;
|
||||||
|
import forge.game.player.Player;
|
||||||
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.interfaces.IButton;
|
||||||
|
import forge.match.IMatchController;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
|
import forge.model.FModel;
|
||||||
|
import forge.player.PlayerControllerHuman;
|
||||||
|
import forge.properties.ForgePreferences;
|
||||||
|
import forge.properties.ForgePreferences.FPref;
|
||||||
|
import forge.screens.match.views.VAssignDamage;
|
||||||
|
import forge.screens.match.views.VPhaseIndicator;
|
||||||
|
import forge.screens.match.views.VPlayerPanel;
|
||||||
|
import forge.screens.match.views.VCardDisplayArea.CardAreaPanel;
|
||||||
|
import forge.screens.match.views.VPhaseIndicator.PhaseLabel;
|
||||||
|
import forge.screens.match.views.VPlayerPanel.InfoTab;
|
||||||
|
import forge.screens.match.views.VPrompt;
|
||||||
|
import forge.screens.match.winlose.ViewWinLose;
|
||||||
|
import forge.toolbox.FDisplayObject;
|
||||||
|
import forge.util.ITriggerEvent;
|
||||||
|
import forge.util.WaitCallback;
|
||||||
|
import forge.util.gui.SGuiChoose;
|
||||||
|
import forge.view.CardView;
|
||||||
|
import forge.view.CombatView;
|
||||||
|
import forge.view.GameEntityView;
|
||||||
|
import forge.view.LocalGameView;
|
||||||
|
import forge.view.PlayerView;
|
||||||
|
import forge.view.SpellAbilityView;
|
||||||
|
import forge.view.CardView.CardStateView;
|
||||||
|
|
||||||
|
public class MatchController implements IMatchController {
|
||||||
|
private MatchController() { }
|
||||||
|
public static final MatchController instance = new MatchController();
|
||||||
|
|
||||||
|
private static final Map<LobbyPlayer, FImage> avatarImages = new HashMap<LobbyPlayer, FImage>();
|
||||||
|
private static final Map<Integer, CardStateView> cardDetailsCache = new HashMap<Integer, CardStateView>();
|
||||||
|
|
||||||
|
private static MatchScreen view;
|
||||||
|
|
||||||
|
public static MatchScreen getView() {
|
||||||
|
return view;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static FImage getPlayerAvatar(final PlayerView p) {
|
||||||
|
LobbyPlayer lp = p.getLobbyPlayer();
|
||||||
|
FImage avatar = avatarImages.get(lp);
|
||||||
|
if (avatar == null) {
|
||||||
|
avatar = new FTextureRegionImage(FSkin.getAvatars().get(lp.getAvatarIndex()));
|
||||||
|
}
|
||||||
|
return avatar;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void setPlayerAvatar(final LobbyPlayer lp, final FImage avatarImage) {
|
||||||
|
avatarImages.put(lp, avatarImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public static CardStateView getCardDetails(CardView card) {
|
||||||
|
final CardStateView details = cardDetailsCache.get(card.getId());
|
||||||
|
if (details == null) {
|
||||||
|
cardDetailsCache.put(card.getId(), card.getOriginal());
|
||||||
|
return card.getOriginal();
|
||||||
|
}
|
||||||
|
return details;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void refreshCardDetails(Iterable<CardView> cards) {
|
||||||
|
Set<PlayerView> playersNeedingFieldUpdate = null;
|
||||||
|
|
||||||
|
for (final CardView c : cards) {
|
||||||
|
//for each card in play, if it changed from creature to non-creature or vice versa,
|
||||||
|
//or if it changed from land to non-land or vice-versa,
|
||||||
|
//ensure field containing that card is updated to reflect that change
|
||||||
|
final CardStateView state = c.getOriginal();
|
||||||
|
if (c.getZone() == ZoneType.Battlefield) {
|
||||||
|
CardStateView oldDetails = cardDetailsCache.get(c);
|
||||||
|
if (oldDetails == null || state.isCreature() != oldDetails.isCreature() || state.isLand() != oldDetails.isLand()) {
|
||||||
|
if (playersNeedingFieldUpdate == null) {
|
||||||
|
playersNeedingFieldUpdate = new HashSet<PlayerView>();
|
||||||
|
}
|
||||||
|
playersNeedingFieldUpdate.add(c.getController());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
cardDetailsCache.put(c.getId(), c.getOriginal());
|
||||||
|
}
|
||||||
|
|
||||||
|
if (playersNeedingFieldUpdate != null) { //update field for any players necessary
|
||||||
|
for (PlayerView p : playersNeedingFieldUpdate) {
|
||||||
|
view.getPlayerPanel(p).getField().update();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void startNewMatch(Match match) {
|
||||||
|
MatchUtil.startGame(match);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean resetForNewGame() {
|
||||||
|
cardDetailsCache.clear(); //ensure details cache cleared before starting a new game
|
||||||
|
CardAreaPanel.resetForNewGame(); //ensure card panels reset between games
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void openView(List<Player> sortedPlayers, int humanCount) {
|
||||||
|
List<VPlayerPanel> playerPanels = new ArrayList<VPlayerPanel>();
|
||||||
|
for (Player p : sortedPlayers) {
|
||||||
|
playerPanels.add(new VPlayerPanel(MatchUtil.getGameView(p).getPlayerView(p), humanCount == 0 || p.getController() instanceof PlayerControllerHuman));
|
||||||
|
}
|
||||||
|
view = new MatchScreen(playerPanels);
|
||||||
|
|
||||||
|
if (humanCount == 0) {
|
||||||
|
//add special object that pauses game if screen touched
|
||||||
|
view.add(new FDisplayObject() {
|
||||||
|
@Override
|
||||||
|
public void draw(Graphics g) {
|
||||||
|
//don't draw anything
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void buildTouchListeners(float screenX, float screenY, ArrayList<FDisplayObject> listeners) {
|
||||||
|
if (screenY < view.getHeight() - VPrompt.HEIGHT) {
|
||||||
|
MatchUtil.pause();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
actuateMatchPreferences();
|
||||||
|
|
||||||
|
Forge.openScreen(view);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IButton getBtnOK(PlayerView player) {
|
||||||
|
return view.getPrompt(player).getBtnOk();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public IButton getBtnCancel(PlayerView player) {
|
||||||
|
return view.getPrompt(player).getBtnCancel();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showPromptMessage(final PlayerView player, String message) {
|
||||||
|
view.getPrompt(player).setMessage(message);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void focusButton(final IButton button) {
|
||||||
|
//not needed for mobile game
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void flashIncorrectAction() {
|
||||||
|
//SDisplayUtil.remind(VPrompt.SINGLETON_INSTANCE); //TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updatePhase() {
|
||||||
|
LocalGameView gameView = MatchUtil.getGameView();
|
||||||
|
final PlayerView p = gameView.getPlayerTurn();
|
||||||
|
final PhaseType ph = gameView.getPhase();
|
||||||
|
|
||||||
|
PhaseLabel lbl = view.getPlayerPanel(p).getPhaseIndicator().getLabel(ph);
|
||||||
|
|
||||||
|
view.resetAllPhaseButtons();
|
||||||
|
if (lbl != null) {
|
||||||
|
lbl.setActive(true);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateTurn(final PlayerView player) {
|
||||||
|
//VField nextField = getFieldViewFor(event.turnOwner);
|
||||||
|
//SDisplayUtil.showTab(nextField);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updatePlayerControl() {
|
||||||
|
//TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void disableOverlay() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void enableOverlay() {
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void finishGame() {
|
||||||
|
new ViewWinLose(MatchUtil.getGameView()).setVisible(true);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateStack() {
|
||||||
|
view.getStack().update();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setPanelSelection(final CardView c) {
|
||||||
|
//GuiUtils.setPanelSelection(c); //TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getAbilityToPlay(List<SpellAbilityView> abilities, ITriggerEvent triggerEvent) {
|
||||||
|
if (abilities.isEmpty()) {
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
if (abilities.size() == 1) {
|
||||||
|
return abilities.get(0).getId();
|
||||||
|
}
|
||||||
|
final SpellAbilityView choice = SGuiChoose.oneOrNone(GuiBase.getInterface(), "Choose ability to play", abilities);
|
||||||
|
return choice == null ? -1 : choice.getId();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void showCombat(final CombatView combat) {
|
||||||
|
//not needed
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Object showManaPool(final PlayerView player) {
|
||||||
|
VPlayerPanel playerPanel = view.getPlayerPanel(player);
|
||||||
|
InfoTab oldSelectedTab = playerPanel.getSelectedTab();
|
||||||
|
playerPanel.setSelectedTab(playerPanel.getManaPoolTab());
|
||||||
|
return oldSelectedTab;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void hideManaPool(final PlayerView player, final Object zoneToRestore) {
|
||||||
|
VPlayerPanel playerPanel = view.getPlayerPanel(player);
|
||||||
|
if (zoneToRestore == playerPanel.getManaPoolTab()) {
|
||||||
|
return; //if mana pool was selected previously, we don't need to switch back to anything
|
||||||
|
}
|
||||||
|
if (playerPanel.getSelectedTab() != playerPanel.getManaPoolTab()) {
|
||||||
|
return; //if player switch away from mana pool already, don't change anything
|
||||||
|
}
|
||||||
|
playerPanel.setSelectedTab((InfoTab)zoneToRestore);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean openZones(Collection<ZoneType> zones, Map<PlayerView, Object> players) {
|
||||||
|
if (zones.size() == 1) {
|
||||||
|
ZoneType zoneType = zones.iterator().next();
|
||||||
|
switch (zoneType) {
|
||||||
|
case Battlefield:
|
||||||
|
case Command:
|
||||||
|
players.clear(); //clear since no zones need to be restored
|
||||||
|
return true; //Battlefield is always open
|
||||||
|
default:
|
||||||
|
//open zone tab for given zone if needed
|
||||||
|
boolean result = true;
|
||||||
|
for (PlayerView player : players.keySet()) {
|
||||||
|
VPlayerPanel playerPanel = view.getPlayerPanel(player);
|
||||||
|
players.put(player, playerPanel.getSelectedTab()); //backup selected tab before changing it
|
||||||
|
InfoTab zoneTab = playerPanel.getZoneTab(zoneType);
|
||||||
|
if (zoneTab == null) {
|
||||||
|
result = false;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
playerPanel.setSelectedTab(zoneTab);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void restoreOldZones(Map<PlayerView, Object> playersToRestoreZonesFor) {
|
||||||
|
for (Entry<PlayerView, Object> player : playersToRestoreZonesFor.entrySet()) {
|
||||||
|
VPlayerPanel playerPanel = view.getPlayerPanel(player.getKey());
|
||||||
|
playerPanel.setSelectedTab((InfoTab)player.getValue());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Map<CardView, Integer> assignDamage(final CardView attacker, final List<CardView> blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) {
|
||||||
|
return new WaitCallback<Map<CardView, Integer>>() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder, this);
|
||||||
|
v.show();
|
||||||
|
}
|
||||||
|
}.invokeAndWait();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateManaPool(List<PlayerView> manaPoolUpdate) {
|
||||||
|
for (PlayerView p : manaPoolUpdate) {
|
||||||
|
view.getPlayerPanel(p).updateManaPool();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateLives(List<PlayerView> livesUpdate) {
|
||||||
|
for (PlayerView p : livesUpdate) {
|
||||||
|
view.getPlayerPanel(p).updateLife();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void hear(LobbyPlayer player, String message) {
|
||||||
|
//FNetOverlay.SINGLETON_INSTANCE.addMessage(player.getName(), message); //TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean stopAtPhase(PlayerView turn, PhaseType phase) {
|
||||||
|
return view.stopAtPhase(turn, phase);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate) {
|
||||||
|
view.updateZones(zonesToUpdate);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void updateSingleCard(CardView card) {
|
||||||
|
view.updateSingleCard(card);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void afterGameEnd() {
|
||||||
|
Forge.back();
|
||||||
|
cardDetailsCache.clear(); //ensure card details cache cleared ending game
|
||||||
|
}
|
||||||
|
|
||||||
|
private static void actuateMatchPreferences() {
|
||||||
|
ForgePreferences prefs = FModel.getPreferences();
|
||||||
|
|
||||||
|
VPhaseIndicator fvAi = view.getTopPlayerPanel().getPhaseIndicator();
|
||||||
|
fvAi.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP));
|
||||||
|
fvAi.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW));
|
||||||
|
fvAi.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1));
|
||||||
|
fvAi.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT));
|
||||||
|
fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS));
|
||||||
|
fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS));
|
||||||
|
fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE));
|
||||||
|
fvAi.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE));
|
||||||
|
fvAi.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT));
|
||||||
|
fvAi.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2));
|
||||||
|
fvAi.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_EOT));
|
||||||
|
fvAi.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP));
|
||||||
|
|
||||||
|
VPhaseIndicator fvHuman = view.getBottomPlayerPanel().getPhaseIndicator();
|
||||||
|
fvHuman.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP));
|
||||||
|
fvHuman.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW));
|
||||||
|
fvHuman.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1));
|
||||||
|
fvHuman.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT));
|
||||||
|
fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS));
|
||||||
|
fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS));
|
||||||
|
fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE));
|
||||||
|
fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE));
|
||||||
|
fvHuman.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT));
|
||||||
|
fvHuman.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2));
|
||||||
|
fvHuman.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT));
|
||||||
|
fvHuman.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP));
|
||||||
|
}
|
||||||
|
|
||||||
|
public static void writeMatchPreferences() {
|
||||||
|
ForgePreferences prefs = FModel.getPreferences();
|
||||||
|
|
||||||
|
VPhaseIndicator fvAi = view.getTopPlayerPanel().getPhaseIndicator();
|
||||||
|
prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLabel(PhaseType.UPKEEP).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLabel(PhaseType.DRAW).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLabel(PhaseType.MAIN1).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_END).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLabel(PhaseType.MAIN2).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLabel(PhaseType.END_OF_TURN).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLabel(PhaseType.CLEANUP).getStopAtPhase()));
|
||||||
|
|
||||||
|
VPhaseIndicator fvHuman = view.getBottomPlayerPanel().getPhaseIndicator();
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLabel(PhaseType.UPKEEP).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLabel(PhaseType.DRAW).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLabel(PhaseType.MAIN1).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_END).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLabel(PhaseType.MAIN2).getStopAtPhase()));
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLabel(PhaseType.END_OF_TURN).getStopAtPhase());
|
||||||
|
prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLabel(PhaseType.CLEANUP).getStopAtPhase());
|
||||||
|
|
||||||
|
prefs.save();
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -11,7 +11,9 @@ import org.apache.commons.lang3.tuple.Pair;
|
|||||||
import com.badlogic.gdx.Input.Keys;
|
import com.badlogic.gdx.Input.Keys;
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
import forge.Forge;
|
import forge.game.phase.PhaseType;
|
||||||
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menu.FMenuBar;
|
import forge.menu.FMenuBar;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.LobbyPlayerHuman;
|
import forge.player.LobbyPlayerHuman;
|
||||||
@@ -24,17 +26,20 @@ import forge.screens.match.views.VGameMenu;
|
|||||||
import forge.screens.match.views.VLog;
|
import forge.screens.match.views.VLog;
|
||||||
import forge.screens.match.views.VManaPool;
|
import forge.screens.match.views.VManaPool;
|
||||||
import forge.screens.match.views.VPlayerPanel;
|
import forge.screens.match.views.VPlayerPanel;
|
||||||
|
import forge.screens.match.views.VPhaseIndicator.PhaseLabel;
|
||||||
import forge.screens.match.views.VPlayerPanel.InfoTab;
|
import forge.screens.match.views.VPlayerPanel.InfoTab;
|
||||||
import forge.screens.match.views.VPlayers;
|
import forge.screens.match.views.VPlayers;
|
||||||
import forge.screens.match.views.VPrompt;
|
import forge.screens.match.views.VPrompt;
|
||||||
import forge.screens.match.views.VStack;
|
import forge.screens.match.views.VStack;
|
||||||
import forge.sound.MusicPlaylist;
|
import forge.sound.MusicPlaylist;
|
||||||
|
import forge.sound.SoundSystem;
|
||||||
import forge.Forge.KeyInputAdapter;
|
import forge.Forge.KeyInputAdapter;
|
||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.animation.AbilityEffect;
|
import forge.animation.AbilityEffect;
|
||||||
import forge.assets.FSkinColor;
|
import forge.assets.FSkinColor;
|
||||||
import forge.assets.FSkinTexture;
|
import forge.assets.FSkinTexture;
|
||||||
import forge.assets.FSkinColor.Colors;
|
import forge.assets.FSkinColor.Colors;
|
||||||
|
import forge.toolbox.FCardPanel;
|
||||||
import forge.toolbox.FEvent;
|
import forge.toolbox.FEvent;
|
||||||
import forge.toolbox.FEvent.FEventHandler;
|
import forge.toolbox.FEvent.FEventHandler;
|
||||||
import forge.toolbox.FScrollPane;
|
import forge.toolbox.FScrollPane;
|
||||||
@@ -76,13 +81,13 @@ public class MatchScreen extends FScreen {
|
|||||||
new FEventHandler() {
|
new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.getGameView().selectButtonOk();
|
MatchUtil.getGameView().selectButtonOk();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new FEventHandler() {
|
new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.getGameView().selectButtonCancel();
|
MatchUtil.getGameView().selectButtonCancel();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
@@ -91,13 +96,13 @@ public class MatchScreen extends FScreen {
|
|||||||
new FEventHandler() {
|
new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.getGameView().selectButtonOk();
|
MatchUtil.getGameView().selectButtonOk();
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
new FEventHandler() {
|
new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.getGameView().selectButtonCancel();
|
MatchUtil.getGameView().selectButtonCancel();
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
@@ -130,7 +135,7 @@ public class MatchScreen extends FScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public VPrompt getActivePrompt() {
|
public VPrompt getActivePrompt() {
|
||||||
if (topPlayerPrompt != null && topPlayerPanel.getPlayer().equals(FControl.getCurrentPlayer())) {
|
if (topPlayerPrompt != null && topPlayerPanel.getPlayer().equals(MatchUtil.getCurrentPlayer())) {
|
||||||
return topPlayerPrompt;
|
return topPlayerPrompt;
|
||||||
}
|
}
|
||||||
return bottomPlayerPrompt;
|
return bottomPlayerPrompt;
|
||||||
@@ -165,8 +170,8 @@ public class MatchScreen extends FScreen {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onClose(Callback<Boolean> canCloseCallback) {
|
public void onClose(Callback<Boolean> canCloseCallback) {
|
||||||
FControl.writeMatchPreferences();
|
MatchController.writeMatchPreferences();
|
||||||
Forge.getSoundSystem().setBackgroundMusic(MusicPlaylist.MENUS);
|
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MENUS);
|
||||||
super.onClose(canCloseCallback);
|
super.onClose(canCloseCallback);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -196,7 +201,7 @@ public class MatchScreen extends FScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//draw arrows for combat
|
//draw arrows for combat
|
||||||
final CombatView combat = FControl.getGameView().getCombat();
|
final CombatView combat = MatchUtil.getGameView().getCombat();
|
||||||
if (combat != null) {
|
if (combat != null) {
|
||||||
for (final CardView attacker : combat.getAttackers()) {
|
for (final CardView attacker : combat.getAttackers()) {
|
||||||
//connect each attacker with planeswalker it's attacking if applicable
|
//connect each attacker with planeswalker it's attacking if applicable
|
||||||
@@ -234,25 +239,25 @@ public class MatchScreen extends FScreen {
|
|||||||
return true; //suppress Back button so it's not bumped when trying to press OK or Cancel buttons
|
return true; //suppress Back button so it's not bumped when trying to press OK or Cancel buttons
|
||||||
case Keys.A: //alpha strike on Ctrl+A
|
case Keys.A: //alpha strike on Ctrl+A
|
||||||
if (KeyInputAdapter.isCtrlKeyDown()) {
|
if (KeyInputAdapter.isCtrlKeyDown()) {
|
||||||
FControl.alphaStrike();
|
MatchUtil.alphaStrike();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Keys.E: //end turn on Ctrl+E
|
case Keys.E: //end turn on Ctrl+E
|
||||||
if (KeyInputAdapter.isCtrlKeyDown()) {
|
if (KeyInputAdapter.isCtrlKeyDown()) {
|
||||||
FControl.endCurrentTurn();
|
MatchUtil.endCurrentTurn();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Keys.Q: //concede game on Ctrl+Q
|
case Keys.Q: //concede game on Ctrl+Q
|
||||||
if (KeyInputAdapter.isCtrlKeyDown()) {
|
if (KeyInputAdapter.isCtrlKeyDown()) {
|
||||||
FControl.concede();
|
MatchUtil.concede();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Keys.Z: //undo on Ctrl+Z
|
case Keys.Z: //undo on Ctrl+Z
|
||||||
if (KeyInputAdapter.isCtrlKeyDown()) {
|
if (KeyInputAdapter.isCtrlKeyDown()) {
|
||||||
FControl.getGameView().tryUndoLastAction();
|
MatchUtil.getGameView().tryUndoLastAction();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
@@ -265,6 +270,58 @@ public class MatchScreen extends FScreen {
|
|||||||
//don't show menu from this screen since it's too easy to bump the menu button when trying to press OK or Cancel
|
//don't show menu from this screen since it's too easy to bump the menu button when trying to press OK or Cancel
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean stopAtPhase(final PlayerView turn, final PhaseType phase) {
|
||||||
|
PhaseLabel label = getPlayerPanel(turn).getPhaseIndicator().getLabel(phase);
|
||||||
|
return label == null || label.getStopAtPhase();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void resetAllPhaseButtons() {
|
||||||
|
for (final VPlayerPanel panel : getPlayerPanels().values()) {
|
||||||
|
panel.getPhaseIndicator().resetPhaseButtons();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public VPlayerPanel getPlayerPanel(final PlayerView playerView) {
|
||||||
|
return getPlayerPanels().get(playerView);
|
||||||
|
}
|
||||||
|
|
||||||
|
public void highlightCard(final CardView c) {
|
||||||
|
for (VPlayerPanel playerPanel : getPlayerPanels().values()) {
|
||||||
|
for (FCardPanel p : playerPanel.getField().getCardPanels()) {
|
||||||
|
if (p.getCard().equals(c)) {
|
||||||
|
p.setHighlighted(true);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void clearCardHighlights() {
|
||||||
|
for (VPlayerPanel playerPanel : getPlayerPanels().values()) {
|
||||||
|
for (FCardPanel p : playerPanel.getField().getCardPanels()) {
|
||||||
|
p.setHighlighted(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate) {
|
||||||
|
for (Pair<PlayerView, ZoneType> kv : zonesToUpdate) {
|
||||||
|
PlayerView owner = kv.getKey();
|
||||||
|
ZoneType zt = kv.getValue();
|
||||||
|
if (owner == null || zt == null) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
getPlayerPanel(owner).updateZone(zt);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void updateSingleCard(final CardView card) {
|
||||||
|
final ZoneType zone = card.getZone();
|
||||||
|
if (zone != null && zone == ZoneType.Battlefield) {
|
||||||
|
getPlayerPanel(card.getController()).getField().updateCard(card);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
private class FieldScroller extends FScrollPane {
|
private class FieldScroller extends FScrollPane {
|
||||||
private float extraHeight = 0;
|
private float extraHeight = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ public class TargetingOverlay {
|
|||||||
}
|
}
|
||||||
public static void drawArrow(Graphics g, Vector2 start, PlayerView targetPlayer, boolean connectsFoes) {
|
public static void drawArrow(Graphics g, Vector2 start, PlayerView targetPlayer, boolean connectsFoes) {
|
||||||
drawArrow(g, start,
|
drawArrow(g, start,
|
||||||
FControl.getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(),
|
MatchController.getView().getPlayerPanel(targetPlayer).getAvatar().getTargetingArrowOrigin(),
|
||||||
connectsFoes);
|
connectsFoes);
|
||||||
}
|
}
|
||||||
public static void drawArrow(Graphics g, Vector2 start, Vector2 end, boolean connectsFoes) {
|
public static void drawArrow(Graphics g, Vector2 start, Vector2 end, boolean connectsFoes) {
|
||||||
|
|||||||
@@ -24,7 +24,8 @@ import forge.assets.FSkinFont;
|
|||||||
import forge.assets.FSkinImage;
|
import forge.assets.FSkinImage;
|
||||||
import forge.assets.FSkinColor.Colors;
|
import forge.assets.FSkinColor.Colors;
|
||||||
import forge.card.CardZoom;
|
import forge.card.CardZoom;
|
||||||
import forge.screens.match.FControl;
|
import forge.match.MatchUtil;
|
||||||
|
import forge.screens.match.MatchController;
|
||||||
import forge.toolbox.FButton;
|
import forge.toolbox.FButton;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.toolbox.FCardPanel;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
@@ -225,7 +226,7 @@ public class VAssignDamage extends FDialog {
|
|||||||
}
|
}
|
||||||
else if (defender instanceof PlayerView) {
|
else if (defender instanceof PlayerView) {
|
||||||
PlayerView player = (PlayerView)defender;
|
PlayerView player = (PlayerView)defender;
|
||||||
obj = add(new MiscAttDefPanel(player.getName(), FControl.getPlayerAvatar(player)));
|
obj = add(new MiscAttDefPanel(player.getName(), MatchController.getPlayerAvatar(player)));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
obj = add(new MiscAttDefPanel(defender.toString(), FSkinImage.UNKNOWN));
|
obj = add(new MiscAttDefPanel(defender.toString(), FSkinImage.UNKNOWN));
|
||||||
@@ -456,7 +457,7 @@ public class VAssignDamage extends FDialog {
|
|||||||
if (source == null) {
|
if (source == null) {
|
||||||
if (defender instanceof PlayerView) {
|
if (defender instanceof PlayerView) {
|
||||||
PlayerView p = (PlayerView)defender;
|
PlayerView p = (PlayerView)defender;
|
||||||
lethalDamage = attackerHasInfect ? FControl.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife();
|
lethalDamage = attackerHasInfect ? MatchUtil.getGameView().getPoisonCountersToLose() - p.getPoisonCounters() : p.getLife();
|
||||||
}
|
}
|
||||||
else if (defender instanceof CardView) { // planeswalker
|
else if (defender instanceof CardView) { // planeswalker
|
||||||
CardView pw = (CardView)defender;
|
CardView pw = (CardView)defender;
|
||||||
|
|||||||
@@ -4,7 +4,8 @@ import com.badlogic.gdx.math.Vector2;
|
|||||||
|
|
||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.assets.FImage;
|
import forge.assets.FImage;
|
||||||
import forge.screens.match.FControl;
|
import forge.match.MatchUtil;
|
||||||
|
import forge.screens.match.MatchController;
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
import forge.util.ThreadUtil;
|
import forge.util.ThreadUtil;
|
||||||
import forge.util.Utils;
|
import forge.util.Utils;
|
||||||
@@ -19,7 +20,7 @@ public class VAvatar extends FDisplayObject {
|
|||||||
|
|
||||||
public VAvatar(PlayerView player0) {
|
public VAvatar(PlayerView player0) {
|
||||||
player = player0;
|
player = player0;
|
||||||
image = FControl.getPlayerAvatar(player);
|
image = MatchController.getPlayerAvatar(player);
|
||||||
setSize(WIDTH, HEIGHT);
|
setSize(WIDTH, HEIGHT);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -28,7 +29,7 @@ public class VAvatar extends FDisplayObject {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() { //must invoke in game thread in case a dialog needs to be shown
|
ThreadUtil.invokeInGameThread(new Runnable() { //must invoke in game thread in case a dialog needs to be shown
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().selectPlayer(player, null);
|
MatchUtil.getGameView().selectPlayer(player, null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return true;
|
return true;
|
||||||
@@ -38,7 +39,7 @@ public class VAvatar extends FDisplayObject {
|
|||||||
Vector2 origin = new Vector2(getScreenPosition());
|
Vector2 origin = new Vector2(getScreenPosition());
|
||||||
|
|
||||||
origin.x += WIDTH * 0.75f;
|
origin.x += WIDTH * 0.75f;
|
||||||
if (origin.y < FControl.getView().getHeight() / 2) {
|
if (origin.y < MatchController.getView().getHeight() / 2) {
|
||||||
origin.y += HEIGHT * 0.75f; //target bottom right corner if on top half of screen
|
origin.y += HEIGHT * 0.75f; //target bottom right corner if on top half of screen
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import forge.FThreads;
|
|||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.GuiBase;
|
import forge.GuiBase;
|
||||||
import forge.card.CardZoom;
|
import forge.card.CardZoom;
|
||||||
import forge.screens.match.FControl;
|
import forge.match.MatchUtil;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.toolbox.FCardPanel;
|
||||||
import forge.util.ThreadUtil;
|
import forge.util.ThreadUtil;
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
@@ -245,7 +245,7 @@ public abstract class VCardDisplayArea extends VDisplayArea {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean selectCard() {
|
public boolean selectCard() {
|
||||||
if (FControl.getGameView().selectCard(getCard(), null)) {
|
if (MatchUtil.getGameView().selectCard(getCard(), null)) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
//if panel can't do anything with card selection, try selecting previous panel in stack
|
//if panel can't do anything with card selection, try selecting previous panel in stack
|
||||||
|
|||||||
@@ -1,9 +1,9 @@
|
|||||||
package forge.screens.match.views;
|
package forge.screens.match.views;
|
||||||
|
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menu.FCheckBoxMenuItem;
|
import forge.menu.FCheckBoxMenuItem;
|
||||||
import forge.menu.FDropDownMenu;
|
import forge.menu.FDropDownMenu;
|
||||||
import forge.menu.FMenuItem;
|
import forge.menu.FMenuItem;
|
||||||
import forge.screens.match.FControl;
|
|
||||||
import forge.toolbox.FEvent;
|
import forge.toolbox.FEvent;
|
||||||
import forge.toolbox.FEvent.FEventHandler;
|
import forge.toolbox.FEvent.FEventHandler;
|
||||||
import forge.util.ThreadUtil;
|
import forge.util.ThreadUtil;
|
||||||
@@ -17,7 +17,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() { //must invoke all these in game thread since they may require synchronous user input
|
ThreadUtil.invokeInGameThread(new Runnable() { //must invoke all these in game thread since they may require synchronous user input
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().generateMana();
|
MatchUtil.getGameView().cheat().generateMana();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -28,7 +28,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().tutorForCard();
|
MatchUtil.getGameView().cheat().tutorForCard();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -39,7 +39,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().addCardToHand();
|
MatchUtil.getGameView().cheat().addCardToHand();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -50,7 +50,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().addCardToBattlefield();
|
MatchUtil.getGameView().cheat().addCardToBattlefield();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -61,7 +61,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().setPlayerLife();
|
MatchUtil.getGameView().cheat().setPlayerLife();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -72,7 +72,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().winGame();
|
MatchUtil.getGameView().cheat().winGame();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -83,26 +83,26 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().setupGameState();
|
MatchUtil.getGameView().cheat().setupGameState();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
|
|
||||||
final boolean unlimitedLands = FControl.getGameView().canPlayUnlimitedLands();
|
final boolean unlimitedLands = MatchUtil.getGameView().canPlayUnlimitedLands();
|
||||||
addItem(new FCheckBoxMenuItem("Play Unlimited Lands", unlimitedLands,
|
addItem(new FCheckBoxMenuItem("Play Unlimited Lands", unlimitedLands,
|
||||||
new FEventHandler() {
|
new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.getGameView().cheat().setCanPlayUnlimitedLands(!unlimitedLands);
|
MatchUtil.getGameView().cheat().setCanPlayUnlimitedLands(!unlimitedLands);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
final boolean viewAll = FControl.getGameView().canViewAllCards();
|
final boolean viewAll = MatchUtil.getGameView().canViewAllCards();
|
||||||
addItem(new FCheckBoxMenuItem("View All Cards", viewAll,
|
addItem(new FCheckBoxMenuItem("View All Cards", viewAll,
|
||||||
new FEventHandler() {
|
new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.getGameView().cheat().setViewAllCards(!viewAll);
|
MatchUtil.getGameView().cheat().setViewAllCards(!viewAll);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
addItem(new FMenuItem("Add Counters to Permanent", new FEventHandler() {
|
addItem(new FMenuItem("Add Counters to Permanent", new FEventHandler() {
|
||||||
@@ -111,7 +111,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().addCountersToPermanent();
|
MatchUtil.getGameView().cheat().addCountersToPermanent();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -122,7 +122,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().tapPermanents();
|
MatchUtil.getGameView().cheat().tapPermanents();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -133,7 +133,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().untapPermanents();
|
MatchUtil.getGameView().cheat().untapPermanents();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -144,7 +144,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().riggedPlanarRoll();
|
MatchUtil.getGameView().cheat().riggedPlanarRoll();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -155,7 +155,7 @@ public class VDevMenu extends FDropDownMenu {
|
|||||||
ThreadUtil.invokeInGameThread(new Runnable() {
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
FControl.getGameView().cheat().planeswalkTo();
|
MatchUtil.getGameView().cheat().planeswalkTo();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ import java.util.List;
|
|||||||
|
|
||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.GuiBase;
|
import forge.GuiBase;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.screens.match.views.VCardDisplayArea.CardAreaPanel;
|
import forge.screens.match.views.VCardDisplayArea.CardAreaPanel;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
@@ -62,7 +62,7 @@ public class VField extends FContainer {
|
|||||||
|
|
||||||
for (CardView card : model) {
|
for (CardView card : model) {
|
||||||
CardAreaPanel cardPanel = CardAreaPanel.get(card);
|
CardAreaPanel cardPanel = CardAreaPanel.get(card);
|
||||||
CardStateView details = FControl.getCardDetails(card); //use details so creature/land check is accurate
|
CardStateView details = MatchController.getCardDetails(card); //use details so creature/land check is accurate
|
||||||
if (cardPanel.getAttachedToPanel() == null) { //skip attached panels
|
if (cardPanel.getAttachedToPanel() == null) { //skip attached panels
|
||||||
if (details.isCreature()) {
|
if (details.isCreature()) {
|
||||||
if (!tryStackCard(card, creatures)) {
|
if (!tryStackCard(card, creatures)) {
|
||||||
|
|||||||
@@ -7,13 +7,14 @@ import forge.deck.FDeckViewer;
|
|||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menu.FDropDownMenu;
|
import forge.menu.FDropDownMenu;
|
||||||
import forge.menu.FMenuItem;
|
import forge.menu.FMenuItem;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.screens.match.FControl;
|
|
||||||
import forge.screens.settings.SettingsScreen;
|
import forge.screens.settings.SettingsScreen;
|
||||||
import forge.toolbox.FEvent;
|
import forge.toolbox.FEvent;
|
||||||
import forge.toolbox.FEvent.FEventHandler;
|
import forge.toolbox.FEvent.FEventHandler;
|
||||||
|
import forge.util.ThreadUtil;
|
||||||
|
|
||||||
public class VGameMenu extends FDropDownMenu {
|
public class VGameMenu extends FDropDownMenu {
|
||||||
public VGameMenu() {
|
public VGameMenu() {
|
||||||
@@ -21,31 +22,36 @@ public class VGameMenu extends FDropDownMenu {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void buildMenu() {
|
protected void buildMenu() {
|
||||||
final Game game = FControl.getGame();
|
final Game game = MatchUtil.getGame();
|
||||||
addItem(new FMenuItem("Concede", FSkinImage.CONCEDE, new FEventHandler() {
|
addItem(new FMenuItem("Concede", FSkinImage.CONCEDE, new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.concede();
|
ThreadUtil.invokeInGameThread(new Runnable() {
|
||||||
|
@Override
|
||||||
|
public void run() {
|
||||||
|
MatchUtil.concede();
|
||||||
|
}
|
||||||
|
});
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
/*addItem(new FMenuItem("Save Game", FSkinImage.SAVE, new FEventHandler() {
|
/*addItem(new FMenuItem("Save Game", FSkinImage.SAVE, new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
GameStateSerializer.saveGameState(FControl.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt");
|
GameStateSerializer.saveGameState(MatchUtil.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt");
|
||||||
FOptionPane.showMessageDialog("Game saved successfully.", "Save Game", FOptionPane.INFORMATION_ICON);
|
FOptionPane.showMessageDialog("Game saved successfully.", "Save Game", FOptionPane.INFORMATION_ICON);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
addItem(new FMenuItem("Load Game", FSkinImage.OPEN, new FEventHandler() {
|
addItem(new FMenuItem("Load Game", FSkinImage.OPEN, new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
GameStateDeserializer.loadGameState(FControl.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt");
|
GameStateDeserializer.loadGameState(MatchUtil.getGame(), ForgeConstants.USER_GAMES_DIR + "GameSave.txt");
|
||||||
}
|
}
|
||||||
}));*/
|
}));*/
|
||||||
addItem(new FMenuItem("Deck List", FSkinImage.DECKLIST, new FEventHandler() {
|
addItem(new FMenuItem("Deck List", FSkinImage.DECKLIST, new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
final LobbyPlayer guiPlayer = GamePlayerUtil.getGuiPlayer();
|
final LobbyPlayer guiPlayer = GamePlayerUtil.getGuiPlayer();
|
||||||
final Deck deck = FControl.getGameView().getDeck(guiPlayer);
|
final Deck deck = MatchUtil.getGameView().getDeck(guiPlayer);
|
||||||
if (deck != null) {
|
if (deck != null) {
|
||||||
FDeckViewer.show(deck);
|
FDeckViewer.show(deck);
|
||||||
}
|
}
|
||||||
@@ -54,7 +60,7 @@ public class VGameMenu extends FDropDownMenu {
|
|||||||
addItem(new FMenuItem("Auto-Yields", FSkinImage.WARNING, new FEventHandler() {
|
addItem(new FMenuItem("Auto-Yields", FSkinImage.WARNING, new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
final Player localPlayer = FControl.getCurrentPlayer();
|
final Player localPlayer = MatchUtil.getCurrentPlayer();
|
||||||
if (localPlayer == null) { return; }
|
if (localPlayer == null) { return; }
|
||||||
|
|
||||||
final boolean autoYieldsDisabled = game.getDisableAutoYields();
|
final boolean autoYieldsDisabled = game.getDisableAutoYields();
|
||||||
@@ -67,7 +73,7 @@ public class VGameMenu extends FDropDownMenu {
|
|||||||
//if re-enabling auto-yields, auto-yield to current ability on stack if applicable
|
//if re-enabling auto-yields, auto-yield to current ability on stack if applicable
|
||||||
SpellAbility ability = game.getStack().peekAbility();
|
SpellAbility ability = game.getStack().peekAbility();
|
||||||
if (ability != null && ability.isAbility() && localPlayer.getController().shouldAutoYield(ability.toUnsuppressedString())) {
|
if (ability != null && ability.isAbility() && localPlayer.getController().shouldAutoYield(ability.toUnsuppressedString())) {
|
||||||
FControl.getGameView().passPriority();
|
MatchUtil.getGameView().passPriority();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,10 +11,10 @@ import forge.assets.TextRenderer;
|
|||||||
import forge.assets.FSkinColor.Colors;
|
import forge.assets.FSkinColor.Colors;
|
||||||
import forge.game.GameLogEntry;
|
import forge.game.GameLogEntry;
|
||||||
import forge.game.GameLogEntryType;
|
import forge.game.GameLogEntryType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menu.FDropDown;
|
import forge.menu.FDropDown;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.FControl;
|
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
import forge.util.Utils;
|
import forge.util.Utils;
|
||||||
|
|
||||||
@@ -45,7 +45,7 @@ public class VLog extends FDropDown {
|
|||||||
clear();
|
clear();
|
||||||
|
|
||||||
GameLogEntryType logVerbosityFilter = GameLogEntryType.valueOf(FModel.getPreferences().getPref(FPref.DEV_LOG_ENTRY_TYPE));
|
GameLogEntryType logVerbosityFilter = GameLogEntryType.valueOf(FModel.getPreferences().getPref(FPref.DEV_LOG_ENTRY_TYPE));
|
||||||
List<GameLogEntry> logEntrys = FControl.getGameView().getLogEntries(logVerbosityFilter);
|
List<GameLogEntry> logEntrys = MatchUtil.getGameView().getLogEntries(logVerbosityFilter);
|
||||||
|
|
||||||
LogEntryDisplay logEntryDisplay;
|
LogEntryDisplay logEntryDisplay;
|
||||||
float width = maxWidth - getMenuTab().getScreenPosition().x; //stretch from tab to edge of screen
|
float width = maxWidth - getMenuTab().getScreenPosition().x; //stretch from tab to edge of screen
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import forge.assets.FSkinFont;
|
|||||||
import forge.assets.FSkinImage;
|
import forge.assets.FSkinImage;
|
||||||
import forge.assets.FSkinColor.Colors;
|
import forge.assets.FSkinColor.Colors;
|
||||||
import forge.card.MagicColor;
|
import forge.card.MagicColor;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.screens.match.FControl;
|
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
import forge.view.PlayerView;
|
import forge.view.PlayerView;
|
||||||
|
|
||||||
@@ -82,7 +82,7 @@ public class VManaPool extends VDisplayArea {
|
|||||||
@Override
|
@Override
|
||||||
public boolean tap(float x, float y, int count) {
|
public boolean tap(float x, float y, int count) {
|
||||||
if (player.getLobbyPlayer() == GamePlayerUtil.getGuiPlayer()) {
|
if (player.getLobbyPlayer() == GamePlayerUtil.getGuiPlayer()) {
|
||||||
FControl.getGameView().useMana(colorCode);
|
MatchUtil.getGameView().useMana(colorCode);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,9 +14,10 @@ import forge.assets.FSkinFont;
|
|||||||
import forge.assets.FSkinImage;
|
import forge.assets.FSkinImage;
|
||||||
import forge.assets.FSkinColor.Colors;
|
import forge.assets.FSkinColor.Colors;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.screens.match.MatchScreen;
|
import forge.screens.match.MatchScreen;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
@@ -114,8 +115,8 @@ public class VPlayerPanel extends FContainer {
|
|||||||
selectedTab.displayArea.setVisible(true);
|
selectedTab.displayArea.setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (FControl.getView() != null) { //must revalidate entire screen so panel heights updated
|
if (MatchController.getView() != null) { //must revalidate entire screen so panel heights updated
|
||||||
FControl.getView().revalidate();
|
MatchController.getView().revalidate();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -289,7 +290,7 @@ public class VPlayerPanel extends FContainer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//when gui player loses life, vibrate device for a length of time based on amount of life lost
|
//when gui player loses life, vibrate device for a length of time based on amount of life lost
|
||||||
if (vibrateDuration > 0 && player.getLobbyPlayer() == FControl.getGuiPlayer() &&
|
if (vibrateDuration > 0 && player.getLobbyPlayer() == MatchUtil.getGuiPlayer() &&
|
||||||
FModel.getPreferences().getPrefBoolean(FPref.UI_VIBRATE_ON_LIFE_LOSS)) {
|
FModel.getPreferences().getPrefBoolean(FPref.UI_VIBRATE_ON_LIFE_LOSS)) {
|
||||||
//never vibrate more than two seconds regardless of life lost or poison counters gained
|
//never vibrate more than two seconds regardless of life lost or poison counters gained
|
||||||
Gdx.input.vibrate(Math.min(vibrateDuration, 2000));
|
Gdx.input.vibrate(Math.min(vibrateDuration, 2000));
|
||||||
@@ -298,7 +299,7 @@ public class VPlayerPanel extends FContainer {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean tap(float x, float y, int count) {
|
public boolean tap(float x, float y, int count) {
|
||||||
FControl.getGameView().selectPlayer(player, null); //treat tapping on life the same as tapping on the avatar
|
MatchUtil.getGameView().selectPlayer(player, null); //treat tapping on life the same as tapping on the avatar
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -7,10 +7,11 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
|||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.assets.FImage;
|
import forge.assets.FImage;
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menu.FDropDown;
|
import forge.menu.FDropDown;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.toolbox.FContainer;
|
import forge.toolbox.FContainer;
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
import forge.toolbox.FList;
|
import forge.toolbox.FList;
|
||||||
@@ -20,7 +21,7 @@ import forge.view.PlayerView;
|
|||||||
|
|
||||||
public class VPlayers extends FDropDown {
|
public class VPlayers extends FDropDown {
|
||||||
public VPlayers() {
|
public VPlayers() {
|
||||||
for (final PlayerView p : FControl.getGameView().getPlayers()) {
|
for (final PlayerView p : MatchUtil.getGameView().getPlayers()) {
|
||||||
add(new PlayerInfoPanel(p));
|
add(new PlayerInfoPanel(p));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,7 +64,7 @@ public class VPlayers extends FDropDown {
|
|||||||
float y = PADDING;
|
float y = PADDING;
|
||||||
float h = getHeight() - 2 * y;
|
float h = getHeight() - 2 * y;
|
||||||
|
|
||||||
FImage avatarImage = FControl.getPlayerAvatar(player);
|
FImage avatarImage = MatchController.getPlayerAvatar(player);
|
||||||
g.drawImage(avatarImage, x, y, h, h);
|
g.drawImage(avatarImage, x, y, h, h);
|
||||||
x += h + PADDING;
|
x += h + PADDING;
|
||||||
|
|
||||||
@@ -87,7 +88,7 @@ public class VPlayers extends FDropDown {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (FControl.getGameView().isCommander()) {
|
if (MatchUtil.getGameView().isCommander()) {
|
||||||
builder.append(" | " + player.getCommanderInfo());
|
builder.append(" | " + player.getCommanderInfo());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,6 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
|||||||
import com.badlogic.gdx.math.Vector2;
|
import com.badlogic.gdx.math.Vector2;
|
||||||
|
|
||||||
import forge.Graphics;
|
import forge.Graphics;
|
||||||
import forge.GuiBase;
|
|
||||||
import forge.assets.FSkinColor;
|
import forge.assets.FSkinColor;
|
||||||
import forge.assets.FSkinFont;
|
import forge.assets.FSkinFont;
|
||||||
import forge.assets.TextRenderer;
|
import forge.assets.TextRenderer;
|
||||||
@@ -21,11 +20,12 @@ import forge.card.CardZoom;
|
|||||||
import forge.card.CardDetailUtil.DetailColors;
|
import forge.card.CardDetailUtil.DetailColors;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.menu.FCheckBoxMenuItem;
|
import forge.menu.FCheckBoxMenuItem;
|
||||||
import forge.menu.FDropDown;
|
import forge.menu.FDropDown;
|
||||||
import forge.menu.FMenuItem;
|
import forge.menu.FMenuItem;
|
||||||
import forge.menu.FPopupMenu;
|
import forge.menu.FPopupMenu;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.screens.match.TargetingOverlay;
|
import forge.screens.match.TargetingOverlay;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.toolbox.FCardPanel;
|
||||||
import forge.toolbox.FDisplayObject;
|
import forge.toolbox.FDisplayObject;
|
||||||
@@ -73,14 +73,14 @@ public class VStack extends FDropDown {
|
|||||||
playersWithValidTargets.put(c.getController(), c);
|
playersWithValidTargets.put(c.getController(), c);
|
||||||
}
|
}
|
||||||
if (zones != null && zones.size() > 0 && playersWithValidTargets != null && playersWithValidTargets.size() > 0) {
|
if (zones != null && zones.size() > 0 && playersWithValidTargets != null && playersWithValidTargets.size() > 0) {
|
||||||
GuiBase.getInterface().openZones(zones, playersWithValidTargets);
|
MatchController.instance.openZones(zones, playersWithValidTargets);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//restore old zones when active stack instance changes
|
//restore old zones when active stack instance changes
|
||||||
private void restoreOldZones() {
|
private void restoreOldZones() {
|
||||||
if (playersWithValidTargets == null) { return; }
|
if (playersWithValidTargets == null) { return; }
|
||||||
GuiBase.getInterface().restoreOldZones(playersWithValidTargets);
|
MatchController.instance.restoreOldZones(playersWithValidTargets);
|
||||||
playersWithValidTargets = null;
|
playersWithValidTargets = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -90,7 +90,7 @@ public class VStack extends FDropDown {
|
|||||||
activeStackInstance = null; //reset before updating stack
|
activeStackInstance = null; //reset before updating stack
|
||||||
restoreOldZones();
|
restoreOldZones();
|
||||||
|
|
||||||
final List<StackItemView> stack = FControl.getGameView().getStack();
|
final List<StackItemView> stack = MatchUtil.getGameView().getStack();
|
||||||
if (stackSize != stack.size()) {
|
if (stackSize != stack.size()) {
|
||||||
int oldStackSize = stackSize;
|
int oldStackSize = stackSize;
|
||||||
stackSize = stack.size();
|
stackSize = stack.size();
|
||||||
@@ -118,10 +118,10 @@ public class VStack extends FDropDown {
|
|||||||
|
|
||||||
float x = MARGINS;
|
float x = MARGINS;
|
||||||
float y = MARGINS;
|
float y = MARGINS;
|
||||||
float totalWidth = maxWidth - FControl.getView().getTopPlayerPanel().getTabs().iterator().next().getRight(); //keep avatar, life total, and hand tab visible to left of stack
|
float totalWidth = maxWidth - MatchController.getView().getTopPlayerPanel().getTabs().iterator().next().getRight(); //keep avatar, life total, and hand tab visible to left of stack
|
||||||
float width = totalWidth - 2 * MARGINS;
|
float width = totalWidth - 2 * MARGINS;
|
||||||
|
|
||||||
final List<StackItemView> stack = FControl.getGameView().getStack();
|
final List<StackItemView> stack = MatchUtil.getGameView().getStack();
|
||||||
if (stack.isEmpty()) { //show label if stack empty
|
if (stack.isEmpty()) { //show label if stack empty
|
||||||
FLabel label = add(new FLabel.Builder().text("[Empty]").font(FONT).align(HAlignment.CENTER).build());
|
FLabel label = add(new FLabel.Builder().text("[Empty]").font(FONT).align(HAlignment.CENTER).build());
|
||||||
|
|
||||||
@@ -201,7 +201,7 @@ public class VStack extends FDropDown {
|
|||||||
|
|
||||||
text = stackInstance.getText();
|
text = stackInstance.getText();
|
||||||
if (stackInstance.isOptionalTrigger() &&
|
if (stackInstance.isOptionalTrigger() &&
|
||||||
stackInstance0.getActivatingPlayer().equals(FControl.getCurrentPlayer())) {
|
stackInstance0.getActivatingPlayer().equals(MatchUtil.getCurrentPlayer())) {
|
||||||
text = "(OPTIONAL) " + text;
|
text = "(OPTIONAL) " + text;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -224,21 +224,21 @@ public class VStack extends FDropDown {
|
|||||||
VStack.this.updateSizeAndPosition();
|
VStack.this.updateSizeAndPosition();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
Player player = FControl.getCurrentPlayer();
|
Player player = MatchUtil.getCurrentPlayer();
|
||||||
if (player != null) { //don't show menu if tapping on art
|
if (player != null) { //don't show menu if tapping on art
|
||||||
if (stackInstance.isAbility()) {
|
if (stackInstance.isAbility()) {
|
||||||
FPopupMenu menu = new FPopupMenu() {
|
FPopupMenu menu = new FPopupMenu() {
|
||||||
@Override
|
@Override
|
||||||
protected void buildMenu() {
|
protected void buildMenu() {
|
||||||
final IGameView gameView = FControl.getGameView();
|
final IGameView gameView = MatchUtil.getGameView();
|
||||||
final Player player = FControl.getCurrentPlayer();
|
final Player player = MatchUtil.getCurrentPlayer();
|
||||||
final String key = stackInstance.getKey();
|
final String key = stackInstance.getKey();
|
||||||
final boolean autoYield = gameView.shouldAutoYield(key);
|
final boolean autoYield = gameView.shouldAutoYield(key);
|
||||||
addItem(new FCheckBoxMenuItem("Auto-Yield", autoYield,
|
addItem(new FCheckBoxMenuItem("Auto-Yield", autoYield,
|
||||||
new FEventHandler() {
|
new FEventHandler() {
|
||||||
@Override
|
@Override
|
||||||
public void handleEvent(FEvent e) {
|
public void handleEvent(FEvent e) {
|
||||||
FControl.getGameView().setShouldAutoYield(key, !autoYield);
|
MatchUtil.getGameView().setShouldAutoYield(key, !autoYield);
|
||||||
if (!autoYield && stackInstance.equals(gameView.peekStack())) {
|
if (!autoYield && stackInstance.equals(gameView.peekStack())) {
|
||||||
//auto-pass priority if ability is on top of stack
|
//auto-pass priority if ability is on top of stack
|
||||||
gameView.passPriority();
|
gameView.passPriority();
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package forge.screens.match.winlose;
|
package forge.screens.match.winlose;
|
||||||
|
|
||||||
import forge.screens.match.FControl;
|
import forge.match.MatchUtil;
|
||||||
|
import forge.screens.match.MatchController;
|
||||||
import forge.toolbox.FEvent;
|
import forge.toolbox.FEvent;
|
||||||
import forge.toolbox.FEvent.FEventHandler;
|
import forge.toolbox.FEvent.FEventHandler;
|
||||||
import forge.view.IGameView;
|
import forge.view.IGameView;
|
||||||
@@ -53,21 +54,21 @@ public class ControlWinLose {
|
|||||||
view.hide();
|
view.hide();
|
||||||
saveOptions();
|
saveOptions();
|
||||||
|
|
||||||
FControl.startGameInSameMatch();
|
MatchUtil.continueMatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Action performed when "restart" button is pressed in default win/lose UI. */
|
/** Action performed when "restart" button is pressed in default win/lose UI. */
|
||||||
public void actionOnRestart() {
|
public void actionOnRestart() {
|
||||||
view.hide();
|
view.hide();
|
||||||
saveOptions();
|
saveOptions();
|
||||||
FControl.startGameInNewMatch();
|
MatchUtil.restartMatch();
|
||||||
}
|
}
|
||||||
|
|
||||||
/** Action performed when "quit" button is pressed in default win/lose UI. */
|
/** Action performed when "quit" button is pressed in default win/lose UI. */
|
||||||
public void actionOnQuit() {
|
public void actionOnQuit() {
|
||||||
// Reset other stuff
|
// Reset other stuff
|
||||||
saveOptions();
|
saveOptions();
|
||||||
FControl.endCurrentGame();
|
MatchUtil.endCurrentGame();
|
||||||
view.hide();
|
view.hide();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -76,7 +77,7 @@ public class ControlWinLose {
|
|||||||
* with other game modes.
|
* with other game modes.
|
||||||
*/
|
*/
|
||||||
public void saveOptions() {
|
public void saveOptions() {
|
||||||
FControl.writeMatchPreferences();
|
MatchController.writeMatchPreferences();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -41,7 +41,7 @@ public class GauntletWinLose extends ControlWinLose {
|
|||||||
*/
|
*/
|
||||||
public GauntletWinLose(final ViewWinLose view0, IGameView lastGame) {
|
public GauntletWinLose(final ViewWinLose view0, IGameView lastGame) {
|
||||||
super(view0, lastGame);
|
super(view0, lastGame);
|
||||||
controller = new GauntletWinLoseController(view0, lastGame, GuiBase.getInterface()) {
|
controller = new GauntletWinLoseController(view0, lastGame) {
|
||||||
@Override
|
@Override
|
||||||
protected void showOutcome(final String message1, final String message2, final FSkinProp icon, final List<String> lstEventNames, final List<String> lstEventRecords, final int len, final int num) {
|
protected void showOutcome(final String message1, final String message2, final FSkinProp icon, final List<String> lstEventNames, final List<String> lstEventRecords, final int len, final int num) {
|
||||||
FThreads.invokeInBackgroundThread(new Runnable() {
|
FThreads.invokeInBackgroundThread(new Runnable() {
|
||||||
|
|||||||
@@ -6,7 +6,6 @@ import com.badlogic.gdx.Input.Keys;
|
|||||||
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment;
|
||||||
|
|
||||||
import forge.Forge;
|
import forge.Forge;
|
||||||
import forge.GuiBase;
|
|
||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.assets.FSkinColor;
|
import forge.assets.FSkinColor;
|
||||||
import forge.assets.FSkinColor.Colors;
|
import forge.assets.FSkinColor.Colors;
|
||||||
@@ -61,7 +60,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView<FButton> {
|
|||||||
//control = new QuestDraftWinLose(this, game0);
|
//control = new QuestDraftWinLose(this, game0);
|
||||||
break;
|
break;
|
||||||
case Draft:
|
case Draft:
|
||||||
if (!FModel.getGauntletMini(GuiBase.getInterface()).isGauntletDraft()) {
|
if (!FModel.getGauntletMini().isGauntletDraft()) {
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case Sealed:
|
case Sealed:
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ public class SealedScreen extends LaunchScreen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
int matches = FModel.getDecks().getSealed().get(human.getName()).getAiDecks().size();
|
||||||
FModel.getGauntletMini(GuiBase.getInterface()).launch(matches, human.getDeck(), GameType.Sealed);
|
FModel.getGauntletMini().launch(matches, human.getDeck(), GameType.Sealed);
|
||||||
return false; //prevent launching via launch screen since gauntlet handles it
|
return false; //prevent launching via launch screen since gauntlet handles it
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import forge.properties.ForgePreferences;
|
|||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.FScreen;
|
import forge.screens.FScreen;
|
||||||
import forge.screens.TabPageScreen.TabPage;
|
import forge.screens.TabPageScreen.TabPage;
|
||||||
|
import forge.sound.SoundSystem;
|
||||||
import forge.toolbox.FCheckBox;
|
import forge.toolbox.FCheckBox;
|
||||||
import forge.toolbox.FGroupList;
|
import forge.toolbox.FGroupList;
|
||||||
import forge.toolbox.FList;
|
import forge.toolbox.FList;
|
||||||
@@ -194,7 +195,7 @@ public class SettingsPage extends TabPage<SettingsScreen> {
|
|||||||
public void select() {
|
public void select() {
|
||||||
super.select();
|
super.select();
|
||||||
//update background music when this setting changes
|
//update background music when this setting changes
|
||||||
Forge.getSoundSystem().changeBackgroundTrack();
|
SoundSystem.instance.changeBackgroundTrack();
|
||||||
}
|
}
|
||||||
}, 7);
|
}, 7);
|
||||||
/*lstSettings.addItem(new BooleanSetting(FPref.UI_ALT_SOUND_SYSTEM,
|
/*lstSettings.addItem(new BooleanSetting(FPref.UI_ALT_SOUND_SYSTEM,
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ import forge.card.CardRenderer;
|
|||||||
import forge.card.CardZoom;
|
import forge.card.CardZoom;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.screens.match.FControl;
|
import forge.screens.match.MatchController;
|
||||||
import forge.screens.match.views.VAvatar;
|
import forge.screens.match.views.VAvatar;
|
||||||
import forge.screens.match.views.VStack;
|
import forge.screens.match.views.VStack;
|
||||||
import forge.util.Utils;
|
import forge.util.Utils;
|
||||||
@@ -426,7 +426,7 @@ public class FChoiceList<T> extends FList<T> {
|
|||||||
@Override
|
@Override
|
||||||
public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) {
|
public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) {
|
||||||
PlayerView player = (PlayerView)value;
|
PlayerView player = (PlayerView)value;
|
||||||
g.drawImage(FControl.getPlayerAvatar(player), x - FList.PADDING, y - FList.PADDING, VAvatar.WIDTH, VAvatar.HEIGHT);
|
g.drawImage(MatchController.getPlayerAvatar(player), x - FList.PADDING, y - FList.PADDING, VAvatar.WIDTH, VAvatar.HEIGHT);
|
||||||
x += VAvatar.WIDTH;
|
x += VAvatar.WIDTH;
|
||||||
w -= VAvatar.WIDTH;
|
w -= VAvatar.WIDTH;
|
||||||
g.drawText(player.getName() + " (" + player.getLife() + ")", font, foreColor, x, y, w, h, false, HAlignment.LEFT, true);
|
g.drawText(player.getName() + " (" + player.getLife() + ")", font, foreColor, x, y, w, h, false, HAlignment.LEFT, true);
|
||||||
|
|||||||
@@ -49,9 +49,9 @@ import forge.game.player.Player;
|
|||||||
import forge.game.zone.PlayerZone;
|
import forge.game.zone.PlayerZone;
|
||||||
import forge.game.zone.Zone;
|
import forge.game.zone.Zone;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.match.input.ButtonUtil;
|
import forge.match.input.ButtonUtil;
|
||||||
import forge.match.input.InputBase;
|
import forge.match.input.InputBase;
|
||||||
import forge.match.input.InputNone;
|
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
@@ -83,7 +83,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
phaseUpdPlanned.set(false);
|
phaseUpdPlanned.set(false);
|
||||||
gameView.getGui().updatePhase();
|
MatchUtil.getController().updatePhase();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
@@ -100,7 +100,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
combatUpdPlanned.set(false);
|
combatUpdPlanned.set(false);
|
||||||
gameView.getGui().showCombat(gameView.getCombat());
|
MatchUtil.getController().showCombat(gameView.getCombat());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
@@ -120,7 +120,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
turnUpdPlanned.set(false);
|
turnUpdPlanned.set(false);
|
||||||
gameView.getGui().updateTurn(gameView.getPlayerView(event.turnOwner));
|
MatchUtil.getController().updateTurn(gameView.getPlayerView(event.turnOwner));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
@@ -148,7 +148,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
FThreads.invokeInEdtNowOrLater(gameView.getGui(), new Runnable() {
|
FThreads.invokeInEdtNowOrLater(gameView.getGui(), new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
gameView.getGui().updatePlayerControl();
|
MatchUtil.getController().updatePlayerControl();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
return null;
|
return null;
|
||||||
@@ -172,11 +172,11 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
FThreads.invokeInEdtNowOrLater(gameView.getGui(), new Runnable() {
|
FThreads.invokeInEdtNowOrLater(gameView.getGui(), new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
InputNone inputNone = new InputNone(gameView);
|
PlayerView localPlayer = gameView.getLocalPlayerView();
|
||||||
InputBase.cancelAwaitNextInput(); //ensure "Waiting for opponent..." doesn't appear behind WinLo
|
InputBase.cancelAwaitNextInput(); //ensure "Waiting for opponent..." doesn't appear behind WinLo
|
||||||
gameView.getGui().showPromptMessage(inputNone.getOwner(), ""); //clear prompt behind WinLose overlay
|
MatchUtil.getController().showPromptMessage(localPlayer, ""); //clear prompt behind WinLose overlay
|
||||||
ButtonUtil.update(inputNone, "", "", false, false, false);
|
ButtonUtil.update(localPlayer, "", "", false, false, false);
|
||||||
gameView.getGui().finishGame();
|
MatchUtil.getController().finishGame();
|
||||||
gameView.updateAchievements();
|
gameView.updateAchievements();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -188,7 +188,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
stackUpdPlanned.set(false);
|
stackUpdPlanned.set(false);
|
||||||
gameView.getGui().updateStack();
|
MatchUtil.getController().updateStack();
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -219,7 +219,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
synchronized (zonesToUpdate) {
|
synchronized (zonesToUpdate) {
|
||||||
gameView.getGui().updateZones(zonesToUpdate);
|
MatchUtil.getController().updateZones(zonesToUpdate);
|
||||||
zonesToUpdate.clear();
|
zonesToUpdate.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -271,7 +271,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
public void run() {
|
public void run() {
|
||||||
synchronized (cardsToUpdate) {
|
synchronized (cardsToUpdate) {
|
||||||
final Iterable<CardView> newCardsToUpdate = gameView.getRefreshedCardViews(cardsToUpdate);
|
final Iterable<CardView> newCardsToUpdate = gameView.getRefreshedCardViews(cardsToUpdate);
|
||||||
gameView.getGui().updateCards(newCardsToUpdate);
|
MatchUtil.updateCards(newCardsToUpdate);
|
||||||
cardsToUpdate.clear();
|
cardsToUpdate.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -372,14 +372,14 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
@Override
|
@Override
|
||||||
public Void visit(GameEventCardStatsChanged event) {
|
public Void visit(GameEventCardStatsChanged event) {
|
||||||
final Iterable<CardView> cardViews = gameView.getCardViews(event.cards);
|
final Iterable<CardView> cardViews = gameView.getCardViews(event.cards);
|
||||||
gameView.getGui().refreshCardDetails(cardViews);
|
MatchUtil.getController().refreshCardDetails(cardViews);
|
||||||
return updateManyCards(cardViews);
|
return updateManyCards(cardViews);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Void visit(GameEventPlayerStatsChanged event) {
|
public Void visit(GameEventPlayerStatsChanged event) {
|
||||||
for (final Player p : event.players) {
|
for (final Player p : event.players) {
|
||||||
gameView.getGui().refreshCardDetails(gameView.getCardViews(p.getAllCards()));
|
MatchUtil.getController().refreshCardDetails(gameView.getCardViews(p.getAllCards()));
|
||||||
}
|
}
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
@@ -395,7 +395,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
private final Runnable updManaPool = new Runnable() {
|
private final Runnable updManaPool = new Runnable() {
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
synchronized (manaPoolUpdate) {
|
synchronized (manaPoolUpdate) {
|
||||||
gameView.getGui().updateManaPool(gameView.getPlayerViews(manaPoolUpdate));
|
MatchUtil.getController().updateManaPool(gameView.getPlayerViews(manaPoolUpdate));
|
||||||
manaPoolUpdate.clear();
|
manaPoolUpdate.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -421,7 +421,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
|||||||
private final Runnable updLives = new Runnable() {
|
private final Runnable updLives = new Runnable() {
|
||||||
@Override public void run() {
|
@Override public void run() {
|
||||||
synchronized (livesUpdate) {
|
synchronized (livesUpdate) {
|
||||||
gameView.getGui().updateLives(gameView.getPlayerViews(livesUpdate));
|
MatchUtil.getController().updateLives(gameView.getPlayerViews(livesUpdate));
|
||||||
livesUpdate.clear();
|
livesUpdate.clear();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ import forge.game.event.GameEventSpellResolved;
|
|||||||
import forge.game.event.GameEventTurnPhase;
|
import forge.game.event.GameEventTurnPhase;
|
||||||
import forge.game.event.IGameEventVisitor;
|
import forge.game.event.IGameEventVisitor;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.match.input.InputPlaybackControl;
|
import forge.match.input.InputPlaybackControl;
|
||||||
import forge.view.LocalGameView;
|
import forge.view.LocalGameView;
|
||||||
|
|
||||||
@@ -76,7 +77,7 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
|
|||||||
*/
|
*/
|
||||||
@Override
|
@Override
|
||||||
public Void visit(GameEventTurnPhase ev) {
|
public Void visit(GameEventTurnPhase ev) {
|
||||||
boolean isUiToStop = gui.stopAtPhase(
|
boolean isUiToStop = MatchUtil.getController().stopAtPhase(
|
||||||
gameView.getPlayerView(ev.playerTurn), ev.phase);
|
gameView.getPlayerView(ev.playerTurn), ev.phase);
|
||||||
|
|
||||||
switch(ev.phase) {
|
switch(ev.phase) {
|
||||||
|
|||||||
@@ -10,8 +10,8 @@ import forge.deck.Deck;
|
|||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
import forge.interfaces.IButton;
|
import forge.interfaces.IButton;
|
||||||
import forge.interfaces.IGuiBase;
|
|
||||||
import forge.interfaces.IWinLoseView;
|
import forge.interfaces.IWinLoseView;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.view.IGameView;
|
import forge.view.IGameView;
|
||||||
@@ -19,12 +19,10 @@ import forge.view.IGameView;
|
|||||||
public abstract class GauntletWinLoseController {
|
public abstract class GauntletWinLoseController {
|
||||||
private final IGameView lastGame;
|
private final IGameView lastGame;
|
||||||
private final IWinLoseView<? extends IButton> view;
|
private final IWinLoseView<? extends IButton> view;
|
||||||
private final IGuiBase gui;
|
|
||||||
|
|
||||||
public GauntletWinLoseController(IWinLoseView<? extends IButton> view0, final IGameView game0, final IGuiBase gui) {
|
public GauntletWinLoseController(IWinLoseView<? extends IButton> view0, final IGameView game0) {
|
||||||
view = view0;
|
view = view0;
|
||||||
lastGame = game0;
|
lastGame = game0;
|
||||||
this.gui = gui;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void showOutcome() {
|
public void showOutcome() {
|
||||||
@@ -121,9 +119,9 @@ public abstract class GauntletWinLoseController {
|
|||||||
|
|
||||||
view.hide();
|
view.hide();
|
||||||
saveOptions();
|
saveOptions();
|
||||||
gui.endCurrentGame();
|
MatchUtil.endCurrentGame();
|
||||||
|
|
||||||
gui.startMatch(GameType.Gauntlet, players);
|
MatchUtil.startMatch(GameType.Gauntlet, players);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -3,32 +3,17 @@ package forge.interfaces;
|
|||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.assets.ISkinImage;
|
import forge.assets.ISkinImage;
|
||||||
import forge.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
import forge.events.UiEvent;
|
|
||||||
import forge.game.GameType;
|
|
||||||
import forge.game.Match;
|
|
||||||
import forge.game.phase.PhaseType;
|
|
||||||
import forge.game.player.IHasIcon;
|
import forge.game.player.IHasIcon;
|
||||||
import forge.game.player.RegisteredPlayer;
|
|
||||||
import forge.game.zone.ZoneType;
|
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.sound.IAudioClip;
|
import forge.sound.IAudioClip;
|
||||||
import forge.sound.IAudioMusic;
|
import forge.sound.IAudioMusic;
|
||||||
import forge.util.ITriggerEvent;
|
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
import forge.view.CombatView;
|
|
||||||
import forge.view.GameEntityView;
|
|
||||||
import forge.view.PlayerView;
|
|
||||||
import forge.view.SpellAbilityView;
|
|
||||||
|
|
||||||
public interface IGuiBase {
|
public interface IGuiBase {
|
||||||
boolean isRunningOnDesktop();
|
boolean isRunningOnDesktop();
|
||||||
@@ -53,40 +38,7 @@ public interface IGuiBase {
|
|||||||
File getSaveFile(File defaultFile);
|
File getSaveFile(File defaultFile);
|
||||||
void showCardList(final String title, final String message, final List<PaperCard> list);
|
void showCardList(final String title, final String message, final List<PaperCard> list);
|
||||||
boolean showBoxedProduct(final String title, final String message, final List<PaperCard> list);
|
boolean showBoxedProduct(final String title, final String message, final List<PaperCard> list);
|
||||||
void fireEvent(UiEvent e);
|
|
||||||
void setCard(CardView card);
|
void setCard(CardView card);
|
||||||
void showCombat(CombatView combat);
|
|
||||||
void setUsedToPay(CardView card, boolean b);
|
|
||||||
void setHighlighted(PlayerView player, boolean b);
|
|
||||||
void showPromptMessage(PlayerView playerView, String message);
|
|
||||||
boolean stopAtPhase(PlayerView playerTurn, PhaseType phase);
|
|
||||||
IButton getBtnOK(PlayerView playerView);
|
|
||||||
IButton getBtnCancel(PlayerView playerView);
|
|
||||||
void focusButton(IButton button);
|
|
||||||
void flashIncorrectAction();
|
|
||||||
void updatePhase();
|
|
||||||
void updateTurn(PlayerView player);
|
|
||||||
void updatePlayerControl();
|
|
||||||
void enableOverlay();
|
|
||||||
void disableOverlay();
|
|
||||||
void finishGame();
|
|
||||||
Object showManaPool(PlayerView player);
|
|
||||||
void hideManaPool(PlayerView player, Object zoneToRestore);
|
|
||||||
boolean openZones(Collection<ZoneType> zones, Map<PlayerView, Object> players);
|
|
||||||
void restoreOldZones(Map<PlayerView, Object> playersToRestoreZonesFor);
|
|
||||||
void updateStack();
|
|
||||||
void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate);
|
|
||||||
void updateCards(Iterable<CardView> cardsToUpdate);
|
|
||||||
void refreshCardDetails(Iterable<CardView> cards);
|
|
||||||
void updateManaPool(List<PlayerView> manaPoolUpdate);
|
|
||||||
void updateLives(List<PlayerView> livesUpdate);
|
|
||||||
void endCurrentGame();
|
|
||||||
void startMatch(GameType gauntletType, List<RegisteredPlayer> starter);
|
|
||||||
void setPanelSelection(CardView hostCard);
|
|
||||||
Map<CardView, Integer> getDamageToAssign(CardView attacker, List<CardView> blockers,
|
|
||||||
int damageDealt, GameEntityView defender, boolean overrideOrder);
|
|
||||||
int getAbilityToPlay(List<SpellAbilityView> abilities, ITriggerEvent triggerEvent);
|
|
||||||
void hear(LobbyPlayer player, String message);
|
|
||||||
int getAvatarCount();
|
int getAvatarCount();
|
||||||
void copyToClipboard(String text);
|
void copyToClipboard(String text);
|
||||||
void browseToUrl(String url) throws Exception;
|
void browseToUrl(String url) throws Exception;
|
||||||
@@ -94,8 +46,6 @@ public interface IGuiBase {
|
|||||||
IAudioMusic createAudioMusic(String filename);
|
IAudioMusic createAudioMusic(String filename);
|
||||||
void startAltSoundSystem(String filename, boolean isSynchronized);
|
void startAltSoundSystem(String filename, boolean isSynchronized);
|
||||||
void clearImageCache();
|
void clearImageCache();
|
||||||
void startGame(Match match);
|
|
||||||
void continueMatch(Match match);
|
|
||||||
void showSpellShop();
|
void showSpellShop();
|
||||||
void showBazaar();
|
void showBazaar();
|
||||||
void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi);
|
void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi);
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import java.util.List;
|
|||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.game.GameType;
|
import forge.game.GameType;
|
||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.util.Aggregates;
|
import forge.util.Aggregates;
|
||||||
@@ -38,8 +38,6 @@ import forge.util.Aggregates;
|
|||||||
* @since 1.2.xx
|
* @since 1.2.xx
|
||||||
*/
|
*/
|
||||||
public class GauntletMini {
|
public class GauntletMini {
|
||||||
|
|
||||||
private final IGuiBase gui;
|
|
||||||
private int rounds;
|
private int rounds;
|
||||||
private Deck humanDeck;
|
private Deck humanDeck;
|
||||||
private int currentRound;
|
private int currentRound;
|
||||||
@@ -49,8 +47,7 @@ public class GauntletMini {
|
|||||||
private GameType gauntletType;
|
private GameType gauntletType;
|
||||||
private List<RegisteredPlayer> aiOpponents = new ArrayList<RegisteredPlayer>();
|
private List<RegisteredPlayer> aiOpponents = new ArrayList<RegisteredPlayer>();
|
||||||
|
|
||||||
public GauntletMini(IGuiBase gui) {
|
public GauntletMini() {
|
||||||
this.gui = gui;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// private final String humanName;
|
// private final String humanName;
|
||||||
@@ -86,7 +83,7 @@ public class GauntletMini {
|
|||||||
}
|
}
|
||||||
|
|
||||||
currentRound++;
|
currentRound++;
|
||||||
gui.endCurrentGame();
|
MatchUtil.endCurrentGame();
|
||||||
startRound();
|
startRound();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -143,7 +140,7 @@ public class GauntletMini {
|
|||||||
starter.add(new RegisteredPlayer(humanDeck).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
starter.add(new RegisteredPlayer(humanDeck).setPlayer(GamePlayerUtil.getGuiPlayer()));
|
||||||
starter.add(aiOpponents.get(currentRound - 1).setPlayer(GamePlayerUtil.createAiPlayer()));
|
starter.add(aiOpponents.get(currentRound - 1).setPlayer(GamePlayerUtil.createAiPlayer()));
|
||||||
|
|
||||||
gui.startMatch(gauntletType, starter);
|
MatchUtil.startMatch(gauntletType, starter);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -17,7 +17,7 @@ public abstract class LimitedWinLoseController {
|
|||||||
public LimitedWinLoseController(IWinLoseView<? extends IButton> view0, final IGameView game0, final IGuiBase gui) {
|
public LimitedWinLoseController(IWinLoseView<? extends IButton> view0, final IGameView game0, final IGuiBase gui) {
|
||||||
view = view0;
|
view = view0;
|
||||||
lastGame = game0;
|
lastGame = game0;
|
||||||
gauntlet = FModel.getGauntletMini(gui);
|
gauntlet = FModel.getGauntletMini();
|
||||||
wonMatch = lastGame.isMatchWonBy(GamePlayerUtil.getGuiPlayer());
|
wonMatch = lastGame.isMatchWonBy(GamePlayerUtil.getGuiPlayer());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
54
forge-gui/src/main/java/forge/match/IMatchController.java
Normal file
54
forge-gui/src/main/java/forge/match/IMatchController.java
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package forge.match;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import org.apache.commons.lang3.tuple.Pair;
|
||||||
|
|
||||||
|
import forge.LobbyPlayer;
|
||||||
|
import forge.game.Match;
|
||||||
|
import forge.game.phase.PhaseType;
|
||||||
|
import forge.game.player.Player;
|
||||||
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.interfaces.IButton;
|
||||||
|
import forge.util.ITriggerEvent;
|
||||||
|
import forge.view.CardView;
|
||||||
|
import forge.view.CombatView;
|
||||||
|
import forge.view.GameEntityView;
|
||||||
|
import forge.view.PlayerView;
|
||||||
|
import forge.view.SpellAbilityView;
|
||||||
|
|
||||||
|
public interface IMatchController {
|
||||||
|
void startNewMatch(Match match);
|
||||||
|
boolean resetForNewGame();
|
||||||
|
void openView(List<Player> sortedPlayers, int humanCount);
|
||||||
|
void afterGameEnd();
|
||||||
|
void showCombat(CombatView combat);
|
||||||
|
void showPromptMessage(PlayerView playerView, String message);
|
||||||
|
boolean stopAtPhase(PlayerView playerTurn, PhaseType phase);
|
||||||
|
IButton getBtnOK(PlayerView playerView);
|
||||||
|
IButton getBtnCancel(PlayerView playerView);
|
||||||
|
void focusButton(IButton button);
|
||||||
|
void flashIncorrectAction();
|
||||||
|
void updatePhase();
|
||||||
|
void updateTurn(PlayerView player);
|
||||||
|
void updatePlayerControl();
|
||||||
|
void enableOverlay();
|
||||||
|
void disableOverlay();
|
||||||
|
void finishGame();
|
||||||
|
Object showManaPool(PlayerView player);
|
||||||
|
void hideManaPool(PlayerView player, Object zoneToRestore);
|
||||||
|
boolean openZones(Collection<ZoneType> zones, Map<PlayerView, Object> players);
|
||||||
|
void restoreOldZones(Map<PlayerView, Object> playersToRestoreZonesFor);
|
||||||
|
void updateStack();
|
||||||
|
void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate);
|
||||||
|
void updateSingleCard(CardView card);
|
||||||
|
void refreshCardDetails(Iterable<CardView> cards);
|
||||||
|
void updateManaPool(List<PlayerView> manaPoolUpdate);
|
||||||
|
void updateLives(List<PlayerView> livesUpdate);
|
||||||
|
void setPanelSelection(CardView hostCard);
|
||||||
|
void hear(LobbyPlayer player, String message);
|
||||||
|
int getAbilityToPlay(List<SpellAbilityView> abilities, ITriggerEvent triggerEvent);
|
||||||
|
Map<CardView, Integer> assignDamage(CardView attacker, List<CardView> blockers, int damage, GameEntityView defender, boolean overrideOrder);
|
||||||
|
}
|
||||||
@@ -1,4 +1,4 @@
|
|||||||
package forge.screens.match;
|
package forge.match;
|
||||||
|
|
||||||
import java.io.BufferedReader;
|
import java.io.BufferedReader;
|
||||||
import java.io.DataInputStream;
|
import java.io.DataInputStream;
|
||||||
@@ -16,18 +16,14 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
import org.apache.commons.lang3.tuple.Pair;
|
import org.apache.commons.lang3.StringUtils;
|
||||||
|
|
||||||
import com.google.common.eventbus.EventBus;
|
import com.google.common.eventbus.EventBus;
|
||||||
import com.google.common.eventbus.Subscribe;
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
|
||||||
import forge.Forge;
|
|
||||||
import forge.Graphics;
|
|
||||||
import forge.GuiBase;
|
import forge.GuiBase;
|
||||||
import forge.LobbyPlayer;
|
import forge.LobbyPlayer;
|
||||||
import forge.assets.FImage;
|
import forge.ai.LobbyPlayerAi;
|
||||||
import forge.assets.FSkin;
|
|
||||||
import forge.assets.FTextureRegionImage;
|
|
||||||
import forge.card.CardCharacteristicName;
|
import forge.card.CardCharacteristicName;
|
||||||
import forge.control.FControlGameEventHandler;
|
import forge.control.FControlGameEventHandler;
|
||||||
import forge.control.FControlGamePlayback;
|
import forge.control.FControlGamePlayback;
|
||||||
@@ -51,49 +47,43 @@ import forge.match.input.InputQueue;
|
|||||||
import forge.match.input.InputSynchronized;
|
import forge.match.input.InputSynchronized;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
|
import forge.player.LobbyPlayerHuman;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.quest.QuestController;
|
import forge.quest.QuestController;
|
||||||
import forge.screens.match.views.VAssignDamage;
|
|
||||||
import forge.screens.match.views.VPrompt;
|
|
||||||
import forge.screens.match.views.VCardDisplayArea.CardAreaPanel;
|
|
||||||
import forge.screens.match.views.VPhaseIndicator;
|
|
||||||
import forge.screens.match.views.VPhaseIndicator.PhaseLabel;
|
|
||||||
import forge.screens.match.views.VPlayerPanel;
|
|
||||||
import forge.sound.MusicPlaylist;
|
import forge.sound.MusicPlaylist;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.sound.SoundSystem;
|
||||||
import forge.toolbox.FDisplayObject;
|
|
||||||
import forge.toolbox.FOptionPane;
|
|
||||||
import forge.util.Callback;
|
|
||||||
import forge.util.GuiDisplayUtil;
|
import forge.util.GuiDisplayUtil;
|
||||||
import forge.util.NameGenerator;
|
import forge.util.NameGenerator;
|
||||||
import forge.util.WaitCallback;
|
import forge.util.gui.SOptionPane;
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
import forge.view.CardView.CardStateView;
|
|
||||||
import forge.view.CombatView;
|
|
||||||
import forge.view.GameEntityView;
|
import forge.view.GameEntityView;
|
||||||
import forge.view.LocalGameView;
|
import forge.view.LocalGameView;
|
||||||
import forge.view.PlayerView;
|
import forge.view.PlayerView;
|
||||||
import forge.view.WatchLocalGame;
|
import forge.view.WatchLocalGame;
|
||||||
|
|
||||||
public class FControl {
|
public class MatchUtil {
|
||||||
private FControl() { } //don't allow creating instance
|
private static IMatchController controller;
|
||||||
|
|
||||||
private static Game game;
|
private static Game game;
|
||||||
private static List<LocalGameView> gameViews = new ArrayList<LocalGameView>();
|
private static List<LocalGameView> gameViews = new ArrayList<LocalGameView>();
|
||||||
private static MatchScreen view;
|
|
||||||
private static final EventBus uiEvents;
|
private static final EventBus uiEvents;
|
||||||
private static final MatchUiEventVisitor visitor = new MatchUiEventVisitor();
|
|
||||||
private static FControlGamePlayback playbackControl;
|
private static FControlGamePlayback playbackControl;
|
||||||
private static final Map<LobbyPlayer, FImage> avatarImages = new HashMap<LobbyPlayer, FImage>();
|
private static final MatchUiEventVisitor visitor = new MatchUiEventVisitor();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
uiEvents = new EventBus("ui events");
|
uiEvents = new EventBus("ui events");
|
||||||
uiEvents.register(Forge.getSoundSystem());
|
uiEvents.register(SoundSystem.instance);
|
||||||
uiEvents.register(visitor);
|
uiEvents.register(visitor);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static IMatchController getController() {
|
||||||
|
return controller;
|
||||||
|
}
|
||||||
|
public static void setController(IMatchController controller0) {
|
||||||
|
controller = controller0;
|
||||||
|
}
|
||||||
|
|
||||||
public static void startMatch(GameType gameType, List<RegisteredPlayer> players) {
|
public static void startMatch(GameType gameType, List<RegisteredPlayer> players) {
|
||||||
startMatch(gameType, null, players);
|
startMatch(gameType, null, players);
|
||||||
}
|
}
|
||||||
@@ -112,16 +102,16 @@ public class FControl {
|
|||||||
rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
||||||
rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
||||||
|
|
||||||
startGame(new Match(rules, players));
|
controller.startNewMatch(new Match(rules, players));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void startGameInSameMatch() {
|
public static void continueMatch() {
|
||||||
final Match match = game.getMatch();
|
final Match match = game.getMatch();
|
||||||
endCurrentGame();
|
endCurrentGame();
|
||||||
startGame(match);
|
startGame(match);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void startGameInNewMatch() {
|
public static void restartMatch() {
|
||||||
final Match match = game.getMatch();
|
final Match match = game.getMatch();
|
||||||
endCurrentGame();
|
endCurrentGame();
|
||||||
match.clearGamesPlayed();
|
match.clearGamesPlayed();
|
||||||
@@ -129,10 +119,19 @@ public class FControl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void startGame(final Match match) {
|
public static void startGame(final Match match) {
|
||||||
cardDetailsCache.clear(); //ensure details cache cleared before starting a new game
|
if (!controller.resetForNewGame()) { return; }
|
||||||
CardAreaPanel.resetForNewGame(); //ensure card panels reset between games
|
|
||||||
|
|
||||||
Forge.getSoundSystem().setBackgroundMusic(MusicPlaylist.MATCH);
|
//prompt user for player one name if needed
|
||||||
|
final ForgePreferences prefs = FModel.getPreferences();
|
||||||
|
if (StringUtils.isBlank(prefs.getPref(FPref.PLAYER_NAME))) {
|
||||||
|
boolean isPlayerOneHuman = match.getPlayers().get(0).getPlayer() instanceof LobbyPlayerHuman;
|
||||||
|
boolean isPlayerTwoComputer = match.getPlayers().get(1).getPlayer() instanceof LobbyPlayerAi;
|
||||||
|
if (isPlayerOneHuman && isPlayerTwoComputer) {
|
||||||
|
GamePlayerUtil.setPlayerName(GuiBase.getInterface());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SoundSystem.instance.setBackgroundMusic(MusicPlaylist.MATCH);
|
||||||
|
|
||||||
game = match.createGame();
|
game = match.createGame();
|
||||||
|
|
||||||
@@ -145,9 +144,9 @@ public class FControl {
|
|||||||
game.subscribeToEvents(qc); // this one listens to player's mulligans ATM
|
game.subscribeToEvents(qc); // this one listens to player's mulligans ATM
|
||||||
}
|
}
|
||||||
|
|
||||||
game.subscribeToEvents(Forge.getSoundSystem());
|
game.subscribeToEvents(SoundSystem.instance);
|
||||||
|
|
||||||
final String[] indices = FModel.getPreferences().getPref(FPref.UI_AVATARS).split(",");
|
final String[] indices = prefs.getPref(FPref.UI_AVATARS).split(",");
|
||||||
|
|
||||||
// Instantiate all required field slots (user at 0)
|
// Instantiate all required field slots (user at 0)
|
||||||
final List<Player> sortedPlayers = new ArrayList<Player>(game.getRegisteredPlayers());
|
final List<Player> sortedPlayers = new ArrayList<Player>(game.getRegisteredPlayers());
|
||||||
@@ -161,7 +160,6 @@ public class FControl {
|
|||||||
});
|
});
|
||||||
|
|
||||||
gameViews.clear();
|
gameViews.clear();
|
||||||
List<VPlayerPanel> playerPanels = new ArrayList<VPlayerPanel>();
|
|
||||||
|
|
||||||
int i = 0;
|
int i = 0;
|
||||||
int avatarIndex = 0;
|
int avatarIndex = 0;
|
||||||
@@ -195,35 +193,13 @@ public class FControl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (Player p : sortedPlayers) {
|
|
||||||
playerPanels.add(new VPlayerPanel(getGameView(p).getPlayerView(p), humanCount == 0 || p.getController() instanceof PlayerControllerHuman));
|
|
||||||
}
|
|
||||||
view = new MatchScreen(playerPanels);
|
|
||||||
|
|
||||||
if (humanCount == 0) {
|
if (humanCount == 0) {
|
||||||
playbackControl = new FControlGamePlayback(GuiBase.getInterface(), getGameView());
|
playbackControl = new FControlGamePlayback(GuiBase.getInterface(), getGameView());
|
||||||
playbackControl.setGame(game);
|
playbackControl.setGame(game);
|
||||||
game.subscribeToEvents(playbackControl);
|
game.subscribeToEvents(playbackControl);
|
||||||
|
|
||||||
//add special object that pauses game if screen touched
|
|
||||||
view.add(new FDisplayObject() {
|
|
||||||
@Override
|
|
||||||
public void draw(Graphics g) {
|
|
||||||
//don't draw anything
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void buildTouchListeners(float screenX, float screenY, ArrayList<FDisplayObject> listeners) {
|
|
||||||
if (screenY < view.getHeight() - VPrompt.HEIGHT) {
|
|
||||||
pause();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
actuateMatchPreferences();
|
controller.openView(sortedPlayers, humanCount);
|
||||||
|
|
||||||
Forge.openScreen(view);
|
|
||||||
|
|
||||||
// It's important to run match in a different thread to allow GUI inputs to be invoked from inside game.
|
// It's important to run match in a different thread to allow GUI inputs to be invoked from inside game.
|
||||||
// Game is set on pause while gui player takes decisions
|
// Game is set on pause while gui player takes decisions
|
||||||
@@ -256,10 +232,6 @@ public class FControl {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static MatchScreen getView() {
|
|
||||||
return view;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static InputQueue getInputQueue() {
|
public static InputQueue getInputQueue() {
|
||||||
LocalGameView gameView = getGameView();
|
LocalGameView gameView = getGameView();
|
||||||
if (gameView != null) {
|
if (gameView != null) {
|
||||||
@@ -268,44 +240,10 @@ public class FControl {
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean stopAtPhase(final PlayerView turn, final PhaseType phase) {
|
|
||||||
PhaseLabel label = getPlayerPanel(turn).getPhaseIndicator().getLabel(phase);
|
|
||||||
return label == null || label.getStopAtPhase();
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void endCurrentTurn() {
|
public static void endCurrentTurn() {
|
||||||
getGameView().passPriorityUntilEndOfTurn();
|
getGameView().passPriorityUntilEndOfTurn();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void resetAllPhaseButtons() {
|
|
||||||
for (final VPlayerPanel panel : view.getPlayerPanels().values()) {
|
|
||||||
panel.getPhaseIndicator().resetPhaseButtons();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static VPlayerPanel getPlayerPanel(final PlayerView playerView) {
|
|
||||||
return view.getPlayerPanels().get(playerView);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void highlightCard(final CardView c) {
|
|
||||||
for (VPlayerPanel playerPanel : FControl.getView().getPlayerPanels().values()) {
|
|
||||||
for (FCardPanel p : playerPanel.getField().getCardPanels()) {
|
|
||||||
if (p.getCard().equals(c)) {
|
|
||||||
p.setHighlighted(true);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void clearCardHighlights() {
|
|
||||||
for (VPlayerPanel playerPanel : FControl.getView().getPlayerPanels().values()) {
|
|
||||||
for (FCardPanel p : playerPanel.getField().getCardPanels()) {
|
|
||||||
p.setHighlighted(false);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Player getCurrentPlayer() {
|
public static Player getCurrentPlayer() {
|
||||||
if (game == null) { return null; }
|
if (game == null) { return null; }
|
||||||
|
|
||||||
@@ -330,29 +268,6 @@ public class FControl {
|
|||||||
getGameView().alphaStrike();
|
getGameView().alphaStrike();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void showCombat(CombatView combat) {
|
|
||||||
/*if (combat != null && combat.getAttackers().size() > 0 && combat.getAttackingPlayer().getGame().getStack().isEmpty()) {
|
|
||||||
if (selectedDocBeforeCombat == null) {
|
|
||||||
IVDoc<? extends ICDoc> combatDoc = EDocID.REPORT_COMBAT.getDoc();
|
|
||||||
if (combatDoc.getParentCell() != null) {
|
|
||||||
selectedDocBeforeCombat = combatDoc.getParentCell().getSelected();
|
|
||||||
if (selectedDocBeforeCombat != combatDoc) {
|
|
||||||
SDisplayUtil.showTab(combatDoc);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
selectedDocBeforeCombat = null; //don't need to cache combat doc this way
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (selectedDocBeforeCombat != null) { //re-select doc that was selected before once combat finished
|
|
||||||
SDisplayUtil.showTab(selectedDocBeforeCombat);
|
|
||||||
selectedDocBeforeCombat = null;
|
|
||||||
}
|
|
||||||
CCombat.SINGLETON_INSTANCE.setModel(combat);
|
|
||||||
CCombat.SINGLETON_INSTANCE.update();*/
|
|
||||||
}
|
|
||||||
|
|
||||||
public static Map<CardView, Integer> getDamageToAssign(final CardView attacker, final List<CardView> blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) {
|
public static Map<CardView, Integer> getDamageToAssign(final CardView attacker, final List<CardView> blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) {
|
||||||
if (damage <= 0) {
|
if (damage <= 0) {
|
||||||
return new HashMap<CardView, Integer>();
|
return new HashMap<CardView, Integer>();
|
||||||
@@ -366,22 +281,20 @@ public class FControl {
|
|||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
return new WaitCallback<Map<CardView, Integer>>() {
|
return controller.assignDamage(attacker, blockers, damage, defender, overrideOrder);
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
VAssignDamage v = new VAssignDamage(attacker, blockers, damage, defender, overrideOrder, this);
|
|
||||||
v.show();
|
|
||||||
}
|
|
||||||
}.invokeAndWait();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static Set<PlayerView> highlightedPlayers = new HashSet<PlayerView>();
|
private static Set<PlayerView> highlightedPlayers = new HashSet<PlayerView>();
|
||||||
public static void setHighlighted(PlayerView ge, boolean b) {
|
public static void setHighlighted(PlayerView pv, boolean b) {
|
||||||
if (b) highlightedPlayers.add(ge);
|
if (b) {
|
||||||
else highlightedPlayers.remove(ge);
|
highlightedPlayers.add(pv);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
highlightedPlayers.remove(pv);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isHighlighted(Player player) {
|
public static boolean isHighlighted(PlayerView player) {
|
||||||
return highlightedPlayers.contains(player);
|
return highlightedPlayers.contains(player);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -390,7 +303,7 @@ public class FControl {
|
|||||||
public static void setUsedToPay(CardView card, boolean value) {
|
public static void setUsedToPay(CardView card, boolean value) {
|
||||||
boolean hasChanged = value ? highlightedCards.add(card) : highlightedCards.remove(card);
|
boolean hasChanged = value ? highlightedCards.add(card) : highlightedCards.remove(card);
|
||||||
if (hasChanged) { // since we are in UI thread, may redraw the card right now
|
if (hasChanged) { // since we are in UI thread, may redraw the card right now
|
||||||
updateSingleCard(card);
|
controller.updateSingleCard(card);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -398,79 +311,9 @@ public class FControl {
|
|||||||
return highlightedCards.contains(card);
|
return highlightedCards.contains(card);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void updateZones(List<Pair<PlayerView, ZoneType>> zonesToUpdate) {
|
|
||||||
for (Pair<PlayerView, ZoneType> kv : zonesToUpdate) {
|
|
||||||
PlayerView owner = kv.getKey();
|
|
||||||
ZoneType zt = kv.getValue();
|
|
||||||
if (owner == null || zt == null) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
getPlayerPanel(owner).updateZone(zt);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Player's mana pool changes
|
|
||||||
public static void updateManaPool(List<PlayerView> manaPoolUpdate) {
|
|
||||||
for (PlayerView p : manaPoolUpdate) {
|
|
||||||
getPlayerPanel(p).updateManaPool();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Player's lives and poison counters
|
|
||||||
public static void updateLives(List<PlayerView> livesUpdate) {
|
|
||||||
for (PlayerView p : livesUpdate) {
|
|
||||||
getPlayerPanel(p).updateLife();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void updateCards(Iterable<CardView> cardsToUpdate) {
|
public static void updateCards(Iterable<CardView> cardsToUpdate) {
|
||||||
for (CardView c : cardsToUpdate) {
|
for (CardView c : cardsToUpdate) {
|
||||||
updateSingleCard(c);
|
controller.updateSingleCard(c);
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private static final Map<Integer, CardStateView> cardDetailsCache = new HashMap<Integer, CardStateView>();
|
|
||||||
|
|
||||||
public static CardStateView getCardDetails(CardView card) {
|
|
||||||
final CardStateView details = cardDetailsCache.get(card.getId());
|
|
||||||
if (details == null) {
|
|
||||||
cardDetailsCache.put(card.getId(), card.getOriginal());
|
|
||||||
return card.getOriginal();
|
|
||||||
}
|
|
||||||
return details;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void refreshCardDetails(Iterable<CardView> cards) {
|
|
||||||
Set<PlayerView> playersNeedingFieldUpdate = null;
|
|
||||||
|
|
||||||
for (final CardView c : cards) {
|
|
||||||
//for each card in play, if it changed from creature to non-creature or vice versa,
|
|
||||||
//or if it changed from land to non-land or vice-versa,
|
|
||||||
//ensure field containing that card is updated to reflect that change
|
|
||||||
final CardStateView state = c.getOriginal();
|
|
||||||
if (c.getZone() == ZoneType.Battlefield) {
|
|
||||||
CardStateView oldDetails = cardDetailsCache.get(c);
|
|
||||||
if (oldDetails == null || state.isCreature() != oldDetails.isCreature() || state.isLand() != oldDetails.isLand()) {
|
|
||||||
if (playersNeedingFieldUpdate == null) {
|
|
||||||
playersNeedingFieldUpdate = new HashSet<PlayerView>();
|
|
||||||
}
|
|
||||||
playersNeedingFieldUpdate.add(c.getController());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
cardDetailsCache.put(c.getId(), c.getOriginal());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (playersNeedingFieldUpdate != null) { //update field for any players necessary
|
|
||||||
for (PlayerView p : playersNeedingFieldUpdate) {
|
|
||||||
getPlayerPanel(p).getField().update();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void updateSingleCard(final CardView card) {
|
|
||||||
final ZoneType zone = card.getZone();
|
|
||||||
if (zone != null && zone == ZoneType.Battlefield) {
|
|
||||||
getPlayerPanel(card.getController()).getField().updateCard(card);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -479,14 +322,9 @@ public class FControl {
|
|||||||
String userPrompt =
|
String userPrompt =
|
||||||
"This will end the current game and you will not be able to resume.\n\n" +
|
"This will end the current game and you will not be able to resume.\n\n" +
|
||||||
"Concede anyway?";
|
"Concede anyway?";
|
||||||
FOptionPane.showConfirmDialog(userPrompt, "Concede Game?", "Concede", "Cancel", false, new Callback<Boolean>() {
|
if (SOptionPane.showConfirmDialog(GuiBase.getInterface(), userPrompt, "Concede Game?", "Concede", "Cancel")) {
|
||||||
@Override
|
stopGame();
|
||||||
public void run(Boolean result) {
|
}
|
||||||
if (result) {
|
|
||||||
stopGame();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void stopGame() {
|
public static void stopGame() {
|
||||||
@@ -525,13 +363,12 @@ public class FControl {
|
|||||||
public static void endCurrentGame() {
|
public static void endCurrentGame() {
|
||||||
if (game == null) { return; }
|
if (game == null) { return; }
|
||||||
|
|
||||||
Forge.back();
|
|
||||||
game = null;
|
game = null;
|
||||||
cardDetailsCache.clear(); //ensure card details cache cleared ending game
|
controller.afterGameEnd();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void pause() {
|
public static void pause() {
|
||||||
Forge.getSoundSystem().pause();
|
SoundSystem.instance.pause();
|
||||||
//pause playback if needed
|
//pause playback if needed
|
||||||
InputQueue inputQueue = getInputQueue();
|
InputQueue inputQueue = getInputQueue();
|
||||||
if (inputQueue != null && inputQueue.getInput() instanceof InputPlaybackControl) {
|
if (inputQueue != null && inputQueue.getInput() instanceof InputPlaybackControl) {
|
||||||
@@ -540,7 +377,7 @@ public class FControl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static void resume() {
|
public static void resume() {
|
||||||
Forge.getSoundSystem().resume();
|
SoundSystem.instance.resume();
|
||||||
}
|
}
|
||||||
|
|
||||||
private final static boolean LOG_UIEVENTS = false;
|
private final static boolean LOG_UIEVENTS = false;
|
||||||
@@ -553,25 +390,6 @@ public class FControl {
|
|||||||
uiEvents.post(uiEvent);
|
uiEvents.post(uiEvent);
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class MatchUiEventVisitor implements IUiEventVisitor<Void> {
|
|
||||||
@Override
|
|
||||||
public Void visit(UiEventBlockerAssigned event) {
|
|
||||||
updateSingleCard(event.blocker);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Void visit(UiEventAttackerDeclared event) {
|
|
||||||
updateSingleCard(event.attacker);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Subscribe
|
|
||||||
public void receiveEvent(UiEvent evt) {
|
|
||||||
evt.visit(this);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setupGameState(String filename) {
|
public static void setupGameState(String filename) {
|
||||||
int humanLife = -1;
|
int humanLife = -1;
|
||||||
int aiLife = -1;
|
int aiLife = -1;
|
||||||
@@ -647,10 +465,10 @@ public class FControl {
|
|||||||
in.close();
|
in.close();
|
||||||
}
|
}
|
||||||
catch (final FileNotFoundException fnfe) {
|
catch (final FileNotFoundException fnfe) {
|
||||||
FOptionPane.showErrorDialog("File not found: " + filename);
|
SOptionPane.showErrorDialog(GuiBase.getInterface(), "File not found: " + filename);
|
||||||
}
|
}
|
||||||
catch (final Exception e) {
|
catch (final Exception e) {
|
||||||
FOptionPane.showErrorDialog("Error loading battle setup file!");
|
SOptionPane.showErrorDialog(GuiBase.getInterface(), "Error loading battle setup file!");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -745,72 +563,6 @@ public class FControl {
|
|||||||
}
|
}
|
||||||
return cl;
|
return cl;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void writeMatchPreferences() {
|
|
||||||
ForgePreferences prefs = FModel.getPreferences();
|
|
||||||
|
|
||||||
VPhaseIndicator fvAi = FControl.getView().getTopPlayerPanel().getPhaseIndicator();
|
|
||||||
prefs.setPref(FPref.PHASE_AI_UPKEEP, String.valueOf(fvAi.getLabel(PhaseType.UPKEEP).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_DRAW, String.valueOf(fvAi.getLabel(PhaseType.DRAW).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_MAIN1, String.valueOf(fvAi.getLabel(PhaseType.MAIN1).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_BEGINCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_DECLAREATTACKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_DECLAREBLOCKERS, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_FIRSTSTRIKE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_COMBATDAMAGE, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_ENDCOMBAT, String.valueOf(fvAi.getLabel(PhaseType.COMBAT_END).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_MAIN2, String.valueOf(fvAi.getLabel(PhaseType.MAIN2).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_EOT, String.valueOf(fvAi.getLabel(PhaseType.END_OF_TURN).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_AI_CLEANUP, String.valueOf(fvAi.getLabel(PhaseType.CLEANUP).getStopAtPhase()));
|
|
||||||
|
|
||||||
VPhaseIndicator fvHuman = FControl.getView().getBottomPlayerPanel().getPhaseIndicator();
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_UPKEEP, String.valueOf(fvHuman.getLabel(PhaseType.UPKEEP).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_DRAW, String.valueOf(fvHuman.getLabel(PhaseType.DRAW).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_MAIN1, String.valueOf(fvHuman.getLabel(PhaseType.MAIN1).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_BEGINCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_BEGIN).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_DECLAREATTACKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_DECLAREBLOCKERS, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_FIRSTSTRIKE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_COMBATDAMAGE, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_ENDCOMBAT, String.valueOf(fvHuman.getLabel(PhaseType.COMBAT_END).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_MAIN2, String.valueOf(fvHuman.getLabel(PhaseType.MAIN2).getStopAtPhase()));
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_EOT, fvHuman.getLabel(PhaseType.END_OF_TURN).getStopAtPhase());
|
|
||||||
prefs.setPref(FPref.PHASE_HUMAN_CLEANUP, fvHuman.getLabel(PhaseType.CLEANUP).getStopAtPhase());
|
|
||||||
|
|
||||||
prefs.save();
|
|
||||||
}
|
|
||||||
|
|
||||||
private static void actuateMatchPreferences() {
|
|
||||||
ForgePreferences prefs = FModel.getPreferences();
|
|
||||||
|
|
||||||
VPhaseIndicator fvAi = FControl.getView().getTopPlayerPanel().getPhaseIndicator();
|
|
||||||
fvAi.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_UPKEEP));
|
|
||||||
fvAi.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DRAW));
|
|
||||||
fvAi.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN1));
|
|
||||||
fvAi.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_BEGINCOMBAT));
|
|
||||||
fvAi.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREATTACKERS));
|
|
||||||
fvAi.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_DECLAREBLOCKERS));
|
|
||||||
fvAi.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_FIRSTSTRIKE));
|
|
||||||
fvAi.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_COMBATDAMAGE));
|
|
||||||
fvAi.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_ENDCOMBAT));
|
|
||||||
fvAi.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_MAIN2));
|
|
||||||
fvAi.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_EOT));
|
|
||||||
fvAi.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_AI_CLEANUP));
|
|
||||||
|
|
||||||
VPhaseIndicator fvHuman = FControl.getView().getBottomPlayerPanel().getPhaseIndicator();
|
|
||||||
fvHuman.getLabel(PhaseType.UPKEEP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_UPKEEP));
|
|
||||||
fvHuman.getLabel(PhaseType.DRAW).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DRAW));
|
|
||||||
fvHuman.getLabel(PhaseType.MAIN1).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN1));
|
|
||||||
fvHuman.getLabel(PhaseType.COMBAT_BEGIN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_BEGINCOMBAT));
|
|
||||||
fvHuman.getLabel(PhaseType.COMBAT_DECLARE_ATTACKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREATTACKERS));
|
|
||||||
fvHuman.getLabel(PhaseType.COMBAT_DECLARE_BLOCKERS).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_DECLAREBLOCKERS));
|
|
||||||
fvHuman.getLabel(PhaseType.COMBAT_FIRST_STRIKE_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_FIRSTSTRIKE));
|
|
||||||
fvHuman.getLabel(PhaseType.COMBAT_DAMAGE).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_COMBATDAMAGE));
|
|
||||||
fvHuman.getLabel(PhaseType.COMBAT_END).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_ENDCOMBAT));
|
|
||||||
fvHuman.getLabel(PhaseType.MAIN2).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_MAIN2));
|
|
||||||
fvHuman.getLabel(PhaseType.END_OF_TURN).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_EOT));
|
|
||||||
fvHuman.getLabel(PhaseType.CLEANUP).setStopAtPhase(prefs.getPrefBoolean(FPref.PHASE_HUMAN_CLEANUP));
|
|
||||||
}
|
|
||||||
|
|
||||||
/** Returns a random name from the supplied list. */
|
/** Returns a random name from the supplied list. */
|
||||||
public static String getRandomName() {
|
public static String getRandomName() {
|
||||||
@@ -823,16 +575,22 @@ public class FControl {
|
|||||||
return GamePlayerUtil.getGuiPlayer();
|
return GamePlayerUtil.getGuiPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static FImage getPlayerAvatar(final PlayerView p) {
|
private static class MatchUiEventVisitor implements IUiEventVisitor<Void> {
|
||||||
LobbyPlayer lp = p.getLobbyPlayer();
|
@Override
|
||||||
FImage avatar = avatarImages.get(lp);
|
public Void visit(UiEventBlockerAssigned event) {
|
||||||
if (avatar == null) {
|
controller.updateSingleCard(event.blocker);
|
||||||
avatar = new FTextureRegionImage(FSkin.getAvatars().get(lp.getAvatarIndex()));
|
return null;
|
||||||
}
|
}
|
||||||
return avatar;
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void setPlayerAvatar(final LobbyPlayer lp, final FImage avatarImage) {
|
@Override
|
||||||
avatarImages.put(lp, avatarImage);
|
public Void visit(UiEventAttackerDeclared event) {
|
||||||
|
controller.updateSingleCard(event.attacker);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Subscribe
|
||||||
|
public void receiveEvent(UiEvent evt) {
|
||||||
|
evt.visit(this);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -18,31 +18,29 @@
|
|||||||
package forge.match.input;
|
package forge.match.input;
|
||||||
|
|
||||||
import forge.interfaces.IButton;
|
import forge.interfaces.IButton;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.match.MatchUtil;
|
||||||
import forge.view.PlayerView;
|
import forge.view.PlayerView;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Manages match UI OK/Cancel button enabling and focus
|
* Manages match UI OK/Cancel button enabling and focus
|
||||||
*/
|
*/
|
||||||
public class ButtonUtil {
|
public class ButtonUtil {
|
||||||
public static void update(final Input input, boolean okEnabled, boolean cancelEnabled, boolean focusOk) {
|
public static void update(PlayerView owner, boolean okEnabled, boolean cancelEnabled, boolean focusOk) {
|
||||||
update(input, "OK", "Cancel", okEnabled, cancelEnabled, focusOk);
|
update(owner, "OK", "Cancel", okEnabled, cancelEnabled, focusOk);
|
||||||
}
|
}
|
||||||
public static void update(final Input input, String okLabel, String cancelLabel, boolean okEnabled, boolean cancelEnabled, boolean focusOk) {
|
public static void update(PlayerView owner, String okLabel, String cancelLabel, boolean okEnabled, boolean cancelEnabled, boolean focusOk) {
|
||||||
IGuiBase gui = input.getGui();
|
IButton btnOk = MatchUtil.getController().getBtnOK(owner);
|
||||||
PlayerView owner = input.getOwner();
|
IButton btnCancel = MatchUtil.getController().getBtnCancel(owner);
|
||||||
IButton btnOk = gui.getBtnOK(owner);
|
|
||||||
IButton btnCancel = gui.getBtnCancel(owner);
|
|
||||||
|
|
||||||
btnOk.setText(okLabel);
|
btnOk.setText(okLabel);
|
||||||
btnCancel.setText(cancelLabel);
|
btnCancel.setText(cancelLabel);
|
||||||
btnOk.setEnabled(okEnabled);
|
btnOk.setEnabled(okEnabled);
|
||||||
btnCancel.setEnabled(cancelEnabled);
|
btnCancel.setEnabled(cancelEnabled);
|
||||||
if (okEnabled && focusOk) {
|
if (okEnabled && focusOk) {
|
||||||
gui.focusButton(btnOk);
|
MatchUtil.getController().focusButton(btnOk);
|
||||||
}
|
}
|
||||||
else if (cancelEnabled) {
|
else if (cancelEnabled) {
|
||||||
gui.focusButton(btnCancel);
|
MatchUtil.getController().focusButton(btnCancel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,6 +37,7 @@ import forge.game.combat.Combat;
|
|||||||
import forge.game.combat.CombatUtil;
|
import forge.game.combat.CombatUtil;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.view.CardView;
|
import forge.view.CardView;
|
||||||
@@ -81,7 +82,7 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
List<Pair<Card, GameEntity>> mandatoryAttackers = CombatUtil.getMandatoryAttackers(playerAttacks, combat, defenders);
|
List<Pair<Card, GameEntity>> mandatoryAttackers = CombatUtil.getMandatoryAttackers(playerAttacks, combat, defenders);
|
||||||
for (Pair<Card, GameEntity> attacker : mandatoryAttackers) {
|
for (Pair<Card, GameEntity> attacker : mandatoryAttackers) {
|
||||||
combat.addAttacker(attacker.getLeft(), attacker.getRight());
|
combat.addAttacker(attacker.getLeft(), attacker.getRight());
|
||||||
getGui().fireEvent(new UiEventAttackerDeclared(
|
MatchUtil.fireEvent(new UiEventAttackerDeclared(
|
||||||
getController().getCardView(attacker.getLeft()),
|
getController().getCardView(attacker.getLeft()),
|
||||||
getController().getGameEntityView(attacker.getRight())));
|
getController().getGameEntityView(attacker.getRight())));
|
||||||
}
|
}
|
||||||
@@ -100,10 +101,10 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
|
|
||||||
private void updatePrompt() {
|
private void updatePrompt() {
|
||||||
if (canCallBackAttackers()) {
|
if (canCallBackAttackers()) {
|
||||||
ButtonUtil.update(this, "OK", "Call Back", true, true, true);
|
ButtonUtil.update(getOwner(), "OK", "Call Back", true, true, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ButtonUtil.update(this, "OK", "Alpha Strike", true, true, true);
|
ButtonUtil.update(getOwner(), "OK", "Alpha Strike", true, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -151,7 +152,7 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
getGui().updateCards(refreshCards);
|
MatchUtil.updateCards(refreshCards);
|
||||||
updateMessage();
|
updateMessage();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -238,7 +239,7 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
combat.addAttacker(card, currentDefender, activeBand);
|
combat.addAttacker(card, currentDefender, activeBand);
|
||||||
activateBand(activeBand);
|
activateBand(activeBand);
|
||||||
|
|
||||||
getGui().fireEvent(new UiEventAttackerDeclared(
|
MatchUtil.fireEvent(new UiEventAttackerDeclared(
|
||||||
getController().getCardView(card),
|
getController().getCardView(card),
|
||||||
getController().getGameEntityView(currentDefender)));
|
getController().getGameEntityView(currentDefender)));
|
||||||
}
|
}
|
||||||
@@ -253,11 +254,11 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
if (canUndeclareAttacker(card)) {
|
if (canUndeclareAttacker(card)) {
|
||||||
// TODO Is there no way to attacks each turn cards to attack Planeswalkers?
|
// TODO Is there no way to attacks each turn cards to attack Planeswalkers?
|
||||||
combat.removeFromCombat(card);
|
combat.removeFromCombat(card);
|
||||||
getGui().setUsedToPay(getController().getCardView(card), false);
|
MatchUtil.setUsedToPay(getController().getCardView(card), false);
|
||||||
// When removing an attacker clear the attacking band
|
// When removing an attacker clear the attacking band
|
||||||
activateBand(null);
|
activateBand(null);
|
||||||
|
|
||||||
getGui().fireEvent(new UiEventAttackerDeclared(
|
MatchUtil.fireEvent(new UiEventAttackerDeclared(
|
||||||
getController().getCardView(card), null));
|
getController().getCardView(card), null));
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@@ -268,10 +269,10 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
currentDefender = def;
|
currentDefender = def;
|
||||||
for (final GameEntity ge : defenders) {
|
for (final GameEntity ge : defenders) {
|
||||||
if (ge instanceof Card) {
|
if (ge instanceof Card) {
|
||||||
getGui().setUsedToPay(getController().getCardView((Card) ge), ge == def);
|
MatchUtil.setUsedToPay(getController().getCardView((Card) ge), ge == def);
|
||||||
}
|
}
|
||||||
else if (ge instanceof Player) {
|
else if (ge instanceof Player) {
|
||||||
getGui().setHighlighted(getController().getPlayerView((Player) ge), ge == def);
|
MatchUtil.setHighlighted(getController().getPlayerView((Player) ge), ge == def);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -281,14 +282,14 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
private final void activateBand(final AttackingBand band) {
|
private final void activateBand(final AttackingBand band) {
|
||||||
if (activeBand != null) {
|
if (activeBand != null) {
|
||||||
for (final Card card : activeBand.getAttackers()) {
|
for (final Card card : activeBand.getAttackers()) {
|
||||||
getGui().setUsedToPay(getController().getCardView(card), false);
|
MatchUtil.setUsedToPay(getController().getCardView(card), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
activeBand = band;
|
activeBand = band;
|
||||||
|
|
||||||
if (activeBand != null) {
|
if (activeBand != null) {
|
||||||
for (final Card card : activeBand.getAttackers()) {
|
for (final Card card : activeBand.getAttackers()) {
|
||||||
getGui().setUsedToPay(getController().getCardView(card), true);
|
MatchUtil.setUsedToPay(getController().getCardView(card), true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -312,6 +313,6 @@ public class InputAttack extends InputSyncronizedBase {
|
|||||||
showMessage(message);
|
showMessage(message);
|
||||||
|
|
||||||
updatePrompt();
|
updatePrompt();
|
||||||
getGui().showCombat(getController().getCombat(combat)); // redraw sword icons
|
MatchUtil.getController().showCombat(getController().getCombat(combat)); // redraw sword icons
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ import forge.game.phase.PhaseHandler;
|
|||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.view.LocalGameView;
|
import forge.view.LocalGameView;
|
||||||
@@ -110,9 +111,9 @@ public abstract class InputBase implements java.io.Serializable, Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static void updatePromptForAwait(final LocalGameView gameView) {
|
private static void updatePromptForAwait(final LocalGameView gameView) {
|
||||||
InputNone inputNone = new InputNone(gameView);
|
PlayerView playerView = gameView.getLocalPlayerView();
|
||||||
inputNone.getGui().showPromptMessage(inputNone.getOwner(), "Waiting for opponent...");
|
MatchUtil.getController().showPromptMessage(playerView, "Waiting for opponent...");
|
||||||
ButtonUtil.update(inputNone, false, false, false);
|
ButtonUtil.update(playerView, false, false, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void cancelAwaitNextInput() {
|
public static void cancelAwaitNextInput() {
|
||||||
@@ -173,11 +174,11 @@ public abstract class InputBase implements java.io.Serializable, Input {
|
|||||||
|
|
||||||
// to remove need for CMatchUI dependence
|
// to remove need for CMatchUI dependence
|
||||||
protected final void showMessage(final String message) {
|
protected final void showMessage(final String message) {
|
||||||
getGui().showPromptMessage(getOwner(), message);
|
MatchUtil.getController().showPromptMessage(getOwner(), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final void flashIncorrectAction() {
|
protected final void flashIncorrectAction() {
|
||||||
getGui().flashIncorrectAction();
|
MatchUtil.getController().flashIncorrectAction();
|
||||||
}
|
}
|
||||||
|
|
||||||
protected String getTurnPhasePriorityMessage(final Game game) {
|
protected String getTurnPhasePriorityMessage(final Game game) {
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import forge.game.combat.Combat;
|
|||||||
import forge.game.combat.CombatUtil;
|
import forge.game.combat.CombatUtil;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.util.ThreadUtil;
|
import forge.util.ThreadUtil;
|
||||||
@@ -74,7 +75,7 @@ public class InputBlock extends InputSyncronizedBase {
|
|||||||
@Override
|
@Override
|
||||||
protected final void showMessage() {
|
protected final void showMessage() {
|
||||||
// could add "Reset Blockers" button
|
// could add "Reset Blockers" button
|
||||||
ButtonUtil.update(this, true, false, true);
|
ButtonUtil.update(getOwner(), true, false, true);
|
||||||
|
|
||||||
if (currentAttacker == null) {
|
if (currentAttacker == null) {
|
||||||
showMessage("Select another attacker to declare blockers for.");
|
showMessage("Select another attacker to declare blockers for.");
|
||||||
@@ -85,7 +86,7 @@ public class InputBlock extends InputSyncronizedBase {
|
|||||||
showMessage(message);
|
showMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
getGui().showCombat(getController().getCombat(combat));
|
MatchUtil.getController().showCombat(getController().getCombat(combat));
|
||||||
}
|
}
|
||||||
|
|
||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@@ -114,7 +115,7 @@ public class InputBlock extends InputSyncronizedBase {
|
|||||||
boolean isCorrectAction = false;
|
boolean isCorrectAction = false;
|
||||||
if (triggerEvent != null && triggerEvent.getButton() == 3 && card.getController() == defender) {
|
if (triggerEvent != null && triggerEvent.getButton() == 3 && card.getController() == defender) {
|
||||||
combat.removeFromCombat(card);
|
combat.removeFromCombat(card);
|
||||||
getGui().fireEvent(new UiEventBlockerAssigned(
|
MatchUtil.fireEvent(new UiEventBlockerAssigned(
|
||||||
getController().getCardView(card), (CardView) null));
|
getController().getCardView(card), (CardView) null));
|
||||||
isCorrectAction = true;
|
isCorrectAction = true;
|
||||||
}
|
}
|
||||||
@@ -130,7 +131,7 @@ public class InputBlock extends InputSyncronizedBase {
|
|||||||
if (combat.isBlocking(card, currentAttacker)) {
|
if (combat.isBlocking(card, currentAttacker)) {
|
||||||
//if creature already blocking current attacker, remove blocker from combat
|
//if creature already blocking current attacker, remove blocker from combat
|
||||||
combat.removeBlockAssignment(currentAttacker, card);
|
combat.removeBlockAssignment(currentAttacker, card);
|
||||||
getGui().fireEvent(new UiEventBlockerAssigned(
|
MatchUtil.fireEvent(new UiEventBlockerAssigned(
|
||||||
getController().getCardView(card), (CardView) null));
|
getController().getCardView(card), (CardView) null));
|
||||||
isCorrectAction = true;
|
isCorrectAction = true;
|
||||||
}
|
}
|
||||||
@@ -138,7 +139,7 @@ public class InputBlock extends InputSyncronizedBase {
|
|||||||
isCorrectAction = CombatUtil.canBlock(currentAttacker, card, combat);
|
isCorrectAction = CombatUtil.canBlock(currentAttacker, card, combat);
|
||||||
if (isCorrectAction) {
|
if (isCorrectAction) {
|
||||||
combat.addBlocker(currentAttacker, card);
|
combat.addBlocker(currentAttacker, card);
|
||||||
getGui().fireEvent(new UiEventBlockerAssigned(
|
MatchUtil.fireEvent(new UiEventBlockerAssigned(
|
||||||
getController().getCardView(card),
|
getController().getCardView(card),
|
||||||
getController().getCardView(currentAttacker)));
|
getController().getCardView(currentAttacker)));
|
||||||
}
|
}
|
||||||
@@ -157,7 +158,7 @@ public class InputBlock extends InputSyncronizedBase {
|
|||||||
private void setCurrentAttacker(final Card card) {
|
private void setCurrentAttacker(final Card card) {
|
||||||
currentAttacker = card;
|
currentAttacker = card;
|
||||||
for (final Card c : combat.getAttackers()) {
|
for (final Card c : combat.getAttackers()) {
|
||||||
getGui().setUsedToPay(getController().getCardView(c), card == c);
|
MatchUtil.setUsedToPay(getController().getCardView(c), card == c);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ public class InputConfirm extends InputSyncronizedBase {
|
|||||||
/** {@inheritDoc} */
|
/** {@inheritDoc} */
|
||||||
@Override
|
@Override
|
||||||
protected final void showMessage() {
|
protected final void showMessage() {
|
||||||
ButtonUtil.update(this, yesButtonText, noButtonText, true, true, defaultYes);
|
ButtonUtil.update(getOwner(), yesButtonText, noButtonText, true, true, defaultYes);
|
||||||
showMessage(message);
|
showMessage(message);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,6 +24,7 @@ import forge.game.Game;
|
|||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.util.Lang;
|
import forge.util.Lang;
|
||||||
@@ -72,11 +73,11 @@ public class InputConfirmMulligan extends InputSyncronizedBase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (isCommander) {
|
if (isCommander) {
|
||||||
ButtonUtil.update(this, "Keep", "Exile", true, false, true);
|
ButtonUtil.update(getOwner(), "Keep", "Exile", true, false, true);
|
||||||
sb.append("Will you keep your hand or choose some cards to exile those and draw one less card?");
|
sb.append("Will you keep your hand or choose some cards to exile those and draw one less card?");
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ButtonUtil.update(this, "Keep", "Mulligan", true, true, true);
|
ButtonUtil.update(getOwner(), "Keep", "Mulligan", true, true, true);
|
||||||
sb.append("Do you want to keep your hand?");
|
sb.append("Do you want to keep your hand?");
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -101,7 +102,7 @@ public class InputConfirmMulligan extends InputSyncronizedBase {
|
|||||||
if (isCommander) {
|
if (isCommander) {
|
||||||
// Clear the "selected" icon after clicking the done button
|
// Clear the "selected" icon after clicking the done button
|
||||||
for (final Card c : this.selected) {
|
for (final Card c : this.selected) {
|
||||||
getGui().setUsedToPay(getController().getCardView(c), false);
|
MatchUtil.setUsedToPay(getController().getCardView(c), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
stop();
|
stop();
|
||||||
@@ -137,14 +138,14 @@ public class InputConfirmMulligan extends InputSyncronizedBase {
|
|||||||
|
|
||||||
if (isCommander) { // allow to choose cards for partial paris
|
if (isCommander) { // allow to choose cards for partial paris
|
||||||
if (selected.contains(c0)) {
|
if (selected.contains(c0)) {
|
||||||
getGui().setUsedToPay(getController().getCardView(c0), false);
|
MatchUtil.setUsedToPay(getController().getCardView(c0), false);
|
||||||
selected.remove(c0);
|
selected.remove(c0);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
getGui().setUsedToPay(getController().getCardView(c0), true);
|
MatchUtil.setUsedToPay(getController().getCardView(c0), true);
|
||||||
selected.add(c0);
|
selected.add(c0);
|
||||||
}
|
}
|
||||||
ButtonUtil.update(this, "Keep", "Exile", true, !selected.isEmpty(), true);
|
ButtonUtil.update(getOwner(), "Keep", "Exile", true, !selected.isEmpty(), true);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ import forge.game.card.Card;
|
|||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.util.ThreadUtil;
|
import forge.util.ThreadUtil;
|
||||||
import forge.view.PlayerView;
|
import forge.view.PlayerView;
|
||||||
@@ -65,7 +66,7 @@ public class InputLockUI implements Input {
|
|||||||
private final Runnable showMessageFromEdt = new Runnable() {
|
private final Runnable showMessageFromEdt = new Runnable() {
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
ButtonUtil.update(InputLockUI.this, "", "", false, false, false);
|
ButtonUtil.update(InputLockUI.this.getOwner(), "", "", false, false, false);
|
||||||
showMessage("Waiting for actions...");
|
showMessage("Waiting for actions...");
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
@@ -75,7 +76,7 @@ public class InputLockUI implements Input {
|
|||||||
}
|
}
|
||||||
|
|
||||||
protected void showMessage(String message) {
|
protected void showMessage(String message) {
|
||||||
getGui().showPromptMessage(getOwner(), message);
|
MatchUtil.getController().showPromptMessage(getOwner(), message);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
package forge.match.input;
|
|
||||||
|
|
||||||
import forge.game.card.Card;
|
|
||||||
import forge.game.player.Player;
|
|
||||||
import forge.game.spellability.SpellAbility;
|
|
||||||
import forge.interfaces.IGuiBase;
|
|
||||||
import forge.util.ITriggerEvent;
|
|
||||||
import forge.view.LocalGameView;
|
|
||||||
import forge.view.PlayerView;
|
|
||||||
|
|
||||||
public class InputNone implements Input {
|
|
||||||
private final IGuiBase gui;
|
|
||||||
private final PlayerView owner;
|
|
||||||
|
|
||||||
public InputNone(LocalGameView gameView) {
|
|
||||||
gui = gameView.getGui();
|
|
||||||
owner = gameView.getLocalPlayerView();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public IGuiBase getGui() {
|
|
||||||
return gui;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public PlayerView getOwner() {
|
|
||||||
return owner;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void showMessageInitial() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean selectCard(Card card, ITriggerEvent triggerEvent) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectAbility(SpellAbility ab) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectPlayer(Player player, ITriggerEvent triggerEvent) {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonOK() {
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void selectButtonCancel() {
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -57,10 +57,10 @@ public class InputPassPriority extends InputSyncronizedBase {
|
|||||||
showMessage(getTurnPhasePriorityMessage(player.getGame()));
|
showMessage(getTurnPhasePriorityMessage(player.getGame()));
|
||||||
chosenSa = null;
|
chosenSa = null;
|
||||||
if (getController().canUndoLastAction()) { //allow undoing with cancel button if can undo last action
|
if (getController().canUndoLastAction()) { //allow undoing with cancel button if can undo last action
|
||||||
ButtonUtil.update(this, "OK", "Undo", true, true, true);
|
ButtonUtil.update(getOwner(), "OK", "Undo", true, true, true);
|
||||||
}
|
}
|
||||||
else { //otherwise allow ending turn with cancel button
|
else { //otherwise allow ending turn with cancel button
|
||||||
ButtonUtil.update(this, "OK", "End Turn", true, true, true);
|
ButtonUtil.update(getOwner(), "OK", "End Turn", true, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -21,6 +21,7 @@ import forge.game.player.Player;
|
|||||||
import forge.game.replacement.ReplacementEffect;
|
import forge.game.replacement.ReplacementEffect;
|
||||||
import forge.game.spellability.AbilityManaPart;
|
import forge.game.spellability.AbilityManaPart;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.HumanPlay;
|
import forge.player.HumanPlay;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.Evaluator;
|
import forge.util.Evaluator;
|
||||||
@@ -53,13 +54,13 @@ public abstract class InputPayMana extends InputSyncronizedBase {
|
|||||||
|
|
||||||
//if player is floating mana, show mana pool to make it easier to use that mana
|
//if player is floating mana, show mana pool to make it easier to use that mana
|
||||||
wasFloatingMana = !player.getManaPool().isEmpty();
|
wasFloatingMana = !player.getManaPool().isEmpty();
|
||||||
zoneToRestore = wasFloatingMana ? getGui().showManaPool(getController().getPlayerView(player)) : null;
|
zoneToRestore = wasFloatingMana ? MatchUtil.getController().showManaPool(getController().getPlayerView(player)) : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void onStop() {
|
protected void onStop() {
|
||||||
if (wasFloatingMana) { //hide mana pool if it was shown due to floating mana
|
if (wasFloatingMana) { //hide mana pool if it was shown due to floating mana
|
||||||
getGui().hideManaPool(getController().getPlayerView(player), zoneToRestore);
|
MatchUtil.getController().hideManaPool(getController().getPlayerView(player), zoneToRestore);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -371,10 +372,10 @@ public abstract class InputPayMana extends InputSyncronizedBase {
|
|||||||
|
|
||||||
protected void updateButtons() {
|
protected void updateButtons() {
|
||||||
if (supportAutoPay()) {
|
if (supportAutoPay()) {
|
||||||
ButtonUtil.update(this, "Auto", "Cancel", false, true, false);
|
ButtonUtil.update(getOwner(), "Auto", "Cancel", false, true, false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ButtonUtil.update(this, "", "Cancel", false, true, false);
|
ButtonUtil.update(getOwner(), "", "Cancel", false, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -393,7 +394,7 @@ public abstract class InputPayMana extends InputSyncronizedBase {
|
|||||||
canPayManaCost = proc.getResult();
|
canPayManaCost = proc.getResult();
|
||||||
}
|
}
|
||||||
if (canPayManaCost) { //enabled Auto button if mana cost can be paid
|
if (canPayManaCost) { //enabled Auto button if mana cost can be paid
|
||||||
ButtonUtil.update(this, "Auto", "Cancel", true, true, true);
|
ButtonUtil.update(getOwner(), "Auto", "Cancel", true, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
showMessage(getMessage());
|
showMessage(getMessage());
|
||||||
|
|||||||
@@ -55,10 +55,10 @@ public class InputPlaybackControl extends InputSyncronizedBase implements InputS
|
|||||||
private void setPause(boolean pause) {
|
private void setPause(boolean pause) {
|
||||||
isPaused = pause;
|
isPaused = pause;
|
||||||
if (isPaused) {
|
if (isPaused) {
|
||||||
ButtonUtil.update(this, "Resume", "Step", true, true, true);
|
ButtonUtil.update(getOwner(), "Resume", "Step", true, true, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ButtonUtil.update(this, "Pause", isFast ? "1x Speed" : "10x Faster", true, true, true);
|
ButtonUtil.update(getOwner(), "Pause", isFast ? "1x Speed" : "10x Faster", true, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import com.google.common.collect.Iterables;
|
|||||||
|
|
||||||
import forge.game.GameEntity;
|
import forge.game.GameEntity;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
|
|
||||||
public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyncronizedBase {
|
public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyncronizedBase {
|
||||||
@@ -44,7 +45,7 @@ public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyn
|
|||||||
@Override
|
@Override
|
||||||
public final void showMessage() {
|
public final void showMessage() {
|
||||||
showMessage(getMessage());
|
showMessage(getMessage());
|
||||||
ButtonUtil.update(this, hasEnoughTargets(), allowCancel, true);
|
ButtonUtil.update(getOwner(), hasEnoughTargets(), allowCancel, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -74,14 +75,14 @@ public abstract class InputSelectManyBase<T extends GameEntity> extends InputSyn
|
|||||||
|
|
||||||
protected void onSelectStateChanged(final GameEntity c, final boolean newState) {
|
protected void onSelectStateChanged(final GameEntity c, final boolean newState) {
|
||||||
if (c instanceof Card) {
|
if (c instanceof Card) {
|
||||||
getGui().setUsedToPay(getController().getCardView((Card) c), newState); // UI supports card highlighting though this abstraction-breaking mechanism
|
MatchUtil.setUsedToPay(getController().getCardView((Card) c), newState); // UI supports card highlighting though this abstraction-breaking mechanism
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void resetUsedToPay() {
|
private void resetUsedToPay() {
|
||||||
for (final GameEntity c : getSelected()) {
|
for (final GameEntity c : getSelected()) {
|
||||||
if (c instanceof Card) {
|
if (c instanceof Card) {
|
||||||
getGui().setUsedToPay(getController().getCardView((Card) c), false);
|
MatchUtil.setUsedToPay(getController().getCardView((Card) c), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -13,6 +13,7 @@ import forge.game.card.Card;
|
|||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.spellability.TargetRestrictions;
|
import forge.game.spellability.TargetRestrictions;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.util.gui.SGuiChoose;
|
import forge.util.gui.SGuiChoose;
|
||||||
@@ -78,19 +79,19 @@ public final class InputSelectTargets extends InputSyncronizedBase {
|
|||||||
if (!tgt.isMinTargetsChosen(sa.getHostCard(), sa) || tgt.isDividedAsYouChoose()) {
|
if (!tgt.isMinTargetsChosen(sa.getHostCard(), sa) || tgt.isDividedAsYouChoose()) {
|
||||||
if (mandatory && tgt.hasCandidates(sa, true)) {
|
if (mandatory && tgt.hasCandidates(sa, true)) {
|
||||||
// Player has to click on a target
|
// Player has to click on a target
|
||||||
ButtonUtil.update(this, false, false, false);
|
ButtonUtil.update(getOwner(), false, false, false);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ButtonUtil.update(this, false, true, false);
|
ButtonUtil.update(getOwner(), false, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (mandatory && tgt.hasCandidates(sa, true)) {
|
if (mandatory && tgt.hasCandidates(sa, true)) {
|
||||||
// Player has to click on a target or ok
|
// Player has to click on a target or ok
|
||||||
ButtonUtil.update(this, true, false, true);
|
ButtonUtil.update(getOwner(), true, false, true);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
ButtonUtil.update(this, true, true, true);
|
ButtonUtil.update(getOwner(), true, true, true);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -238,7 +239,7 @@ public final class InputSelectTargets extends InputSyncronizedBase {
|
|||||||
private void addTarget(final GameEntity ge) {
|
private void addTarget(final GameEntity ge) {
|
||||||
sa.getTargets().add(ge);
|
sa.getTargets().add(ge);
|
||||||
if (ge instanceof Card) {
|
if (ge instanceof Card) {
|
||||||
getGui().setUsedToPay(getController().getCardView((Card) ge), true);
|
MatchUtil.setUsedToPay(getController().getCardView((Card) ge), true);
|
||||||
lastTarget = (Card) ge;
|
lastTarget = (Card) ge;
|
||||||
}
|
}
|
||||||
final Integer val = targetDepth.get(ge);
|
final Integer val = targetDepth.get(ge);
|
||||||
@@ -255,7 +256,7 @@ public final class InputSelectTargets extends InputSyncronizedBase {
|
|||||||
private void done() {
|
private void done() {
|
||||||
for (final GameEntity c : targetDepth.keySet()) {
|
for (final GameEntity c : targetDepth.keySet()) {
|
||||||
if (c instanceof Card) {
|
if (c instanceof Card) {
|
||||||
getGui().setUsedToPay(getController().getCardView((Card) c), false);
|
MatchUtil.setUsedToPay(getController().getCardView((Card) c), false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -300,9 +300,9 @@ public class FModel {
|
|||||||
gauntletData = data0;
|
gauntletData = data0;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static GauntletMini getGauntletMini(final IGuiBase gui) {
|
public static GauntletMini getGauntletMini() {
|
||||||
if (gauntlet == null) {
|
if (gauntlet == null) {
|
||||||
gauntlet = new GauntletMini(gui);
|
gauntlet = new GauntletMini();
|
||||||
}
|
}
|
||||||
return gauntlet;
|
return gauntlet;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import forge.game.player.IGameEntitiesFactory;
|
|||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.player.PlayerController;
|
import forge.game.player.PlayerController;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.util.GuiDisplayUtil;
|
import forge.util.GuiDisplayUtil;
|
||||||
|
|
||||||
public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactory {
|
public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactory {
|
||||||
@@ -33,7 +34,7 @@ public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactor
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void hear(LobbyPlayer player, String message) {
|
public void hear(LobbyPlayer player, String message) {
|
||||||
gui.hear(player, message);
|
MatchUtil.getController().hear(player, message);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IGuiBase getGui() {
|
public IGuiBase getGui() {
|
||||||
|
|||||||
@@ -82,6 +82,7 @@ import forge.game.zone.ZoneType;
|
|||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
import forge.item.IPaperCard;
|
import forge.item.IPaperCard;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.match.input.ButtonUtil;
|
import forge.match.input.ButtonUtil;
|
||||||
import forge.match.input.Input;
|
import forge.match.input.Input;
|
||||||
import forge.match.input.InputAttack;
|
import forge.match.input.InputAttack;
|
||||||
@@ -89,7 +90,6 @@ import forge.match.input.InputBase;
|
|||||||
import forge.match.input.InputBlock;
|
import forge.match.input.InputBlock;
|
||||||
import forge.match.input.InputConfirm;
|
import forge.match.input.InputConfirm;
|
||||||
import forge.match.input.InputConfirmMulligan;
|
import forge.match.input.InputConfirmMulligan;
|
||||||
import forge.match.input.InputNone;
|
|
||||||
import forge.match.input.InputPassPriority;
|
import forge.match.input.InputPassPriority;
|
||||||
import forge.match.input.InputPayMana;
|
import forge.match.input.InputPayMana;
|
||||||
import forge.match.input.InputProliferate;
|
import forge.match.input.InputProliferate;
|
||||||
@@ -169,14 +169,14 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) {
|
public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) {
|
||||||
return !getGui().stopAtPhase(gameView.getPlayerView(turn), phase);
|
return !MatchUtil.getController().stopAtPhase(gameView.getPlayerView(turn), phase);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Uses GUI to learn which spell the player (human in our case) would like to play
|
* Uses GUI to learn which spell the player (human in our case) would like to play
|
||||||
*/
|
*/
|
||||||
public SpellAbility getAbilityToPlay(final List<SpellAbility> abilities, final ITriggerEvent triggerEvent) {
|
public SpellAbility getAbilityToPlay(final List<SpellAbility> abilities, final ITriggerEvent triggerEvent) {
|
||||||
final int choice = getGui().getAbilityToPlay(gameView.getSpellAbilityViews(abilities), triggerEvent);
|
final int choice = MatchUtil.getController().getAbilityToPlay(gameView.getSpellAbilityViews(abilities), triggerEvent);
|
||||||
return gameView.getSpellAbility(choice);
|
return gameView.getSpellAbility(choice);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -258,7 +258,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
if ((attacker.hasKeyword("Trample") && defender != null) || (blockers.size() > 1)) {
|
if ((attacker.hasKeyword("Trample") && defender != null) || (blockers.size() > 1)) {
|
||||||
final CardView vAttacker = gameView.getCardView(attacker);
|
final CardView vAttacker = gameView.getCardView(attacker);
|
||||||
final GameEntityView vDefender = gameView.getGameEntityView(defender);
|
final GameEntityView vDefender = gameView.getGameEntityView(defender);
|
||||||
final Map<CardView, Integer> result = getGui().getDamageToAssign(vAttacker, vBlockers, damageDealt, vDefender, overrideOrder);
|
final Map<CardView, Integer> result = MatchUtil.getDamageToAssign(vAttacker, vBlockers, damageDealt, vDefender, overrideOrder);
|
||||||
for (final Entry<CardView, Integer> e : result.entrySet()) {
|
for (final Entry<CardView, Integer> e : result.entrySet()) {
|
||||||
map.put(gameView.getCard(e.getKey()), e.getValue());
|
map.put(gameView.getCard(e.getKey()), e.getValue());
|
||||||
}
|
}
|
||||||
@@ -300,7 +300,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
if (max <= 0) {
|
if (max <= 0) {
|
||||||
return new ArrayList<Card>();
|
return new ArrayList<Card>();
|
||||||
}
|
}
|
||||||
|
|
||||||
StringBuilder builder = new StringBuilder("Select ");
|
StringBuilder builder = new StringBuilder("Select ");
|
||||||
if (min == 0) {
|
if (min == 0) {
|
||||||
builder.append("up to ");
|
builder.append("up to ");
|
||||||
@@ -325,10 +325,10 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
if (max == 1) {
|
if (max == 1) {
|
||||||
Card singleChosen = chooseSingleEntityForEffect(sourceList, sa, title, isOptional);
|
Card singleChosen = chooseSingleEntityForEffect(sourceList, sa, title, isOptional);
|
||||||
return singleChosen == null ? Lists.<Card>newArrayList() : Lists.newArrayList(singleChosen);
|
return singleChosen == null ? Lists.<Card>newArrayList() : Lists.newArrayList(singleChosen);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MatchUtil.getController().setPanelSelection(gameView.getCardView(sa.getHostCard()));
|
||||||
|
|
||||||
getGui().setPanelSelection(gameView.getCardView(sa.getHostCard()));
|
|
||||||
|
|
||||||
// try to use InputSelectCardsFromList when possible
|
// try to use InputSelectCardsFromList when possible
|
||||||
boolean cardsAreInMyHandOrBattlefield = true;
|
boolean cardsAreInMyHandOrBattlefield = true;
|
||||||
for (Card c : sourceList) {
|
for (Card c : sourceList) {
|
||||||
@@ -496,7 +496,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
@Override
|
@Override
|
||||||
public List<Card> orderBlockers(final Card attacker, final List<Card> blockers) {
|
public List<Card> orderBlockers(final Card attacker, final List<Card> blockers) {
|
||||||
final CardView vAttacker = gameView.getCardView(attacker);
|
final CardView vAttacker = gameView.getCardView(attacker);
|
||||||
getGui().setPanelSelection(vAttacker);
|
MatchUtil.getController().setPanelSelection(vAttacker);
|
||||||
final List<CardView> choices = SGuiChoose.order(getGui(), "Choose Damage Order for " + vAttacker, "Damaged First", gameView.getCardViews(blockers), vAttacker);
|
final List<CardView> choices = SGuiChoose.order(getGui(), "Choose Damage Order for " + vAttacker, "Damaged First", gameView.getCardViews(blockers), vAttacker);
|
||||||
return gameView.getCards(choices);
|
return gameView.getCards(choices);
|
||||||
}
|
}
|
||||||
@@ -504,7 +504,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
@Override
|
@Override
|
||||||
public List<Card> orderBlocker(final Card attacker, final Card blocker, final List<Card> oldBlockers) {
|
public List<Card> orderBlocker(final Card attacker, final Card blocker, final List<Card> oldBlockers) {
|
||||||
final CardView vAttacker = gameView.getCardView(attacker);
|
final CardView vAttacker = gameView.getCardView(attacker);
|
||||||
getGui().setPanelSelection(vAttacker);
|
MatchUtil.getController().setPanelSelection(vAttacker);
|
||||||
final List<CardView> choices = SGuiChoose.insertInList(getGui(), "Choose blocker after which to place " + vAttacker + " in damage order; cancel to place it first", gameView.getCardView(blocker), gameView.getCardViews(oldBlockers));
|
final List<CardView> choices = SGuiChoose.insertInList(getGui(), "Choose blocker after which to place " + vAttacker + " in damage order; cancel to place it first", gameView.getCardView(blocker), gameView.getCardViews(oldBlockers));
|
||||||
return gameView.getCards(choices);
|
return gameView.getCards(choices);
|
||||||
}
|
}
|
||||||
@@ -512,7 +512,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
@Override
|
@Override
|
||||||
public List<Card> orderAttackers(final Card blocker, final List<Card> attackers) {
|
public List<Card> orderAttackers(final Card blocker, final List<Card> attackers) {
|
||||||
final CardView vBlocker = gameView.getCardView(blocker);
|
final CardView vBlocker = gameView.getCardView(blocker);
|
||||||
getGui().setPanelSelection(vBlocker);
|
MatchUtil.getController().setPanelSelection(vBlocker);
|
||||||
final List<CardView> choices = SGuiChoose.order(getGui(), "Choose Damage Order for " + vBlocker, "Damaged First", gameView.getCardViews(attackers), vBlocker);
|
final List<CardView> choices = SGuiChoose.order(getGui(), "Choose Damage Order for " + vBlocker, "Damaged First", gameView.getCardViews(attackers), vBlocker);
|
||||||
return gameView.getCards(choices);
|
return gameView.getCards(choices);
|
||||||
}
|
}
|
||||||
@@ -733,9 +733,9 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
Iterables.removeAll(types, invalidTypes);
|
Iterables.removeAll(types, invalidTypes);
|
||||||
}
|
}
|
||||||
if (isOptional) {
|
if (isOptional) {
|
||||||
return SGuiChoose.oneOrNone(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types);
|
return SGuiChoose.oneOrNone(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types);
|
||||||
}
|
}
|
||||||
return SGuiChoose.one(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types);
|
return SGuiChoose.one(getGui(), "Choose a " + kindOfType.toLowerCase() + " type", types);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -767,7 +767,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
//ensure they're declared and then delay slightly so user can see as much
|
//ensure they're declared and then delay slightly so user can see as much
|
||||||
for (Pair<Card, GameEntity> attacker : mandatoryAttackers) {
|
for (Pair<Card, GameEntity> attacker : mandatoryAttackers) {
|
||||||
combat.addAttacker(attacker.getLeft(), attacker.getRight());
|
combat.addAttacker(attacker.getLeft(), attacker.getRight());
|
||||||
getGui().fireEvent(new UiEventAttackerDeclared(gameView.getCardView(attacker.getLeft()), gameView.getGameEntityView(attacker.getRight())));
|
MatchUtil.fireEvent(new UiEventAttackerDeclared(gameView.getCardView(attacker.getLeft()), gameView.getGameEntityView(attacker.getRight())));
|
||||||
}
|
}
|
||||||
try {
|
try {
|
||||||
Thread.sleep(FControlGamePlayback.combatDelay);
|
Thread.sleep(FControlGamePlayback.combatDelay);
|
||||||
@@ -797,10 +797,10 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
//allow user to cancel auto-pass
|
//allow user to cancel auto-pass
|
||||||
InputBase.cancelAwaitNextInput(); //don't overwrite prompt with awaiting opponent
|
InputBase.cancelAwaitNextInput(); //don't overwrite prompt with awaiting opponent
|
||||||
PhaseType phase = getAutoPassUntilPhase();
|
PhaseType phase = getAutoPassUntilPhase();
|
||||||
InputNone inputNone = new InputNone(gameView);
|
PlayerView playerView = gameView.getLocalPlayerView();
|
||||||
getGui().showPromptMessage(inputNone.getOwner(), "Yielding until " + (phase == PhaseType.CLEANUP ? "end of turn" : phase.nameForUi.toString()) +
|
MatchUtil.getController().showPromptMessage(playerView, "Yielding until " + (phase == PhaseType.CLEANUP ? "end of turn" : phase.nameForUi.toString()) +
|
||||||
".\nYou may cancel this yield to take an action.");
|
".\nYou may cancel this yield to take an action.");
|
||||||
ButtonUtil.update(inputNone, false, true, false);
|
ButtonUtil.update(playerView, false, true, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -816,9 +816,9 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
super.autoPassCancel();
|
super.autoPassCancel();
|
||||||
|
|
||||||
//prevent prompt getting stuck on yielding message while actually waiting for next input opportunity
|
//prevent prompt getting stuck on yielding message while actually waiting for next input opportunity
|
||||||
InputNone inputNone = new InputNone(gameView);
|
PlayerView playerView = gameView.getLocalPlayerView();
|
||||||
getGui().showPromptMessage(inputNone.getOwner(), "");
|
MatchUtil.getController().showPromptMessage(playerView, "");
|
||||||
ButtonUtil.update(inputNone, false, false, false);
|
ButtonUtil.update(playerView, false, false, false);
|
||||||
InputBase.awaitNextInput(gameView);
|
InputBase.awaitNextInput(gameView);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1163,9 +1163,9 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
@Override
|
@Override
|
||||||
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers, HashMap<String, Object> runParams) {
|
public ReplacementEffect chooseSingleReplacementEffect(String prompt, List<ReplacementEffect> possibleReplacers, HashMap<String, Object> runParams) {
|
||||||
if (possibleReplacers.size() == 1) {
|
if (possibleReplacers.size() == 1) {
|
||||||
return possibleReplacers.get(0);
|
return possibleReplacers.get(0);
|
||||||
}
|
}
|
||||||
return SGuiChoose.one(getGui(), prompt, possibleReplacers);
|
return SGuiChoose.one(getGui(), prompt, possibleReplacers);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1327,8 +1327,8 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
|
|
||||||
public boolean isGuiPlayer() {
|
public boolean isGuiPlayer() {
|
||||||
return lobbyPlayer == GamePlayerUtil.getGuiPlayer();
|
return lobbyPlayer == GamePlayerUtil.getGuiPlayer();
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* What follows are the View methods.
|
* What follows are the View methods.
|
||||||
*/
|
*/
|
||||||
@@ -1720,7 +1720,7 @@ public class PlayerControllerHuman extends PlayerController {
|
|||||||
public void setViewAllCards(final boolean canViewAll) {
|
public void setViewAllCards(final boolean canViewAll) {
|
||||||
mayLookAtAllCards = canViewAll;
|
mayLookAtAllCards = canViewAll;
|
||||||
for (final Player p : game.getPlayers()) {
|
for (final Player p : game.getPlayers()) {
|
||||||
getGui().updateCards(getCardViews(p.getAllCards()));
|
MatchUtil.updateCards(getCardViews(p.getAllCards()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,6 +35,7 @@ import forge.game.spellability.SpellAbilityStackInstance;
|
|||||||
import forge.game.spellability.TargetRestrictions;
|
import forge.game.spellability.TargetRestrictions;
|
||||||
import forge.game.zone.Zone;
|
import forge.game.zone.Zone;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.match.input.InputSelectTargets;
|
import forge.match.input.InputSelectTargets;
|
||||||
import forge.util.Aggregates;
|
import forge.util.Aggregates;
|
||||||
import forge.util.gui.SGuiChoose;
|
import forge.util.gui.SGuiChoose;
|
||||||
@@ -138,12 +139,12 @@ public class TargetSelection {
|
|||||||
for (Card card : validTargets) {
|
for (Card card : validTargets) {
|
||||||
playersWithValidTargets.put(controller.getPlayerView(card.getController()), null);
|
playersWithValidTargets.put(controller.getPlayerView(card.getController()), null);
|
||||||
}
|
}
|
||||||
if (controller.getGui().openZones(zone, playersWithValidTargets)) {
|
if (MatchUtil.getController().openZones(zone, playersWithValidTargets)) {
|
||||||
InputSelectTargets inp = new InputSelectTargets(controller, validTargets, ability, mandatory);
|
InputSelectTargets inp = new InputSelectTargets(controller, validTargets, ability, mandatory);
|
||||||
inp.showAndWait();
|
inp.showAndWait();
|
||||||
choiceResult = !inp.hasCancelled();
|
choiceResult = !inp.hasCancelled();
|
||||||
bTargetingDone = inp.hasPressedOk();
|
bTargetingDone = inp.hasPressedOk();
|
||||||
controller.getGui().restoreOldZones(playersWithValidTargets);
|
MatchUtil.getController().restoreOldZones(playersWithValidTargets);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// for every other case an all-purpose GuiChoose
|
// for every other case an all-purpose GuiChoose
|
||||||
|
|||||||
@@ -3,7 +3,6 @@ package forge.quest;
|
|||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import forge.FThreads;
|
|
||||||
import forge.deck.Deck;
|
import forge.deck.Deck;
|
||||||
import forge.deck.DeckGroup;
|
import forge.deck.DeckGroup;
|
||||||
import forge.deck.DeckSection;
|
import forge.deck.DeckSection;
|
||||||
@@ -13,6 +12,7 @@ import forge.game.GameType;
|
|||||||
import forge.game.Match;
|
import forge.game.Match;
|
||||||
import forge.game.player.RegisteredPlayer;
|
import forge.game.player.RegisteredPlayer;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
@@ -29,7 +29,12 @@ public class QuestDraftUtils {
|
|||||||
if (lastGame.getMatch().isMatchOver()) {
|
if (lastGame.getMatch().isMatchOver()) {
|
||||||
matchInProgress = false;
|
matchInProgress = false;
|
||||||
}
|
}
|
||||||
gui.continueMatch(matchInProgress ? lastGame.getMatch() : null);
|
if (matchInProgress) {
|
||||||
|
MatchUtil.continueMatch();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
MatchUtil.endCurrentGame();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void completeDraft(DeckGroup finishedDraft) {
|
public static void completeDraft(DeckGroup finishedDraft) {
|
||||||
@@ -184,15 +189,15 @@ public class QuestDraftUtils {
|
|||||||
if (matchInProgress) {
|
if (matchInProgress) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
gui.enableOverlay();
|
MatchUtil.getController().enableOverlay();
|
||||||
|
|
||||||
DraftMatchup nextMatch = matchups.remove(0);
|
DraftMatchup nextMatch = matchups.remove(0);
|
||||||
|
|
||||||
matchInProgress = true;
|
matchInProgress = true;
|
||||||
|
|
||||||
if (!nextMatch.hasHumanPlayer) {
|
if (!nextMatch.hasHumanPlayer) {
|
||||||
gui.disableOverlay();
|
MatchUtil.getController().disableOverlay();
|
||||||
waitForUserInput = false;
|
waitForUserInput = false;
|
||||||
aiMatchInProgress = true;
|
aiMatchInProgress = true;
|
||||||
}
|
}
|
||||||
@@ -207,14 +212,8 @@ public class QuestDraftUtils {
|
|||||||
rules.setGamesPerMatch(3);
|
rules.setGamesPerMatch(3);
|
||||||
rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
rules.setManaBurn(FModel.getPreferences().getPrefBoolean(FPref.UI_MANABURN));
|
||||||
rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
rules.canCloneUseTargetsImage = FModel.getPreferences().getPrefBoolean(FPref.UI_CLONE_MODE_SOURCE);
|
||||||
|
|
||||||
final Match match = new Match(rules, nextMatch.matchStarter);
|
MatchUtil.getController().startNewMatch(new Match(rules, nextMatch.matchStarter));
|
||||||
FThreads.invokeInEdtLater(gui, new Runnable(){
|
|
||||||
@Override
|
|
||||||
public void run() {
|
|
||||||
gui.startGame(match);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void continueMatches(final IGuiBase gui) {
|
public static void continueMatches(final IGuiBase gui) {
|
||||||
|
|||||||
@@ -38,6 +38,7 @@ import forge.interfaces.IButton;
|
|||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
import forge.item.IPaperCard;
|
import forge.item.IPaperCard;
|
||||||
import forge.item.PaperToken;
|
import forge.item.PaperToken;
|
||||||
|
import forge.match.MatchUtil;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.GamePlayerUtil;
|
import forge.player.GamePlayerUtil;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
@@ -589,7 +590,7 @@ public class QuestUtil {
|
|||||||
FThreads.invokeInEdtNowOrLater(gui, new Runnable(){
|
FThreads.invokeInEdtNowOrLater(gui, new Runnable(){
|
||||||
@Override
|
@Override
|
||||||
public void run() {
|
public void run() {
|
||||||
gui.startGame(mc);
|
MatchUtil.startGame(mc);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import java.util.Map;
|
|||||||
|
|
||||||
import com.google.common.eventbus.Subscribe;
|
import com.google.common.eventbus.Subscribe;
|
||||||
|
|
||||||
|
import forge.GuiBase;
|
||||||
import forge.events.UiEvent;
|
import forge.events.UiEvent;
|
||||||
import forge.game.event.GameEvent;
|
import forge.game.event.GameEvent;
|
||||||
import forge.interfaces.IGuiBase;
|
import forge.interfaces.IGuiBase;
|
||||||
@@ -19,6 +20,8 @@ import forge.properties.ForgePreferences.FPref;
|
|||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class SoundSystem {
|
public class SoundSystem {
|
||||||
|
public static final SoundSystem instance = new SoundSystem(GuiBase.getInterface());
|
||||||
|
|
||||||
public static final int DELAY = 30;
|
public static final int DELAY = 30;
|
||||||
|
|
||||||
private static final IAudioClip emptySound = new NoSoundClip();
|
private static final IAudioClip emptySound = new NoSoundClip();
|
||||||
@@ -28,7 +31,7 @@ public class SoundSystem {
|
|||||||
private final IGuiBase gui;
|
private final IGuiBase gui;
|
||||||
private final EventVisualizer visualizer;
|
private final EventVisualizer visualizer;
|
||||||
|
|
||||||
public SoundSystem(final IGuiBase gui) {
|
private SoundSystem(final IGuiBase gui) {
|
||||||
this.gui = gui;
|
this.gui = gui;
|
||||||
this.visualizer = new EventVisualizer(GamePlayerUtil.getGuiPlayer());
|
this.visualizer = new EventVisualizer(GamePlayerUtil.getGuiPlayer());
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user