mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 19:58:00 +00:00
Merge branch 'target-other-zones' into 'master'
Show ZoneAreas when targeting non-Stack zones See merge request core-developers/forge!2492
This commit is contained in:
@@ -17,39 +17,11 @@
|
|||||||
*/
|
*/
|
||||||
package forge.screens.match;
|
package forge.screens.match;
|
||||||
|
|
||||||
import java.awt.Component;
|
|
||||||
import java.awt.Dimension;
|
|
||||||
import java.awt.event.KeyEvent;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.EnumMap;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
import java.util.concurrent.atomic.AtomicReference;
|
|
||||||
|
|
||||||
import javax.swing.JMenu;
|
|
||||||
import javax.swing.JOptionPane;
|
|
||||||
import javax.swing.JPanel;
|
|
||||||
import javax.swing.JPopupMenu;
|
|
||||||
import javax.swing.KeyStroke;
|
|
||||||
import javax.swing.SwingUtilities;
|
|
||||||
import javax.swing.event.PopupMenuEvent;
|
|
||||||
import javax.swing.event.PopupMenuListener;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
import com.google.common.collect.ImmutableMap;
|
import com.google.common.collect.ImmutableMap;
|
||||||
|
import com.google.common.collect.Lists;
|
||||||
import forge.FThreads;
|
import forge.*;
|
||||||
import forge.GuiBase;
|
|
||||||
import forge.ImageCache;
|
|
||||||
import forge.LobbyPlayer;
|
|
||||||
import forge.Singletons;
|
|
||||||
import forge.StaticData;
|
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.card.CardStateName;
|
import forge.card.CardStateName;
|
||||||
import forge.control.KeyboardShortcuts;
|
import forge.control.KeyboardShortcuts;
|
||||||
@@ -71,51 +43,26 @@ import forge.game.phase.PhaseType;
|
|||||||
import forge.game.player.DelayedReveal;
|
import forge.game.player.DelayedReveal;
|
||||||
import forge.game.player.IHasIcon;
|
import forge.game.player.IHasIcon;
|
||||||
import forge.game.player.PlayerView;
|
import forge.game.player.PlayerView;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.*;
|
||||||
import forge.game.spellability.SpellAbilityStackInstance;
|
|
||||||
import forge.game.spellability.SpellAbilityView;
|
|
||||||
import forge.game.spellability.StackItemView;
|
|
||||||
import forge.game.spellability.TargetChoices;
|
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.gui.FNetOverlay;
|
import forge.gui.*;
|
||||||
import forge.gui.GuiChoose;
|
import forge.gui.framework.*;
|
||||||
import forge.gui.GuiDialog;
|
|
||||||
import forge.gui.GuiUtils;
|
|
||||||
import forge.gui.SOverlayUtils;
|
|
||||||
import forge.gui.framework.DragCell;
|
|
||||||
import forge.gui.framework.EDocID;
|
|
||||||
import forge.gui.framework.FScreen;
|
|
||||||
import forge.gui.framework.ICDoc;
|
|
||||||
import forge.gui.framework.IVDoc;
|
|
||||||
import forge.gui.framework.SDisplayUtil;
|
|
||||||
import forge.gui.framework.SLayoutIO;
|
|
||||||
import forge.gui.framework.VEmptyDoc;
|
|
||||||
import forge.item.InventoryItem;
|
import forge.item.InventoryItem;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.match.AbstractGuiGame;
|
import forge.match.AbstractGuiGame;
|
||||||
import forge.menus.IMenuProvider;
|
import forge.menus.IMenuProvider;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.PlayerZoneUpdate;
|
import forge.player.PlayerZoneUpdate;
|
||||||
|
import forge.player.PlayerZoneUpdates;
|
||||||
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.screens.match.controllers.CAntes;
|
import forge.screens.match.controllers.*;
|
||||||
import forge.screens.match.controllers.CCombat;
|
|
||||||
import forge.screens.match.controllers.CDetailPicture;
|
|
||||||
import forge.screens.match.controllers.CDev;
|
|
||||||
import forge.screens.match.controllers.CDock;
|
|
||||||
import forge.screens.match.controllers.CLog;
|
|
||||||
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.VField;
|
import forge.screens.match.views.VField;
|
||||||
import forge.screens.match.views.VHand;
|
import forge.screens.match.views.VHand;
|
||||||
import forge.toolbox.FButton;
|
import forge.toolbox.*;
|
||||||
import forge.toolbox.FLabel;
|
|
||||||
import forge.toolbox.FOptionPane;
|
|
||||||
import forge.toolbox.FSkin;
|
|
||||||
import forge.toolbox.FSkin.SkinImage;
|
import forge.toolbox.FSkin.SkinImage;
|
||||||
import forge.toolbox.FTextArea;
|
|
||||||
import forge.toolbox.imaging.FImagePanel;
|
import forge.toolbox.imaging.FImagePanel;
|
||||||
import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode;
|
import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode;
|
||||||
import forge.toolbox.imaging.FImageUtil;
|
import forge.toolbox.imaging.FImageUtil;
|
||||||
@@ -123,15 +70,26 @@ import forge.toolbox.special.PhaseIndicator;
|
|||||||
import forge.toolbox.special.PhaseLabel;
|
import forge.toolbox.special.PhaseLabel;
|
||||||
import forge.trackable.TrackableCollection;
|
import forge.trackable.TrackableCollection;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
|
import forge.util.Localizer;
|
||||||
import forge.util.collect.FCollection;
|
import forge.util.collect.FCollection;
|
||||||
import forge.util.collect.FCollectionView;
|
import forge.util.collect.FCollectionView;
|
||||||
import forge.util.gui.SOptionPane;
|
import forge.util.gui.SOptionPane;
|
||||||
import forge.util.Localizer;
|
|
||||||
import forge.view.FView;
|
import forge.view.FView;
|
||||||
import forge.view.arcane.CardPanel;
|
import forge.view.arcane.CardPanel;
|
||||||
import forge.view.arcane.FloatingZone;
|
import forge.view.arcane.FloatingZone;
|
||||||
import net.miginfocom.swing.MigLayout;
|
import net.miginfocom.swing.MigLayout;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import javax.swing.event.PopupMenuEvent;
|
||||||
|
import javax.swing.event.PopupMenuListener;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.KeyEvent;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.*;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
import java.util.concurrent.atomic.AtomicReference;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constructs instance of match UI controller, used as a single point of
|
* Constructs instance of match UI controller, used as a single point of
|
||||||
* top-level control for child UIs. Tasks targeting the view of individual
|
* top-level control for child UIs. Tasks targeting the view of individual
|
||||||
@@ -459,6 +417,8 @@ public final class CMatchUI
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterable<PlayerZoneUpdate> tempShowZones(final PlayerView controller, final Iterable<PlayerZoneUpdate> zonesToUpdate) {
|
public Iterable<PlayerZoneUpdate> tempShowZones(final PlayerView controller, final Iterable<PlayerZoneUpdate> zonesToUpdate) {
|
||||||
|
List<PlayerZoneUpdate> updatedPlayerZones = Lists.newArrayList();
|
||||||
|
|
||||||
for (final PlayerZoneUpdate update : zonesToUpdate) {
|
for (final PlayerZoneUpdate update : zonesToUpdate) {
|
||||||
final PlayerView player = update.getPlayer();
|
final PlayerView player = update.getPlayer();
|
||||||
for (final ZoneType zone : update.getZones()) {
|
for (final ZoneType zone : update.getZones()) {
|
||||||
@@ -467,7 +427,9 @@ public final class CMatchUI
|
|||||||
break;
|
break;
|
||||||
case Hand: // controller hand always shown
|
case Hand: // controller hand always shown
|
||||||
if (controller != player) {
|
if (controller != player) {
|
||||||
FloatingZone.show(this,player,zone);
|
if (FloatingZone.show(this,player,zone)) {
|
||||||
|
updatedPlayerZones.add(update);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Library:
|
case Library:
|
||||||
@@ -475,14 +437,16 @@ public final class CMatchUI
|
|||||||
case Exile:
|
case Exile:
|
||||||
case Flashback:
|
case Flashback:
|
||||||
case Command:
|
case Command:
|
||||||
FloatingZone.show(this,player,zone);
|
if (FloatingZone.show(this,player,zone)) {
|
||||||
|
updatedPlayerZones.add(update);
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return zonesToUpdate; //pfps should return only the newly shown zones
|
return updatedPlayerZones;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@@ -1086,21 +1050,30 @@ public final class CMatchUI
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean openZones(final Collection<ZoneType> zones, final Map<PlayerView, Object> players) {
|
public PlayerZoneUpdates openZones(PlayerView controller, final Collection<ZoneType> zones, final Map<PlayerView, Object> playersWithTargetables) {
|
||||||
if (zones.size() == 1) {
|
final PlayerZoneUpdates zonesToUpdate = new PlayerZoneUpdates();
|
||||||
switch (zones.iterator().next()) {
|
for (final PlayerView view : playersWithTargetables.keySet()) {
|
||||||
case Battlefield:
|
for(final ZoneType zone : zones) {
|
||||||
case Hand:
|
if (zone.equals(ZoneType.Battlefield) || zone.equals(ZoneType.Hand)) {
|
||||||
return true; //don't actually need to open anything, but indicate that zone can be opened
|
continue;
|
||||||
default:
|
}
|
||||||
return false;
|
|
||||||
|
if (zone.equals(ZoneType.Stack)) {
|
||||||
|
// TODO: Remove this if we have ever have a Stack zone that's displayable for Counters
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
zonesToUpdate.add(new PlayerZoneUpdate(view, zone));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
|
||||||
|
tempShowZones(controller, zonesToUpdate);
|
||||||
|
return zonesToUpdate;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restoreOldZones(final Map<PlayerView, Object> playersToRestoreZonesFor) {
|
public void restoreOldZones(PlayerView playerView, PlayerZoneUpdates playerZoneUpdates) {
|
||||||
|
hideZones(playerView, playerZoneUpdates);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -17,18 +17,6 @@
|
|||||||
*/
|
*/
|
||||||
package forge.view.arcane;
|
package forge.view.arcane;
|
||||||
|
|
||||||
import java.awt.Point;
|
|
||||||
import java.awt.Rectangle;
|
|
||||||
import java.awt.Component;
|
|
||||||
import java.awt.event.ActionEvent;
|
|
||||||
import java.awt.event.ActionListener;
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.swing.ScrollPaneConstants;
|
|
||||||
import javax.swing.Timer;
|
|
||||||
|
|
||||||
import forge.Singletons;
|
import forge.Singletons;
|
||||||
import forge.game.card.CardView;
|
import forge.game.card.CardView;
|
||||||
import forge.gui.framework.SDisplayUtil;
|
import forge.gui.framework.SDisplayUtil;
|
||||||
@@ -39,10 +27,19 @@ import forge.screens.match.CMatchUI;
|
|||||||
import forge.toolbox.FMouseAdapter;
|
import forge.toolbox.FMouseAdapter;
|
||||||
import forge.toolbox.FScrollPane;
|
import forge.toolbox.FScrollPane;
|
||||||
import forge.toolbox.MouseTriggerEvent;
|
import forge.toolbox.MouseTriggerEvent;
|
||||||
//import forge.util.collect.FCollectionView;
|
|
||||||
import forge.view.FDialog;
|
import forge.view.FDialog;
|
||||||
import forge.view.FFrame;
|
import forge.view.FFrame;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.*;
|
||||||
|
import java.awt.event.ActionEvent;
|
||||||
|
import java.awt.event.ActionListener;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
//import forge.util.collect.FCollectionView;
|
||||||
|
|
||||||
// show some cards in a new window
|
// show some cards in a new window
|
||||||
public abstract class FloatingCardArea extends CardArea {
|
public abstract class FloatingCardArea extends CardArea {
|
||||||
|
|
||||||
@@ -67,12 +64,14 @@ public abstract class FloatingCardArea extends CardArea {
|
|||||||
getWindow().setFocusableWindowState(false); // should probably do this earlier
|
getWindow().setFocusableWindowState(false); // should probably do this earlier
|
||||||
getWindow().setVisible(true);
|
getWindow().setVisible(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void hideWindow() {
|
protected void hideWindow() {
|
||||||
onShow();
|
onShow();
|
||||||
getWindow().setFocusableWindowState(false); // should probably do this earlier
|
getWindow().setFocusableWindowState(false); // should probably do this earlier
|
||||||
getWindow().setVisible(false);
|
getWindow().setVisible(false);
|
||||||
getWindow().dispose(); //pfps so that old content does not show up
|
getWindow().dispose(); //pfps so that old content does not show up
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void showOrHideWindow() {
|
protected void showOrHideWindow() {
|
||||||
if (getWindow().isVisible()) {
|
if (getWindow().isVisible()) {
|
||||||
hideWindow();
|
hideWindow();
|
||||||
@@ -98,9 +97,12 @@ public abstract class FloatingCardArea extends CardArea {
|
|||||||
if (hasBeenShown || locLoaded) { return; }
|
if (hasBeenShown || locLoaded) { return; }
|
||||||
super.setLocationRelativeTo(c);
|
super.setLocationRelativeTo(c);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void setVisible(boolean b0) {
|
public void setVisible(boolean b0) {
|
||||||
if (isVisible() == b0) { return; }
|
if (isVisible() == b0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
if (!b0 && hasBeenShown && locPref != null) {
|
if (!b0 && hasBeenShown && locPref != null) {
|
||||||
//update preference before hiding window, as otherwise its location will be 0,0
|
//update preference before hiding window, as otherwise its location will be 0,0
|
||||||
prefs.setPref(locPref,
|
prefs.setPref(locPref,
|
||||||
@@ -116,6 +118,10 @@ public abstract class FloatingCardArea extends CardArea {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
public boolean isVisible() {
|
||||||
|
return window.isVisible();
|
||||||
|
}
|
||||||
|
|
||||||
protected FDialog getWindow() {
|
protected FDialog getWindow() {
|
||||||
return window;
|
return window;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -17,27 +17,26 @@
|
|||||||
*/
|
*/
|
||||||
package forge.view.arcane;
|
package forge.view.arcane;
|
||||||
|
|
||||||
import java.util.HashMap;
|
import forge.FThreads;
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Collections;
|
|
||||||
import java.util.Comparator;
|
|
||||||
|
|
||||||
import java.awt.event.MouseEvent;
|
|
||||||
import javax.swing.ScrollPaneConstants;
|
|
||||||
import javax.swing.WindowConstants;
|
|
||||||
|
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.game.card.CardView;
|
import forge.game.card.CardView;
|
||||||
import forge.game.player.PlayerView;
|
import forge.game.player.PlayerView;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.CMatchUI;
|
import forge.screens.match.CMatchUI;
|
||||||
import forge.toolbox.FScrollPane;
|
|
||||||
import forge.toolbox.FMouseAdapter;
|
import forge.toolbox.FMouseAdapter;
|
||||||
|
import forge.toolbox.FScrollPane;
|
||||||
import forge.toolbox.FSkin;
|
import forge.toolbox.FSkin;
|
||||||
import forge.util.Lang;
|
import forge.util.Lang;
|
||||||
import forge.util.collect.FCollection;
|
import forge.util.collect.FCollection;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.awt.event.MouseEvent;
|
||||||
|
import java.util.Collections;
|
||||||
|
import java.util.Comparator;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class FloatingZone extends FloatingCardArea {
|
public class FloatingZone extends FloatingCardArea {
|
||||||
private static final long serialVersionUID = 1927906492186378596L;
|
private static final long serialVersionUID = 1927906492186378596L;
|
||||||
|
|
||||||
@@ -46,18 +45,44 @@ public class FloatingZone extends FloatingCardArea {
|
|||||||
private static int getKey(final PlayerView player, final ZoneType zone) {
|
private static int getKey(final PlayerView player, final ZoneType zone) {
|
||||||
return 40 * player.getId() + zone.hashCode();
|
return 40 * player.getId() + zone.hashCode();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void showOrHide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
public static void showOrHide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
||||||
final FloatingZone cardArea = _init(matchUI, player, zone);
|
final FloatingZone cardArea = _init(matchUI, player, zone);
|
||||||
cardArea.showOrHideWindow();
|
cardArea.showOrHideWindow();
|
||||||
}
|
}
|
||||||
public static void show(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
|
||||||
|
public static boolean show(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
||||||
final FloatingZone cardArea = _init(matchUI, player, zone);
|
final FloatingZone cardArea = _init(matchUI, player, zone);
|
||||||
|
|
||||||
|
if (cardArea.isVisible()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FThreads.invokeInEdtNowOrLater(new Runnable() {
|
||||||
|
@Override public void run() {
|
||||||
cardArea.showWindow();
|
cardArea.showWindow();
|
||||||
}
|
}
|
||||||
public static void hide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static boolean hide(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
||||||
final FloatingZone cardArea = _init(matchUI, player, zone);
|
final FloatingZone cardArea = _init(matchUI, player, zone);
|
||||||
|
|
||||||
|
if (!cardArea.isVisible()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
FThreads.invokeInEdtNowOrLater(new Runnable() {
|
||||||
|
@Override public void run() {
|
||||||
cardArea.hideWindow();
|
cardArea.hideWindow();
|
||||||
}
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
private static FloatingZone _init(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
private static FloatingZone _init(final CMatchUI matchUI, final PlayerView player, final ZoneType zone) {
|
||||||
final int key = getKey(player, zone);
|
final int key = getKey(player, zone);
|
||||||
FloatingZone cardArea = floatingAreas.get(key);
|
FloatingZone cardArea = floatingAreas.get(key);
|
||||||
@@ -69,10 +94,12 @@ public class FloatingZone extends FloatingCardArea {
|
|||||||
}
|
}
|
||||||
return cardArea;
|
return cardArea;
|
||||||
}
|
}
|
||||||
|
|
||||||
public static CardPanel getCardPanel(final CMatchUI matchUI, final CardView card) {
|
public static CardPanel getCardPanel(final CMatchUI matchUI, final CardView card) {
|
||||||
final FloatingZone window = _init(matchUI, card.getController(), card.getZone());
|
final FloatingZone window = _init(matchUI, card.getController(), card.getZone());
|
||||||
return window.getCardPanel(card.getId());
|
return window.getCardPanel(card.getId());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void refresh(final PlayerView player, final ZoneType zone) {
|
public static void refresh(final PlayerView player, final ZoneType zone) {
|
||||||
FloatingZone cardArea = floatingAreas.get(getKey(player, zone));
|
FloatingZone cardArea = floatingAreas.get(getKey(player, zone));
|
||||||
if (cardArea != null) {
|
if (cardArea != null) {
|
||||||
@@ -91,12 +118,14 @@ public class FloatingZone extends FloatingCardArea {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void closeAll() {
|
public static void closeAll() {
|
||||||
for (final FloatingZone cardArea : floatingAreas.values()) {
|
for (final FloatingZone cardArea : floatingAreas.values()) {
|
||||||
cardArea.window.setVisible(false);
|
cardArea.window.setVisible(false);
|
||||||
}
|
}
|
||||||
floatingAreas.clear();
|
floatingAreas.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void refreshAll() {
|
public static void refreshAll() {
|
||||||
for (final FloatingZone cardArea : floatingAreas.values()) {
|
for (final FloatingZone cardArea : floatingAreas.values()) {
|
||||||
cardArea.refresh();
|
cardArea.refresh();
|
||||||
@@ -179,7 +208,8 @@ public class FloatingZone extends FloatingCardArea {
|
|||||||
super.onShow();
|
super.onShow();
|
||||||
if (!hasBeenShown) {
|
if (!hasBeenShown) {
|
||||||
getWindow().getTitleBar().addMouseListener(new FMouseAdapter() {
|
getWindow().getTitleBar().addMouseListener(new FMouseAdapter() {
|
||||||
@Override public final void onRightClick(final MouseEvent e) {
|
@Override
|
||||||
|
public final void onRightClick(final MouseEvent e) {
|
||||||
toggleSorted();
|
toggleSorted();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -192,7 +222,9 @@ public class FloatingZone extends FloatingCardArea {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void setPlayer(PlayerView player0) {
|
private void setPlayer(PlayerView player0) {
|
||||||
if (player == player0) { return; }
|
if (player == player0) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
player = player0;
|
player = player0;
|
||||||
setTitle();
|
setTitle();
|
||||||
|
|
||||||
|
|||||||
@@ -5,7 +5,6 @@ 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.Map.Entry;
|
|
||||||
|
|
||||||
import forge.FThreads;
|
import forge.FThreads;
|
||||||
import forge.assets.FSkinImage;
|
import forge.assets.FSkinImage;
|
||||||
@@ -44,6 +43,7 @@ import forge.match.AbstractGuiGame;
|
|||||||
import forge.match.HostedMatch;
|
import forge.match.HostedMatch;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.PlayerZoneUpdate;
|
import forge.player.PlayerZoneUpdate;
|
||||||
|
import forge.player.PlayerZoneUpdates;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.properties.ForgePreferences.FPref;
|
import forge.properties.ForgePreferences.FPref;
|
||||||
import forge.screens.match.views.VAssignDamage;
|
import forge.screens.match.views.VAssignDamage;
|
||||||
@@ -307,40 +307,51 @@ public class MatchController extends AbstractGuiGame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean openZones(final Collection<ZoneType> zones, final Map<PlayerView, Object> players) {
|
public PlayerZoneUpdates openZones(PlayerView controller, final Collection<ZoneType> zones, final Map<PlayerView, Object> playersWithTargetables) {
|
||||||
|
PlayerZoneUpdates updates = new PlayerZoneUpdates();
|
||||||
if (zones.size() == 1) {
|
if (zones.size() == 1) {
|
||||||
final ZoneType zoneType = zones.iterator().next();
|
final ZoneType zoneType = zones.iterator().next();
|
||||||
switch (zoneType) {
|
switch (zoneType) {
|
||||||
case Battlefield:
|
case Battlefield:
|
||||||
case Command:
|
case Command:
|
||||||
players.clear(); //clear since no zones need to be restored
|
playersWithTargetables.clear(); //clear since no zones need to be restored
|
||||||
return true; //Battlefield is always open
|
|
||||||
default:
|
default:
|
||||||
//open zone tab for given zone if needed
|
//open zone tab for given zone if needed
|
||||||
boolean result = true;
|
boolean result = true;
|
||||||
for (final PlayerView player : players.keySet()) {
|
for (final PlayerView player : playersWithTargetables.keySet()) {
|
||||||
final VPlayerPanel playerPanel = view.getPlayerPanel(player);
|
final VPlayerPanel playerPanel = view.getPlayerPanel(player);
|
||||||
players.put(player, playerPanel.getSelectedTab()); //backup selected tab before changing it
|
playersWithTargetables.put(player, playerPanel.getSelectedTab()); //backup selected tab before changing it
|
||||||
final InfoTab zoneTab = playerPanel.getZoneTab(zoneType);
|
final InfoTab zoneTab = playerPanel.getZoneTab(zoneType);
|
||||||
if (zoneTab == null) {
|
ZoneType previousZone = playerPanel.getZoneByInfoTab(playerPanel.getSelectedTab());
|
||||||
result = false;
|
updates.add(new PlayerZoneUpdate(player, previousZone));
|
||||||
} else {
|
if (zoneTab != null) {
|
||||||
playerPanel.setSelectedTab(zoneTab);
|
playerPanel.setSelectedTab(zoneTab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return updates;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restoreOldZones(final Map<PlayerView, Object> playersToRestoreZonesFor) {
|
public void restoreOldZones(PlayerView playerView, PlayerZoneUpdates playerZoneUpdates) {
|
||||||
for (final Entry<PlayerView, Object> player : playersToRestoreZonesFor.entrySet()) {
|
for(PlayerZoneUpdate update : playerZoneUpdates) {
|
||||||
final VPlayerPanel playerPanel = view.getPlayerPanel(player.getKey());
|
PlayerView player = update.getPlayer();
|
||||||
if (player.getValue() == null || player.getValue() instanceof InfoTab) {
|
|
||||||
playerPanel.setSelectedTab((InfoTab) player.getValue());
|
ZoneType zone = null;
|
||||||
|
for(ZoneType type : update.getZones()) {
|
||||||
|
zone = type;
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
final VPlayerPanel playerPanel = view.getPlayerPanel(player);
|
||||||
|
if (zone == null) {
|
||||||
|
playerPanel.hideSelectedTab();
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
final InfoTab zoneTab = playerPanel.getZoneTab(zone);
|
||||||
|
playerPanel.setSelectedTab(zoneTab);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -102,18 +102,32 @@ public class VPlayerPanel extends FContainer {
|
|||||||
return zoneTabs.get(zoneType);
|
return zoneTabs.get(zoneType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public ZoneType getZoneByInfoTab(InfoTab tab) {
|
||||||
|
for(ZoneType zone : zoneTabs.keySet()) {
|
||||||
|
if (zoneTabs.get(zone).equals(tab)) {
|
||||||
|
return zone;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
public void setSelectedZone(ZoneType zoneType) {
|
public void setSelectedZone(ZoneType zoneType) {
|
||||||
setSelectedTab(zoneTabs.get(zoneType));
|
setSelectedTab(zoneTabs.get(zoneType));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void hideSelectedTab() {
|
||||||
|
if (selectedTab != null) {
|
||||||
|
selectedTab.displayArea.setVisible(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public void setSelectedTab(InfoTab selectedTab0) {
|
public void setSelectedTab(InfoTab selectedTab0) {
|
||||||
if (selectedTab == selectedTab0) {
|
if (selectedTab == selectedTab0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (selectedTab != null) {
|
hideSelectedTab();
|
||||||
selectedTab.displayArea.setVisible(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
selectedTab = selectedTab0;
|
selectedTab = selectedTab0;
|
||||||
|
|
||||||
|
|||||||
@@ -31,6 +31,7 @@ import forge.menu.FDropDown;
|
|||||||
import forge.menu.FMenuItem;
|
import forge.menu.FMenuItem;
|
||||||
import forge.menu.FMenuTab;
|
import forge.menu.FMenuTab;
|
||||||
import forge.menu.FPopupMenu;
|
import forge.menu.FPopupMenu;
|
||||||
|
import forge.player.PlayerZoneUpdates;
|
||||||
import forge.screens.match.MatchController;
|
import forge.screens.match.MatchController;
|
||||||
import forge.screens.match.TargetingOverlay;
|
import forge.screens.match.TargetingOverlay;
|
||||||
import forge.toolbox.FCardPanel;
|
import forge.toolbox.FCardPanel;
|
||||||
@@ -55,6 +56,7 @@ public class VStack extends FDropDown {
|
|||||||
private StackInstanceDisplay activeItem;
|
private StackInstanceDisplay activeItem;
|
||||||
private StackItemView activeStackInstance;
|
private StackItemView activeStackInstance;
|
||||||
private Map<PlayerView, Object> playersWithValidTargets;
|
private Map<PlayerView, Object> playersWithValidTargets;
|
||||||
|
private PlayerZoneUpdates restorablePlayerZones = null;
|
||||||
|
|
||||||
private int stackSize;
|
private int stackSize;
|
||||||
|
|
||||||
@@ -70,6 +72,8 @@ public class VStack extends FDropDown {
|
|||||||
private void revealTargetZones() {
|
private void revealTargetZones() {
|
||||||
if (activeStackInstance == null) { return; }
|
if (activeStackInstance == null) { return; }
|
||||||
|
|
||||||
|
PlayerView player = MatchController.instance.getCurrentPlayer();
|
||||||
|
|
||||||
final Set<ZoneType> zones = new HashSet<>();
|
final Set<ZoneType> zones = new HashSet<>();
|
||||||
playersWithValidTargets = new HashMap<>();
|
playersWithValidTargets = new HashMap<>();
|
||||||
for (final CardView c : activeStackInstance.getTargetCards()) {
|
for (final CardView c : activeStackInstance.getTargetCards()) {
|
||||||
@@ -79,14 +83,15 @@ public class VStack extends FDropDown {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (zones.isEmpty() || playersWithValidTargets.isEmpty()) { return; }
|
if (zones.isEmpty() || playersWithValidTargets.isEmpty()) { return; }
|
||||||
MatchController.instance.openZones(zones, playersWithValidTargets);
|
restorablePlayerZones = MatchController.instance.openZones(player, 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 (restorablePlayerZones == null) { return; }
|
||||||
MatchController.instance.restoreOldZones(playersWithValidTargets);
|
PlayerView player = MatchController.instance.getCurrentPlayer();
|
||||||
playersWithValidTargets = null;
|
MatchController.instance.restoreOldZones(player, restorablePlayerZones);
|
||||||
|
restorablePlayerZones = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
package forge.interfaces;
|
package forge.interfaces;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
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.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
@@ -22,9 +17,14 @@ import forge.game.spellability.SpellAbilityView;
|
|||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
import forge.item.PaperCard;
|
import forge.item.PaperCard;
|
||||||
import forge.player.PlayerZoneUpdate;
|
import forge.player.PlayerZoneUpdate;
|
||||||
|
import forge.player.PlayerZoneUpdates;
|
||||||
import forge.trackable.TrackableCollection;
|
import forge.trackable.TrackableCollection;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public interface IGuiGame {
|
public interface IGuiGame {
|
||||||
void setGameView(GameView gameView);
|
void setGameView(GameView gameView);
|
||||||
GameView getGameView();
|
GameView getGameView();
|
||||||
@@ -107,7 +107,6 @@ public interface IGuiGame {
|
|||||||
* @return null if choices is missing, empty, or if the users' choices are
|
* @return null if choices is missing, empty, or if the users' choices are
|
||||||
* empty; otherwise, returns the first item in the List returned by
|
* empty; otherwise, returns the first item in the List returned by
|
||||||
* getChoices.
|
* getChoices.
|
||||||
* @see #getChoices(String, int, int, Object...)
|
|
||||||
*/
|
*/
|
||||||
<T> T oneOrNone(String message, List<T> choices);
|
<T> T oneOrNone(String message, List<T> choices);
|
||||||
|
|
||||||
@@ -158,8 +157,8 @@ public interface IGuiGame {
|
|||||||
|
|
||||||
void setCard(CardView card);
|
void setCard(CardView card);
|
||||||
void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi);
|
void setPlayerAvatar(LobbyPlayer player, IHasIcon ihi);
|
||||||
boolean openZones(Collection<ZoneType> zones, Map<PlayerView, Object> players);
|
PlayerZoneUpdates openZones(PlayerView controller, Collection<ZoneType> zones, Map<PlayerView, Object> players);
|
||||||
void restoreOldZones(Map<PlayerView, Object> playersToRestoreZonesFor);
|
void restoreOldZones(PlayerView playerView, PlayerZoneUpdates playerZoneUpdates);
|
||||||
void setHighlighted(PlayerView pv, boolean b);
|
void setHighlighted(PlayerView pv, boolean b);
|
||||||
void setUsedToPay(CardView card, boolean value);
|
void setUsedToPay(CardView card, boolean value);
|
||||||
void setSelectables(final Iterable<CardView> cards);
|
void setSelectables(final Iterable<CardView> cards);
|
||||||
|
|||||||
@@ -1,23 +1,22 @@
|
|||||||
package forge.match.input;
|
package forge.match.input;
|
||||||
|
|
||||||
import java.util.Collection;
|
import forge.FThreads;
|
||||||
import java.util.List;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
|
|
||||||
import forge.game.GameEntity;
|
import forge.game.GameEntity;
|
||||||
import forge.game.card.Card;
|
import forge.game.card.Card;
|
||||||
import forge.game.card.CardView;
|
import forge.game.card.CardView;
|
||||||
|
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
|
import forge.game.zone.Zone;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
import forge.util.collect.FCollection;
|
|
||||||
import forge.util.collect.FCollectionView;
|
|
||||||
import forge.util.ITriggerEvent;
|
|
||||||
import forge.player.PlayerZoneUpdate;
|
import forge.player.PlayerZoneUpdate;
|
||||||
import forge.player.PlayerZoneUpdates;
|
import forge.player.PlayerZoneUpdates;
|
||||||
import forge.game.zone.Zone;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.FThreads;
|
import forge.util.collect.FCollection;
|
||||||
|
import forge.util.collect.FCollectionView;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
public class InputSelectEntitiesFromList<T extends GameEntity> extends InputSelectManyBase<T> {
|
public class InputSelectEntitiesFromList<T extends GameEntity> extends InputSelectManyBase<T> {
|
||||||
private static final long serialVersionUID = -6609493252672573139L;
|
private static final long serialVersionUID = -6609493252672573139L;
|
||||||
@@ -51,7 +50,8 @@ public class InputSelectEntitiesFromList<T extends GameEntity> extends InputSele
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
FThreads.invokeInEdtNowOrLater(new Runnable() {
|
FThreads.invokeInEdtNowOrLater(new Runnable() {
|
||||||
@Override public void run() {
|
@Override
|
||||||
|
public void run() {
|
||||||
getController().getGui().updateZones(zonesToUpdate);
|
getController().getGui().updateZones(zonesToUpdate);
|
||||||
zonesShown = getController().getGui().tempShowZones(controller.getPlayer().getView(), zonesToUpdate);
|
zonesShown = getController().getGui().tempShowZones(controller.getPlayer().getView(), zonesToUpdate);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,13 +1,7 @@
|
|||||||
package forge.match.input;
|
package forge.match.input;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.Map.Entry;
|
|
||||||
|
|
||||||
import com.google.common.collect.ImmutableList;
|
import com.google.common.collect.ImmutableList;
|
||||||
|
import forge.FThreads;
|
||||||
import forge.game.GameEntity;
|
import forge.game.GameEntity;
|
||||||
import forge.game.GameObject;
|
import forge.game.GameObject;
|
||||||
import forge.game.ability.ApiType;
|
import forge.game.ability.ApiType;
|
||||||
@@ -18,13 +12,18 @@ import forge.game.spellability.SpellAbility;
|
|||||||
import forge.game.spellability.TargetRestrictions;
|
import forge.game.spellability.TargetRestrictions;
|
||||||
import forge.model.FModel;
|
import forge.model.FModel;
|
||||||
import forge.player.PlayerControllerHuman;
|
import forge.player.PlayerControllerHuman;
|
||||||
|
import forge.player.PlayerZoneUpdate;
|
||||||
|
import forge.player.PlayerZoneUpdates;
|
||||||
import forge.properties.ForgeConstants;
|
import forge.properties.ForgeConstants;
|
||||||
import forge.properties.ForgePreferences;
|
import forge.properties.ForgePreferences;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.util.TextUtil;
|
import forge.util.TextUtil;
|
||||||
import forge.player.PlayerZoneUpdate;
|
|
||||||
import forge.player.PlayerZoneUpdates;
|
import java.util.ArrayList;
|
||||||
import forge.FThreads;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
import java.util.Map.Entry;
|
||||||
|
|
||||||
public final class InputSelectTargets extends InputSyncronizedBase {
|
public final class InputSelectTargets extends InputSyncronizedBase {
|
||||||
private final List<Card> choices;
|
private final List<Card> choices;
|
||||||
@@ -53,7 +52,8 @@ public final class InputSelectTargets extends InputSyncronizedBase {
|
|||||||
zonesToUpdate.add(new PlayerZoneUpdate(c.getZone().getPlayer().getView(), c.getZone().getZoneType()));
|
zonesToUpdate.add(new PlayerZoneUpdate(c.getZone().getPlayer().getView(), c.getZone().getZoneType()));
|
||||||
}
|
}
|
||||||
FThreads.invokeInEdtNowOrLater(new Runnable() {
|
FThreads.invokeInEdtNowOrLater(new Runnable() {
|
||||||
@Override public void run() {
|
@Override
|
||||||
|
public void run() {
|
||||||
controller.getGui().updateZones(zonesToUpdate);
|
controller.getGui().updateZones(zonesToUpdate);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -1,14 +1,6 @@
|
|||||||
package forge.net;
|
package forge.net;
|
||||||
|
|
||||||
import java.io.Serializable;
|
|
||||||
import java.lang.reflect.Method;
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.ConcurrentModificationException;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
import com.google.common.base.Function;
|
import com.google.common.base.Function;
|
||||||
|
|
||||||
import forge.GuiBase;
|
import forge.GuiBase;
|
||||||
import forge.assets.FSkinProp;
|
import forge.assets.FSkinProp;
|
||||||
import forge.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
@@ -22,11 +14,19 @@ import forge.game.spellability.SpellAbilityView;
|
|||||||
import forge.interfaces.IGameController;
|
import forge.interfaces.IGameController;
|
||||||
import forge.interfaces.IGuiGame;
|
import forge.interfaces.IGuiGame;
|
||||||
import forge.match.NextGameDecision;
|
import forge.match.NextGameDecision;
|
||||||
|
import forge.player.PlayerZoneUpdates;
|
||||||
import forge.trackable.TrackableCollection;
|
import forge.trackable.TrackableCollection;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
import forge.util.ReflectionUtil;
|
import forge.util.ReflectionUtil;
|
||||||
import org.apache.commons.lang3.SerializationUtils;
|
import org.apache.commons.lang3.SerializationUtils;
|
||||||
|
|
||||||
|
import java.io.Serializable;
|
||||||
|
import java.lang.reflect.Method;
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.ConcurrentModificationException;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The methods that can be sent through this protocol.
|
* The methods that can be sent through this protocol.
|
||||||
*/
|
*/
|
||||||
@@ -75,8 +75,8 @@ public enum ProtocolMethod {
|
|||||||
clearSelectables (Mode.SERVER),
|
clearSelectables (Mode.SERVER),
|
||||||
refreshField (Mode.SERVER),
|
refreshField (Mode.SERVER),
|
||||||
// TODO case "setPlayerAvatar":
|
// TODO case "setPlayerAvatar":
|
||||||
openZones (Mode.SERVER, Boolean.TYPE, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class),
|
openZones (Mode.SERVER, PlayerZoneUpdates.class, Collection/*ZoneType*/.class, Map/*PlayerView,Object*/.class),
|
||||||
restoreOldZones (Mode.SERVER, Void.TYPE, Map/*PlayerView,Object*/.class),
|
restoreOldZones (Mode.SERVER, Void.TYPE, PlayerView.class, PlayerZoneUpdates.class),
|
||||||
isUiSetToSkipPhase (Mode.SERVER, Boolean.TYPE, PlayerView.class, PhaseType.class),
|
isUiSetToSkipPhase (Mode.SERVER, Boolean.TYPE, PlayerView.class, PhaseType.class),
|
||||||
setRememberedActions(Mode.SERVER, Void.TYPE),
|
setRememberedActions(Mode.SERVER, Void.TYPE),
|
||||||
nextRememberedAction(Mode.SERVER, Void.TYPE),
|
nextRememberedAction(Mode.SERVER, Void.TYPE),
|
||||||
|
|||||||
@@ -1,11 +1,6 @@
|
|||||||
package forge.net.server;
|
package forge.net.server;
|
||||||
|
|
||||||
import java.util.Collection;
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
|
||||||
|
|
||||||
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.deck.CardPool;
|
import forge.deck.CardPool;
|
||||||
@@ -23,9 +18,14 @@ import forge.match.AbstractGuiGame;
|
|||||||
import forge.net.GameProtocolSender;
|
import forge.net.GameProtocolSender;
|
||||||
import forge.net.ProtocolMethod;
|
import forge.net.ProtocolMethod;
|
||||||
import forge.player.PlayerZoneUpdate;
|
import forge.player.PlayerZoneUpdate;
|
||||||
|
import forge.player.PlayerZoneUpdates;
|
||||||
import forge.trackable.TrackableCollection;
|
import forge.trackable.TrackableCollection;
|
||||||
import forge.util.ITriggerEvent;
|
import forge.util.ITriggerEvent;
|
||||||
|
|
||||||
|
import java.util.Collection;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class NetGuiGame extends AbstractGuiGame {
|
public class NetGuiGame extends AbstractGuiGame {
|
||||||
|
|
||||||
private final GameProtocolSender sender;
|
private final GameProtocolSender sender;
|
||||||
@@ -283,14 +283,14 @@ public class NetGuiGame extends AbstractGuiGame {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean openZones(final Collection<ZoneType> zones, final Map<PlayerView, Object> players) {
|
public PlayerZoneUpdates openZones(PlayerView controller, final Collection<ZoneType> zones, final Map<PlayerView, Object> players) {
|
||||||
updateGameView();
|
updateGameView();
|
||||||
return sendAndWait(ProtocolMethod.openZones, zones, players);
|
return sendAndWait(ProtocolMethod.openZones, controller, zones, players);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void restoreOldZones(final Map<PlayerView, Object> playersToRestoreZonesFor) {
|
public void restoreOldZones(PlayerView playerView, PlayerZoneUpdates playerZoneUpdates) {
|
||||||
send(ProtocolMethod.restoreOldZones, playersToRestoreZonesFor);
|
send(ProtocolMethod.restoreOldZones, playerView, playerZoneUpdates);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -14,11 +14,15 @@ public class PlayerZoneUpdate implements Serializable {
|
|||||||
private final Set<ZoneType> zones;
|
private final Set<ZoneType> zones;
|
||||||
|
|
||||||
public PlayerZoneUpdate(final PlayerView player, final ZoneType zone) {
|
public PlayerZoneUpdate(final PlayerView player, final ZoneType zone) {
|
||||||
if (player == null || zone == null) {
|
if (player == null ) {
|
||||||
throw new NullPointerException();
|
throw new NullPointerException();
|
||||||
}
|
}
|
||||||
this.player = player;
|
this.player = player;
|
||||||
|
if (zone != null) {
|
||||||
this.zones = EnumSet.of(zone);
|
this.zones = EnumSet.of(zone);
|
||||||
|
} else {
|
||||||
|
this.zones = EnumSet.noneOf(ZoneType.class);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
public PlayerView getPlayer() {
|
public PlayerView getPlayer() {
|
||||||
@@ -30,13 +34,13 @@ public class PlayerZoneUpdate implements Serializable {
|
|||||||
|
|
||||||
void addZone(final ZoneType zone) {
|
void addZone(final ZoneType zone) {
|
||||||
if (zone == null) {
|
if (zone == null) {
|
||||||
throw new NullPointerException();
|
return;
|
||||||
}
|
}
|
||||||
zones.add(zone);
|
zones.add(zone);
|
||||||
}
|
}
|
||||||
void add(final PlayerZoneUpdate other) {
|
void add(final PlayerZoneUpdate other) {
|
||||||
if (other == null) {
|
if (other == null) {
|
||||||
throw new NullPointerException();
|
return;
|
||||||
}
|
}
|
||||||
zones.addAll(other.getZones());
|
zones.addAll(other.getZones());
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -100,7 +100,7 @@ public class TargetSelection {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
final List<ZoneType> zone = tgt.getZone();
|
final List<ZoneType> zones = tgt.getZone();
|
||||||
final boolean mandatory = tgt.getMandatory() && hasCandidates;
|
final boolean mandatory = tgt.getMandatory() && hasCandidates;
|
||||||
|
|
||||||
final boolean choiceResult;
|
final boolean choiceResult;
|
||||||
@@ -110,7 +110,7 @@ public class TargetSelection {
|
|||||||
final GameObject choice = Aggregates.random(candidates);
|
final GameObject choice = Aggregates.random(candidates);
|
||||||
return ability.getTargets().add(choice);
|
return ability.getTargets().add(choice);
|
||||||
}
|
}
|
||||||
else if (zone.size() == 1 && zone.get(0) == ZoneType.Stack) {
|
else if (zones.size() == 1 && zones.get(0) == ZoneType.Stack) {
|
||||||
// If Zone is Stack, the choices are handled slightly differently.
|
// If Zone is Stack, the choices are handled slightly differently.
|
||||||
// Handle everything inside function due to interaction with StackInstance
|
// Handle everything inside function due to interaction with StackInstance
|
||||||
return this.chooseCardFromStack(mandatory);
|
return this.chooseCardFromStack(mandatory);
|
||||||
@@ -152,12 +152,15 @@ public class TargetSelection {
|
|||||||
for (Card card : validTargets) {
|
for (Card card : validTargets) {
|
||||||
playersWithValidTargets.put(PlayerView.get(card.getController()), null);
|
playersWithValidTargets.put(PlayerView.get(card.getController()), null);
|
||||||
}
|
}
|
||||||
if (controller.getGui().openZones(zone, playersWithValidTargets)) {
|
|
||||||
|
PlayerView playerView = controller.getLocalPlayerView();
|
||||||
|
PlayerZoneUpdates playerZoneUpdates = controller.getGui().openZones(playerView, zones, playersWithValidTargets);
|
||||||
|
if (!zones.contains(ZoneType.Stack)) {
|
||||||
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);
|
controller.getGui().restoreOldZones(playerView, playerZoneUpdates);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
// for every other case an all-purpose GuiChoose
|
// for every other case an all-purpose GuiChoose
|
||||||
|
|||||||
Reference in New Issue
Block a user