diff --git a/.gitattributes b/.gitattributes index 38cea455ade..02038539688 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16962,6 +16962,7 @@ forge-gui/src/main/java/forge/card/CardScriptInfo.java -text forge-gui/src/main/java/forge/control/ChatArea.java -text forge-gui/src/main/java/forge/control/FControlGameEventHandler.java -text forge-gui/src/main/java/forge/control/FControlGamePlayback.java -text +forge-gui/src/main/java/forge/control/WatchLocalGame.java -text forge-gui/src/main/java/forge/control/package-info.java -text forge-gui/src/main/java/forge/deck/ColorDeckGenerator.java -text forge-gui/src/main/java/forge/deck/DeckGeneratorTheme.java -text @@ -17151,17 +17152,6 @@ forge-gui/src/main/java/forge/util/gui/SGuiChoose.java -text forge-gui/src/main/java/forge/util/gui/SGuiDialog.java -text forge-gui/src/main/java/forge/util/gui/SOptionPane.java -text forge-gui/src/main/java/forge/util/package-info.java -text -forge-gui/src/main/java/forge/view/Cache.java -text -forge-gui/src/main/java/forge/view/CardView.java -text -forge-gui/src/main/java/forge/view/CombatView.java -text -forge-gui/src/main/java/forge/view/GameEntityView.java -text -forge-gui/src/main/java/forge/view/IGameView.java -text -forge-gui/src/main/java/forge/view/LocalGameView.java -text -forge-gui/src/main/java/forge/view/PlayerView.java -text -forge-gui/src/main/java/forge/view/SpellAbilityView.java -text -forge-gui/src/main/java/forge/view/StackItemView.java -text -forge-gui/src/main/java/forge/view/ViewUtil.java -text -forge-gui/src/main/java/forge/view/WatchLocalGame.java -text forge-gui/src/main/resources/proxy-template.ftl -text forge-gui/src/site/apt/index.apt -text forge-gui/tools/PerSetTracking.py svneol=native#text/x-python diff --git a/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java b/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java index 939a6eea989..eb232b9090f 100644 --- a/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java +++ b/forge-ai/src/main/java/forge/ai/LobbyPlayerAi.java @@ -47,7 +47,7 @@ public class LobbyPlayerAi extends LobbyPlayer implements IGameEntitiesFactory { Player ai = new Player(getName(), game, id); ai.setFirstController(createControllerFor(ai)); - if( rotateProfileEachGame ) { + if (rotateProfileEachGame) { setAiProfile(AiProfileUtil.getRandomProfile()); System.out.println(String.format("AI profile %s was chosen for the lobby player %s.", getAiProfile(), getName())); } diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index bdd9e9e6912..82511628bad 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -100,6 +100,9 @@ public class Game { private final GameView view; public Game(List players0, GameRules rules0, Match match0) { /* no more zones to map here */ + Card.clearCache(); + Player.clearCache(); + rules = rules0; match = match0; List players = new ArrayList(); diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 5cef6bebab1..7cdcbf8ca12 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -19,15 +19,28 @@ package forge.game; import forge.game.card.Card; import forge.game.card.CardCollection; +import forge.game.card.CardView; import forge.game.card.CardCollection.CardCollectionView; import forge.game.event.GameEventCardAttachment; import forge.game.event.GameEventCardAttachment.AttachMethod; +import forge.game.player.Player; +import forge.game.player.PlayerView; import java.util.Map; import java.util.TreeMap; public abstract class GameEntity extends GameObject implements IIdentifiable { + public static GameEntity get(GameEntityView gameEntityView) { + if (gameEntityView instanceof CardView) { + return Card.get((CardView)gameEntityView); + } + if (gameEntityView instanceof PlayerView) { + return Player.get((PlayerView)gameEntityView); + } + return null; + } + protected final int id; private String name = ""; private int preventNextDamage = 0; diff --git a/forge-game/src/main/java/forge/game/GameEntityView.java b/forge-game/src/main/java/forge/game/GameEntityView.java index e85d04cf3c9..8c91ec55719 100644 --- a/forge-game/src/main/java/forge/game/GameEntityView.java +++ b/forge-game/src/main/java/forge/game/GameEntityView.java @@ -1,6 +1,7 @@ package forge.game; import forge.game.card.CardView; +import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; @@ -9,6 +10,17 @@ public abstract class GameEntityView extends TrackableObject { return e == null ? null : e.getView(); } + public static TrackableCollection getEntityCollection(Iterable entities) { + if (entities == null) { + return null; + } + TrackableCollection collection = new TrackableCollection(); + for (GameEntity e : entities) { + collection.add(e.getView()); + } + return collection; + } + protected GameEntityView(int id0) { super(id0); } diff --git a/forge-game/src/main/java/forge/game/GameView.java b/forge-game/src/main/java/forge/game/GameView.java index 8bbfca0a89e..b000ea1ca62 100644 --- a/forge-game/src/main/java/forge/game/GameView.java +++ b/forge-game/src/main/java/forge/game/GameView.java @@ -2,6 +2,9 @@ package forge.game; import java.util.List; +import forge.LobbyPlayer; +import forge.deck.Deck; +import forge.game.GameOutcome.AnteResult; import forge.game.card.Card; import forge.game.card.CardView; import forge.game.combat.AttackingBand; @@ -9,23 +12,27 @@ import forge.game.combat.Combat; import forge.game.combat.CombatView; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; +import forge.game.player.Player; import forge.game.player.PlayerView; -import forge.game.spellability.SpellAbilityView; import forge.game.spellability.StackItemView; import forge.game.zone.MagicStack; -import forge.trackable.TrackableIndex; +import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; +import forge.util.FCollection; public class GameView extends TrackableObject { - private final TrackableIndex cards = new TrackableIndex(); + /*private final TrackableIndex cards = new TrackableIndex(); private final TrackableIndex players = new TrackableIndex(); private final TrackableIndex spellAbilities = new TrackableIndex(); - private final TrackableIndex stackItems = new TrackableIndex(); + private final TrackableIndex stackItems = new TrackableIndex();*/ + private final TrackableCollection players; private CombatView combatView; + private final Game game; //TODO: Remove this when possible before network support added - public GameView(Game game) { + public GameView(Game game0) { super(-1); //ID not needed + game = game0; set(TrackableProperty.WinningTeam, -1); GameRules rules = game.getRules(); @@ -36,6 +43,12 @@ public class GameView extends TrackableObject { set(TrackableProperty.GameLog, game.getGameLog()); set(TrackableProperty.NumPlayedGamesInMatch, game.getMatch().getPlayedGames().size()); + + players = PlayerView.getCollection(game.getPlayers()); + } + + public FCollection.FCollectionView getPlayers() { + return players.getView(); } public boolean isCommander() { @@ -145,4 +158,47 @@ public class GameView extends TrackableObject { /*GameStateDeserializer deserializer = new GameStateDeserializer(); deserializer.readObject();*/ } + + //TODO: Find better ways to make this information available to all GUIs without using the Game class + + public FCollection.FCollectionView getStack() { + return StackItemView.getCollection(game.getStack()).getView(); + } + + public boolean isMatchWonBy(LobbyPlayer questPlayer) { + return game.getMatch().isWonBy(questPlayer); + } + + public Iterable getOutcomesOfMatch() { + return game.getMatch().getOutcomes(); + } + + public LobbyPlayer getWinningPlayer() { + return game.getOutcome().getWinningLobbyPlayer(); + } + + public StackItemView peekStack() { + return StackItemView.get(game.getStack().peek()); + } + + public boolean isWinner(LobbyPlayer guiPlayer) { + return game.getOutcome().isWinner(guiPlayer); + } + + public int getGamesWonBy(LobbyPlayer questPlayer) { + return game.getMatch().getGamesWonBy(questPlayer); + } + + public Deck getDeck(LobbyPlayer guiPlayer) { + for (Player p : game.getRegisteredPlayers()) { + if (p.getLobbyPlayer().equals(guiPlayer)) { + return p.getRegisteredPlayer().getDeck(); + } + } + return null; + } + + public AnteResult getAnteResult(PlayerView player) { + return game.getOutcome().anteResult.get(Player.get(player)); + } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java index 16d5085c4df..03f4ec25ba3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlSpellEffect.java @@ -74,11 +74,11 @@ public class ControlSpellEffect extends SpellAbilityEffect { continue; } - if (!c.canBeControlledBy(si.getActivator())) { + if (!c.canBeControlledBy(si.getActivatingPlayer())) { continue; } - if (c.getController().equals(si.getActivator())) { + if (c.getController().equals(si.getActivatingPlayer())) { // Controllers are already the same, no exchange needed continue; } @@ -86,7 +86,7 @@ public class ControlSpellEffect extends SpellAbilityEffect { if (remember) { source.addRemembered(c); } - c.setController(si.getActivator(), tStamp); + c.setController(si.getActivatingPlayer(), tStamp); } } @@ -98,7 +98,7 @@ public class ControlSpellEffect extends SpellAbilityEffect { source.addRemembered(tgtC); } tgtC.setController(newController, tStamp); - si.setActivator(newController); + si.setActivatingPlayer(newController); } } } diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java index 6027bee916a..6367e3099fd 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -87,6 +87,21 @@ import java.util.concurrent.CopyOnWriteArrayList; * @version $Id$ */ public class Card extends GameEntity implements Comparable, IIdentifiable { + private static HashMap cardCache = new HashMap(); + public static Card get(CardView cardView) { + return cardCache.get(cardView.getId()); + } + public static List getList(Iterable cardViews) { + List list = new ArrayList(); + for (CardView cv : cardViews) { + list.add(get(cv)); + } + return list; + } + public static void clearCache() { + cardCache.clear(); + } + private final IPaperCard paperCard; private final Map characteristicsMap @@ -254,10 +269,15 @@ public class Card extends GameEntity implements Comparable, IIdentifiable public Card(final int id0, final IPaperCard paperCard0) { super(id0); + if (id0 >= 0) { + cardCache.put(id0, this); + } paperCard = paperCard0; - characteristicsMap.put(CardCharacteristicName.Original, new CardCharacteristics()); - characteristicsMap.put(CardCharacteristicName.FaceDown, CardUtil.getFaceDownCharacteristic()); view = new CardView(id0); + characteristicsMap.put(CardCharacteristicName.Original, new CardCharacteristics(view.getOriginal())); + characteristicsMap.put(CardCharacteristicName.FaceDown, CardUtil.getFaceDownCharacteristic(this)); + view.updateChangedColorWords(this); + view.updateChangedTypes(this); } public boolean changeToState(final CardCharacteristicName state) { @@ -337,7 +357,6 @@ public class Card extends GameEntity implements Comparable, IIdentifiable preTFDCharacteristic = curCharacteristics; return setState(CardCharacteristicName.FaceDown); } - return false; } @@ -359,7 +378,6 @@ public class Card extends GameEntity implements Comparable, IIdentifiable } return result; } - return false; } @@ -372,12 +390,19 @@ public class Card extends GameEntity implements Comparable, IIdentifiable } public final void addAlternateState(final CardCharacteristicName state, final boolean updateView) { - characteristicsMap.put(state, new CardCharacteristics()); + characteristicsMap.put(state, new CardCharacteristics(view.createAlternateState())); if (updateView) { view.updateState(this, false); } } + public void updateAttackingForView() { + view.updateAttacking(this); + } + public void updateBlockingForView() { + view.updateBlocking(this); + } + @Override public final String getName() { return getCharacteristics().getName(); @@ -2363,7 +2388,7 @@ public class Card extends GameEntity implements Comparable, IIdentifiable } public final void setType(final List a) { - getCharacteristics().setType(new ArrayList(a)); + getCharacteristics().setType(new HashSet(a)); } public final void addType(final String a) { diff --git a/forge-game/src/main/java/forge/game/card/CardCharacteristics.java b/forge-game/src/main/java/forge/game/card/CardCharacteristics.java index 80d43e25932..3e4375cdd11 100644 --- a/forge-game/src/main/java/forge/game/card/CardCharacteristics.java +++ b/forge-game/src/main/java/forge/game/card/CardCharacteristics.java @@ -23,6 +23,7 @@ import forge.card.CardEdition; import forge.card.CardRarity; import forge.card.ColorSet; import forge.card.mana.ManaCost; +import forge.game.card.CardView.CardStateView; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.SpellAbility; import forge.game.staticability.StaticAbility; @@ -36,10 +37,7 @@ import java.util.TreeMap; import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArraySet; -/** - * TODO: Write javadoc for this type. - * - */ + public class CardCharacteristics { private String name = ""; private Set type = new CopyOnWriteArraySet(); @@ -61,439 +59,57 @@ public class CardCharacteristics { private CardRarity rarity = CardRarity.Unknown; private String curSetCode = CardEdition.UNKNOWN.getCode(); - - /** - * Gets the name. - * - * @return the name - */ - public final String getName() { - return this.name; - } - - /** - * Sets the name. - * - * @param name0 - * the name to set - */ - public final void setName(final String name0) { - this.name = name0; - } - - /** - * Gets the type. - * - * @return the type - */ - public final Set getType() { - return this.type; - } - - /** - * Sets the type. - * - * @param type0 - * the type to set - */ - public final void setType(final ArrayList type0) { - this.type.clear(); - this.type.addAll(type0); - } - - /** - * Gets the mana cost. - * - * @return the manaCost - */ - public final ManaCost getManaCost() { - return this.manaCost; - } - - /** - * Sets the mana cost. - * - * @param manaCost0 - * the manaCost to set - */ - public final void setManaCost(final ManaCost manaCost0) { - this.manaCost = manaCost0; - } - - /** - * Gets the card color. - * - * @return the cardColor - */ - public final List getCardColor() { - return this.cardColor; - } - - /** - * Sets the card color. - * - * @param cardColor0 - * the cardColor to set - */ - public final void setCardColor(final Iterable cardColor0) { - this.cardColor = Lists.newArrayList(cardColor0); - } - /** - * Resets the card color. - */ + private final CardStateView view; + + public CardCharacteristics(CardStateView view0) { + view = view0; + } + + public CardStateView getView() { + return view; + } + + public final String getName() { + return name; + } + public final void setName(final String name0) { + name = name0; + view.updateName(this); + } + + public final Set getType() { + return type; + } + public final void setType(final Set type0) { + type.clear(); + type.addAll(type0); + view.updateType(this); + } + + public final ManaCost getManaCost() { + return manaCost; + } + public final void setManaCost(final ManaCost manaCost0) { + manaCost = manaCost0; + view.updateManaCost(this); + } + + public final List getCardColor() { + return cardColor; + } + public final void setCardColor(final Iterable cardColor0) { + cardColor = Lists.newArrayList(cardColor0); + view.updateColors(this); + } public final void resetCardColor() { - if (!this.cardColor.isEmpty()) { - this.cardColor = Lists.newArrayList(this.cardColor.subList(0, 1)); - } + if (cardColor.isEmpty()) { return; } + + cardColor = Lists.newArrayList(cardColor.subList(0, 1)); + view.updateColors(this); } - - /** - * @return the oracleText - */ - public String getOracleText() { - return oracleText; - } - - /** - * @param oracleText the oracleText to set - */ - public void setOracleText(final String oracleText) { - this.oracleText = oracleText; - } - - /** - * Gets the base attack. - * - * @return the baseAttack - */ - public final int getBaseAttack() { - return this.baseAttack; - } - - /** - * Sets the base attack. - * - * @param baseAttack0 - * the baseAttack to set - */ - public final void setBaseAttack(final int baseAttack0) { - this.baseAttack = baseAttack0; - } - - /** - * Gets the base defense. - * - * @return the baseDefense - */ - public final int getBaseDefense() { - return this.baseDefense; - } - - /** - * Sets the base defense. - * - * @param baseDefense0 - * the baseDefense to set - */ - public final void setBaseDefense(final int baseDefense0) { - this.baseDefense = baseDefense0; - } - - /** - * Gets the intrinsic keyword. - * - * @return the intrinsicKeyword - */ - public final List getIntrinsicKeyword() { - return this.intrinsicKeyword; - } - - /** - * Sets the intrinsic keyword. - * - * @param intrinsicKeyword0 - * the intrinsicKeyword to set - */ - public final void setIntrinsicKeyword(final ArrayList intrinsicKeyword0) { - this.intrinsicKeyword = intrinsicKeyword0; - } - - /** - * Gets the spell ability. - * - * @return the spellAbility - */ - public final List getSpellAbility() { - return this.spellAbility; - } - - public final void setSpellAbility(SpellAbility sa) { - this.spellAbility.clear(); - if (sa != null) { - this.spellAbility.add(sa); - } - } - - /** - * Gets the intrinsic ability. - * - * @return the intrinsicAbility - */ - public final List getUnparsedAbilities() { - return this.unparsedAbilities; - } - - /** - * Sets the intrinsic ability. - * - * @param list - * the intrinsicAbility to set - */ - public final void setUnparsedAbilities(final List list) { - this.unparsedAbilities = list; - } - - /** - * Gets the mana ability. - * - * @return the manaAbility - */ - public final List getManaAbility() { - return this.manaAbility; - } - - /** - * Gets the triggers. - * - * @return the triggers - */ - public final List getTriggers() { - return this.triggers; - } - - /** - * Sets the triggers. - * - * @param triggers0 - * the triggers to set - */ - public final void setTriggers(final List triggers0) { - this.triggers = triggers0; - } - - /** - * Gets the static abilities. - * - * @return the staticAbilities - */ - public final List getStaticAbilities() { - return this.staticAbilities; - } - - /** - * Sets the static abilities. - * - * @param staticAbilities0 - * the staticAbilities to set - */ - public final void setStaticAbilities(final ArrayList staticAbilities0) { - this.staticAbilities = new ArrayList(staticAbilities0); - } - - /** - * Gets the image filename. - * - * @return the imageFilename - */ - public final String getImageKey() { - return this.imageKey; - } - - /** - * Sets the image filename. - * - * @param imageFilename0 - * the imageFilename to set - */ - public final void setImageKey(final String imageFilename0) { - this.imageKey = imageFilename0; - } - - /** - * Gets the static ability strings. - * - * @return the staticAbilityStrings - */ - public final List getStaticAbilityStrings() { - return this.staticAbilityStrings; - } - - /** - * Sets the static ability strings. - * - * @param staticAbilityStrings0 - * the staticAbilityStrings to set - */ - public final void setStaticAbilityStrings(final ArrayList staticAbilityStrings0) { - this.staticAbilityStrings = staticAbilityStrings0; - } - - /** - * @return the replacementEffects - */ - public List getReplacementEffects() { - return replacementEffects; - } - - /** - *

- * getSVar. - *

- * - * @param var - * a {@link java.lang.String} object. - * @return a {@link java.lang.String} object. - */ - public final String getSVar(final String var) { - if (this.sVars.containsKey(var)) { - return this.sVars.get(var); - } else { - return ""; - } - } - - /** - *

- * hasSVar. - *

- * - * @param var - * a {@link java.lang.String} object. - */ - public final boolean hasSVar(final String var) { - return this.sVars.containsKey(var); - } - - /** - *

- * setSVar. - *

- * - * @param var - * a {@link java.lang.String} object. - * @param str - * a {@link java.lang.String} object. - */ - public final void setSVar(final String var, final String str) { - this.sVars.put(var, str); - } - - /** - *

- * getSVars. - *

- * - * @return a Map object. - */ - public final Map getSVars() { - return this.sVars; - } - - /** - *

- * setSVars. - *

- * - * @param newSVars - * a Map object. - */ - public final void setSVars(final Map newSVars) { - this.sVars = newSVars; - } - - /** - * - * TODO Write javadoc for this method. - * - * @return an int - */ - public final int getFoil() { - final String foil = this.getSVar("Foil"); - if (!foil.isEmpty()) { - return Integer.parseInt(foil); - } - return 0; - } - - /** - *

- * copy. - *

- * - * @param source - * a Map object. - */ - public final void copyFrom(final CardCharacteristics source) { - // Makes a "deeper" copy of a CardCharacteristics object - - // String name : just copy reference - this.name = source.getName(); - // ArrayList type : list of String objects so use copy constructor - this.type = new CopyOnWriteArraySet(source.getType()); - // CardManaCost manaCost : not sure if a deep copy is needed - this.manaCost = source.getManaCost(); - // ArrayList cardColor : not sure if a deep copy is needed - this.cardColor = new ArrayList(source.getCardColor()); - // int baseAttack : set value - this.baseAttack = source.getBaseAttack(); - // int baseDefense : set value - this.baseDefense = source.getBaseDefense(); - // ArrayList intrinsicKeyword : list of String objects so use copy constructor - this.intrinsicKeyword = new ArrayList(source.getIntrinsicKeyword()); - // ArrayList intrinsicAbility : list of String objects so use copy constructor - this.unparsedAbilities = new ArrayList(source.getUnparsedAbilities()); - // ArrayList staticAbilityStrings : list of String objects so use copy constructor - this.staticAbilityStrings = new ArrayList(source.getStaticAbilityStrings()); - // String imageFilename = copy reference - this.imageKey = source.getImageKey(); - this.rarity = source.rarity; - this.curSetCode = source.curSetCode; - // Map sVars - this.sVars = new TreeMap(source.getSVars()); - this.replacementEffects = new ArrayList(); - for (ReplacementEffect RE : source.getReplacementEffects()) { - this.replacementEffects.add(RE.getCopy()); - } - } - - public CardRarity getRarity() { - return rarity; - } - - - public void setRarity(CardRarity rarity) { - this.rarity = rarity; - } - - - public String getCurSetCode() { - return curSetCode; - } - - - public void setCurSetCode(String curSetCode) { - this.curSetCode = curSetCode; - } - - - /** - * Determine the colors. - * - * @return a {@link ColorSet}. - */ public final ColorSet determineColor() { - final List colorList = this.getCardColor(); + final List colorList = getCardColor(); byte colors = 0; for (int i = colorList.size() - 1;i >= 0;i--) { final CardColor cc = colorList.get(i); @@ -504,4 +120,157 @@ public class CardCharacteristics { } return ColorSet.fromMask(colors); } + + public String getOracleText() { + return oracleText; + } + public void setOracleText(final String oracleText0) { + oracleText = oracleText0; + view.updateText(this); + } + + public final int getBaseAttack() { + return baseAttack; + } + public final void setBaseAttack(final int baseAttack0) { + if (baseAttack == baseAttack0) { return; } + baseAttack = baseAttack0; + view.updatePower(this); + } + + public final int getBaseDefense() { + return baseDefense; + } + public final void setBaseDefense(final int baseDefense0) { + if (baseDefense == baseDefense0) { return; } + baseDefense = baseDefense0; + view.updateToughness(this); + } + + public final List getIntrinsicKeyword() { + return intrinsicKeyword; + } + public final void setIntrinsicKeyword(final ArrayList intrinsicKeyword0) { + intrinsicKeyword = intrinsicKeyword0; + } + + public final List getSpellAbility() { + return spellAbility; + } + public final void setSpellAbility(SpellAbility sa) { + spellAbility.clear(); + if (sa != null) { + spellAbility.add(sa); + } + } + + public final List getUnparsedAbilities() { + return unparsedAbilities; + } + public final void setUnparsedAbilities(final List list) { + unparsedAbilities = list; + } + + public final List getManaAbility() { + return manaAbility; + } + + public final List getTriggers() { + return triggers; + } + public final void setTriggers(final List triggers0) { + triggers = triggers0; + } + + public final List getStaticAbilities() { + return staticAbilities; + } + public final void setStaticAbilities(final ArrayList staticAbilities0) { + staticAbilities = new ArrayList(staticAbilities0); + } + + public final String getImageKey() { + return imageKey; + } + public final void setImageKey(final String imageFilename0) { + imageKey = imageFilename0; + view.updateImageKey(this); + } + + public final List getStaticAbilityStrings() { + return staticAbilityStrings; + } + public final void setStaticAbilityStrings(final ArrayList staticAbilityStrings0) { + staticAbilityStrings = staticAbilityStrings0; + } + + public List getReplacementEffects() { + return replacementEffects; + } + + public final Map getSVars() { + return sVars; + } + public final String getSVar(final String var) { + if (sVars.containsKey(var)) { + return sVars.get(var); + } else { + return ""; + } + } + public final boolean hasSVar(final String var) { + return sVars.containsKey(var); + } + public final void setSVar(final String var, final String str) { + sVars.put(var, str); + view.updateFoilIndex(this); + } + public final void setSVars(final Map newSVars) { + sVars = newSVars; + view.updateFoilIndex(this); + } + + public final int getFoil() { + final String foil = getSVar("Foil"); + if (!foil.isEmpty()) { + return Integer.parseInt(foil); + } + return 0; + } + + public final void copyFrom(final CardCharacteristics source) { + // Makes a "deeper" copy of a CardCharacteristics object + + setName(source.getName()); + setType(source.getType()); + setManaCost(source.getManaCost()); + setCardColor(source.getCardColor()); + setBaseAttack(source.getBaseAttack()); + setBaseDefense(source.getBaseDefense()); + intrinsicKeyword = new ArrayList(source.getIntrinsicKeyword()); + unparsedAbilities = new ArrayList(source.getUnparsedAbilities()); + staticAbilityStrings = new ArrayList(source.getStaticAbilityStrings()); + setImageKey(source.getImageKey()); + setRarity(source.rarity); + setCurSetCode(source.curSetCode); + setSVars(new TreeMap(source.getSVars())); + replacementEffects = new ArrayList(); + for (ReplacementEffect RE : source.getReplacementEffects()) { + replacementEffects.add(RE.getCopy()); + } + } + + public CardRarity getRarity() { + return rarity; + } + public void setRarity(CardRarity rarity0) { + rarity = rarity0; + } + + public String getCurSetCode() { + return curSetCode; + } + public void setCurSetCode(String curSetCode0) { + curSetCode = curSetCode0; + } } diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 576b12599ea..18525a97393 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -281,11 +281,11 @@ public final class CardUtil { return res; } - public static CardCharacteristics getFaceDownCharacteristic() { - final ArrayList types = new ArrayList(); + public static CardCharacteristics getFaceDownCharacteristic(Card c) { + final HashSet types = new HashSet(); types.add("Creature"); - final CardCharacteristics ret = new CardCharacteristics(); + final CardCharacteristics ret = new CardCharacteristics(c.getView().createAlternateState()); ret.setBaseAttack(2); ret.setBaseDefense(2); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index b5b8373da88..4a27e6ab4fe 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -3,13 +3,14 @@ package forge.game.card; import java.util.Set; import java.util.List; import java.util.Map; - import org.apache.commons.lang3.StringUtils; import com.google.common.base.Predicates; import com.google.common.collect.Iterables; +import forge.ImageKeys; import forge.card.CardCharacteristicName; +import forge.card.CardEdition; import forge.card.CardRarity; import forge.card.CardType; import forge.card.ColorSet; @@ -17,6 +18,7 @@ import forge.card.mana.ManaCost; import forge.game.GameEntityView; import forge.game.player.PlayerView; import forge.game.zone.ZoneType; +import forge.item.IPaperCard; import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; @@ -27,6 +29,10 @@ public class CardView extends GameEntityView { return c == null ? null : c.getView(); } + public static CardView getCardForUi(IPaperCard pc) { + return Card.getCardForUi(pc).getView(); + } + public static TrackableCollection getCollection(Iterable cards) { if (cards == null) { return null; @@ -38,10 +44,30 @@ public class CardView extends GameEntityView { return collection; } + public static boolean mayViewAny(Iterable cards) { + if (cards == null) { return false; } + + for (CardView cv : cards) { + if (cv.mayBeShown) { + return true; + } + } + return false; + } + public CardView(int id0) { super(id0); set(TrackableProperty.Original, new CardStateView(id0)); } + public CardView(int id0, String name0) { + this(id0); + getOriginal().setName(name0); + } + public CardView(int id0, String name0, PlayerView ownerAndController, String imageKey) { + this(id0, name0); + set(TrackableProperty.Owner, ownerAndController); + set(TrackableProperty.Controller, ownerAndController); + } public PlayerView getOwner() { return get(TrackableProperty.Owner); @@ -153,8 +179,19 @@ public class CardView extends GameEntityView { public Map getCounters() { return get(TrackableProperty.Counters); } + public boolean hasSameCounters(CardView otherCard) { + Map counters = getCounters(); + if (counters == null) { + return otherCard.getCounters() == null; + } + return counters.equals(otherCard.getCounters()); + } void updateCounters(Card c) { set(TrackableProperty.Counters, c.getCounters()); + CardStateView state = getOriginal(); + state.updatePower(c); + state.updateToughness(c); + state.updateLoyalty(c); } public int getDamage() { @@ -284,13 +321,33 @@ public class CardView extends GameEntityView { return get(TrackableProperty.PairedWith); } + public Map getChangedColorWords() { + return get(TrackableProperty.ChangedColorWords); + } + void updateChangedColorWords(Card c) { + set(TrackableProperty.ChangedColorWords, c.getChangedTextColorWords()); + } + + public Map getChangedTypes() { + return get(TrackableProperty.ChangedTypes); + } + void updateChangedTypes(Card c) { + set(TrackableProperty.ChangedTypes, c.getChangedTextTypeWords()); + } + public CardStateView getOriginal() { return get(TrackableProperty.Original); } + public boolean hasAltState() { + return getAlternate() != null; + } public CardStateView getAlternate() { return get(TrackableProperty.Alternate); } + CardStateView createAlternateState() { + return new CardStateView(getId()); + } public CardStateView getState(final boolean alternate0) { return alternate0 ? getAlternate() : getOriginal(); @@ -304,7 +361,6 @@ public class CardView extends GameEntityView { boolean isTransformed = c.getCurState() == CardCharacteristicName.Transformed; boolean hasAltState = isDoubleFaced || isFlipCard || isSplitCard || (isFaceDown/* && mayShowCardFace*/); - set(TrackableProperty.Alternate, hasAltState ? new CardStateView(getId()) : null); set(TrackableProperty.Cloned, c.isCloned()); set(TrackableProperty.FaceDown, isFaceDown); set(TrackableProperty.SplitCard, isSplitCard); @@ -328,53 +384,23 @@ public class CardView extends GameEntityView { orig = CardCharacteristicName.LeftSplit; alt = CardCharacteristicName.RightSplit; } - updateState(c, getOriginal(), orig); - updateState(c, getAlternate(), alt); - return; + set(TrackableProperty.Original, c.getState(orig).getView()); + set(TrackableProperty.Alternate, c.getState(alt).getView()); } - - final CardStateView origView = getOriginal(); - origView.updateName(c); - origView.updateColors(c); - origView.updateImageKey(c); - origView.updateType(c); - origView.updateManaCost(c); - origView.updatePower(c); - origView.updateToughness(c); - origView.updateLoyalty(c); - origView.updateText(c); - origView.updateChangedColorWords(c); - origView.updateChangedTypes(c); - origView.updateManaCost(c); - origView.updateKeywords(c); - origView.updateFoilIndex(c); - - if (hasAltState) { + else if (hasAltState) { if (isFlipCard && !isFlipped) { - updateState(c, getAlternate(), CardCharacteristicName.Flipped); + set(TrackableProperty.Alternate, c.getState(CardCharacteristicName.Flipped).getView()); } else if (isDoubleFaced && !isTransformed) { - updateState(c, getAlternate(), CardCharacteristicName.Transformed); + set(TrackableProperty.Alternate, c.getState(CardCharacteristicName.Transformed).getView()); } else { - updateState(c, getAlternate(), CardCharacteristicName.Original); + set(TrackableProperty.Alternate, c.getState(CardCharacteristicName.Original).getView()); } } - } - private void updateState(Card c, CardStateView view, CardCharacteristicName state) { - final CardCharacteristics chars = c.getState(state); - if (chars == null) { return; } //can happen when split card initialized before both sides have been initialized - - view.updateName(chars); - view.updateColors(chars); - view.updateImageKey(chars); - view.updateType(chars); - view.updateManaCost(chars); - view.updatePower(chars); - view.updateToughness(chars); - view.updateLoyalty(chars); - view.updateText(chars); - view.updateFoilIndex(chars); + else { + set(TrackableProperty.Alternate, null); + } } @Override @@ -422,10 +448,13 @@ public class CardView extends GameEntityView { return get(TrackableProperty.Name); } void updateName(Card c) { - set(TrackableProperty.Name, c.getName()); + setName(c.getName()); } void updateName(CardCharacteristics c) { - set(TrackableProperty.Name, c.getName()); + setName(c.getName()); + } + private void setName(String name0) { + set(TrackableProperty.Name, name0); } public ColorSet getColors() { @@ -438,8 +467,11 @@ public class CardView extends GameEntityView { set(TrackableProperty.Colors, c.determineColor()); } - public String getImageKey() { - return get(TrackableProperty.ImageKey); + public String getImageKey(boolean ignoreMayBeShown) { + if (mayBeShown || ignoreMayBeShown) { + return get(TrackableProperty.ImageKey); + } + return ImageKeys.HIDDEN_CARD; } void updateImageKey(Card c) { set(TrackableProperty.ImageKey, c.getImageKey()); @@ -451,9 +483,6 @@ public class CardView extends GameEntityView { public Set getType() { return get(TrackableProperty.Type); } - void updateType(Card c) { - set(TrackableProperty.Type, c.getType()); - } void updateType(CardCharacteristics c) { set(TrackableProperty.Type, c.getType()); } @@ -461,9 +490,6 @@ public class CardView extends GameEntityView { public ManaCost getManaCost() { return get(TrackableProperty.ManaCost); } - void updateManaCost(Card c) { - set(TrackableProperty.ManaCost, c.getManaCost()); - } void updateManaCost(CardCharacteristics c) { set(TrackableProperty.ManaCost, c.getManaCost()); } @@ -475,7 +501,13 @@ public class CardView extends GameEntityView { set(TrackableProperty.Power, c.getNetAttack()); } void updatePower(CardCharacteristics c) { - set(TrackableProperty.Power, c.getBaseAttack()); + Card card = Card.get(CardView.this); + if (card != null) { + updatePower(card); //TODO: find a better way to do this + } + else { + set(TrackableProperty.Power, c.getBaseAttack()); + } } public int getToughness() { @@ -485,7 +517,13 @@ public class CardView extends GameEntityView { set(TrackableProperty.Toughness, c.getNetDefense()); } void updateToughness(CardCharacteristics c) { - set(TrackableProperty.Toughness, c.getBaseDefense()); + Card card = Card.get(CardView.this); + if (card != null) { + updateToughness(card); //TODO: find a better way to do this + } + else { + set(TrackableProperty.Toughness, c.getBaseDefense()); + } } public int getLoyalty() { @@ -495,7 +533,13 @@ public class CardView extends GameEntityView { set(TrackableProperty.Loyalty, c.getCurrentLoyalty()); } void updateLoyalty(CardCharacteristics c) { - set(TrackableProperty.Loyalty, 0); // Q why is loyalty not a property of CardCharacteristic? A: because no alt states have a base loyalty (only candidate is Garruk Relentless). + Card card = Card.get(CardView.this); + if (card != null) { + updateLoyalty(card); //TODO: find a better way to do this + } + else { + set(TrackableProperty.Loyalty, 0); + } } public String getText() { @@ -505,31 +549,33 @@ public class CardView extends GameEntityView { set(TrackableProperty.Text, c.getText()); } void updateText(CardCharacteristics c) { - set(TrackableProperty.Text, c.getOracleText()); + Card card = Card.get(CardView.this); + if (card != null) { + updateText(card); //TODO: find a better way to do this + } + else { + set(TrackableProperty.Text, c.getOracleText()); + } } + private int foilIndexOverride = -1; public int getFoilIndex() { + if (foilIndexOverride >= 0) { + return foilIndexOverride; + } return get(TrackableProperty.FoilIndex); } void updateFoilIndex(Card c) { - set(TrackableProperty.FoilIndex, c.getCharacteristics().getFoil()); + updateFoilIndex(c.getCharacteristics()); } void updateFoilIndex(CardCharacteristics c) { set(TrackableProperty.FoilIndex, c.getFoil()); } - - public Map getChangedColorWords() { - return get(TrackableProperty.ChangedColorWords); - } - void updateChangedColorWords(Card c) { - set(TrackableProperty.ChangedColorWords, c.getChangedTextColorWords()); - } - - public Map getChangedTypes() { - return get(TrackableProperty.ChangedTypes); - } - void updateChangedTypes(Card c) { - set(TrackableProperty.ChangedTypes, c.getChangedTextTypeWords()); + public void setFoilIndexOverride(int index0) { + if (index0 < 0) { + index0 = CardEdition.getRandomFoil(getSetCode()); + } + foilIndexOverride = index0; } public boolean hasDeathtouch() { @@ -690,4 +736,13 @@ public class CardView extends GameEntityView { } return null; } + + //below are properties not shared across game instances + private boolean mayBeShown = true; //TODO: Make may be shown get updated + public boolean mayBeShown() { + return mayBeShown; + } + public void setMayBeShown(boolean mayBeShown0) { + //mayBeShown = mayBeShown0; + } } diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index c089f041cbd..53c52066f14 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -21,6 +21,7 @@ import com.google.common.collect.ArrayListMultimap; import com.google.common.collect.Lists; import com.google.common.collect.Multimap; import com.google.common.collect.Multimaps; + import forge.game.GameEntity; import forge.game.card.Card; import forge.game.card.CardLists; @@ -28,6 +29,7 @@ import forge.game.card.CardPredicates; import forge.game.player.Player; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; + import org.apache.commons.lang3.tuple.Pair; import java.util.*; @@ -72,6 +74,30 @@ public class Combat { } } + public void endCombat() { + //backup attackers and blockers + List attackers = Lists.newArrayList(getAttackers()); + List blockers = Lists.newArrayList(getAllBlockers()); + + //clear all combat-related collections + attackableEntries.clear(); + attackedByBands.clear(); + blockedBands.clear(); + defendingDamageMap.clear(); + attackersOrderedForDamageAssignment.clear(); + blockersOrderedForDamageAssignment.clear(); + lkiCache.clear(); + combatantsThatDealtFirstStrikeDamage.clear(); + + //update view for all attackers and blockers + for (Card c : attackers) { + c.updateAttackingForView(); + } + for (Card c : blockers) { + c.updateBlockingForView(); + } + } + public final Player getAttackingPlayer() { return this.playerWhoAttacks; } @@ -136,6 +162,7 @@ public class Combat { else { band.addAttacker(c); } + c.updateAttackingForView(); } public final GameEntity getDefenderByAttacker(final Card c) { @@ -213,7 +240,6 @@ public class Combat { public final boolean isBlocked(final Card attacker) { AttackingBand band = getBandOfAttacker(attacker); return band == null ? false : Boolean.TRUE.equals(band.isBlocked()); - } // Some cards in Alpha may UNBLOCK an attacker, so second parameter is not always-true @@ -228,27 +254,32 @@ public class Combat { if (blockersOrderedForDamageAssignment.containsKey(attacker)) { addBlockerToDamageAssignmentOrder(attacker, blocker); } + blocker.updateBlockingForView(); } // remove blocked from specific attacker public final void removeBlockAssignment(final Card attacker, final Card blocker) { AttackingBand band = getBandOfAttacker(attacker); Collection cc = blockedBands.get(band); - if (cc != null) + if (cc != null) { cc.remove(blocker); + } + blocker.updateBlockingForView(); } // remove blocker from everywhere public final void undoBlockingAssignment(final Card blocker) { List toRemove = Lists.newArrayList(blocker); blockedBands.values().removeAll(toRemove); + blocker.updateBlockingForView(); } public final List getAllBlockers() { List result = new ArrayList(); for (Card blocker : blockedBands.values()) { - if (!result.contains(blocker)) + if (!result.contains(blocker)) { result.add(blocker); + } } return result; } @@ -267,7 +298,7 @@ public class Combat { } return blocked; } - + public final List getAttackingBandsBlockedBy(Card blocker) { List bands = Lists.newArrayList(); for (Entry kv : blockedBands.entries()) { @@ -372,7 +403,6 @@ public class Combat { } } } - return; } // removes references to this defender from all indices and orders @@ -391,6 +421,8 @@ public class Combat { if (ab != null) { unregisterAttacker(c, ab); ab.removeAttacker(c); + c.updateAttackingForView(); + return; } // if not found in attackers, look for this card in blockers @@ -402,7 +434,8 @@ public class Combat { // remove card from map while(blockedBands.values().remove(c)); - } // removeFromCombat() + c.updateBlockingForView(); + } public final boolean removeAbsentCombatants() { // iterate all attackers and remove them diff --git a/forge-game/src/main/java/forge/game/combat/CombatView.java b/forge-game/src/main/java/forge/game/combat/CombatView.java index ae0009aacce..cc03b9b4aa0 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatView.java +++ b/forge-game/src/main/java/forge/game/combat/CombatView.java @@ -1,14 +1,13 @@ package forge.game.combat; 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.Iterables; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; - import forge.game.GameEntityView; import forge.game.card.CardView; import forge.trackable.TrackableObject; @@ -18,6 +17,12 @@ import forge.trackable.TrackableProperty; public class CombatView extends TrackableObject { public CombatView() { super(-1); //ID not needed + set(TrackableProperty.AttackersWithDefenders, new HashMap()); + set(TrackableProperty.AttackersWithBlockers, new HashMap>()); + set(TrackableProperty.BandsWithDefenders, new HashMap, GameEntityView>()); + set(TrackableProperty.BandsWithBlockers, new HashMap, Iterable>()); + set(TrackableProperty.AttackersWithPlannedBlockers, new HashMap>()); + set(TrackableProperty.BandsWithPlannedBlockers, new HashMap, Iterable>()); } private Map getAttackersWithDefenders() { return get(TrackableProperty.AttackersWithDefenders); @@ -51,7 +56,7 @@ public class CombatView extends TrackableObject { } public Iterable getDefenders() { - return Sets.newHashSet(getAttackersWithDefenders().values()); + return getAttackersWithDefenders().values(); } public GameEntityView getDefender(final CardView attacker) { @@ -132,11 +137,9 @@ public class CombatView extends TrackableObject { } public void addAttackingBand(final Iterable attackingBand, final GameEntityView defender, final Iterable blockers, final Iterable plannedBlockers) { - final List attackingBandCopy = Lists.newArrayList(attackingBand), - blockersCopy, plannedBlockersCopy; - - blockersCopy = blockers == null ? null : Lists.newArrayList(blockers); - plannedBlockersCopy = plannedBlockers == null ? null : Lists.newArrayList(plannedBlockers); + final List attackingBandCopy = Lists.newArrayList(attackingBand); + final List blockersCopy = blockers == null ? null : Lists.newArrayList(blockers); + final List plannedBlockersCopy = plannedBlockers == null ? null : Lists.newArrayList(plannedBlockers); for (final CardView attacker : attackingBandCopy) { this.getAttackersWithDefenders().put(attacker, defender); diff --git a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java index d1dcbb194c7..4c7140c9c7f 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -311,6 +311,9 @@ public class PhaseHandler implements java.io.Serializable { game.getEndOfCombat().executeUntil(); game.getEndOfCombat().executeAt(); + if (combat != null) { + combat.endCombat(); + } //SDisplayUtil.showTab(EDocID.REPORT_STACK.getDoc()); break; diff --git a/forge-game/src/main/java/forge/game/player/Player.java b/forge-game/src/main/java/forge/game/player/Player.java index aa8e1983edc..ffb360d6611 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -78,6 +78,21 @@ public class Player extends GameEntity implements Comparable { ZoneType.Library, ZoneType.Graveyard, ZoneType.Hand, ZoneType.Exile, ZoneType.Command, ZoneType.Ante, ZoneType.Sideboard, ZoneType.PlanarDeck, ZoneType.SchemeDeck)); + private static HashMap playerCache = new HashMap(); + public static Player get(PlayerView playerView) { + return playerCache.get(playerView.getId()); + } + public static List getList(Iterable playerViews) { + List list = new ArrayList(); + for (PlayerView pv : playerViews) { + list.add(get(pv)); + } + return list; + } + public static void clearCache() { + playerCache.clear(); + } + private final Map commanderDamage = new HashMap(); private int poisonCounters = 0; @@ -146,9 +161,12 @@ public class Player extends GameEntity implements Comparable { zones.put(z, toPut); } - view = new PlayerView(id); + view = new PlayerView(id0); view.updateMaxHandSize(this); setName(chooseName(name0)); + if (id0 >= 0) { + playerCache.put(id0, this); + } } public final AchievementTracker getAchievementTracker() { diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index f294dbf7424..fad07efcb20 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -13,6 +13,7 @@ import forge.deck.Deck; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; +import forge.game.GameOutcome.AnteResult; import forge.game.GameType; import forge.game.card.Card; import forge.game.card.CardShields; @@ -136,13 +137,13 @@ public abstract class PlayerController { // Triggers preliminary choice: ask, decline or play private Map triggersAlwaysAccept = new HashMap(); - public final boolean shouldAlwaysAcceptTrigger(Integer trigger) { return Boolean.TRUE.equals(triggersAlwaysAccept.get(trigger)); } - public final boolean shouldAlwaysDeclineTrigger(Integer trigger) { return Boolean.FALSE.equals(triggersAlwaysAccept.get(trigger)); } - public final boolean shouldAlwaysAskTrigger(Integer trigger) { return !triggersAlwaysAccept.containsKey(trigger); } + public boolean shouldAlwaysAcceptTrigger(Integer trigger) { return Boolean.TRUE.equals(triggersAlwaysAccept.get(trigger)); } + public boolean shouldAlwaysDeclineTrigger(Integer trigger) { return Boolean.FALSE.equals(triggersAlwaysAccept.get(trigger)); } + public boolean shouldAlwaysAskTrigger(Integer trigger) { return !triggersAlwaysAccept.containsKey(trigger); } - public final void setShouldAlwaysAcceptTrigger(Integer trigger) { triggersAlwaysAccept.put(trigger, true); } - public final void setShouldAlwaysDeclineTrigger(Integer trigger) { triggersAlwaysAccept.put(trigger, false); } - public final void setShouldAlwaysAskTrigger(Integer trigger) { triggersAlwaysAccept.remove(trigger); } + public void setShouldAlwaysAcceptTrigger(Integer trigger) { triggersAlwaysAccept.put(trigger, true); } + public void setShouldAlwaysDeclineTrigger(Integer trigger) { triggersAlwaysAccept.put(trigger, false); } + public void setShouldAlwaysAskTrigger(Integer trigger) { triggersAlwaysAccept.remove(trigger); } // End of Triggers preliminary choice @@ -293,4 +294,8 @@ public abstract class PlayerController { public boolean canPlayUnlimitedLands() { return false; } + + public AnteResult getAnteResult() { + return game.getOutcome().anteResult.get(player); + } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/player/PlayerView.java b/forge-game/src/main/java/forge/game/player/PlayerView.java index 933b932c24f..7b3e4ddcf73 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerView.java +++ b/forge-game/src/main/java/forge/game/player/PlayerView.java @@ -1,12 +1,16 @@ package forge.game.player; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Map.Entry; +import org.apache.commons.lang3.NotImplementedException; + import com.google.common.collect.ImmutableList; import com.google.common.collect.Maps; +import forge.LobbyPlayer; import forge.card.MagicColor; import forge.game.GameEntityView; import forge.game.card.Card; @@ -97,7 +101,7 @@ public class PlayerView extends GameEntityView { set(TrackableProperty.NumDrawnThisTurn, p.getNumDrawnThisTurn()); } - public Iterable getKeywords() { + public List getKeywords() { return get(TrackableProperty.Keywords); } void updateKeywords(Player p) { @@ -122,37 +126,65 @@ public class PlayerView extends GameEntityView { set(TrackableProperty.CommanderDamage, map); } + public String getCommanderInfo() { + throw new NotImplementedException("Not implemented"); + } + public Iterable getAnte() { return get(TrackableProperty.Ante); } + public int getAnteSize() { + return getZoneSize(TrackableProperty.Ante); + } public Iterable getBattlefield() { return get(TrackableProperty.Battlefield); } + public int getBattlefieldSize() { + return getZoneSize(TrackableProperty.Battlefield); + } public Iterable getCommand() { return get(TrackableProperty.Command); } + public int getCommandSize() { + return getZoneSize(TrackableProperty.Command); + } public Iterable getExile() { return get(TrackableProperty.Exile); } + public int getExileSize() { + return getZoneSize(TrackableProperty.Exile); + } public Iterable getFlashback() { return get(TrackableProperty.Flashback); } + public int getFlashbackSize() { + return getZoneSize(TrackableProperty.Flashback); + } public Iterable getGraveyard() { return get(TrackableProperty.Graveyard); } + public int getGraveyardSize() { + return getZoneSize(TrackableProperty.Graveyard); + } public Iterable getHand() { return get(TrackableProperty.Hand); } + public int getHandSize() { + return getZoneSize(TrackableProperty.Hand); + } public Iterable getLibrary() { return get(TrackableProperty.Library); } + public int getLibrarySize() { + return getZoneSize(TrackableProperty.Library); + } public Iterable getCards(final ZoneType zone) { TrackableProperty prop = getZoneProp(zone); @@ -161,6 +193,10 @@ public class PlayerView extends GameEntityView { } return null; } + private int getZoneSize(TrackableProperty zoneProp) { + TrackableCollection cards = get(zoneProp); + return cards == null ? 0 : cards.size(); + } private TrackableProperty getZoneProp(final ZoneType zone) { switch (zone) { case Ante: @@ -201,4 +237,9 @@ public class PlayerView extends GameEntityView { } set(TrackableProperty.Mana, mana); } + + //TODO: Find better way to do this + public LobbyPlayer getLobbyPlayer() { + return Player.get(this).getLobbyPlayer(); + } } \ No newline at end of file diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java index b0a4217ff76..737476e8212 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityStackInstance.java @@ -38,7 +38,6 @@ import java.util.Map; * @version $Id$ */ public class SpellAbilityStackInstance implements IIdentifiable { - private static int maxId = 0; private static int nextId() { return ++maxId; } @@ -55,7 +54,7 @@ public class SpellAbilityStackInstance implements IIdentifiable { private final SpellAbility ability; private final SpellAbilityStackInstance subInstance; - private Player activator; + private Player activatingPlayer; // When going to a SubAbility that SA has a Instance Choice object private TargetChoices tc = new TargetChoices(); @@ -94,7 +93,7 @@ public class SpellAbilityStackInstance implements IIdentifiable { id = nextId(); ability = sa; stackDescription = sa.getStackDescription(); - activator = sa.getActivatingPlayer(); + activatingPlayer = sa.getActivatingPlayer(); // Payment info paidHash = ability.getPaidHash(); @@ -162,7 +161,7 @@ public class SpellAbilityStackInstance implements IIdentifiable { if (refresh) { ability.resetTargets(); ability.setTargets(tc); - ability.setActivatingPlayer(activator); + ability.setActivatingPlayer(activatingPlayer); // Saved sub-SA needs to be reset on the way out if (subInstance != null) { @@ -287,14 +286,14 @@ public class SpellAbilityStackInstance implements IIdentifiable { return true; } - public Player getActivator() { - return activator; + public Player getActivatingPlayer() { + return activatingPlayer; } - public void setActivator(Player activator0) { - if (activator == activator0) { return; } - activator = activator0; - view.updateActivator(this); + public void setActivatingPlayer(Player activatingPlayer0) { + if (activatingPlayer == activatingPlayer0) { return; } + activatingPlayer = activatingPlayer0; + view.updateActivatingPlayer(this); } @Override diff --git a/forge-game/src/main/java/forge/game/spellability/StackItemView.java b/forge-game/src/main/java/forge/game/spellability/StackItemView.java index 0794838bc27..db0a79fb3c6 100644 --- a/forge-game/src/main/java/forge/game/spellability/StackItemView.java +++ b/forge-game/src/main/java/forge/game/spellability/StackItemView.java @@ -2,18 +2,34 @@ package forge.game.spellability; import forge.game.card.CardView; import forge.game.player.PlayerView; +import forge.trackable.TrackableCollection; import forge.trackable.TrackableObject; import forge.trackable.TrackableProperty; public class StackItemView extends TrackableObject { + public static StackItemView get(SpellAbilityStackInstance si) { + return si == null ? null : si.getView(); + } + + public static TrackableCollection getCollection(Iterable instances) { + if (instances == null) { + return null; + } + TrackableCollection collection = new TrackableCollection(); + for (SpellAbilityStackInstance si : instances) { + collection.add(si.getView()); + } + return collection; + } + public StackItemView(SpellAbilityStackInstance si) { super(si.getId()); updateKey(si); updateSourceTrigger(si); updateText(si); updateSourceCard(si); - updateActivator(si); + updateActivatingPlayer(si); updateTargetCards(si); updateTargetPlayers(si); updateAbility(si); @@ -46,14 +62,14 @@ public class StackItemView extends TrackableObject { return get(TrackableProperty.SourceCard); } void updateSourceCard(SpellAbilityStackInstance si) { - set(TrackableProperty.SourceCard, si.getSourceCard()); + set(TrackableProperty.SourceCard, CardView.get(si.getSourceCard())); } - public PlayerView getActivator() { - return get(TrackableProperty.Activator); + public PlayerView getActivatingPlayer() { + return get(TrackableProperty.ActivatingPlayer); } - void updateActivator(SpellAbilityStackInstance si) { - set(TrackableProperty.Activator, PlayerView.get(si.getActivator())); + void updateActivatingPlayer(SpellAbilityStackInstance si) { + set(TrackableProperty.ActivatingPlayer, PlayerView.get(si.getActivatingPlayer())); } public Iterable getTargetCards() { diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 641e4da4090..ec426200ff4 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -103,7 +103,7 @@ public enum TrackableProperty { Key(TrackableTypes.StringType), SourceTrigger(TrackableTypes.IntegerType), SourceCard(TrackableTypes.CardViewType), - Activator(TrackableTypes.PlayerViewType), + ActivatingPlayer(TrackableTypes.PlayerViewType), TargetCards(TrackableTypes.CardViewCollectionType), TargetPlayers(TrackableTypes.PlayerViewCollectionType), SubInstance(TrackableTypes.StackItemViewType), @@ -111,13 +111,14 @@ public enum TrackableProperty { OptionalTrigger(TrackableTypes.BooleanType), //Combat - AttackersWithDefenders(null), //TODO - AttackersWithBlockers(null), - BandsWithDefenders(null), - BandsWithBlockers(null), - AttackersWithPlannedBlockers(null), - BandsWithPlannedBlockers(null), + AttackersWithDefenders(TrackableTypes.CardViewCollectionType), //TODO: change out for proper types when serialization needed + AttackersWithBlockers(TrackableTypes.CardViewCollectionType), + BandsWithDefenders(TrackableTypes.CardViewCollectionType), + BandsWithBlockers(TrackableTypes.CardViewCollectionType), + AttackersWithPlannedBlockers(TrackableTypes.CardViewCollectionType), + BandsWithPlannedBlockers(TrackableTypes.CardViewCollectionType), + //Game GameType(TrackableTypes.EnumType(GameType.class)), Turn(TrackableTypes.IntegerType), WinningTeam(TrackableTypes.IntegerType), diff --git a/forge-game/src/main/java/forge/trackable/TrackableTypes.java b/forge-game/src/main/java/forge/trackable/TrackableTypes.java index 13e74ae75d3..53088ee294e 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableTypes.java +++ b/forge-game/src/main/java/forge/trackable/TrackableTypes.java @@ -212,10 +212,10 @@ public class TrackableTypes { protected GameEntityView deserialize(TrackableDeserializer td, GameEntityView oldValue) { switch (td.readInt()) { case 0: - int cardId = td.readInt(); + //int cardId = td.readInt(); return oldValue; //TODO: lookup card by ID case 1: - int playerId = td.readInt(); + //int playerId = td.readInt(); return oldValue; //TODO: lookup player by ID } return null; diff --git a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java index 251ab098942..de649678940 100644 --- a/forge-gui-desktop/src/main/java/forge/GuiDesktop.java +++ b/forge-gui-desktop/src/main/java/forge/GuiDesktop.java @@ -25,7 +25,9 @@ import forge.control.GuiTimer; import forge.deck.CardPool; import forge.error.BugReportDialog; import forge.game.GameEntity; +import forge.game.GameEntityView; import forge.game.GameObject; +import forge.game.card.CardView; import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; import forge.gui.BoxedProductCardListViewer; @@ -51,8 +53,6 @@ import forge.toolbox.FSkin.SkinImage; import forge.util.BuildInfo; import forge.util.FileUtil; import forge.util.gui.SGuiChoose; -import forge.view.CardView; -import forge.view.GameEntityView; public class GuiDesktop implements IGuiBase { @Override @@ -194,7 +194,7 @@ public class GuiDesktop implements IGuiBase { delayedReveal.reveal(controller); //TODO: Merge this into search dialog } controller.tempShow(optionList); - List gameEntityViews = controller.getGameView().getGameEntityViews(optionList, false); + List gameEntityViews = GameEntityView.getEntityCollection(optionList); if (isOptional) { return SGuiChoose.oneOrNone(title, gameEntityViews); } diff --git a/forge-gui-desktop/src/main/java/forge/ImageCache.java b/forge-gui-desktop/src/main/java/forge/ImageCache.java index f8d3a037edf..697a465aa20 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageCache.java +++ b/forge-gui-desktop/src/main/java/forge/ImageCache.java @@ -34,11 +34,11 @@ import com.mortennobel.imagescaling.ResampleOp; import forge.assets.FSkinProp; import forge.assets.ImageUtil; +import forge.game.card.CardView; import forge.item.InventoryItem; import forge.properties.ForgeConstants; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinIcon; -import forge.view.CardView; /** * This class stores ALL card images in a cache with soft values. this means diff --git a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java index 4ceea5f7535..c8abc1d9db6 100644 --- a/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java +++ b/forge-gui-desktop/src/main/java/forge/deckchooser/FDeckViewer.java @@ -17,6 +17,7 @@ import net.miginfocom.swing.MigLayout; import forge.deck.CardPool; import forge.deck.Deck; import forge.deck.DeckSection; +import forge.game.card.CardView; import forge.gui.CardDetailPanel; import forge.gui.CardPicturePanel; import forge.item.IPaperCard; @@ -28,9 +29,7 @@ import forge.itemmanager.ItemManagerModel; import forge.itemmanager.views.ImageView; import forge.toolbox.FButton; import forge.toolbox.FOptionPane; -import forge.view.CardView; import forge.view.FDialog; -import forge.view.ViewUtil; @SuppressWarnings("serial") public class FDeckViewer extends FDialog { @@ -62,7 +61,7 @@ public class FDeckViewer extends FDialog { return new ImageView(this, model0) { @Override protected void showHoveredItem(PaperCard item) { - final CardView card = ViewUtil.getCardForUi(item); + final CardView card = CardView.getCardForUi(item); if (card == null) { return; } cardDetail.setCard(card); @@ -78,7 +77,7 @@ public class FDeckViewer extends FDialog { final IPaperCard paperCard = cardManager.getSelectedItem(); if (paperCard == null) { return; } - final CardView card = ViewUtil.getCardForUi(paperCard); + final CardView card = CardView.getCardForUi(paperCard); if (card == null) { return; } cardDetail.setCard(card); diff --git a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java index c515031a5c0..469e9860f95 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/BoxedProductCardListViewer.java @@ -31,6 +31,7 @@ import javax.swing.JList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import forge.game.card.CardView; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; @@ -38,7 +39,6 @@ import forge.toolbox.FButton; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; import forge.view.FDialog; -import forge.view.ViewUtil; /** * A simple class that shows a list of cards in a dialog with preview in its @@ -189,7 +189,7 @@ public class BoxedProductCardListViewer extends FDialog { // (String) jList.getSelectedValue(); if ((row >= 0) && (row < BoxedProductCardListViewer.this.list.size())) { final PaperCard cp = BoxedProductCardListViewer.this.list.get(row); - BoxedProductCardListViewer.this.detail.setCard(ViewUtil.getCardForUi(cp)); + BoxedProductCardListViewer.this.detail.setCard(CardView.getCardForUi(cp)); BoxedProductCardListViewer.this.picture.setCard(cp); } } diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java b/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java index 778d8629634..f64c9c69466 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardContainer.java @@ -18,7 +18,8 @@ package forge.gui; -import forge.view.CardView; +import forge.game.card.CardView; + /** * The class CardContainer. A card container is an object that references a @@ -28,23 +29,6 @@ import forge.view.CardView; * @version V0.0 17.02.2010 */ public interface CardContainer { - /** - *

- * setCard. - *

- * - * @param card - * a {@link CardView} object. - */ - void setCard(CardView card); - - /** - *

- * getCard. - *

- * - * @return a {@link CardView} object. - */ CardView getCard(); - + void setCard(CardView card); } diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java b/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java index f5a64140bdf..4ce03e174d2 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardDetailPanel.java @@ -33,6 +33,9 @@ import org.apache.commons.lang3.StringUtils; import forge.card.CardDetailUtil; import forge.card.CardDetailUtil.DetailColors; import forge.card.CardEdition; +import forge.game.card.Card; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; import forge.item.IPaperCard; import forge.item.InventoryItemFromSet; import forge.model.FModel; @@ -41,9 +44,6 @@ import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; -import forge.view.CardView; -import forge.view.CardView.CardStateView; -import forge.view.ViewUtil; /** * The class CardDetailPanel. Shows the details of a card. @@ -130,7 +130,7 @@ public class CardDetailPanel extends SkinnedPanel { powerToughnessLabel.setVisible(false); idLabel.setText(""); cdArea.setText(CardDetailUtil.getItemDescription(item)); - this.updateBorder(item instanceof IPaperCard ? ViewUtil.getCardForUi((IPaperCard)item).getOriginal() : null); + this.updateBorder(item instanceof IPaperCard ? Card.getCardForUi((IPaperCard)item).getView().getOriginal() : null); String set = item.getEdition(); setInfoLabel.setText(set); @@ -185,7 +185,7 @@ public class CardDetailPanel extends SkinnedPanel { this.nameCostLabel.setText(CardDetailUtil.formatCardName(state)); } else { final String manaCost; - if (card.isSplitCard() && card.hasAltState()) { + if (card.isSplitCard() && card.getAlternate() != null) { manaCost = card.getOriginal().getManaCost() + " // " + card.getAlternate().getManaCost(); } else { manaCost = state.getManaCost().toString(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardListChooser.java b/forge-gui-desktop/src/main/java/forge/gui/CardListChooser.java index 6fbc2bfd742..de6a84e3be1 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardListChooser.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardListChooser.java @@ -18,6 +18,7 @@ package forge.gui; +import forge.game.card.CardView; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; @@ -26,7 +27,6 @@ import forge.toolbox.FLabel; import forge.toolbox.FOptionPane; import forge.toolbox.FScrollPane; import forge.view.FDialog; -import forge.view.ViewUtil; import javax.swing.*; import javax.swing.event.ListSelectionEvent; @@ -173,7 +173,7 @@ public class CardListChooser extends FDialog { final int row = CardListChooser.this.jList.getSelectedIndex(); if ((row >= 0) && (row < CardListChooser.this.list.size())) { final PaperCard cp = CardListChooser.this.list.get(row); - CardListChooser.this.detail.setCard(ViewUtil.getCardForUi(cp)); + CardListChooser.this.detail.setCard(CardView.getCardForUi(cp)); CardListChooser.this.picture.setCard(cp); } } diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java index ff7d5d8aba2..bfce8f7bba4 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardListViewer.java @@ -31,6 +31,7 @@ import javax.swing.JList; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import forge.game.card.CardView; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; @@ -38,7 +39,6 @@ import forge.toolbox.FButton; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; import forge.view.FDialog; -import forge.view.ViewUtil; /** * A simple class that shows a list of cards in a dialog with preview in its @@ -172,7 +172,7 @@ public class CardListViewer extends FDialog { // (String) jList.getSelectedValue(); if ((row >= 0) && (row < CardListViewer.this.list.size())) { final PaperCard cp = CardListViewer.this.list.get(row); - CardListViewer.this.detail.setCard(ViewUtil.getCardForUi(cp)); + CardListViewer.this.detail.setCard(CardView.getCardForUi(cp)); CardListViewer.this.picture.setCard(cp); } } diff --git a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java index 76c74aeed9f..6c650f1012e 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java +++ b/forge-gui-desktop/src/main/java/forge/gui/CardPicturePanel.java @@ -25,13 +25,13 @@ import javax.swing.JPanel; import forge.ImageCache; import forge.ImageKeys; +import forge.game.card.CardView.CardStateView; import forge.item.InventoryItem; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; import forge.toolbox.imaging.FImagePanel; import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode; import forge.toolbox.imaging.FImageUtil; -import forge.view.CardView.CardStateView; /** * Displays image associated with a card or inventory item. diff --git a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java index a9ddd3b0ff7..c0bf1099608 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java +++ b/forge-gui-desktop/src/main/java/forge/gui/DualListBox.java @@ -21,6 +21,10 @@ import javax.swing.event.ListDataListener; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import forge.game.card.Card; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; +import forge.game.spellability.SpellAbilityView; import forge.item.IPaperCard; import forge.item.PaperCard; import forge.screens.match.CMatchUI; @@ -29,11 +33,7 @@ import forge.toolbox.FLabel; import forge.toolbox.FList; import forge.toolbox.FPanel; import forge.toolbox.FScrollPane; -import forge.view.CardView; -import forge.view.CardView.CardStateView; import forge.view.FDialog; -import forge.view.SpellAbilityView; -import forge.view.ViewUtil; // An input box for handling the order of choices. // Left box has the original choices @@ -334,7 +334,7 @@ public class DualListBox extends FDialog { } else if (obj instanceof SpellAbilityView) { card = ((SpellAbilityView) obj).getHostCard(); } else if (obj instanceof PaperCard) { - card = ViewUtil.getCardForUi((IPaperCard) obj); + card = Card.getCardForUi((IPaperCard) obj).getView(); } GuiUtils.clearPanelSelections(); diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java index aaf04f61f35..cd73e27cb62 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiChoose.java @@ -20,16 +20,13 @@ import com.google.common.base.Function; import com.google.common.collect.Iterables; import forge.FThreads; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; import forge.item.InventoryItem; import forge.screens.match.CMatchUI; import forge.toolbox.FOptionPane; -import forge.view.CardView; -import forge.view.CardView.CardStateView; -/** - * TODO: Write javadoc for this type. - * - */ + public class GuiChoose { /** @@ -210,9 +207,11 @@ public class GuiChoose { final CardView card; if (sel instanceof CardStateView) { card = ((CardStateView) sel).getCard(); - } else if (sel instanceof CardView) { + } + else if (sel instanceof CardView) { card = (CardView) sel; - } else { + } + else { card = null; } if (card != null) { diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java index 749587f9ba9..3d8d3e74558 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiDialog.java @@ -8,9 +8,9 @@ import javax.swing.UIManager; import org.apache.commons.lang3.StringUtils; import forge.FThreads; +import forge.game.card.CardView; import forge.screens.match.CMatchUI; import forge.toolbox.FOptionPane; -import forge.view.CardView; /** * Holds player interactions using standard windows diff --git a/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java b/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java index d1ba41f8a4b..47b0ff81f15 100644 --- a/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java +++ b/forge-gui-desktop/src/main/java/forge/gui/GuiUtils.java @@ -32,9 +32,9 @@ import javax.swing.JPopupMenu; import javax.swing.JSeparator; import javax.swing.KeyStroke; +import forge.game.card.CardView; import forge.screens.match.VMatchUI; import forge.screens.match.views.VField; -import forge.view.CardView; import forge.view.arcane.CardPanel; /** diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index 0de4a99845d..819d472e9ca 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -4,6 +4,7 @@ import forge.ImageCache; import forge.assets.FSkinProp; import forge.deck.DeckProxy; import forge.game.card.Card; +import forge.game.card.CardView; import forge.gui.framework.ILocalRepaint; import forge.item.IPaperCard; import forge.item.InventoryItem; @@ -20,8 +21,6 @@ import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.CardZoomer; -import forge.view.CardView; -import forge.view.ViewUtil; import forge.view.arcane.CardPanel; import javax.swing.*; @@ -234,7 +233,7 @@ public class ImageView extends ItemView { ItemInfo item = getItemAtPoint(e.getPoint()); if (item != null && item.item instanceof IPaperCard) { setLockHoveredItem(true); //lock hoveredItem while zoomer open - final CardView card = ViewUtil.getCardForUi((IPaperCard) item.item); + final CardView card = CardView.getCardForUi((IPaperCard) item.item); CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(card); } } @@ -1101,14 +1100,14 @@ public class ImageView extends ItemView { if (item instanceof IPaperCard) { IPaperCard paperCard = (IPaperCard)item; if (paperCard.isFoil()) { - final CardView card = ViewUtil.getCardForUi(paperCard); + final CardView card = CardView.getCardForUi(paperCard); if (card.getOriginal().getFoilIndex() == 0) { //if foil finish not yet established, assign a random one // FIXME should assign a random foil here in all cases // (currently assigns 1 for the deck editors where foils "flicker" otherwise) if (item instanceof Card) { - card.getOriginal().setRandomFoil(); + card.getOriginal().setFoilIndexOverride(-1); //-1 to set random foil } else if (item instanceof IPaperCard) { - card.getOriginal().setFoilIndex(1); + card.getOriginal().setFoilIndexOverride(1); } } CardPanel.drawFoilEffect(g, card, bounds.x, bounds.y, bounds.width, bounds.height, borderSize); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java index 6a4dadedb21..bdbfafcb44f 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/sanctioned/VSubmenuConstructed.java @@ -40,6 +40,7 @@ import forge.deckchooser.DecksComboBoxEvent; import forge.deckchooser.FDeckChooser; import forge.deckchooser.IDecksComboBoxListener; import forge.game.GameType; +import forge.game.card.CardView; import forge.gui.CardDetailPanel; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; @@ -75,7 +76,6 @@ import forge.toolbox.FTextField; import forge.util.Lang; import forge.util.MyRandom; import forge.util.NameGenerator; -import forge.view.ViewUtil; /** * Assembles Swing components of constructed submenu singleton. @@ -1243,7 +1243,7 @@ public enum VSubmenuConstructed implements IVSubmenu { if (obj instanceof PaperCard) { pp.setVanguardButtonText(((PaperCard) obj).getName()); - cdp.setCard(ViewUtil.getCardForUi((PaperCard) obj)); + cdp.setCard(CardView.getCardForUi((PaperCard) obj)); cdp.setVisible(true); refreshPanels(false, true); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java index a67c3dd1671..e60d732019e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuAchievements.java @@ -16,6 +16,7 @@ import java.awt.event.MouseMotionListener; import forge.achievement.Achievement; import forge.achievement.AchievementCollection; import forge.assets.FSkinProp; +import forge.game.card.CardView; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -30,7 +31,6 @@ import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinFont; import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.CardZoomer; -import forge.view.ViewUtil; import net.miginfocom.swing.MigLayout; import javax.swing.*; @@ -104,7 +104,7 @@ public enum VSubmenuAchievements implements IVSubmenu { IPaperCard pc = achievement.getPaperCard(); if (pc != null) { preventMouseOut = true; - CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(ViewUtil.getCardForUi(pc)); + CardZoomer.SINGLETON_INSTANCE.doMouseButtonZoom(CardView.getCardForUi(pc)); } } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index dbb32ef8b64..aadc8b1c54e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -39,9 +39,15 @@ import forge.ImageCache; import forge.LobbyPlayer; import forge.Singletons; import forge.UiCommand; +import forge.game.GameEntityView; +import forge.game.GameView; import forge.game.Match; +import forge.game.card.CardView; +import forge.game.combat.CombatView; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerView; +import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.gui.FNetOverlay; import forge.gui.GuiChoose; @@ -82,13 +88,6 @@ import forge.toolbox.FSkin.SkinImage; import forge.toolbox.special.PhaseIndicator; import forge.toolbox.special.PhaseLabel; import forge.util.ITriggerEvent; -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.ViewUtil; import forge.view.arcane.CardPanel; import forge.view.arcane.PlayArea; @@ -169,7 +168,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { int i = 0; for (final PlayerView p : sortedPlayers) { - if (allHands || p.getLobbyPlayer() instanceof LobbyPlayerHuman || ViewUtil.mayViewAny(p.getHandCards())) { + if (allHands || p.getLobbyPlayer() instanceof LobbyPlayerHuman || CardView.mayViewAny(p.getHand())) { VHand newHand = new VHand(EDocID.Hands[i], p); newHand.getLayoutControl().initialize(); hands.add(newHand); @@ -247,7 +246,9 @@ public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { return sortedPlayers.indexOf(player); } - public void showCombat(final CombatView combat) { + @Override + public void showCombat() { + CombatView combat = MatchUtil.getGameView().getCombat(); if (combat != null && combat.getNumAttackers() > 0 && MatchUtil.getGameView().peekStack() == null) { if (selectedDocBeforeCombat == null) { IVDoc combatDoc = EDocID.REPORT_COMBAT.getDoc(); @@ -427,7 +428,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { @Override public void updatePhase() { - LocalGameView gameView = MatchUtil.getGameView(); + GameView gameView = MatchUtil.getGameView(); final PlayerView p = gameView.getPlayerTurn(); final PhaseType ph = gameView.getPhase(); final CMatchUI matchUi = CMatchUI.SINGLETON_INSTANCE; @@ -486,26 +487,25 @@ public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { } @Override - public int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { + public SpellAbility getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { if (triggerEvent == null) { if (abilities.isEmpty()) { - return -1; + return null; } if (abilities.size() == 1) { - return abilities.get(0).getId(); + return abilities.get(0); } - final SpellAbilityView choice = GuiChoose.oneOrNone("Choose ability to play", abilities); - return choice == null ? -1 : choice.getId(); + return GuiChoose.oneOrNone("Choose ability to play", abilities); } if (abilities.isEmpty()) { - return -1; + return null; } - if (abilities.size() == 1 && !abilities.get(0).isPromptIfOnlyPossibleAbility()) { + if (abilities.size() == 1 && !abilities.get(0).promptIfOnlyPossibleAbility()) { if (abilities.get(0).canPlay()) { - return abilities.get(0).getId(); //only return ability if it's playable, otherwise return null + return abilities.get(0); //only return ability if it's playable, otherwise return null } - return -1; + return null; } //show menu if mouse was trigger for ability @@ -514,7 +514,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { boolean enabled; boolean hasEnabled = false; int shortcut = KeyEvent.VK_1; //use number keys as shortcuts for abilities 1-9 - for (final SpellAbilityView ab : abilities) { + for (final SpellAbility ab : abilities) { enabled = ab.canPlay(); if (enabled) { hasEnabled = true; @@ -544,7 +544,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { menu.show(mouseEvent.getComponent(), mouseEvent.getX(), mouseEvent.getY()); } - return -1; //delay ability until choice made + return null; //delay ability until choice made } @Override @@ -615,7 +615,7 @@ public enum CMatchUI implements ICDoc, IMenuProvider, IMatchController { public void openView(List sortedPlayers) { List sortedPlayerViews = new ArrayList(); for (Player p : sortedPlayers) { - sortedPlayerViews.add(MatchUtil.getGameView().getPlayerView(p, false)); + sortedPlayerViews.add(PlayerView.get(p)); } CMatchUI.SINGLETON_INSTANCE.initMatch(sortedPlayerViews, MatchUtil.getHumanCount() != 1); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java index c57a78890a4..6c04527166a 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ControlWinLose.java @@ -6,10 +6,10 @@ import java.awt.event.ActionListener; import javax.swing.JButton; import forge.Singletons; +import forge.game.GameView; import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; import forge.match.MatchUtil; -import forge.view.IGameView; /** * Default controller for a ViewWinLose object. This class can @@ -19,11 +19,11 @@ import forge.view.IGameView; */ public class ControlWinLose { private final ViewWinLose view; - protected final IGameView lastGame; + protected final GameView lastGame; /** @param v   ViewWinLose * @param match */ - public ControlWinLose(final ViewWinLose v, final IGameView game0) { + public ControlWinLose(final ViewWinLose v, final GameView game0) { this.view = v; this.lastGame = game0; addListeners(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java index 07772d8fefc..79f74faf452 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/GauntletWinLose.java @@ -26,11 +26,11 @@ import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; import forge.assets.FSkinProp; +import forge.game.GameView; import forge.gauntlet.GauntletWinLoseController; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; -import forge.view.IGameView; /** * The Win/Lose handler for 'gauntlet' type tournament @@ -45,7 +45,7 @@ public class GauntletWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match */ - public GauntletWinLose(final ViewWinLose view0, final IGameView game0) { + public GauntletWinLose(final ViewWinLose view0, final GameView game0) { super(view0, game0); controller = new GauntletWinLoseController(view0, game0) { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java index 352e0a6318d..4cd23a44dc6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/LimitedWinLose.java @@ -21,12 +21,12 @@ import java.awt.Dimension; import javax.swing.SwingConstants; +import forge.game.GameView; import forge.limited.LimitedWinLoseController; import forge.toolbox.FSkin; import forge.toolbox.FSkin.Colors; import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinnedLabel; -import forge.view.IGameView; /** * The Win/Lose handler for 'gauntlet' type tournament @@ -46,7 +46,7 @@ public class LimitedWinLose extends ControlWinLose { * @param view0 {@link forge.screens.match.ViewWinLose} * @param match {@link forge.game.Match} */ - public LimitedWinLose(final ViewWinLose view0, final IGameView game0) { + public LimitedWinLose(final ViewWinLose view0, final GameView game0) { super(view0, game0); controller = new LimitedWinLoseController(view0, game0) { @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java index 56a1fc4b04b..b0697c74188 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestDraftWinLose.java @@ -18,11 +18,11 @@ package forge.screens.match; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; -import java.util.List; - import forge.LobbyPlayer; import forge.Singletons; import forge.assets.FSkinProp; +import forge.game.GameView; +import forge.game.player.PlayerView; import forge.gui.SOverlayUtils; import forge.gui.framework.FScreen; import forge.match.MatchUtil; @@ -36,8 +36,6 @@ import forge.screens.home.quest.CSubmenuQuestDraft; import forge.screens.home.quest.VSubmenuQuestDraft; import forge.toolbox.FOptionPane; import forge.toolbox.FSkin; -import forge.view.IGameView; -import forge.view.PlayerView; /** *

@@ -59,7 +57,7 @@ public class QuestDraftWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match2 */ - public QuestDraftWinLose(final ViewWinLose view0, final IGameView game0) { + public QuestDraftWinLose(final ViewWinLose view0, final GameView game0) { super(view0, game0); this.view = view0; qData = FModel.getQuest(); @@ -79,7 +77,7 @@ public class QuestDraftWinLose extends ControlWinLose { QuestController quest = FModel.getQuest(); final LobbyPlayer questLobbyPlayer = GamePlayerUtil.getQuestPlayer(); - final List players = lastGame.getPlayers(); + final Iterable players = lastGame.getPlayers(); boolean gameHadHumanPlayer = false; for (final PlayerView p : players) { if (p.getLobbyPlayer().equals(questLobbyPlayer)) { @@ -87,33 +85,30 @@ public class QuestDraftWinLose extends ControlWinLose { break; } } - - if (lastGame.isMatchOver()) { + if (lastGame.isMatchOver()) { String winner = lastGame.getWinningPlayer().getName(); quest.getAchievements().getCurrentDraft().setWinner(winner); quest.save(); - } - + if (!gameHadHumanPlayer) { - if (lastGame.isMatchOver()) { this.actionOnQuitMatch(); QuestDraftUtils.matchInProgress = false; QuestDraftUtils.update(); - } else { + } + else { this.actionOnContinue(); QuestDraftUtils.update(); } return false; - } - + view.getBtnRestart().setEnabled(false); view.getBtnRestart().setVisible(false); - + if (lastGame.isMatchOver()) { view.getBtnQuit().setEnabled(true); view.getBtnContinue().setEnabled(false); @@ -129,7 +124,8 @@ public class QuestDraftWinLose extends ControlWinLose { QuestDraftUtils.continueMatches(); } }); - } else { + } + else { view.getBtnQuit().setEnabled(true); for (ActionListener listener : view.getBtnQuit().getActionListeners()) { view.getBtnQuit().removeActionListener(listener); @@ -146,13 +142,13 @@ public class QuestDraftWinLose extends ControlWinLose { } }); } - + CSubmenuQuestDraft.SINGLETON_INSTANCE.update(); VSubmenuQuestDraft.SINGLETON_INSTANCE.populate(); - + return false; //We're not awarding anything, so never display the custom panel. } - + public final void actionOnQuitMatch() { CSubmenuDuels.SINGLETON_INSTANCE.update(); CSubmenuChallenges.SINGLETON_INSTANCE.update(); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java index 3a48b50521f..f19cfd76c71 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLose.java @@ -22,6 +22,7 @@ import java.util.List; import javax.swing.SwingConstants; import forge.assets.FSkinProp; +import forge.game.GameView; import forge.item.PaperCard; import forge.model.FModel; import forge.properties.ForgePreferences.FPref; @@ -33,7 +34,6 @@ import forge.toolbox.FSkin.Colors; import forge.toolbox.FSkin.SkinColor; import forge.toolbox.FSkin.SkinIcon; import forge.toolbox.FSkin.SkinnedLabel; -import forge.view.IGameView; /** *

@@ -61,7 +61,7 @@ public class QuestWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match2 */ - public QuestWinLose(final ViewWinLose view0, final IGameView game0) { + public QuestWinLose(final ViewWinLose view0, final GameView game0) { super(view0, game0); view = view0; controller = new QuestWinLoseController(game0) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java index e36d2f2df1d..88e52a48910 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/QuestWinLoseCardViewer.java @@ -26,6 +26,7 @@ import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; import net.miginfocom.swing.MigLayout; +import forge.game.card.CardView; import forge.gui.CardDetailPanel; import forge.gui.CardPicturePanel; import forge.item.PaperCard; @@ -35,7 +36,6 @@ import forge.toolbox.FList; import forge.toolbox.FPanel; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; -import forge.view.ViewUtil; /** * A simple JPanel that shows three columns: card list, pic, and description.. @@ -112,10 +112,9 @@ public class QuestWinLoseCardViewer extends FPanel { // (String) jList.getSelectedValue(); if ((row >= 0) && (row < QuestWinLoseCardViewer.this.list.size())) { final PaperCard cp = QuestWinLoseCardViewer.this.list.get(row); - QuestWinLoseCardViewer.this.detail.setCard(ViewUtil.getCardForUi(cp)); + QuestWinLoseCardViewer.this.detail.setCard(CardView.getCardForUi(cp)); QuestWinLoseCardViewer.this.picture.setCard(cp); } } } - } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java index fb757cf10f7..6c89bae9f09 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/TargetingOverlay.java @@ -35,24 +35,23 @@ import javax.swing.JPanel; import com.google.common.collect.Lists; import forge.Singletons; +import forge.game.GameEntityView; +import forge.game.GameView; +import forge.game.card.CardView; +import forge.game.combat.CombatView; import forge.gui.framework.FScreen; import forge.match.MatchUtil; import forge.screens.match.controllers.CDock; import forge.screens.match.views.VField; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; -import forge.view.CardView; -import forge.view.CombatView; import forge.view.FView; -import forge.view.GameEntityView; -import forge.view.IGameView; import forge.view.arcane.CardPanel; /** * Semi-transparent overlay panel. Should be used with layered panes. * */ - @SuppressWarnings("serial") public enum TargetingOverlay { /** */ @@ -365,7 +364,7 @@ public enum TargetingOverlay { if (overlaystate == 0) { return; } // Arc drawing - final IGameView gameView = MatchUtil.getGameView(); + final GameView gameView = MatchUtil.getGameView(); if (gameView != null) { assembleArcs(gameView.getCombat()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java index ed53219cc13..fb51ebe4f4d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignDamage.java @@ -37,6 +37,9 @@ import net.miginfocom.swing.MigLayout; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import forge.game.GameEntityView; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.gui.SOverlayUtils; import forge.match.MatchUtil; import forge.toolbox.FButton; @@ -44,10 +47,7 @@ import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; -import forge.view.CardView; import forge.view.FDialog; -import forge.view.GameEntityView; -import forge.view.PlayerView; import forge.view.arcane.CardPanel; /** @@ -145,16 +145,16 @@ public class VAssignDamage { * @param overrideOrder override combatant order */ - public VAssignDamage(final CardView attacker, final List blockers, final int damage0, final GameEntityView defender, boolean overrideOrder) { + public VAssignDamage(final CardView attacker, final List blockers, final int damage0, final GameEntityView defender0, boolean overrideOrder) { dlg.setTitle("Assign damage dealt by " + attacker); // Set damage storage vars - this.totalDamageToAssign = damage0; - this.defender = defender; - this.attackerHasDeathtouch = attacker.getOriginal().hasDeathtouch(); - this.attackerHasInfect = attacker.getOriginal().hasInfect(); - this.attackerHasTrample = defender != null && attacker.getOriginal().hasTrample(); - this.overrideCombatantOrder = overrideOrder; + totalDamageToAssign = damage0; + defender = defender0; + attackerHasDeathtouch = attacker.getOriginal().hasDeathtouch(); + attackerHasInfect = attacker.getOriginal().hasInfect(); + attackerHasTrample = defender != null && attacker.getOriginal().hasTrample(); + overrideCombatantOrder = overrideOrder; // Top-level UI stuff final JPanel overlay = SOverlayUtils.genericOverlay(); @@ -184,28 +184,23 @@ public class VAssignDamage { // Top row of cards... for (final CardView c : blockers) { DamageTarget dt = new DamageTarget(c, new FLabel.Builder().text("0").fontSize(18).fontAlign(SwingConstants.CENTER).build()); - this.damage.put(c, dt); - this.defenders.add(dt); + damage.put(c, dt); + defenders.add(dt); addPanelForDefender(pnlDefenders, c); } if (attackerHasTrample) { DamageTarget dt = new DamageTarget(null, new FLabel.Builder().text("0").fontSize(18).fontAlign(SwingConstants.CENTER).build()); - this.damage.put(null, dt); - this.defenders.add(dt); + damage.put(null, dt); + defenders.add(dt); CardView fakeCard = null; if (defender instanceof CardView) { fakeCard = (CardView)defender; } else if (defender instanceof PlayerView) { - fakeCard = new CardView(-1); - fakeCard.getOriginal().setName(this.defender.toString()); final PlayerView p = (PlayerView)defender; - fakeCard.setOwner(p); - fakeCard.setController(p); - fakeCard.getOriginal().setImageKey(CMatchUI.SINGLETON_INSTANCE.avatarImages.get(p.getLobbyPlayer())); + fakeCard = new CardView(-1, defender.toString(), p, CMatchUI.SINGLETON_INSTANCE.avatarImages.get(p.getLobbyPlayer())); } - addPanelForDefender(pnlDefenders, fakeCard); } @@ -251,12 +246,12 @@ public class VAssignDamage { initialAssignDamage(false); SOverlayUtils.showOverlay(); - this.dlg.setUndecorated(true); - this.dlg.setContentPane(pnlMain); - this.dlg.setSize(new Dimension(wDlg, hDlg)); - this.dlg.setLocation((overlay.getWidth() - wDlg) / 2, (overlay.getHeight() - hDlg) / 2); - this.dlg.setModalityType(ModalityType.APPLICATION_MODAL); - this.dlg.setVisible(true); + dlg.setUndecorated(true); + dlg.setContentPane(pnlMain); + dlg.setSize(new Dimension(wDlg, hDlg)); + dlg.setLocation((overlay.getWidth() - wDlg) / 2, (overlay.getHeight() - hDlg) / 2); + dlg.setModalityType(ModalityType.APPLICATION_MODAL); + dlg.setVisible(true); } /** @@ -284,7 +279,7 @@ public class VAssignDamage { // If trying to assign to the defender, follow the normal assignment rules // No need to check for "active" creature assignee when overiding combatant order - if ((source == null || source == this.defender || !this.overrideCombatantOrder) && isAdding && + if ((source == null || source == defender || !overrideCombatantOrder) && isAdding && !VAssignDamage.this.canAssignTo(source)) { return; } @@ -312,7 +307,7 @@ public class VAssignDamage { // cannot assign first blocker less than lethal damage except when overriding order boolean isFirstBlocker = defenders.get(0).card == source; - if (!this.overrideCombatantOrder && isFirstBlocker && damageToAdd + damageItHad < lethalDamage ) + if (!overrideCombatantOrder && isFirstBlocker && damageToAdd + damageItHad < lethalDamage ) return; if ( 0 == damageToAdd || damageToAdd + damageItHad < 0) @@ -331,7 +326,7 @@ public class VAssignDamage { int damage = dt.damage; // If overriding combatant order, make sure everything has lethal if defender has damage assigned to it // Otherwise, follow normal combatant order - if ( hasAliveEnemy && (!this.overrideCombatantOrder || dt.card == null || dt.card == this.defender)) + if ( hasAliveEnemy && (!overrideCombatantOrder || dt.card == null || dt.card == defender)) dt.damage = 0; else hasAliveEnemy |= damage < lethal; @@ -340,7 +335,7 @@ public class VAssignDamage { // will assign all damage to defenders and rest to player, if present private void initialAssignDamage(boolean toAllBlockers) { - if (!toAllBlockers && this.overrideCombatantOrder) { + if (!toAllBlockers && overrideCombatantOrder) { // Don't auto assign the first damage when overriding combatant order updateLabels(); return; @@ -420,7 +415,7 @@ public class VAssignDamage { dt.label.setText(sb.toString()); } - this.lblTotalDamage.setText(String.format("Available damage points: %d (of %d)", damageLeft, this.totalDamageToAssign)); + lblTotalDamage.setText(String.format("Available damage points: %d (of %d)", damageLeft, totalDamageToAssign)); btnOK.setEnabled(damageLeft == 0); lblAssignRemaining.setVisible(allHaveLethal && damageLeft > 0); } @@ -435,23 +430,20 @@ public class VAssignDamage { dlg.dispose(); SOverlayUtils.hideOverlay(); } - - /** - * TODO: Write javadoc for this method. - * @param card - * @return - */ + private int getDamageToKill(final CardView card) { int lethalDamage = 0; if (card == null) { if (defender instanceof PlayerView) { final PlayerView p = (PlayerView)defender; 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; lethalDamage = pw.getOriginal().getLoyalty(); } - } else { + } + else { lethalDamage = VAssignDamage.this.attackerHasDeathtouch ? 1 : Math.max(0, card.getLethalDamage()); } return lethalDamage; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java index f7304b0772c..045abfabf77 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAutoYields.java @@ -10,13 +10,13 @@ import javax.swing.event.ChangeListener; import forge.Singletons; import forge.UiCommand; +import forge.player.PlayerControllerHuman; import forge.toolbox.FButton; import forge.toolbox.FCheckBox; import forge.toolbox.FList; import forge.toolbox.FOptionPane; import forge.toolbox.FScrollPane; import forge.view.FDialog; -import forge.view.IGameView; @SuppressWarnings("serial") public class VAutoYields extends FDialog { @@ -31,12 +31,12 @@ public class VAutoYields extends FDialog { private final FCheckBox chkDisableAll; private final List autoYields; - public VAutoYields(final IGameView game) { + public VAutoYields(final PlayerControllerHuman humanController) { super(true); setTitle("Auto-Yields"); autoYields = new ArrayList(); - for (final String autoYield : game.getAutoYields()) { + for (final String autoYield : humanController.getAutoYields()) { autoYields.add(autoYield); } lstAutoYields = new FList(new AutoYieldsListModel()); @@ -48,11 +48,11 @@ public class VAutoYields extends FDialog { listScroller = new FScrollPane(lstAutoYields, true); - chkDisableAll = new FCheckBox("Disable All Auto Yields", game.getDisableAutoYields()); + chkDisableAll = new FCheckBox("Disable All Auto Yields", humanController.getDisableAutoYields()); chkDisableAll.addChangeListener(new ChangeListener() { @Override public void stateChanged(ChangeEvent e) { - game.setDisableAutoYields(chkDisableAll.isSelected()); + humanController.setDisableAutoYields(chkDisableAll.isSelected()); } }); @@ -71,7 +71,7 @@ public class VAutoYields extends FDialog { if (selected != null) { autoYields.remove(selected); btnRemove.setEnabled(autoYields.size() > 0); - game.setShouldAutoYield(selected, false); + humanController.setShouldAutoYield(selected, false); VAutoYields.this.revalidate(); lstAutoYields.repaint(); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java index f1806b8ac1c..f2812c93bc7 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VMatchUI.java @@ -1,5 +1,6 @@ package forge.screens.match; +import forge.game.GameView; import forge.gui.framework.*; import forge.match.MatchUtil; import forge.properties.ForgePreferences; @@ -8,7 +9,6 @@ import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; import forge.toolbox.FButton; import forge.view.FView; -import forge.view.IGameView; import javax.swing.*; @@ -23,7 +23,6 @@ import java.util.List; *

(V at beginning of class name denotes a view class.) */ public enum VMatchUI implements IVTopLevelUI { - /** */ SINGLETON_INSTANCE; private List lstCommands = new ArrayList(); @@ -45,12 +44,10 @@ public enum VMatchUI implements IVTopLevelUI { for (int i = 0; i < 8; i++) EDocID.Hands[i].setDoc(new VEmptyDoc(EDocID.Hands[i])); } - /** */ @Override public void instantiate() { } - /** */ @Override public void populate() { // Dev mode disabled? Remove from parent cell if exists. @@ -95,23 +92,12 @@ public enum VMatchUI implements IVTopLevelUI { } } - if (MatchUtil.getGameView().isCommandZoneNeeded()) { - // Add extra players alternatively to existing user/AI field panels. - for (int i = 2; i < lstCommands.size(); i++) { - // If already in layout, no need to add again. - VCommand cmdView = lstCommands.get(i); - if (cmdView.getParentCell() == null) { - lstCommands.get(i % 2).getParentCell().addDoc(cmdView); - } - } - } - else { - //If game goesn't need command zone, remove it from existing field panels - for (int i = 0; i < 2; i++) { - VCommand cmdView = lstCommands.get(i); - if (cmdView.getParentCell() != null) { - cmdView.getParentCell().removeDoc(cmdView); - } + // Add extra players alternatively to existing user/AI field panels. + for (int i = 2; i < lstCommands.size(); i++) { + // If already in layout, no need to add again. + VCommand cmdView = lstCommands.get(i); + if (cmdView.getParentCell() == null) { + lstCommands.get(i % 2).getParentCell().addDoc(cmdView); } } @@ -147,24 +133,18 @@ public enum VMatchUI implements IVTopLevelUI { }); } - //========== Retrieval methods - - /** @return {@link forge.screens.match.CMatchUI} */ public CMatchUI getControl() { return this.control; } - /** @param lst0 List */ public void setFieldViews(final List lst0) { this.lstFields = lst0; } - /** @return {@link java.util.List}<{@link forge.screens.match.views.VHand}> */ public List getFieldViews() { return lstFields; } - /** @param lst0 List */ public void setHandViews(final List lst0) { this.lstHands = lst0; } @@ -177,16 +157,10 @@ public enum VMatchUI implements IVTopLevelUI { return VPrompt.SINGLETON_INSTANCE.getBtnOK(); } - /** - * @return the lstCommands - */ public List getCommandViews() { return lstCommands; } - /** - * @param lstCommands0 the lstCommands to set - */ public void setCommandViews(List lstCommands0) { this.lstCommands = lstCommands0; } @@ -195,20 +169,14 @@ public enum VMatchUI implements IVTopLevelUI { return lstHands; } - /* (non-Javadoc) - * @see forge.gui.framework.IVTopLevelUI#onSwitching(forge.gui.framework.FScreen) - */ @Override public boolean onSwitching(FScreen fromScreen, FScreen toScreen) { return true; } - /* (non-Javadoc) - * @see forge.gui.framework.IVTopLevelUI#onClosing(forge.control.FControl.Screens) - */ @Override public boolean onClosing(FScreen screen) { - final IGameView gameView = MatchUtil.getGameView(); + final GameView gameView = MatchUtil.getGameView(); if (gameView != null && !gameView.isGameOver()) { MatchUtil.concede(); return false; //delay hiding tab even if concede successful diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java b/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java index 822faa224b8..4e99022e1d4 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ViewWinLose.java @@ -18,6 +18,7 @@ import forge.LobbyPlayer; import forge.UiCommand; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; +import forge.game.GameView; import forge.gui.SOverlayUtils; import forge.interfaces.IWinLoseView; import forge.model.FModel; @@ -29,7 +30,6 @@ import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.FTextArea; -import forge.view.IGameView; public class ViewWinLose implements IWinLoseView { private final FButton btnContinue, btnRestart, btnQuit; @@ -39,10 +39,10 @@ public class ViewWinLose implements IWinLoseView { private final SkinnedLabel lblStats = new SkinnedLabel("WinLoseFrame > lblStats needs updating."); private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center")); - private final IGameView game; + private final GameView game; @SuppressWarnings("serial") - public ViewWinLose(final IGameView game0) { + public ViewWinLose(final GameView game0) { this.game = game0; @@ -107,7 +107,7 @@ public class ViewWinLose implements IWinLoseView { // Assemble game log scroller. final FTextArea txtLog = new FTextArea(); - txtLog.setText(StringUtils.join(game.getLogEntries(null), "\r\n").replace("[COMPUTER]", "[AI]")); + txtLog.setText(StringUtils.join(game.getGameLog().getLogEntries(null), "\r\n").replace("[COMPUTER]", "[AI]")); txtLog.setFont(FSkin.getFont(14)); txtLog.setFocusable(true); // allow highlighting and copying of log @@ -187,7 +187,7 @@ public class ViewWinLose implements IWinLoseView { } - private String composeTitle(final IGameView game) { + private String composeTitle(final GameView game) { final LobbyPlayer winner = game.getWinningPlayer(); final int winningTeam = game.getWinningTeam(); if (winner == null) { @@ -220,12 +220,12 @@ public class ViewWinLose implements IWinLoseView { } private void showGameOutcomeSummary() { - for (final GameLogEntry o : game.getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) + for (final GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) pnlOutcomes.add(new FLabel.Builder().text(o.message).fontSize(14).build(), "h 20!"); } private void showPlayerScores() { - for (final GameLogEntry o : game.getLogEntriesExact(GameLogEntryType.MATCH_RESULTS)) { + for (final GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.MATCH_RESULTS)) { lblStats.setText(removePlayerTypeFromLogMessage(o.message)); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java b/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java index 1db3be5629c..c31f96db7ff 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/ZoneAction.java @@ -5,13 +5,13 @@ import java.util.List; import com.google.common.collect.Lists; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.gui.ForgeAction; import forge.gui.GuiChoose; import forge.match.MatchConstants; -import forge.view.CardView; -import forge.view.CardView.CardStateView; -import forge.view.PlayerView; /** * Receives click and programmatic requests for viewing data stacks in the diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java index 75ff7dd643a..299dfb32748 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCombat.java @@ -5,14 +5,14 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Iterables; import forge.UiCommand; +import forge.game.GameEntityView; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; +import forge.game.combat.CombatView; +import forge.game.player.PlayerView; import forge.gui.framework.ICDoc; import forge.screens.match.views.VCombat; import forge.util.Lang; -import forge.view.CardView; -import forge.view.CardView.CardStateView; -import forge.view.CombatView; -import forge.view.GameEntityView; -import forge.view.PlayerView; /** * Controls the combat panel in the match UI. diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java index e03ce86c1a7..db60803aac2 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CCommand.java @@ -18,9 +18,9 @@ package forge.screens.match.controllers; import forge.UiCommand; +import forge.game.player.PlayerView; import forge.gui.framework.ICDoc; import forge.screens.match.views.VCommand; -import forge.view.PlayerView; /** * Controls Swing components of a player's command instance. diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java index bf7d15e234b..28d92cecced 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetail.java @@ -20,14 +20,13 @@ package forge.screens.match.controllers; import java.awt.event.MouseEvent; import forge.UiCommand; +import forge.game.card.CardView; import forge.gui.framework.ICDoc; import forge.item.IPaperCard; import forge.item.InventoryItem; import forge.item.InventoryItemFromSet; import forge.screens.match.views.VDetail; import forge.toolbox.FMouseAdapter; -import forge.view.CardView; -import forge.view.ViewUtil; /** * Controls the card detail area in the match UI. @@ -58,7 +57,7 @@ public enum CDetail implements ICDoc { public void showCard(final InventoryItem item) { if (item instanceof IPaperCard) { - showCard(ViewUtil.getCardForUi((IPaperCard)item)); + showCard(CardView.getCardForUi((IPaperCard)item)); } else if (item instanceof InventoryItemFromSet) { view.getLblFlipcard().setVisible(false); view.getPnlDetail().setItem((InventoryItemFromSet)item); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java index 75724df26b9..9582dd6d610 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDev.java @@ -27,7 +27,7 @@ public enum CDev implements ICDoc { public void togglePlayManyLandsPerTurn() { boolean newValue = !VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().getToggled(); VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(newValue); - MatchUtil.getGameView().cheat().setCanPlayUnlimitedLands(newValue); + MatchUtil.getHumanController().cheat().setCanPlayUnlimitedLands(newValue); } private final MouseListener madViewAll = new MouseAdapter() { @@ -39,7 +39,7 @@ public enum CDev implements ICDoc { public void toggleViewAllCards() { boolean newValue = !VDev.SINGLETON_INSTANCE.getLblViewAll().getToggled(); VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(newValue); - MatchUtil.getGameView().cheat().setViewAllCards(newValue); + MatchUtil.getHumanController().cheat().setViewAllCards(newValue); } private final MouseListener madMana = new MouseAdapter() { @@ -49,7 +49,7 @@ public enum CDev implements ICDoc { } }; public void generateMana() { - MatchUtil.getGameView().cheat().generateMana(); + MatchUtil.getHumanController().cheat().generateMana(); } private final MouseListener madSetup = new MouseAdapter() { @@ -59,7 +59,7 @@ public enum CDev implements ICDoc { } }; public void setupGameState() { - MatchUtil.getGameView().cheat().setupGameState(); + MatchUtil.getHumanController().cheat().setupGameState(); } private final MouseListener madTutor = new MouseAdapter() { @@ -69,7 +69,7 @@ public enum CDev implements ICDoc { } }; public void tutorForCard() { - MatchUtil.getGameView().cheat().tutorForCard(); + MatchUtil.getHumanController().cheat().tutorForCard(); } private final MouseListener madCardToHand = new MouseAdapter() { @@ -79,7 +79,7 @@ public enum CDev implements ICDoc { } }; public void addCardToHand() { - MatchUtil.getGameView().cheat().addCardToHand(); + MatchUtil.getHumanController().cheat().addCardToHand(); } private final MouseListener madCounter = new MouseAdapter() { @@ -89,7 +89,7 @@ public enum CDev implements ICDoc { } }; public void addCounterToPermanent() { - MatchUtil.getGameView().cheat().addCountersToPermanent(); + MatchUtil.getHumanController().cheat().addCountersToPermanent(); } private final MouseListener madTap = new MouseAdapter() { @@ -99,7 +99,7 @@ public enum CDev implements ICDoc { } }; public void tapPermanent() { - MatchUtil.getGameView().cheat().tapPermanents(); + MatchUtil.getHumanController().cheat().tapPermanents(); } private final MouseListener madUntap = new MouseAdapter() { @@ -109,7 +109,7 @@ public enum CDev implements ICDoc { } }; public void untapPermanent() { - MatchUtil.getGameView().cheat().untapPermanents(); + MatchUtil.getHumanController().cheat().untapPermanents(); } private final MouseListener madLife = new MouseAdapter() { @@ -119,7 +119,7 @@ public enum CDev implements ICDoc { } }; public void setPlayerLife() { - MatchUtil.getGameView().cheat().setPlayerLife(); + MatchUtil.getHumanController().cheat().setPlayerLife(); } private final MouseListener madWinGame = new MouseAdapter() { @@ -129,7 +129,7 @@ public enum CDev implements ICDoc { } }; public void winGame() { - MatchUtil.getGameView().cheat().winGame(); + MatchUtil.getHumanController().cheat().winGame(); } private final MouseListener madCardToBattlefield = new MouseAdapter() { @@ -139,7 +139,7 @@ public enum CDev implements ICDoc { } }; public void addCardToBattlefield() { - MatchUtil.getGameView().cheat().addCardToBattlefield(); + MatchUtil.getHumanController().cheat().addCardToBattlefield(); } private final MouseListener madRiggedRoll = new MouseAdapter() { @@ -149,7 +149,7 @@ public enum CDev implements ICDoc { } }; public void riggedPlanerRoll() { - MatchUtil.getGameView().cheat().riggedPlanarRoll(); + MatchUtil.getHumanController().cheat().riggedPlanarRoll(); } private final MouseListener madWalkToPlane = new MouseAdapter() { @@ -159,7 +159,7 @@ public enum CDev implements ICDoc { } }; public void planeswalkTo() { - MatchUtil.getGameView().cheat().planeswalkTo(); + MatchUtil.getHumanController().cheat().planeswalkTo(); } //========== End mouse listener inits @@ -198,7 +198,7 @@ public enum CDev implements ICDoc { */ @Override public void update() { - VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(MatchUtil.getGameView().canPlayUnlimitedLands()); - VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(MatchUtil.getGameView().canViewAllCards()); + VDev.SINGLETON_INSTANCE.getLblUnlimitedLands().setToggled(MatchUtil.getHumanController().canPlayUnlimitedLands()); + VDev.SINGLETON_INSTANCE.getLblViewAll().setToggled(MatchUtil.getHumanController().mayLookAtAllCards()); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java index 615892e82dc..988fa373dfe 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDock.java @@ -236,7 +236,7 @@ public enum CDock implements ICDoc { VDock.SINGLETON_INSTANCE.getBtnAlphaStrike().setCommand(new UiCommand() { @Override public void run() { - MatchUtil.getGameView().alphaStrike(); + MatchUtil.getHumanController().alphaStrike(); } }); VDock.SINGLETON_INSTANCE.getBtnTargeting().setCommand(new UiCommand() { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java index 62f7fbaaef7..1c0e0aa8ee1 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java @@ -25,6 +25,8 @@ import com.google.common.base.Function; import forge.Singletons; import forge.UiCommand; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.gui.framework.ICDoc; import forge.match.MatchConstants; @@ -32,8 +34,6 @@ import forge.match.MatchUtil; import forge.screens.match.ZoneAction; import forge.screens.match.views.VField; import forge.toolbox.MouseTriggerEvent; -import forge.view.CardView; -import forge.view.PlayerView; /** * Controls Swing components of a player's field instance. @@ -79,21 +79,20 @@ public class CField implements ICDoc { } @Override protected Iterable getCardsAsIterable() { - return player.getFlashbackCards(); + return player.getFlashback(); } }; Function manaAction = new Function() { public Void apply(Byte colorCode) { if (CField.this.player.getLobbyPlayer() == Singletons.getControl().getGuiPlayer()) { - MatchUtil.getGameView().useMana(colorCode.byteValue()); + MatchUtil.getHumanController().useMana(colorCode.byteValue()); } return null; } }; - + view.getDetailsPanel().setupMouseActions(handAction, libraryAction, exileAction, graveAction, flashBackAction, manaAction); - } @Override diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java index 45e512a63fd..c00e5a76e9e 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CHand.java @@ -33,12 +33,12 @@ import com.google.common.collect.Lists; import forge.FThreads; import forge.Singletons; import forge.UiCommand; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.gui.framework.ICDoc; import forge.screens.match.CMatchUI; import forge.screens.match.views.VField; import forge.screens.match.views.VHand; -import forge.view.CardView; -import forge.view.PlayerView; import forge.view.arcane.CardPanel; import forge.view.arcane.HandArea; import forge.view.arcane.util.Animation; @@ -46,7 +46,6 @@ import forge.view.arcane.util.CardPanelMouseAdapter; /** * Controls Swing components of a player's hand instance. - * */ public class CHand implements ICDoc { private final PlayerView player; @@ -108,7 +107,7 @@ public class CHand implements ICDoc { final List cards; synchronized (player) { - cards = ImmutableList.copyOf(player.getHandCards()); + cards = ImmutableList.copyOf(player.getHand()); } synchronized (ordering) { diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java index c2d5fcd689c..b4f3857cf83 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPicture.java @@ -25,6 +25,7 @@ import javax.swing.JLabel; import forge.UiCommand; import forge.game.card.Card; +import forge.game.card.CardView; import forge.gui.CardPicturePanel; import forge.gui.framework.ICDoc; import forge.item.IPaperCard; @@ -32,8 +33,6 @@ import forge.item.InventoryItem; import forge.screens.match.views.VPicture; import forge.toolbox.FMouseAdapter; import forge.toolbox.special.CardZoomer; -import forge.view.CardView; -import forge.view.ViewUtil; /** * Singleton controller for VPicture. @@ -83,18 +82,20 @@ public enum CPicture implements ICDoc { public void showImage(final InventoryItem item) { if (item instanceof IPaperCard) { final IPaperCard paperCard = ((IPaperCard)item); - final CardView c = ViewUtil.getCardForUi(paperCard); + final CardView c = CardView.getCardForUi(paperCard); if (paperCard.isFoil() && c.getOriginal().getFoilIndex() == 0) { // FIXME should assign a random foil here in all cases // (currently assigns 1 for the deck editors where foils "flicker" otherwise) if (item instanceof Card) { - c.getOriginal().setRandomFoil(); - } else if (item instanceof IPaperCard) { - c.getOriginal().setFoilIndex(1); + c.getOriginal().setFoilIndexOverride(-1); //-1 to choose random + } + else if (item instanceof IPaperCard) { + c.getOriginal().setFoilIndexOverride(1); } } showCard(c, false); - } else { + } + else { currentView = null; isDisplayAlt = false; flipIndicator.setVisible(false); @@ -177,5 +178,4 @@ public enum CPicture implements ICDoc { CDetail.SINGLETON_INSTANCE.showCard(currentView, isDisplayAlt); } } - } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java index c5ca9b9e534..133968324ae 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CPrompt.java @@ -28,16 +28,16 @@ import javax.swing.JButton; import forge.FThreads; import forge.UiCommand; +import forge.game.GameView; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.game.spellability.SpellAbility; import forge.gui.framework.ICDoc; import forge.gui.framework.SDisplayUtil; import forge.match.MatchUtil; import forge.screens.match.views.VPrompt; import forge.toolbox.FSkin; import forge.util.ITriggerEvent; -import forge.view.CardView; -import forge.view.IGameView; -import forge.view.PlayerView; -import forge.view.SpellAbilityView; /** * Controls the prompt panel in the match UI. @@ -45,7 +45,6 @@ import forge.view.SpellAbilityView; *

(C at beginning of class name denotes a control class.) */ public enum CPrompt implements ICDoc { - /** */ SINGLETON_INSTANCE; private Component lastFocusedButton = null; @@ -89,34 +88,33 @@ public enum CPrompt implements ICDoc { } public void selectButtonOk() { - MatchUtil.getGameView().selectButtonOk(); + MatchUtil.getHumanController().selectButtonOk(); } public void selectButtonCancel() { - MatchUtil.getGameView().selectButtonCancel(); + MatchUtil.getHumanController().selectButtonCancel(); } public boolean passPriority() { - return MatchUtil.getGameView().passPriority(); + return MatchUtil.getHumanController().passPriority(); } public boolean passPriorityUntilEndOfTurn() { - return MatchUtil.getGameView().passPriorityUntilEndOfTurn(); + return MatchUtil.getHumanController().passPriorityUntilEndOfTurn(); } public void selectPlayer(final PlayerView player, final ITriggerEvent triggerEvent) { - MatchUtil.getGameView().selectPlayer(player, triggerEvent); + MatchUtil.getHumanController().selectPlayer(player, triggerEvent); } public void selectCard(final CardView card, final ITriggerEvent triggerEvent) { - MatchUtil.getGameView().selectCard(card, triggerEvent); + MatchUtil.getHumanController().selectCard(card, triggerEvent); } - public void selectAbility(final SpellAbilityView sa) { - MatchUtil.getGameView().selectAbility(sa); + public void selectAbility(final SpellAbility sa) { + MatchUtil.getHumanController().selectAbility(sa); } - /** @param s0   {@link java.lang.String} */ public void setMessage(String s0) { view.getTarMessage().setText(FSkin.encodeSymbols(s0, false)); } @@ -126,17 +124,11 @@ public enum CPrompt implements ICDoc { SDisplayUtil.remind(view); } - /* (non-Javadoc) - * @see forge.gui.framework.ICDoc#getCommandOnSelect() - */ @Override public UiCommand getCommandOnSelect() { return null; } - /* (non-Javadoc) - * @see java.util.Observer#update(java.util.Observable, java.lang.Object) - */ @Override public void update() { // set focus back to button that last had it @@ -147,9 +139,9 @@ public enum CPrompt implements ICDoc { public void updateText() { FThreads.assertExecutedByEdt(true); - 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 GameView game = MatchUtil.getGameView(); + final String text = String.format("T:%d G:%d/%d [%s]", game.getTurn(), game.getNumPlayedGamesInMatch() + 1, game.getNumGamesInMatch(), game.getGameType()); 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.getTurn())); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java b/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java index 0a4e35cf4fe..588c5c8ed89 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/menus/DevModeMenu.java @@ -67,8 +67,8 @@ public class DevModeMenu implements ActionListener { menu.add(getMenuItem(DevMenuItem.WIN_GAME)); menu.addSeparator(); menu.add(getMenuItem(DevMenuItem.SETUP_GAME_STATE)); - menu.add(getCheckboxMenuItem(DevMenuItem.PLAY_UNLIMITED_LANDS, MatchUtil.getGameView().canPlayUnlimitedLands())); - menu.add(getCheckboxMenuItem(DevMenuItem.VIEW_ALL, MatchUtil.getGameView().canViewAllCards())); + menu.add(getCheckboxMenuItem(DevMenuItem.PLAY_UNLIMITED_LANDS, MatchUtil.getHumanController().canPlayUnlimitedLands())); + menu.add(getCheckboxMenuItem(DevMenuItem.VIEW_ALL, MatchUtil.getHumanController().mayLookAtAllCards())); menu.add(getMenuItem(DevMenuItem.ADD_COUNTER)); menu.addSeparator(); menu.add(getMenuItem(DevMenuItem.TAP_PERMANENT)); diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java index e2ac93367e1..7b9620e1e07 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/menus/GameMenu.java @@ -83,7 +83,7 @@ public final class GameMenu { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - MatchUtil.getGameView().tryUndoLastAction(); + MatchUtil.getHumanController().tryUndoLastAction(); } }; } @@ -201,7 +201,7 @@ public final class GameMenu { return new ActionListener() { @Override public void actionPerformed(ActionEvent e) { - final VAutoYields autoYields = new VAutoYields(MatchUtil.getGameView()); + final VAutoYields autoYields = new VAutoYields(MatchUtil.getHumanController()); autoYields.showAutoYields(); } }; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java index c337e238182..025baf53139 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VAntes.java @@ -25,6 +25,8 @@ import javax.swing.JPanel; import javax.swing.SwingConstants; import net.miginfocom.swing.MigLayout; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.gui.CardPicturePanel; import forge.gui.WrapLayout; import forge.gui.framework.DragCell; @@ -35,8 +37,6 @@ import forge.match.MatchUtil; import forge.screens.match.controllers.CAntes; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; -import forge.view.CardView; -import forge.view.PlayerView; /** * Assembles Swing components of card ante area. @@ -121,15 +121,15 @@ public enum VAntes implements IVDoc { pnl.removeAll(); for (final PlayerView p : MatchUtil.getGameView().getPlayers()) { - for (final CardView c : p.getAnteCards()) { - final AntePanel pnlTemp = new AntePanel(c); - allAntes.add(pnlTemp); + Iterable ante = p.getAnte(); + if (ante != null) { + for (final CardView c : ante) { + final AntePanel pnlTemp = new AntePanel(c); + allAntes.add(pnlTemp); + pnl.add(pnlTemp); + } } } - - for(AntePanel ap : allAntes) { - pnl.add(ap); - } } //========= Private class handling diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java index 3834bd6cad0..1868c7e53ce 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VCommand.java @@ -20,6 +20,7 @@ package forge.screens.match.views; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; @@ -28,7 +29,6 @@ import forge.gui.framework.IVDoc; import forge.screens.match.controllers.CCommand; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin; -import forge.view.PlayerView; import forge.view.arcane.PlayArea; /** diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java index f93a944803a..c6a48c18bba 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VField.java @@ -28,6 +28,7 @@ import javax.swing.border.Border; import javax.swing.border.LineBorder; import net.miginfocom.swing.MigLayout; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; @@ -41,7 +42,6 @@ import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.special.PhaseIndicator; import forge.toolbox.special.PlayerDetailsPanel; -import forge.view.PlayerView; import forge.view.arcane.PlayArea; /** diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java index 2ae80cab48d..58adfbdc3e6 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VHand.java @@ -20,13 +20,13 @@ package forge.screens.match.views; import javax.swing.JPanel; import net.miginfocom.swing.MigLayout; +import forge.game.player.PlayerView; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.screens.match.controllers.CHand; import forge.toolbox.FScrollPane; -import forge.view.PlayerView; import forge.view.arcane.HandArea; /** diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java index a9f37a925c6..35bbd8c4871 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VLog.java @@ -27,6 +27,7 @@ import com.google.common.collect.Lists; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; +import forge.game.GameView; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -38,8 +39,6 @@ import forge.screens.match.GameLogPanel; import forge.screens.match.controllers.CLog; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinFont; -import forge.view.IGameView; -import forge.view.LocalGameView; /** * Assembles Swing components of game log report. @@ -55,7 +54,7 @@ public enum VLog implements IVDoc { private final List displayedLogEntries = Lists.newArrayList(); // Used to determine when a new game has started. - private IGameView gameLogModel = null; + private GameView gameLogModel = null; // Fields used with interface IVDoc private DragCell parentCell; @@ -128,7 +127,7 @@ public enum VLog implements IVDoc { */ public void updateConsole() { if (isGameLogConsoleVisible()) { - LocalGameView model = MatchUtil.getGameView(); + GameView model = MatchUtil.getGameView(); resetDisplayIfNewGame(model); displayNewGameLogEntries(model); // Important : refreshLayout() needs to be called every update. @@ -140,7 +139,7 @@ public enum VLog implements IVDoc { return parentCell.getSelected().equals(this); } - private void resetDisplayIfNewGame(final IGameView model) { + private void resetDisplayIfNewGame(final GameView model) { if (this.gameLogModel != model) { gameLog.reset(); this.displayedLogEntries.clear(); @@ -167,17 +166,17 @@ public enum VLog implements IVDoc { p.add(gameLog, "w 10:100%, h 100%"); } - private void displayNewGameLogEntries(final IGameView model) { + private void displayNewGameLogEntries(final GameView model) { List newLogEntries = Lists.reverse(getNewGameLogEntries(model)); if (newLogEntries.size() > 0) { addNewLogEntriesToJPanel(newLogEntries); } } - private List getNewGameLogEntries(final IGameView model) { + private List getNewGameLogEntries(final GameView model) { String logEntryType = FModel.getPreferences().getPref(FPref.DEV_LOG_ENTRY_TYPE); GameLogEntryType logVerbosityFilter = GameLogEntryType.valueOf(logEntryType); - List logEntries = model.getLogEntries(logVerbosityFilter); + List logEntries = model.getGameLog().getLogEntries(logVerbosityFilter); // Set subtraction - remove all log entries from new list which are already displayed. logEntries.removeAll(this.displayedLogEntries); return logEntries; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java index 77b6612ce93..bdd45684607 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VPlayers.java @@ -28,6 +28,8 @@ import javax.swing.ScrollPaneConstants; import com.google.common.collect.Lists; import net.miginfocom.swing.MigLayout; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -39,8 +41,6 @@ import forge.screens.match.controllers.CPlayers; import forge.toolbox.FScrollPanel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedLabel; -import forge.view.CardView; -import forge.view.PlayerView; /** * Assembles Swing components of players report. @@ -165,14 +165,16 @@ public enum VPlayers implements IVDoc { temp[5].setText(""); } if (FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)) { - final List list = p0.getAnteCards(); + final Iterable list = p0.getAnte(); final StringBuilder sb = new StringBuilder(); sb.append("Ante'd: "); - for (int i = 0; i < list.size(); i++) { - sb.append(list.get(i)); - if (i < (list.size() - 1)) { + boolean needDelim = false; + for (CardView cv : list) { + if (needDelim) { sb.append(", "); } + else { needDelim = true; } + sb.append(cv); } temp[6].setText(sb.toString()); } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java index 40762ad18e3..8dece1df0c0 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/views/VStack.java @@ -26,8 +26,6 @@ import java.awt.event.ActionListener; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; import java.awt.image.BufferedImage; -import java.util.List; - import javax.swing.JCheckBoxMenuItem; import javax.swing.JPopupMenu; import javax.swing.ScrollPaneConstants; @@ -38,11 +36,16 @@ import net.miginfocom.swing.MigLayout; import forge.ImageCache; import forge.card.CardDetailUtil; import forge.card.CardDetailUtil.DetailColors; +import forge.game.GameView; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.game.spellability.StackItemView; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.match.MatchUtil; +import forge.player.PlayerControllerHuman; import forge.screens.match.CMatchUI; import forge.screens.match.controllers.CPrompt; import forge.screens.match.controllers.CStack; @@ -50,11 +53,7 @@ import forge.toolbox.FMouseAdapter; import forge.toolbox.FScrollPanel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedTextArea; -import forge.view.CardView; -import forge.view.IGameView; -import forge.view.LocalGameView; -import forge.view.PlayerView; -import forge.view.StackItemView; +import forge.util.FCollection; import forge.view.arcane.CardPanel; /** @@ -63,7 +62,6 @@ import forge.view.arcane.CardPanel; *

(V at beginning of class name denotes a view class.) */ public enum VStack implements IVDoc { - /** */ SINGLETON_INSTANCE; // Fields used with interface IVDoc @@ -80,65 +78,40 @@ public enum VStack implements IVDoc { private VStack() { } - //========= Overridden methods - - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#populate() - */ @Override public void populate() { parentCell.getBody().setLayout(new MigLayout("insets 3px, gap 0")); parentCell.getBody().add(scroller, "grow, push"); } - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#setParentCell() - */ @Override public void setParentCell(final DragCell cell0) { - this.parentCell = cell0; + parentCell = cell0; } - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getParentCell() - */ @Override public DragCell getParentCell() { - return this.parentCell; + return parentCell; } - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getDocumentID() - */ @Override public EDocID getDocumentID() { return EDocID.REPORT_STACK; } - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getTabLabel() - */ @Override public DragTab getTabLabel() { return tab; } - /* (non-Javadoc) - * @see forge.gui.framework.IVDoc#getLayoutControl() - */ @Override public CStack getLayoutControl() { return CStack.SINGLETON_INSTANCE; } - //========== Observer update methods - - /** - * @param models - * @param viewer */ public void updateStack() { - final LocalGameView model = MatchUtil.getGameView(); - final List items = model.getStack(); + final GameView model = MatchUtil.getGameView(); + final FCollection.FCollectionView items = model.getStack(); tab.setText("Stack : " + items.size()); // No need to update the rest unless it's showing @@ -155,7 +128,7 @@ public enum VStack implements IVDoc { //update the Card Picture/Detail when the spell is added to the stack if (isFirst) { isFirst = false; - CMatchUI.SINGLETON_INSTANCE.setCard(item.getSource()); + CMatchUI.SINGLETON_INSTANCE.setCard(item.getSourceCard()); } } @@ -178,10 +151,10 @@ public enum VStack implements IVDoc { private final CardView sourceCard; - public StackInstanceTextArea(final LocalGameView gameView, final StackItemView item) { - sourceCard = item.getSource(); + public StackInstanceTextArea(final GameView gameView, final StackItemView item) { + sourceCard = item.getSourceCard(); - final PlayerView localPlayer = gameView.getPlayerView(MatchUtil.getCurrentPlayer(), false); + final PlayerView localPlayer = PlayerView.get(MatchUtil.getCurrentPlayer()); final String txt = (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer) ? "(OPTIONAL) " : "") + item.getText(); @@ -200,7 +173,7 @@ public enum VStack implements IVDoc { @Override public void mouseEntered(final MouseEvent e) { if (!txt.startsWith("Morph ")) { - CMatchUI.SINGLETON_INSTANCE.setCard(item.getSource()); + CMatchUI.SINGLETON_INSTANCE.setCard(item.getSourceCard()); } } }); @@ -216,13 +189,13 @@ public enum VStack implements IVDoc { onClick(e); } private void onClick(MouseEvent e) { - abilityMenu.setStackInstance(gameView, item, localPlayer); + abilityMenu.setStackInstance(MatchUtil.getHumanController(), item, localPlayer); abilityMenu.show(e.getComponent(), e.getX(), e.getY()); } }); } - final DetailColors color = CardDetailUtil.getBorderColor(item.getSource().getOriginal()); + final DetailColors color = CardDetailUtil.getBorderColor(item.getSourceCard().getOriginal()); setBackground(new Color(color.r, color.g, color.b)); setForeground(FSkin.getHighContrastColor(getBackground())); } @@ -248,7 +221,7 @@ public enum VStack implements IVDoc { private final JCheckBoxMenuItem jmiAutoYield; private final JCheckBoxMenuItem jmiAlwaysYes; private final JCheckBoxMenuItem jmiAlwaysNo; - private IGameView game; + private PlayerControllerHuman humanController; private StackItemView item; private Integer triggerID = 0; @@ -259,9 +232,9 @@ public enum VStack implements IVDoc { @Override public void actionPerformed(ActionEvent arg0) { final String key = item.getKey(); - final boolean autoYield = game.shouldAutoYield(key); - game.setShouldAutoYield(key, !autoYield); - if (!autoYield && game.peekStack() == item) { + final boolean autoYield = humanController.shouldAutoYield(key); + humanController.setShouldAutoYield(key, !autoYield); + if (!autoYield && MatchUtil.getGameView().peekStack() == item) { //auto-pass priority if ability is on top of stack CPrompt.SINGLETON_INSTANCE.passPriority(); } @@ -273,14 +246,14 @@ public enum VStack implements IVDoc { jmiAlwaysYes.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { - if (game.shouldAlwaysAcceptTrigger(triggerID)) { - game.setShouldAlwaysAskTrigger(triggerID); + if (humanController.shouldAlwaysAcceptTrigger(triggerID)) { + humanController.setShouldAlwaysAskTrigger(triggerID); } else { - game.setShouldAlwaysAcceptTrigger(triggerID); - if (game.peekStack() == item) { + humanController.setShouldAlwaysAcceptTrigger(triggerID); + if (MatchUtil.getGameView().peekStack() == item) { //auto-yes if ability is on top of stack - game.confirm(); + humanController.confirm(); } } } @@ -291,14 +264,14 @@ public enum VStack implements IVDoc { jmiAlwaysNo.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent arg0) { - if (game.shouldAlwaysDeclineTrigger(triggerID)) { - game.setShouldAlwaysAskTrigger(triggerID); + if (humanController.shouldAlwaysDeclineTrigger(triggerID)) { + humanController.setShouldAlwaysAskTrigger(triggerID); } else { - game.setShouldAlwaysDeclineTrigger(triggerID); - if (game.peekStack() == item) { + humanController.setShouldAlwaysDeclineTrigger(triggerID); + if (MatchUtil.getGameView().peekStack() == item) { //auto-no if ability is on top of stack - game.confirm(); + humanController.confirm(); } } } @@ -306,16 +279,16 @@ public enum VStack implements IVDoc { add(jmiAlwaysNo); } - public void setStackInstance(final IGameView game, final StackItemView item, final PlayerView localPlayer) { - this.game = game; - this.item = item; + public void setStackInstance(final PlayerControllerHuman humanController0, final StackItemView item0, final PlayerView localPlayer0) { + humanController = humanController0; + item = item0; triggerID = Integer.valueOf(item.getSourceTrigger()); - jmiAutoYield.setSelected(game.shouldAutoYield(item.getKey())); + jmiAutoYield.setSelected(humanController.shouldAutoYield(item.getKey())); - if (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer)) { - jmiAlwaysYes.setSelected(game.shouldAlwaysAcceptTrigger(triggerID)); - jmiAlwaysNo.setSelected(game.shouldAlwaysDeclineTrigger(triggerID)); + if (item.isOptionalTrigger() && item.getActivatingPlayer().equals(localPlayer0)) { + jmiAlwaysYes.setSelected(humanController.shouldAlwaysAcceptTrigger(triggerID)); + jmiAlwaysNo.setSelected(humanController.shouldAlwaysDeclineTrigger(triggerID)); jmiAlwaysYes.setVisible(true); jmiAlwaysNo.setVisible(true); } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java index 138647f7f3b..2b67badf786 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/imaging/FImageUtil.java @@ -23,11 +23,11 @@ import java.awt.image.BufferedImage; import java.awt.image.ColorModel; import forge.ImageCache; +import forge.game.card.CardView.CardStateView; import forge.model.FModel; import forge.properties.ForgePreferences; import forge.toolbox.CardFaceSymbols; import forge.toolbox.FSkin.SkinIcon; -import forge.view.CardView.CardStateView; /** * Common image-related routines specific to Forge images. diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java index 21aa89b8764..aeee254e4e8 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardViewer.java @@ -26,11 +26,11 @@ import javax.swing.JPanel; import javax.swing.event.ListSelectionEvent; import javax.swing.event.ListSelectionListener; +import forge.game.card.CardView; import forge.gui.CardDetailPanel; import forge.gui.CardPicturePanel; import forge.item.PaperCard; import forge.toolbox.FScrollPane; -import forge.view.ViewUtil; /** * A simple JPanel that shows three columns: card list, pic, and description.. @@ -40,7 +40,6 @@ import forge.view.ViewUtil; */ @SuppressWarnings("serial") public class CardViewer extends JPanel { - // Data and number of choices for the list private final List list; @@ -49,12 +48,6 @@ public class CardViewer extends JPanel { private final CardDetailPanel detail; private final CardPicturePanel picture; - /** - * Instantiates a new card viewer. - * - * @param list - * the list - */ public CardViewer(final List list) { this.list = Collections.unmodifiableList(list); this.jList = new JList(new ChooserListModel()); @@ -72,7 +65,6 @@ public class CardViewer extends JPanel { } private class ChooserListModel extends AbstractListModel { - private static final long serialVersionUID = 3871965346333840556L; @Override @@ -93,11 +85,9 @@ public class CardViewer extends JPanel { // (String) jList.getSelectedValue(); if ((row >= 0) && (row < CardViewer.this.list.size())) { final PaperCard cp = CardViewer.this.list.get(row); - CardViewer.this.detail.setCard(ViewUtil.getCardForUi(cp)); + CardViewer.this.detail.setCard(CardView.getCardForUi(cp)); CardViewer.this.picture.setCard(cp); } } - } - } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java index df90c6bff96..761715dbedd 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/CardZoomer.java @@ -32,6 +32,8 @@ import javax.swing.Timer; import net.miginfocom.swing.MigLayout; import forge.assets.FSkinProp; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; import forge.gui.SOverlayUtils; import forge.toolbox.FOverlay; import forge.toolbox.FSkin; @@ -39,8 +41,6 @@ import forge.toolbox.FSkin.SkinnedLabel; import forge.toolbox.imaging.FImagePanel; import forge.toolbox.imaging.FImagePanel.AutoSizeImageMode; import forge.toolbox.imaging.FImageUtil; -import forge.view.CardView; -import forge.view.CardView.CardStateView; /** * Displays card image at its original size and correct orientation. @@ -201,7 +201,7 @@ public enum CardZoomer { * Displays a graphical indicator that shows whether the current card can be flipped or transformed. */ private void setFlipIndicator() { - if (thisCard.hasAltState()) { + if (thisCard.getAlternate() != null) { imagePanel.setLayout(new MigLayout("insets 0, w 100%!, h 100%!")); imagePanel.add(lblFlipcard, "pos (100% - 100px) 0"); } @@ -276,7 +276,7 @@ public enum CardZoomer { * Toggles between primary and alternate image associated with card if applicable. */ private void toggleCardImage() { - if (thisCard.hasAltState()) { + if (thisCard.getAlternate() != null) { toggleFlipCard(); } } diff --git a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java index 31545edd578..d3b37e86d0c 100644 --- a/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java +++ b/forge-gui-desktop/src/main/java/forge/toolbox/special/PlayerDetailsPanel.java @@ -18,12 +18,12 @@ import com.google.common.base.Function; import forge.assets.FSkinProp; import forge.card.MagicColor; +import forge.game.player.PlayerView; import forge.gui.ForgeAction; import forge.screens.match.controllers.CPlayers; import forge.toolbox.FLabel; import forge.toolbox.FSkin; import forge.toolbox.FSkin.SkinnedPanel; -import forge.view.PlayerView; public class PlayerDetailsPanel extends JPanel { private static final long serialVersionUID = 8444559244193214459L; @@ -119,14 +119,14 @@ public class PlayerDetailsPanel extends JPanel { * @param p0   {@link forge.game.player.Player} */ public void updateZones() { - this.getLblHand().setText("" + player.getnHandCards()); + this.getLblHand().setText("" + player.getHandSize()); final String handMaxToolTip = player.hasUnlimitedHandSize() ? "no maximum hand size" : String.valueOf(player.getMaxHandSize()); this.getLblHand().setToolTipText("Cards in hand (max: " + handMaxToolTip + ")"); - this.getLblGraveyard().setText("" + player.getGraveCards().size()); - this.getLblLibrary().setText("" + player.getnLibraryCards()); - this.getLblFlashback().setText("" + player.getFlashbackCards().size()); - this.getLblExile().setText("" + player.getExileCards().size()); + this.getLblGraveyard().setText("" + player.getGraveyardSize()); + this.getLblLibrary().setText("" + player.getLibrarySize()); + this.getLblFlashback().setText("" + player.getFlashbackSize()); + this.getLblExile().setText("" + player.getExileSize()); } diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java index 378be39d217..721f84fa311 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanel.java @@ -37,6 +37,8 @@ import javax.swing.SwingUtilities; import forge.ImageCache; import forge.card.CardEdition; import forge.card.mana.ManaCost; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; import forge.gui.CardContainer; import forge.match.MatchUtil; import forge.model.FModel; @@ -44,8 +46,6 @@ import forge.properties.ForgePreferences.FPref; import forge.toolbox.CardFaceSymbols; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.IDisposable; -import forge.view.CardView; -import forge.view.CardView.CardStateView; import forge.view.arcane.util.OutlinedLabel; /** @@ -117,21 +117,21 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * a {@link forge.game.card.Card} object. */ public CardPanel(final CardView card0) { - this.setBackground(Color.black); - this.setOpaque(false); + setBackground(Color.black); + setOpaque(false); createCardNameOverlay(); createPTOverlay(); createCardIdOverlay(); createScaleImagePanel(); - this.setCard(card0); + setCard(card0); } private void createScaleImagePanel() { - this.imagePanel = new ScaledImagePanel(); - this.add(this.imagePanel); - this.addComponentListener(new ComponentAdapter() { + imagePanel = new ScaledImagePanel(); + add(imagePanel); + addComponentListener(new ComponentAdapter() { @Override public void componentShown(final ComponentEvent e) { CardPanel.this.setCard(CardPanel.this.getCard()); @@ -144,224 +144,157 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } private void createCardNameOverlay() { - this.titleText = new OutlinedLabel(); - this.titleText.setFont(this.getFont().deriveFont(Font.BOLD, 13f)); - this.titleText.setForeground(Color.white); - this.titleText.setGlow(Color.black); - this.titleText.setWrap(true); - this.add(this.titleText); + titleText = new OutlinedLabel(); + titleText.setFont(getFont().deriveFont(Font.BOLD, 13f)); + titleText.setForeground(Color.white); + titleText.setGlow(Color.black); + titleText.setWrap(true); + add(titleText); } private void createPTOverlay() { // Power/Toughness - this.ptText = new OutlinedLabel(); - this.ptText.setFont(this.getFont().deriveFont(Font.BOLD, 13f)); - this.ptText.setForeground(Color.white); - this.ptText.setGlow(Color.black); - this.add(this.ptText); + ptText = new OutlinedLabel(); + ptText.setFont(getFont().deriveFont(Font.BOLD, 13f)); + ptText.setForeground(Color.white); + ptText.setGlow(Color.black); + add(ptText); // Damage - this.damageText = new OutlinedLabel(); - this.damageText.setFont(this.getFont().deriveFont(Font.BOLD, 15f)); - this.damageText.setForeground(new Color(160,0,0)); - this.damageText.setGlow(Color.white); - this.add(this.damageText); + damageText = new OutlinedLabel(); + damageText.setFont(getFont().deriveFont(Font.BOLD, 15f)); + damageText.setForeground(new Color(160,0,0)); + damageText.setGlow(Color.white); + add(damageText); } private void createCardIdOverlay() { - this.cardIdText = new OutlinedLabel(); - this.cardIdText.setFont(this.getFont().deriveFont(Font.BOLD, 11f)); - this.cardIdText.setForeground(Color.LIGHT_GRAY); - this.cardIdText.setGlow(Color.black); - this.add(this.cardIdText); + cardIdText = new OutlinedLabel(); + cardIdText.setFont(getFont().deriveFont(Font.BOLD, 11f)); + cardIdText.setForeground(Color.LIGHT_GRAY); + cardIdText.setGlow(Color.black); + add(cardIdText); } - /** - *

- * setImage. - *

- * - * @param srcImage - * a {@link java.awt.Image} object. - * @param srcImageBlurred - * a {@link java.awt.Image} object. - * @param srcImageBlurred - * a {@link java.awt.Image} object. - */ private void setImage(final BufferedImage srcImage) { - synchronized (this.imagePanel) { - this.imagePanel.setImage(srcImage); - this.repaint(); - for (final CardPanel cardPanel : this.imageLoadListeners) { + synchronized (imagePanel) { + imagePanel.setImage(srcImage); + repaint(); + for (final CardPanel cardPanel : imageLoadListeners) { cardPanel.setImage(srcImage); cardPanel.repaint(); } - this.imageLoadListeners.clear(); + imageLoadListeners.clear(); } - this.doLayout(); + doLayout(); } - /** - *

- * setImage. - *

- * - * @param panel - * a {@link forge.view.arcane.CardPanel} object. - */ public final void setImage(final CardPanel panel) { if (panel == this) { throw new IllegalArgumentException("Can't pass 'this' as argument to CardPanel#setImage"); } synchronized (panel.imagePanel) { if (panel.imagePanel.hasImage()) { - this.setImage(panel.imagePanel.getSrcImage()); + setImage(panel.imagePanel.getSrcImage()); } else { panel.imageLoadListeners.add(this); } } } - /** - *

- * Setter for the field displayEnabled. - *

- * - * @param displayEnabled - * a boolean. - */ - public final void setDisplayEnabled(final boolean displayEnabled) { - this.displayEnabled = displayEnabled; - } - - /** - *

- * isDisplayEnabled. - *

- * - * @return a boolean. - */ public final boolean isDisplayEnabled() { - return this.displayEnabled; + return displayEnabled; + } + public final void setDisplayEnabled(final boolean displayEnabled0) { + displayEnabled = displayEnabled0; } - /** - *

- * setAnimationPanel. - *

- * - * @param isAnimationPanel - * a boolean. - */ - public final void setAnimationPanel(final boolean isAnimationPanel) { - this.isAnimationPanel = isAnimationPanel; + public final void setAnimationPanel(final boolean isAnimationPanel0) { + isAnimationPanel = isAnimationPanel0; } - /** - *

- * setSelected. - *

- * - * @param isSelected - * a boolean. - */ - public final void setSelected(final boolean isSelected) { - this.isSelected = isSelected; - this.repaint(); - } - - /** - *

- * isSelected. - *

- * - * @return a boolean. - */ public final boolean isSelected() { - return this.isSelected; + return isSelected; + } + public final void setSelected(final boolean isSelected0) { + isSelected = isSelected0; + repaint(); } - /** {@inheritDoc} */ + @Override public final void paint(final Graphics g) { - if (!this.displayEnabled) { + if (!displayEnabled) { return; } - if (!this.isValid()) { + if (!isValid()) { super.validate(); } Graphics2D g2d = (Graphics2D) g; - if (this.getTappedAngle() > 0) { + if (getTappedAngle() > 0) { g2d = (Graphics2D) g2d.create(); - final float edgeOffset = this.cardWidth / 2f; - g2d.rotate(this.getTappedAngle(), this.cardXOffset + edgeOffset, (this.cardYOffset + this.cardHeight) + final float edgeOffset = cardWidth / 2f; + g2d.rotate(getTappedAngle(), cardXOffset + edgeOffset, (cardYOffset + cardHeight) - edgeOffset); } super.paint(g2d); } - /** {@inheritDoc} */ @Override protected final void paintComponent(final Graphics g) { final Graphics2D g2d = (Graphics2D) g; g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - final int cornerSize = Math.max(4, Math.round(this.cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); - final int offset = this.isTapped() ? 1 : 0; + final int cornerSize = Math.max(4, Math.round(cardWidth * CardPanel.ROUNDED_CORNER_SIZE)); + final int offset = isTapped() ? 1 : 0; // Magenta outline for when card was chosen to pay - if (MatchUtil.isUsedToPay(this.getCard())) { + if (MatchUtil.isUsedToPay(getCard())) { g2d.setColor(Color.magenta); - 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); + final int n2 = Math.max(1, Math.round(2 * cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + g2d.fillRoundRect(cardXOffset - n2, (cardYOffset - n2) + offset, cardWidth + (n2 * 2), cardHeight + (n2 * 2), cornerSize + n2, cornerSize + n2); } // Green outline for hover - if (this.isSelected) { + if (isSelected) { g2d.setColor(Color.green); - final int n = Math.max(1, Math.round(this.cardWidth * CardPanel.SELECTED_BORDER_SIZE)); - g2d.fillRoundRect(this.cardXOffset - n, (this.cardYOffset - n) + offset, this.cardWidth + (n * 2), this.cardHeight + (n * 2), cornerSize + n , cornerSize + n); + final int n = Math.max(1, Math.round(cardWidth * CardPanel.SELECTED_BORDER_SIZE)); + g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); } // Black fill - (will become outline for white bordered cards) final int n = 0; g2d.setColor(Color.black); - g2d.fillRoundRect(this.cardXOffset - n, (this.cardYOffset - n) + offset, this.cardWidth + (n * 2), this.cardHeight + (n * 2), cornerSize + n , cornerSize + n); + g2d.fillRoundRect(cardXOffset - n, (cardYOffset - n) + offset, cardWidth + (n * 2), cardHeight + (n * 2), cornerSize + n , cornerSize + n); // White border if card is known to have it. - if (this.getCard() != null) { - CardEdition ed = FModel.getMagicDb().getEditions().get(this.getCard().getSetCode()); - if (ed != null && ed.isWhiteBorder() && this.getCard().getOriginal().getFoilIndex() == 0) { + if (getCard() != null) { + CardEdition ed = FModel.getMagicDb().getEditions().get(getCard().getSetCode()); + if (ed != null && ed.isWhiteBorder() && getCard().getOriginal().getFoilIndex() == 0) { g2d.setColor(Color.white); int ins = 1; - g2d.fillRoundRect(this.cardXOffset + ins, this.cardYOffset + ins, this.cardWidth - ins*2, this.cardHeight - ins*2, cornerSize-ins, cornerSize-ins); + g2d.fillRoundRect(cardXOffset + ins, cardYOffset + ins, cardWidth - ins*2, cardHeight - ins*2, cornerSize-ins, cornerSize-ins); } } } - /** - * TODO: Write javadoc for this method. - * @param g - * @param manaCost - */ private void drawManaCost(final Graphics g, ManaCost cost, int deltaY) { int width = CardFaceSymbols.getWidth(cost); int height = CardFaceSymbols.getHeight(); - CardFaceSymbols.draw(g, cost, (this.cardXOffset + (this.cardWidth / 2)) - (width / 2), deltaY + this.cardYOffset + (this.cardHeight / 2) - height/2); + CardFaceSymbols.draw(g, cost, (cardXOffset + (cardWidth / 2)) - (width / 2), deltaY + cardYOffset + (cardHeight / 2) - height/2); } - /** {@inheritDoc} */ @Override protected final void paintChildren(final Graphics g) { super.paintChildren(g); - if (this.isAnimationPanel || this.card == null) { + if (isAnimationPanel || card == null) { return; } displayIconOverlay(g); - drawFoilEffect(g, card, this.cardXOffset, this.cardYOffset, - this.cardWidth, this.cardHeight, Math.round(this.cardWidth * BLACK_BORDER_SIZE)); + drawFoilEffect(g, card, cardXOffset, cardYOffset, + cardWidth, cardHeight, Math.round(cardWidth * BLACK_BORDER_SIZE)); } public static void drawFoilEffect(final Graphics g, final CardView card2, final int x, final int y, final int width, final int height, final int borderSize) { @@ -376,15 +309,15 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl @Override public final void doLayout() { - final int borderSize = Math.round(this.cardWidth * CardPanel.BLACK_BORDER_SIZE); + final int borderSize = Math.round(cardWidth * CardPanel.BLACK_BORDER_SIZE); - final Point imgPos = new Point(this.cardXOffset + borderSize, this.cardYOffset + borderSize); - final Dimension imgSize = new Dimension(this.cardWidth - (borderSize * 2), this.cardHeight - (borderSize * 2)); + final Point imgPos = new Point(cardXOffset + borderSize, cardYOffset + borderSize); + final Dimension imgSize = new Dimension(cardWidth - (borderSize * 2), cardHeight - (borderSize * 2)); - this.imagePanel.setLocation(imgPos); - this.imagePanel.setSize(imgSize); + imagePanel.setLocation(imgPos); + imagePanel.setSize(imgSize); - boolean showText = !this.imagePanel.hasImage() || !this.isAnimationPanel; + boolean showText = !imagePanel.hasImage() || !isAnimationPanel; displayCardNameOverlay(showText && showCardNameOverlay(), imgSize, imgPos); displayPTOverlay(showText && showCardPowerOverlay(), imgSize, imgPos); @@ -393,33 +326,33 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl private void displayCardIdOverlay(boolean isVisible, Dimension imgSize, Point imgPos) { if (isVisible) { - final Dimension idSize = this.cardIdText.getPreferredSize(); - this.cardIdText.setSize(idSize.width, idSize.height); + final Dimension idSize = cardIdText.getPreferredSize(); + cardIdText.setSize(idSize.width, idSize.height); final int idX = Math.round(imgSize.width * (24f / 480)); final int idY = Math.round(imgSize.height * (650f / 680)) - 8; - this.cardIdText.setLocation(imgPos.x + idX, imgPos.y + idY); + cardIdText.setLocation(imgPos.x + idX, imgPos.y + idY); } - this.cardIdText.setVisible(isVisible); + cardIdText.setVisible(isVisible); } private void displayPTOverlay(boolean isVisible, Dimension imgSize, Point imgPos) { if (isVisible) { final int rightLine = Math.round(imgSize.width * (412f / 480)) + 3; // Power - final Dimension ptSize = this.ptText.getPreferredSize(); - this.ptText.setSize(ptSize.width, ptSize.height); + final Dimension ptSize = ptText.getPreferredSize(); + ptText.setSize(ptSize.width, ptSize.height); final int ptX = rightLine - ptSize.width/2; final int ptY = Math.round(imgSize.height * (650f / 680)) - 10; - this.ptText.setLocation(imgPos.x + ptX, imgPos.y + ptY); + ptText.setLocation(imgPos.x + ptX, imgPos.y + ptY); // Toughness - final Dimension dmgSize = this.damageText.getPreferredSize(); - this.damageText.setSize(dmgSize.width, dmgSize.height); + final Dimension dmgSize = damageText.getPreferredSize(); + damageText.setSize(dmgSize.width, dmgSize.height); final int dmgX = rightLine - dmgSize.width / 2; final int dmgY = ptY - 16; - this.damageText.setLocation(imgPos.x + dmgX, imgPos.y + dmgY); + damageText.setLocation(imgPos.x + dmgX, imgPos.y + dmgY); } - this.ptText.setVisible(isVisible); - this.damageText.setVisible(isVisible); + ptText.setVisible(isVisible); + damageText.setVisible(isVisible); } private void displayCardNameOverlay(boolean isVisible, Dimension imgSize, Point imgPos) { @@ -427,13 +360,13 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl final int titleX = Math.round(imgSize.width * (24f / 480)); final int titleY = Math.round(imgSize.height * (54f / 640)) - 15; final int titleH = Math.round(imgSize.height * (360f / 640)); - this.titleText.setBounds(imgPos.x + titleX, imgPos.y + titleY + 2, imgSize.width - 2 * titleX, titleH - titleY); + titleText.setBounds(imgPos.x + titleX, imgPos.y + titleY + 2, imgSize.width - 2 * titleX, titleH - titleY); } - this.titleText.setVisible(isVisible); + titleText.setVisible(isVisible); } private void displayIconOverlay(final Graphics g) { - if (showCardManaCostOverlay() && this.cardWidth < 200) { + if (showCardManaCostOverlay() && cardWidth < 200) { final boolean showSplitMana = card.isSplitCard(); if (!showSplitMana) { drawManaCost(g, card.getOriginal().getManaCost(), 0); @@ -444,26 +377,28 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } int number = 0; - for (final Integer i : card.getCounters().values()) { - number += i.intValue(); + if (card.getCounters() != null) { + for (final Integer i : card.getCounters().values()) { + number += i.intValue(); + } } final int counters = number; - final int yCounters = (this.cardYOffset + this.cardHeight) - (this.cardHeight / 3) - 40; + final int yCounters = (cardYOffset + cardHeight) - (cardHeight / 3) - 40; if (counters == 1) { - CardFaceSymbols.drawSymbol("counters1", g, this.cardXOffset - 15, yCounters); + CardFaceSymbols.drawSymbol("counters1", g, cardXOffset - 15, yCounters); } else if (counters == 2) { - CardFaceSymbols.drawSymbol("counters2", g, this.cardXOffset - 15, yCounters); + CardFaceSymbols.drawSymbol("counters2", g, cardXOffset - 15, yCounters); } else if (counters == 3) { - CardFaceSymbols.drawSymbol("counters3", g, this.cardXOffset - 15, yCounters); + CardFaceSymbols.drawSymbol("counters3", g, cardXOffset - 15, yCounters); } else if (counters > 3) { - CardFaceSymbols.drawSymbol("countersMulti", g, this.cardXOffset - 15, yCounters); + CardFaceSymbols.drawSymbol("countersMulti", g, cardXOffset - 15, yCounters); } - final int combatXSymbols = (this.cardXOffset + (this.cardWidth / 4)) - 16; - final int stateXSymbols = (this.cardXOffset + (this.cardWidth / 2)) - 16; - final int ySymbols = (this.cardYOffset + this.cardHeight) - (this.cardHeight / 8) - 16; + final int combatXSymbols = (cardXOffset + (cardWidth / 4)) - 16; + final int stateXSymbols = (cardXOffset + (cardWidth / 2)) - 16; + final int ySymbols = (cardYOffset + cardHeight) - (cardHeight / 8) - 16; if (card.isAttacking()) { CardFaceSymbols.drawSymbol("attack", g, combatXSymbols, ySymbols); @@ -481,131 +416,70 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } if (MatchUtil.isUsedToPay(card)) { - CardFaceSymbols.drawSymbol("sacrifice", g, (this.cardXOffset + (this.cardWidth / 2)) - 20, - (this.cardYOffset + (this.cardHeight / 2)) - 20); + CardFaceSymbols.drawSymbol("sacrifice", g, (cardXOffset + (cardWidth / 2)) - 20, + (cardYOffset + (cardHeight / 2)) - 20); } } @Override public final String toString() { - return this.getCard().toString(); + return getCard().toString(); } - /** - *

- * setCardBounds. - *

- * - * @param x - * a int. - * @param y - * a int. - * @param width - * a int. - * @param height - * a int. - */ public final void setCardBounds(final int x, final int y, int width, int height) { - this.cardWidth = width; - this.cardHeight = height; + cardWidth = width; + cardHeight = height; final int rotCenterX = Math.round(width / 2f); final int rotCenterY = height - rotCenterX; final int rotCenterToTopCorner = Math.round(width * CardPanel.ROT_CENTER_TO_TOP_CORNER); final int rotCenterToBottomCorner = Math.round(width * CardPanel.ROT_CENTER_TO_BOTTOM_CORNER); final int xOffset = rotCenterX - rotCenterToBottomCorner; final int yOffset = rotCenterY - rotCenterToTopCorner; - this.cardXOffset = -xOffset; - this.cardYOffset = -yOffset; + cardXOffset = -xOffset; + cardYOffset = -yOffset; width = -xOffset + rotCenterX + rotCenterToTopCorner; height = -yOffset + rotCenterY + rotCenterToBottomCorner; - this.setBounds(x + xOffset, y + yOffset, width, height); + setBounds(x + xOffset, y + yOffset, width, height); } - /** - *

- * repaint. - *

- */ @Override public final void repaint() { - final Rectangle b = this.getBounds(); + final Rectangle b = getBounds(); final JRootPane rootPane = SwingUtilities.getRootPane(this); if (rootPane == null) { return; } - final Point p = SwingUtilities.convertPoint(this.getParent(), b.x, b.y, rootPane); + final Point p = SwingUtilities.convertPoint(getParent(), b.x, b.y, rootPane); rootPane.repaint(p.x, p.y, b.width, b.height); } - /** - *

- * getCardX. - *

- * - * @return a int. - */ public final int getCardX() { - return this.getX() + this.cardXOffset; + return getX() + cardXOffset; } - /** - *

- * getCardY. - *

- * - * @return a int. - */ public final int getCardY() { - return this.getY() + this.cardYOffset; + return getY() + cardYOffset; } - /** - *

- * Getter for the field cardWidth. - *

- * - * @return a int. - */ public final int getCardWidth() { - return this.cardWidth; + return cardWidth; } - /** - *

- * Getter for the field cardHeight. - *

- * - * @return a int. - */ public final int getCardHeight() { - return this.cardHeight; + return cardHeight; } - /** - *

- * getCardLocation. - *

- * - * @return a {@link java.awt.Point} object. - */ public final Point getCardLocation() { - final Point p = this.getLocation(); - p.x += this.cardXOffset; - p.y += this.cardYOffset; + final Point p = getLocation(); + p.x += cardXOffset; + p.y += cardYOffset; return p; } - /** - *

- * getCardLocationOnScreen. - *

- * - * @return a {@link java.awt.Point} object. - */ public final Point getCardLocationOnScreen() { - final Point p = this.getLocationOnScreen(); - p.x += this.cardXOffset; - p.y += this.cardYOffset; + final Point p = getLocationOnScreen(); + p.x += cardXOffset; + p.y += cardYOffset; return p; } @@ -615,13 +489,13 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } // Card name overlay - this.titleText.setText(card.getOriginal().getName()); + titleText.setText(card.getOriginal().getName()); int damage = card.getDamage(); - this.damageText.setText(damage > 0 ? "\u00BB " + String.valueOf(damage) + " \u00AB" : ""); + damageText.setText(damage > 0 ? "\u00BB " + String.valueOf(damage) + " \u00AB" : ""); // Card Id overlay - this.cardIdText.setText(Integer.toString(card.getId())); + cardIdText.setText(Integer.toString(card.getId())); } public final void updatePTOverlay() { @@ -637,46 +511,41 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl else if (state.isPlaneswalker()) { sPt = String.valueOf(state.getLoyalty()); } - this.ptText.setText(sPt); + ptText.setText(sPt); } - /** - * Gets the card. - * - * @return the card - */ @Override public final CardView getCard() { - return this.card; + return card; } /** {@inheritDoc} */ @Override public final void setCard(final CardView cardView) { - if ((this.getCard() != null) && this.getCard().equals(cardView) && this.isAnimationPanel - && this.imagePanel.hasImage()) { + if ((getCard() != null) && getCard().equals(cardView) && isAnimationPanel + && imagePanel.hasImage()) { return; } - this.card = cardView; + card = cardView; - if (this.imagePanel == null) { + if (imagePanel == null) { return; } final BufferedImage image = cardView == null ? null : ImageCache.getImage(cardView, imagePanel.getWidth(), imagePanel.getHeight()); - this.updateText(); - this.updatePTOverlay(); + updateText(); + updatePTOverlay(); - this.setImage(image); + setImage(image); } public void dispose() { - this.attachedToPanel = null; - this.attachedPanels = null; - this.imagePanel.setImage(null); - this.imagePanel = null; - this.card = null; + attachedToPanel = null; + attachedPanels = null; + imagePanel.setImage(null); + imagePanel = null; + card = null; } /** @@ -704,7 +573,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * @return the attachedToPanel */ public final CardPanel getAttachedToPanel() { - return this.attachedToPanel; + return attachedToPanel; } /** @@ -714,7 +583,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * the attachedToPanel to set */ public final void setAttachedToPanel(final CardPanel attachedToPanel0) { - this.attachedToPanel = attachedToPanel0; + attachedToPanel = attachedToPanel0; } /** @@ -723,7 +592,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * @return the attachedPanels */ public final List getAttachedPanels() { - return this.attachedPanels; + return attachedPanels; } /** @@ -733,7 +602,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * the attachedPanels to set */ public final void setAttachedPanels(final List attachedPanels0) { - this.attachedPanels = attachedPanels0; + attachedPanels = attachedPanels0; } /** @@ -742,7 +611,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * @return the tapped */ public final boolean isTapped() { - return this.tapped; + return tapped; } /** @@ -752,7 +621,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * the tapped to set */ public final void setTapped(final boolean tapped0) { - this.tapped = tapped0; + tapped = tapped0; } /** @@ -761,7 +630,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * @return the tappedAngle */ public final double getTappedAngle() { - return this.tappedAngle; + return tappedAngle; } /** @@ -771,7 +640,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl * the tappedAngle to set */ public final void setTappedAngle(final double tappedAngle0) { - this.tappedAngle = tappedAngle0; + tappedAngle = tappedAngle0; } /** @@ -788,7 +657,7 @@ public class CardPanel extends SkinnedPanel implements CardContainer, IDisposabl } private boolean isShowingOverlays() { - return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && this.card != null; + return isPreferenceEnabled(FPref.UI_SHOW_CARD_OVERLAYS) && card != null; } private boolean showCardNameOverlay() { diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java index 599cbd42419..d6447d82af6 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/CardPanelContainer.java @@ -30,11 +30,11 @@ import java.util.List; import javax.swing.SwingUtilities; import forge.FThreads; +import forge.game.card.CardView; import forge.screens.match.CMatchUI; import forge.toolbox.FScrollPane; import forge.toolbox.FSkin.SkinnedPanel; import forge.toolbox.special.CardZoomer; -import forge.view.CardView; import forge.view.arcane.util.CardPanelMouseListener; /** diff --git a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java index e512db5dfd6..4df390febfb 100644 --- a/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java +++ b/forge-gui-desktop/src/main/java/forge/view/arcane/PlayArea.java @@ -28,14 +28,14 @@ import java.util.List; import com.google.common.collect.Lists; import forge.FThreads; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.screens.match.CMatchUI; import forge.screens.match.controllers.CPrompt; import forge.toolbox.FScrollPane; import forge.toolbox.MouseTriggerEvent; -import forge.view.CardView; -import forge.view.CardView.CardStateView; -import forge.view.PlayerView; import forge.view.arcane.util.Animation; import forge.view.arcane.util.CardPanelMouseListener; @@ -124,7 +124,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen break; } if (!panel.getAttachedPanels().isEmpty() - || !panel.getCard().getCounters().equals(firstPanel.getCard().getCounters()) + || !panel.getCard().hasSameCounters(firstPanel.getCard()) || firstPanel.getCard().isEnchanted() || (stack.size() == this.landStackMax)) { // If this land has attachments or the stack is full, // put it to the right. @@ -180,7 +180,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen final String firstText = firstState.getText(); if (!panel.getAttachedPanels().isEmpty() - || !card.getCounters().equals(firstPanel.getCard().getCounters()) + || !card.hasSameCounters(firstPanel.getCard()) || (card.isSick() != firstCard.isSick()) || (state.getPower() != firstState.getPower()) || (state.getToughness() != firstState.getToughness()) @@ -670,27 +670,33 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen } toPanel.getAttachedPanels().clear(); - final Iterable enchants = card.getEnchantedBy(); - for (final CardView e : enchants) { - final CardPanel cardE = getCardPanel(e.getId()); - if (cardE != null) { - toPanel.getAttachedPanels().add(cardE); + if (card.isEnchanted()) { + final Iterable enchants = card.getEnchantedBy(); + for (final CardView e : enchants) { + final CardPanel cardE = getCardPanel(e.getId()); + if (cardE != null) { + toPanel.getAttachedPanels().add(cardE); + } } } - final Iterable equips = card.getEquippedBy(); - for (final CardView e : equips) { - final CardPanel cardE = getCardPanel(e.getId()); - if (cardE != null) { - toPanel.getAttachedPanels().add(cardE); + if (card.isEquipped()) { + final Iterable equips = card.getEquippedBy(); + for (final CardView e : equips) { + final CardPanel cardE = getCardPanel(e.getId()); + if (cardE != null) { + toPanel.getAttachedPanels().add(cardE); + } } } - final Iterable fortifications = card.getFortifiedBy(); - for (final CardView f : fortifications) { - final CardPanel cardE = getCardPanel(f.getId()); - if (cardE != null) { - toPanel.getAttachedPanels().add(cardE); + if (card.isFortified()) { + final Iterable fortifications = card.getFortifiedBy(); + for (final CardView f : fortifications) { + final CardPanel cardE = getCardPanel(f.getId()); + if (cardE != null) { + toPanel.getAttachedPanels().add(cardE); + } } } @@ -773,7 +779,7 @@ public class PlayArea extends CardPanelContainer implements CardPanelMouseListen final CardStateView thisState = thisCard.getOriginal(); if (otherState.getName().equals(thisState.getName()) && s.size() < othersStackMax) { if (panel.getAttachedPanels().isEmpty() - && thisCard.getCounters().equals(otherCard.getCounters()) + && thisCard.hasSameCounters(otherCard) && (thisCard.isSick() == otherCard.isSick()) && (thisCard.isCloned() == otherCard.isCloned())) { s.add(panel); diff --git a/forge-gui-mobile/src/forge/GuiMobile.java b/forge-gui-mobile/src/forge/GuiMobile.java index b16f3e04621..e4fe4063b9d 100644 --- a/forge-gui-mobile/src/forge/GuiMobile.java +++ b/forge-gui-mobile/src/forge/GuiMobile.java @@ -28,6 +28,8 @@ import forge.deck.FDeckViewer; import forge.deck.FSideboardDialog; import forge.error.BugReportDialog; import forge.game.GameEntity; +import forge.game.GameEntityView; +import forge.game.card.CardView; import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; import forge.interfaces.IGuiBase; @@ -49,8 +51,6 @@ import forge.util.ThreadUtil; import forge.util.WaitCallback; import forge.util.WaitRunnable; import forge.util.gui.SGuiChoose; -import forge.view.CardView; -import forge.view.GameEntityView; public class GuiMobile implements IGuiBase { private final String assetsDir; @@ -215,7 +215,7 @@ public class GuiMobile implements IGuiBase { @Override public GameEntityView chooseSingleEntityForEffect(final String title, final Collection optionList, final DelayedReveal delayedReveal, final boolean isOptional, final PlayerControllerHuman controller) { controller.tempShow(optionList); - final List choiceList = controller.getGameView().getGameEntityViews(optionList, false); + final List choiceList = GameEntityView.getEntityCollection(optionList); if (delayedReveal == null || Iterables.isEmpty(delayedReveal.getCards())) { if (isOptional) { @@ -225,7 +225,7 @@ public class GuiMobile implements IGuiBase { } controller.tempShow(delayedReveal.getCards()); - final List revealList = controller.getGameView().getCardViews(delayedReveal.getCards(), false); + final List revealList = CardView.getCollection(delayedReveal.getCards()); final String revealListCaption = StringUtils.capitalize(MessageUtil.formatMessage("{player's} " + delayedReveal.getZone().name(), controller.getPlayer(), delayedReveal.getOwner())); final FImage revealListImage = MatchController.getView().getPlayerPanels().values().iterator().next().getZoneTab(delayedReveal.getZone()).getIcon(); diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 8c96258d8ee..f67df031319 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -24,11 +24,11 @@ import com.google.common.cache.CacheBuilder; import com.google.common.cache.LoadingCache; import forge.ImageKeys; +import forge.game.card.CardView; import forge.game.player.IHasIcon; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.properties.ForgeConstants; -import forge.view.CardView; import org.apache.commons.lang3.StringUtils; diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index 3bea91ded03..f6e00dfc935 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -18,9 +18,9 @@ import forge.assets.TextRenderer; import forge.card.CardDetailUtil.DetailColors; import forge.card.CardRenderer.CardStackPosition; import forge.card.mana.ManaCost; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; import forge.screens.FScreen; -import forge.view.CardView; -import forge.view.CardView.CardStateView; public class CardImageRenderer { private static final float BASE_IMAGE_WIDTH = 360; @@ -166,7 +166,7 @@ public class CardImageRenderer { //draw mana cost for card float manaCostWidth = 0; ManaCost mainManaCost = state.getManaCost(); - if (card.isSplitCard() && card.hasAltState()) { + if (card.isSplitCard() && card.getAlternate() != null) { //handle rendering both parts of split card mainManaCost = state.getManaCost(); ManaCost otherManaCost = card.getAlternate().getManaCost(); diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index 78643c3d2b5..6e10ce42258 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -23,6 +23,8 @@ import forge.assets.ImageCache; import forge.assets.TextRenderer; import forge.card.CardDetailUtil.DetailColors; import forge.card.mana.ManaCost; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; import forge.item.IPaperCard; import forge.match.MatchUtil; import forge.model.FModel; @@ -31,9 +33,6 @@ import forge.toolbox.FCardPanel; import forge.toolbox.FDialog; import forge.toolbox.FList; import forge.util.Utils; -import forge.view.CardView; -import forge.view.CardView.CardStateView; -import forge.view.ViewUtil; public class CardRenderer { public enum CardStackPosition { @@ -284,7 +283,7 @@ public class CardRenderer { } } public static void drawCardListItem(Graphics g, FSkinFont font, FSkinColor foreColor, IPaperCard pc, int count, String suffix, float x, float y, float w, float h, boolean compactMode) { - final CardView card = ViewUtil.getCardForUi(pc); + final CardView card = CardView.getCardForUi(pc); final CardStateView state = card.getOriginal(); drawCardListItem(g, font, foreColor, getCardArt(pc), card, pc.getEdition(), pc.getRarity(), state.getPower(), state.getToughness(), @@ -372,7 +371,7 @@ public class CardRenderer { float cardArtHeight = getCardListItemHeight(compactMode); float cardArtWidth = cardArtHeight * CARD_ART_RATIO; if (x <= cardArtWidth && y <= cardArtHeight) { - CardZoom.show(ViewUtil.getCardForUi(pc)); + CardZoom.show(CardView.getCardForUi(pc)); return true; } return false; @@ -489,15 +488,15 @@ public class CardRenderer { Texture image = ImageCache.getImage(pc); if (image != null) { if (image == ImageCache.defaultImage) { - CardImageRenderer.drawCardImage(g, ViewUtil.getCardForUi(pc), x, y, w, h, pos); + CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), x, y, w, h, pos); } else { g.drawImage(image, x, y, w, h); } if (pc.isFoil()) { //draw foil effect if needed - final CardView card = ViewUtil.getCardForUi(pc); + final CardView card = CardView.getCardForUi(pc); if (card.getOriginal().getFoilIndex() == 0) { //if foil finish not yet established, assign a random one - card.getOriginal().setRandomFoil(); + card.getOriginal().setFoilIndexOverride(-1); } drawFoilEffect(g, card, x, y, w, h); } @@ -564,8 +563,10 @@ public class CardRenderer { } int number = 0; - for (final Integer i : card.getCounters().values()) { - number += i.intValue(); + if (card.getCounters() != null) { + for (final Integer i : card.getCounters().values()) { + number += i.intValue(); + } } final int counters = number; diff --git a/forge-gui-mobile/src/forge/card/CardZoom.java b/forge-gui-mobile/src/forge/card/CardZoom.java index d65e277c23d..80b51bdf6a1 100644 --- a/forge-gui-mobile/src/forge/card/CardZoom.java +++ b/forge-gui-mobile/src/forge/card/CardZoom.java @@ -5,12 +5,11 @@ import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.Graphics; import forge.assets.FSkinColor; import forge.assets.FSkinFont; +import forge.game.card.CardView; import forge.item.IPaperCard; import forge.toolbox.FList; import forge.toolbox.FOverlay; import forge.util.Utils; -import forge.view.CardView; -import forge.view.ViewUtil; public class CardZoom extends FOverlay { private static final float TAB_HEIGHT = Utils.AVG_FINGER_HEIGHT; @@ -20,7 +19,7 @@ public class CardZoom extends FOverlay { private static boolean zoomMode = true; public static void show(final IPaperCard pc0) { - card = ViewUtil.getCardForUi(pc0); + card = CardView.getCardForUi(pc0); cardZoom.show(); } public static void show(final CardView card0) { diff --git a/forge-gui-mobile/src/forge/card/GameEntityPicker.java b/forge-gui-mobile/src/forge/card/GameEntityPicker.java index ba895ecc8a7..e8168308962 100644 --- a/forge-gui-mobile/src/forge/card/GameEntityPicker.java +++ b/forge-gui-mobile/src/forge/card/GameEntityPicker.java @@ -8,6 +8,8 @@ import forge.Forge; import forge.assets.FImage; import forge.assets.FSkinFont; import forge.assets.FSkinImage; +import forge.game.GameEntityView; +import forge.game.card.CardView; import forge.screens.TabPageScreen; import forge.toolbox.FChoiceList; import forge.toolbox.FDialog; @@ -16,8 +18,6 @@ import forge.toolbox.FOptionPane; import forge.toolbox.FTextField; import forge.toolbox.FEvent.FEventHandler; import forge.util.Callback; -import forge.view.CardView; -import forge.view.GameEntityView; public class GameEntityPicker extends TabPageScreen { private final FOptionPane optionPane; diff --git a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java index 476f23139fe..8bc86d85868 100644 --- a/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java +++ b/forge-gui-mobile/src/forge/itemmanager/views/ImageView.java @@ -12,6 +12,7 @@ import forge.card.CardRenderer; import forge.card.CardRenderer.CardStackPosition; import forge.card.CardZoom; import forge.deck.DeckProxy; +import forge.game.card.CardView; import forge.item.IPaperCard; import forge.item.InventoryItem; import forge.item.PaperCard; @@ -32,7 +33,6 @@ import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FLabel; import forge.toolbox.FScrollPane; import forge.util.Utils; -import forge.view.ViewUtil; import java.util.*; import java.util.Map.Entry; @@ -874,7 +874,7 @@ public class ImageView extends ItemView { public boolean longPress(float x, float y) { ItemInfo item = getItemAtPoint(x + getLeft(), y + getTop()); if (item != null && item.item instanceof IPaperCard) { - CardZoom.show(ViewUtil.getCardForUi((IPaperCard) item.item)); + CardZoom.show(CardView.getCardForUi((IPaperCard) item.item)); return true; } return false; diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 44a5852866d..92ab6de6467 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -15,9 +15,14 @@ import forge.LobbyPlayer; import forge.assets.FImage; import forge.assets.FSkin; import forge.assets.FTextureRegionImage; +import forge.game.GameEntityView; +import forge.game.GameView; import forge.game.Match; +import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerView; +import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.interfaces.IButton; import forge.match.IMatchController; @@ -27,10 +32,10 @@ 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; import forge.screens.match.views.VPhaseIndicator.PhaseLabel; +import forge.screens.match.views.VPlayerPanel; import forge.screens.match.views.VPlayerPanel.InfoTab; import forge.screens.match.views.VPrompt; import forge.screens.match.winlose.ViewWinLose; @@ -38,12 +43,6 @@ 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; public class MatchController implements IMatchController { private MatchController() { } @@ -98,7 +97,7 @@ public class MatchController implements IMatchController { boolean noHumans = MatchUtil.getHumanCount() == 0; List playerPanels = new ArrayList(); for (Player p : sortedPlayers) { - playerPanels.add(new VPlayerPanel(MatchUtil.getGameView(p).getPlayerView(p, false), noHumans || p.getController() instanceof PlayerControllerHuman)); + playerPanels.add(new VPlayerPanel(PlayerView.get(p), noHumans || p.getController() instanceof PlayerControllerHuman)); } view = new MatchScreen(playerPanels); @@ -151,7 +150,7 @@ public class MatchController implements IMatchController { @Override public void updatePhase() { - LocalGameView gameView = MatchUtil.getGameView(); + GameView gameView = MatchUtil.getGameView(); final PlayerView p = gameView.getPlayerTurn(); final PhaseType ph = gameView.getPhase(); @@ -171,7 +170,7 @@ public class MatchController implements IMatchController { public void updatePlayerControl() { //show/hide hand for top player based on whether the opponent is controlled if (MatchUtil.getHumanCount() == 1) { - Player player = MatchUtil.getGameView().getPlayer(view.getTopPlayerPanel().getPlayer()); + Player player = Player.get(view.getTopPlayerPanel().getPlayer()); if (player.getMindSlaveMaster() != null) { view.getTopPlayerPanel().setSelectedZone(ZoneType.Hand); } @@ -205,19 +204,18 @@ public class MatchController implements IMatchController { } @Override - public int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { + public SpellAbility getAbilityToPlay(List abilities, ITriggerEvent triggerEvent) { if (abilities.isEmpty()) { - return -1; + return null; } if (abilities.size() == 1) { - return abilities.get(0).getId(); + return abilities.get(0); } - final SpellAbilityView choice = SGuiChoose.oneOrNone("Choose ability to play", abilities); - return choice == null ? -1 : choice.getId(); + return SGuiChoose.oneOrNone("Choose ability to play", abilities); } @Override - public void showCombat(final CombatView combat) { + public void showCombat() { } @Override diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 09b0596b7b3..e0cf5406c12 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -12,7 +12,19 @@ import com.badlogic.gdx.Input.Keys; import com.badlogic.gdx.math.Rectangle; import com.google.common.collect.Maps; +import forge.Forge; +import forge.Forge.KeyInputAdapter; +import forge.Graphics; +import forge.animation.AbilityEffect; +import forge.assets.FSkinColor; +import forge.assets.FSkinColor.Colors; +import forge.assets.FSkinTexture; +import forge.game.GameEntityView; +import forge.game.card.CardView; +import forge.game.combat.CombatView; import forge.game.phase.PhaseType; +import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.match.MatchUtil; import forge.menu.FDropDown; @@ -25,35 +37,24 @@ import forge.properties.ForgePreferences; import forge.properties.ForgePreferences.FPref; import forge.screens.FScreen; import forge.screens.match.views.VAvatar; +import forge.screens.match.views.VCardDisplayArea.CardAreaPanel; import forge.screens.match.views.VDevMenu; import forge.screens.match.views.VGameMenu; import forge.screens.match.views.VLog; import forge.screens.match.views.VManaPool; -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; import forge.screens.match.views.VPlayerPanel.InfoTab; import forge.screens.match.views.VPlayers; import forge.screens.match.views.VPrompt; import forge.screens.match.views.VStack; import forge.sound.MusicPlaylist; import forge.sound.SoundSystem; -import forge.Forge.KeyInputAdapter; -import forge.Forge; -import forge.Graphics; -import forge.animation.AbilityEffect; -import forge.assets.FSkinColor; -import forge.assets.FSkinTexture; -import forge.assets.FSkinColor.Colors; import forge.toolbox.FCardPanel; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FScrollPane; import forge.util.Callback; -import forge.view.CardView; -import forge.view.CombatView; -import forge.view.GameEntityView; -import forge.view.PlayerView; public class MatchScreen extends FScreen { public static FSkinColor BORDER_COLOR = FSkinColor.get(Colors.CLR_BORDERS); @@ -85,13 +86,13 @@ public class MatchScreen extends FScreen { new FEventHandler() { @Override public void handleEvent(FEvent e) { - MatchUtil.getGameView().selectButtonOk(); + MatchUtil.getHumanController().selectButtonOk(); } }, new FEventHandler() { @Override public void handleEvent(FEvent e) { - MatchUtil.getGameView().selectButtonCancel(); + MatchUtil.getHumanController().selectButtonCancel(); } })); @@ -103,13 +104,13 @@ public class MatchScreen extends FScreen { new FEventHandler() { @Override public void handleEvent(FEvent e) { - MatchUtil.getGameView().selectButtonOk(); + MatchUtil.getHumanController().selectButtonOk(); } }, new FEventHandler() { @Override public void handleEvent(FEvent e) { - MatchUtil.getGameView().selectButtonCancel(); + MatchUtil.getHumanController().selectButtonCancel(); } })); topPlayerPrompt.setRotate180(true); @@ -229,7 +230,7 @@ public class MatchScreen extends FScreen { } public boolean isTopHumanPlayerActive() { - return topPlayerPrompt != null && MatchUtil.getGameView().getPlayer(topPlayerPanel.getPlayer()) == MatchUtil.getCurrentPlayer(); + return topPlayerPrompt != null && Player.get(topPlayerPanel.getPlayer()) == MatchUtil.getCurrentPlayer(); } public VPrompt getActivePrompt() { @@ -375,7 +376,7 @@ public class MatchScreen extends FScreen { break; case Keys.Z: //undo on Ctrl+Z if (KeyInputAdapter.isCtrlKeyDown()) { - MatchUtil.getGameView().tryUndoLastAction(); + MatchUtil.getHumanController().tryUndoLastAction(); return true; } break; diff --git a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java index 59b4ddb8001..aa7505c7d16 100644 --- a/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java +++ b/forge-gui-mobile/src/forge/screens/match/TargetingOverlay.java @@ -20,10 +20,10 @@ package forge.screens.match; import forge.Graphics; import forge.assets.FSkinColor; import forge.assets.FSkinColor.Colors; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.screens.match.views.VCardDisplayArea.CardAreaPanel; import forge.util.Utils; -import forge.view.CardView; -import forge.view.PlayerView; import com.badlogic.gdx.graphics.Color; import com.badlogic.gdx.math.Vector2; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java index 7e63598acc0..622ba0218d3 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignDamage.java @@ -24,6 +24,9 @@ import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; import forge.card.CardZoom; +import forge.game.GameEntityView; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.match.MatchUtil; import forge.screens.match.MatchController; import forge.toolbox.FButton; @@ -39,9 +42,6 @@ import forge.toolbox.FScrollPane; import forge.util.Callback; import forge.util.Utils; import forge.util.WaitCallback; -import forge.view.CardView; -import forge.view.GameEntityView; -import forge.view.PlayerView; import java.util.ArrayList; import java.util.HashMap; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index 2356564c15c..8fc63e7f8f4 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -4,12 +4,12 @@ import com.badlogic.gdx.math.Vector2; import forge.Graphics; import forge.assets.FImage; +import forge.game.player.PlayerView; import forge.match.MatchUtil; import forge.screens.match.MatchController; import forge.toolbox.FDisplayObject; import forge.util.ThreadUtil; import forge.util.Utils; -import forge.view.PlayerView; public class VAvatar extends FDisplayObject { public static final float WIDTH = Utils.AVG_FINGER_WIDTH; @@ -29,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 @Override public void run() { - MatchUtil.getGameView().selectPlayer(player, null); + MatchUtil.getHumanController().selectPlayer(player, null); } }); return true; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java index c8b6b27f785..e845143f899 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VCardDisplayArea.java @@ -11,10 +11,10 @@ import forge.FThreads; import forge.Graphics; import forge.card.CardZoom; import forge.card.CardRenderer.CardStackPosition; +import forge.game.card.CardView; import forge.match.MatchUtil; import forge.toolbox.FCardPanel; import forge.util.ThreadUtil; -import forge.view.CardView; public abstract class VCardDisplayArea extends VDisplayArea { private static final float CARD_STACK_OFFSET = 0.2f; @@ -42,7 +42,7 @@ public abstract class VCardDisplayArea extends VDisplayArea { rotateCards180 = b0; } - protected void refreshCardPanels(List model) { + protected void refreshCardPanels(Iterable model) { clear(); CardAreaPanel newCardPanel = null; @@ -261,7 +261,7 @@ public abstract class VCardDisplayArea extends VDisplayArea { } public boolean selectCard() { - if (MatchUtil.getGameView().selectCard(getCard(), null)) { + if (MatchUtil.getHumanController().selectCard(getCard(), null)) { return true; } //if panel can't do anything with card selection, try selecting previous panel in stack diff --git a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java index 4a37449c09a..525d2caacba 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VDevMenu.java @@ -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 @Override public void run() { - MatchUtil.getGameView().cheat().generateMana(); + MatchUtil.getHumanController().cheat().generateMana(); } }); } @@ -28,7 +28,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().tutorForCard(); + MatchUtil.getHumanController().cheat().tutorForCard(); } }); } @@ -39,7 +39,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().addCardToHand(); + MatchUtil.getHumanController().cheat().addCardToHand(); } }); } @@ -50,7 +50,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().addCardToBattlefield(); + MatchUtil.getHumanController().cheat().addCardToBattlefield(); } }); } @@ -61,7 +61,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().setPlayerLife(); + MatchUtil.getHumanController().cheat().setPlayerLife(); } }); } @@ -72,7 +72,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().winGame(); + MatchUtil.getHumanController().cheat().winGame(); } }); } @@ -83,26 +83,26 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().setupGameState(); + MatchUtil.getHumanController().cheat().setupGameState(); } }); } })); - final boolean unlimitedLands = MatchUtil.getGameView().canPlayUnlimitedLands(); + final boolean unlimitedLands = MatchUtil.getHumanController().canPlayUnlimitedLands(); addItem(new FCheckBoxMenuItem("Play Unlimited Lands", unlimitedLands, new FEventHandler() { @Override public void handleEvent(FEvent e) { - MatchUtil.getGameView().cheat().setCanPlayUnlimitedLands(!unlimitedLands); + MatchUtil.getHumanController().cheat().setCanPlayUnlimitedLands(!unlimitedLands); } })); - final boolean viewAll = MatchUtil.getGameView().canViewAllCards(); + final boolean viewAll = MatchUtil.getHumanController().mayLookAtAllCards(); addItem(new FCheckBoxMenuItem("View All Cards", viewAll, new FEventHandler() { @Override public void handleEvent(FEvent e) { - MatchUtil.getGameView().cheat().setViewAllCards(!viewAll); + MatchUtil.getHumanController().cheat().setViewAllCards(!viewAll); } })); addItem(new FMenuItem("Add Counters to Permanent", new FEventHandler() { @@ -111,7 +111,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().addCountersToPermanent(); + MatchUtil.getHumanController().cheat().addCountersToPermanent(); } }); } @@ -122,7 +122,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().tapPermanents(); + MatchUtil.getHumanController().cheat().tapPermanents(); } }); } @@ -133,7 +133,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().untapPermanents(); + MatchUtil.getHumanController().cheat().untapPermanents(); } }); } @@ -144,7 +144,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().riggedPlanarRoll(); + MatchUtil.getHumanController().cheat().riggedPlanarRoll(); } }); } @@ -155,7 +155,7 @@ public class VDevMenu extends FDropDownMenu { ThreadUtil.invokeInGameThread(new Runnable() { @Override public void run() { - MatchUtil.getGameView().cheat().planeswalkTo(); + MatchUtil.getHumanController().cheat().planeswalkTo(); } }); } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index f9287f83f75..219d1cf6320 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -4,11 +4,11 @@ import java.util.ArrayList; import java.util.List; import forge.FThreads; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; +import forge.game.player.PlayerView; import forge.screens.match.views.VCardDisplayArea.CardAreaPanel; import forge.toolbox.FContainer; -import forge.view.CardView; -import forge.view.CardView.CardStateView; -import forge.view.PlayerView; public class VField extends FContainer { private final PlayerView player; @@ -49,7 +49,7 @@ public class VField extends FContainer { public void run() { clear(); - List model = player.getBfCards(); + Iterable model = player.getBattlefield(); for (CardView card : model) { updateCard(card); } @@ -103,7 +103,7 @@ public class VField extends FContainer { for (CardView c : cardsOfType) { if (!c.isEnchanted() && !c.isEquipped() && cardName.equals(c.getOriginal().getName()) && - card.getCounters().equals(c.getCounters()) && + card.hasSameCounters(c) && card.isToken() == c.isToken()) { //don't stack tokens on top of non-tokens CardAreaPanel cPanel = CardAreaPanel.get(c); while (cPanel.getNextPanelInStack() != null) { @@ -125,6 +125,7 @@ public class VField extends FContainer { toPanel.setTapped(card.isTapped()); toPanel.getAttachedPanels().clear(); + if (card.isEnchanted()) { final Iterable enchants = card.getEnchantedBy(); for (final CardView e : enchants) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VFlashbackZone.java b/forge-gui-mobile/src/forge/screens/match/views/VFlashbackZone.java index e4662e47a0a..12df3ade862 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VFlashbackZone.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VFlashbackZone.java @@ -1,7 +1,7 @@ package forge.screens.match.views; import forge.FThreads; -import forge.view.PlayerView; +import forge.game.player.PlayerView; public class VFlashbackZone extends VCardDisplayArea { private final PlayerView player; @@ -18,7 +18,7 @@ public class VFlashbackZone extends VCardDisplayArea { private final Runnable updateRoutine = new Runnable() { @Override public void run() { - refreshCardPanels(player.getFlashbackCards()); + refreshCardPanels(player.getFlashback()); } }; } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java index fcb85712779..dad8cbdec7e 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VGameMenu.java @@ -70,7 +70,7 @@ public class VGameMenu extends FDropDownMenu { //if re-enabling auto-yields, auto-yield to current ability on stack if applicable SpellAbility ability = game.getStack().peekAbility(); if (ability != null && ability.isAbility() && localPlayer.getController().shouldAutoYield(ability.toUnsuppressedString())) { - MatchUtil.getGameView().passPriority(); + MatchUtil.getHumanController().passPriority(); } } } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VLog.java b/forge-gui-mobile/src/forge/screens/match/views/VLog.java index 6b32a3f236b..a6057c18469 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VLog.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VLog.java @@ -45,7 +45,7 @@ public class VLog extends FDropDown { clear(); GameLogEntryType logVerbosityFilter = GameLogEntryType.valueOf(FModel.getPreferences().getPref(FPref.DEV_LOG_ENTRY_TYPE)); - List logEntrys = MatchUtil.getGameView().getLogEntries(logVerbosityFilter); + List logEntrys = MatchUtil.getGameView().getGameLog().getLogEntries(logVerbosityFilter); LogEntryDisplay logEntryDisplay; float width = maxWidth - getMenuTab().screenPos.x; //stretch from tab to edge of screen diff --git a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java index c1871d30c07..888c06a0ace 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VManaPool.java @@ -11,10 +11,10 @@ import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; import forge.card.MagicColor; +import forge.game.player.PlayerView; import forge.match.MatchUtil; import forge.player.GamePlayerUtil; import forge.toolbox.FDisplayObject; -import forge.view.PlayerView; public class VManaPool extends VDisplayArea { private static final FSkinColor FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); @@ -82,7 +82,7 @@ public class VManaPool extends VDisplayArea { @Override public boolean tap(float x, float y, int count) { if (player.getLobbyPlayer() == GamePlayerUtil.getGuiPlayer()) { - MatchUtil.getGameView().useMana(colorCode); + MatchUtil.getHumanController().useMana(colorCode); } return true; } diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index 241e2a46368..6e986f7d95b 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -13,6 +13,8 @@ import forge.assets.FSkinColor; import forge.assets.FSkinFont; import forge.assets.FSkinImage; import forge.assets.FSkinColor.Colors; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.match.MatchUtil; import forge.model.FModel; @@ -22,8 +24,6 @@ import forge.screens.match.MatchScreen; import forge.toolbox.FContainer; import forge.toolbox.FDisplayObject; import forge.util.Utils; -import forge.view.CardView; -import forge.view.PlayerView; public class VPlayerPanel extends FContainer { private static final FSkinFont LIFE_FONT = FSkinFont.get(18); @@ -312,7 +312,7 @@ public class VPlayerPanel extends FContainer { @Override public boolean tap(float x, float y, int count) { - MatchUtil.getGameView().selectPlayer(player, null); //treat tapping on life the same as tapping on the avatar + MatchUtil.getHumanController().selectPlayer(player, null); //treat tapping on life the same as tapping on the avatar return true; } @@ -458,7 +458,7 @@ public class VPlayerPanel extends FContainer { } @Override - protected void refreshCardPanels(List model) { + protected void refreshCardPanels(Iterable model) { int oldCount = getCount(); super.refreshCardPanels(model); int newCount = getCount(); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java index 4a1573a65c1..fbc79da72f3 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayers.java @@ -1,12 +1,12 @@ package forge.screens.match.views; -import java.util.List; - import com.badlogic.gdx.graphics.g2d.BitmapFont.HAlignment; import forge.Graphics; import forge.assets.FImage; import forge.assets.FSkinFont; +import forge.game.card.CardView; +import forge.game.player.PlayerView; import forge.match.MatchUtil; import forge.menu.FDropDown; import forge.model.FModel; @@ -16,8 +16,6 @@ import forge.toolbox.FContainer; import forge.toolbox.FDisplayObject; import forge.toolbox.FList; import forge.util.Utils; -import forge.view.CardView; -import forge.view.PlayerView; public class VPlayers extends FDropDown { public VPlayers() { @@ -79,13 +77,15 @@ public class VPlayers extends FDropDown { builder.append(" | " + player.getKeywords().toString()); } if (FModel.getPreferences().getPrefBoolean(FPref.UI_ANTE)) { - List list = player.getAnteCards(); + Iterable list = player.getAnte(); builder.append(" | Ante'd: "); - for (int i = 0; i < list.size(); i++) { - builder.append(list.get(i)); - if (i < (list.size() - 1)) { + boolean needDelim = false; + for (CardView cv : list) { + if (needDelim) { builder.append(", "); } + else { needDelim = true; } + builder.append(cv); } } if (MatchUtil.getGameView().isCommander()) { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index 76faf93054f..f9bc30fbf73 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -2,7 +2,6 @@ package forge.screens.match.views; import java.util.HashMap; import java.util.HashSet; -import java.util.List; import java.util.Map; import java.util.Set; @@ -20,7 +19,10 @@ import forge.card.CardRenderer; import forge.card.CardZoom; import forge.card.CardDetailUtil.DetailColors; import forge.card.CardRenderer.CardStackPosition; +import forge.game.card.CardView; import forge.game.player.Player; +import forge.game.player.PlayerView; +import forge.game.spellability.StackItemView; import forge.game.zone.ZoneType; import forge.match.MatchUtil; import forge.menu.FCheckBoxMenuItem; @@ -28,6 +30,7 @@ import forge.menu.FDropDown; import forge.menu.FMenuItem; import forge.menu.FMenuTab; import forge.menu.FPopupMenu; +import forge.player.PlayerControllerHuman; import forge.screens.match.MatchController; import forge.screens.match.TargetingOverlay; import forge.toolbox.FCardPanel; @@ -35,11 +38,8 @@ import forge.toolbox.FDisplayObject; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; import forge.toolbox.FLabel; +import forge.util.FCollection; import forge.util.Utils; -import forge.view.CardView; -import forge.view.LocalGameView; -import forge.view.PlayerView; -import forge.view.StackItemView; public class VStack extends FDropDown { public static final float CARD_WIDTH = Utils.AVG_FINGER_WIDTH; @@ -93,7 +93,7 @@ public class VStack extends FDropDown { activeStackInstance = null; //reset before updating stack restoreOldZones(); - final List stack = MatchUtil.getGameView().getStack(); + final FCollection.FCollectionView stack = MatchUtil.getGameView().getStack(); if (stackSize != stack.size()) { int oldStackSize = stackSize; stackSize = stack.size(); @@ -124,7 +124,7 @@ public class VStack extends FDropDown { 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; - final List stack = MatchUtil.getGameView().getStack(); + final FCollection.FCollectionView stack = MatchUtil.getGameView().getStack(); if (stack.isEmpty()) { //show label if stack empty FLabel label = add(new FLabel.Builder().text("[Empty]").font(FONT).align(HAlignment.CENTER).build()); @@ -222,7 +222,7 @@ public class VStack extends FDropDown { private StackInstanceDisplay(StackItemView stackInstance0, float width) { stackInstance = stackInstance0; - CardView card = stackInstance.getSource(); + CardView card = stackInstance.getSourceCard(); text = stackInstance.getText(); if (stackInstance.isOptionalTrigger() && @@ -255,53 +255,53 @@ public class VStack extends FDropDown { FPopupMenu menu = new FPopupMenu() { @Override protected void buildMenu() { - final LocalGameView gameView = MatchUtil.getGameView(); - final PlayerView playerView = gameView.getPlayerView(player, false); + final PlayerControllerHuman humanController = MatchUtil.getHumanController(); + final PlayerView playerView = PlayerView.get(player); final String key = stackInstance.getKey(); - final boolean autoYield = gameView.shouldAutoYield(key); + final boolean autoYield = humanController.shouldAutoYield(key); addItem(new FCheckBoxMenuItem("Auto-Yield", autoYield, new FEventHandler() { @Override public void handleEvent(FEvent e) { - MatchUtil.getGameView().setShouldAutoYield(key, !autoYield); - if (!autoYield && stackInstance.equals(gameView.peekStack())) { + humanController.setShouldAutoYield(key, !autoYield); + if (!autoYield && stackInstance.equals(MatchUtil.getGameView().peekStack())) { //auto-pass priority if ability is on top of stack - gameView.passPriority(); + humanController.passPriority(); } } })); if (stackInstance.isOptionalTrigger() && stackInstance.getActivatingPlayer().equals(playerView)) { final int triggerID = stackInstance.getSourceTrigger(); addItem(new FCheckBoxMenuItem("Always Yes", - gameView.shouldAlwaysAcceptTrigger(triggerID), + humanController.shouldAlwaysAcceptTrigger(triggerID), new FEventHandler() { @Override public void handleEvent(FEvent e) { - if (gameView.shouldAlwaysAcceptTrigger(triggerID)) { - gameView.setShouldAlwaysAskTrigger(triggerID); + if (humanController.shouldAlwaysAcceptTrigger(triggerID)) { + humanController.setShouldAlwaysAskTrigger(triggerID); } else { - gameView.setShouldAlwaysAcceptTrigger(triggerID); - if (stackInstance.equals(gameView.peekStack())) { + humanController.setShouldAlwaysAcceptTrigger(triggerID); + if (stackInstance.equals(MatchUtil.getGameView().peekStack())) { //auto-yes if ability is on top of stack - gameView.confirm(); + humanController.confirm(); } } } })); addItem(new FCheckBoxMenuItem("Always No", - gameView.shouldAlwaysDeclineTrigger(triggerID), + humanController.shouldAlwaysDeclineTrigger(triggerID), new FEventHandler() { @Override public void handleEvent(FEvent e) { - if (gameView.shouldAlwaysDeclineTrigger(triggerID)) { - gameView.setShouldAlwaysAskTrigger(triggerID); + if (humanController.shouldAlwaysDeclineTrigger(triggerID)) { + humanController.setShouldAlwaysAskTrigger(triggerID); } else { - gameView.setShouldAlwaysDeclineTrigger(triggerID); - if (stackInstance.equals(gameView.peekStack())) { + humanController.setShouldAlwaysDeclineTrigger(triggerID); + if (stackInstance.equals(MatchUtil.getGameView().peekStack())) { //auto-no if ability is on top of stack - gameView.confirm(); + humanController.confirm(); } } } @@ -310,7 +310,7 @@ public class VStack extends FDropDown { addItem(new FMenuItem("Zoom/Details", new FEventHandler() { @Override public void handleEvent(FEvent e) { - CardZoom.show(stackInstance.getSource()); + CardZoom.show(stackInstance.getSourceCard()); } })); }; @@ -320,13 +320,13 @@ public class VStack extends FDropDown { return true; } } - CardZoom.show(stackInstance.getSource()); + CardZoom.show(stackInstance.getSourceCard()); return true; } @Override public boolean longPress(float x, float y) { - CardZoom.show(stackInstance.getSource()); + CardZoom.show(stackInstance.getSourceCard()); return true; } @@ -354,7 +354,7 @@ public class VStack extends FDropDown { x += PADDING; y += PADDING; - CardRenderer.drawCardWithOverlays(g, stackInstance.getSource(), x, y, CARD_WIDTH, CARD_HEIGHT, CardStackPosition.Top); + CardRenderer.drawCardWithOverlays(g, stackInstance.getSourceCard(), x, y, CARD_WIDTH, CARD_HEIGHT, CardStackPosition.Top); x += CARD_WIDTH + PADDING; w -= x + PADDING - BORDER_THICKNESS; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java b/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java index e199d81ee22..6be1730e355 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VZoneDisplay.java @@ -3,10 +3,10 @@ package forge.screens.match.views; import java.util.ArrayList; import forge.FThreads; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.toolbox.FCardPanel; import forge.toolbox.FDisplayObject; -import forge.view.PlayerView; public class VZoneDisplay extends VCardDisplayArea { private final PlayerView player; diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java index b1764a43d45..2d2bcb5b4b1 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ControlWinLose.java @@ -1,10 +1,10 @@ package forge.screens.match.winlose; +import forge.game.GameView; import forge.match.MatchUtil; import forge.screens.match.MatchController; import forge.toolbox.FEvent; import forge.toolbox.FEvent.FEventHandler; -import forge.view.IGameView; /** * Default controller for a ViewWinLose object. This class can @@ -14,11 +14,11 @@ import forge.view.IGameView; */ public class ControlWinLose { private final ViewWinLose view; - protected final IGameView lastGame; + protected final GameView lastGame; /** @param v   ViewWinLose * @param match */ - public ControlWinLose(final ViewWinLose v, IGameView game) { + public ControlWinLose(final ViewWinLose v, GameView game) { view = v; lastGame = game; addListeners(); diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java index 27514abad98..fa9777792cc 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/GauntletWinLose.java @@ -19,9 +19,9 @@ package forge.screens.match.winlose; import forge.FThreads; import forge.assets.FSkinProp; +import forge.game.GameView; import forge.gauntlet.GauntletWinLoseController; import forge.util.gui.SOptionPane; -import forge.view.IGameView; import java.util.List; @@ -38,7 +38,7 @@ public class GauntletWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match */ - public GauntletWinLose(final ViewWinLose view0, IGameView lastGame) { + public GauntletWinLose(final ViewWinLose view0, GameView lastGame) { super(view0, lastGame); controller = new GauntletWinLoseController(view0, lastGame) { @Override diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java index eff623f4941..38a0ab7a6da 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/LimitedWinLose.java @@ -17,8 +17,8 @@ package forge.screens.match.winlose; * along with this program. If not, see . */ +import forge.game.GameView; import forge.limited.LimitedWinLoseController; -import forge.view.IGameView; /** * The Win/Lose handler for 'gauntlet' type tournament @@ -33,7 +33,7 @@ public class LimitedWinLose extends ControlWinLose { * @param view0 {@link forge.gui.match.ViewWinLose} * @param match {@link forge.game.Match} */ - public LimitedWinLose(final ViewWinLose view0, IGameView lastGame) { + public LimitedWinLose(final ViewWinLose view0, GameView lastGame) { super(view0, lastGame); controller = new LimitedWinLoseController(view0, lastGame) { @Override diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java index 5e48caedf92..66351e39818 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/QuestWinLose.java @@ -20,11 +20,11 @@ import java.util.List; import forge.FThreads; import forge.assets.FSkinProp; +import forge.game.GameView; import forge.item.PaperCard; import forge.quest.QuestWinLoseController; import forge.util.gui.SGuiChoose; import forge.util.gui.SOptionPane; -import forge.view.IGameView; /** *

@@ -44,7 +44,7 @@ public class QuestWinLose extends ControlWinLose { * @param view0 ViewWinLose object * @param match2 */ - public QuestWinLose(final ViewWinLose view0, IGameView lastGame) { + public QuestWinLose(final ViewWinLose view0, GameView lastGame) { super(view0, lastGame); controller = new QuestWinLoseController(lastGame) { @Override diff --git a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java index e72c09d1a3a..0ec0254351b 100644 --- a/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java +++ b/forge-gui-mobile/src/forge/screens/match/winlose/ViewWinLose.java @@ -12,6 +12,7 @@ import forge.assets.FSkinColor.Colors; import forge.assets.FSkinFont; import forge.game.GameLogEntry; import forge.game.GameLogEntryType; +import forge.game.GameView; import forge.interfaces.IWinLoseView; import forge.menu.FMagnifyView; import forge.model.FModel; @@ -24,7 +25,6 @@ import forge.toolbox.FLabel; import forge.toolbox.FOverlay; import forge.toolbox.FTextArea; import forge.util.Utils; -import forge.view.IGameView; public class ViewWinLose extends FOverlay implements IWinLoseView { private static final float INSETS_FACTOR = 0.025f; @@ -34,9 +34,9 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { private final FLabel lblTitle, lblLog, lblStats, btnCopyLog; private final FTextArea txtLog; private final OutcomesPanel pnlOutcomes; - private final IGameView game; + private final GameView game; - public ViewWinLose(final IGameView game0) { + public ViewWinLose(final GameView game0) { super(FSkinColor.get(Colors.CLR_OVERLAY).alphaColor(0.75f)); game = game0; @@ -85,7 +85,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { btnContinue.setEnabled(!game0.isMatchOver()); lblLog = add(new FLabel.Builder().text("Game Log").align(HAlignment.CENTER).font(FSkinFont.get(18)).build()); - txtLog = add(new FTextArea(true, StringUtils.join(game.getLogEntries(null), "\r\n").replace("[COMPUTER]", "[AI]")) { + txtLog = add(new FTextArea(true, StringUtils.join(game.getGameLog().getLogEntries(null), "\r\n").replace("[COMPUTER]", "[AI]")) { @Override public boolean tap(float x, float y, int count) { if (txtLog.getMaxScrollTop() > 0) { @@ -110,7 +110,7 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { control.showRewards(); } - private String composeTitle(final IGameView game) { + private String composeTitle(final GameView game) { final LobbyPlayer winner = game.getWinningPlayer(); final int winningTeam = game.getWinningTeam(); if (winner == null) { @@ -135,13 +135,13 @@ public class ViewWinLose extends FOverlay implements IWinLoseView { } private void showGameOutcomeSummary() { - for (GameLogEntry o : game.getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) { + for (GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.GAME_OUTCOME)) { pnlOutcomes.add(new FLabel.Builder().text(o.message).font(FSkinFont.get(14)).build()); } } private void showPlayerScores() { - for (GameLogEntry o : game.getLogEntriesExact(GameLogEntryType.MATCH_RESULTS)) { + for (GameLogEntry o : game.getGameLog().getLogEntriesExact(GameLogEntryType.MATCH_RESULTS)) { lblStats.setText(removePlayerTypeFromLogMessage(o.message)); } } diff --git a/forge-gui-mobile/src/forge/toolbox/FCardPanel.java b/forge-gui-mobile/src/forge/toolbox/FCardPanel.java index c31d81ec4bc..a7e8c3412f5 100644 --- a/forge-gui-mobile/src/forge/toolbox/FCardPanel.java +++ b/forge-gui-mobile/src/forge/toolbox/FCardPanel.java @@ -3,8 +3,8 @@ package forge.toolbox; import forge.Graphics; import forge.card.CardRenderer; import forge.card.CardRenderer.CardStackPosition; +import forge.game.card.CardView; import forge.util.Utils; -import forge.view.CardView; public class FCardPanel extends FDisplayObject { public static final float ASPECT_RATIO = 3.5f / 2.5f; diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index 67ed7467746..395889a43a1 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -15,14 +15,14 @@ import forge.assets.FSkinColor.Colors; import forge.card.CardRenderer; import forge.card.CardZoom; import forge.card.CardRenderer.CardStackPosition; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.game.spellability.SpellAbilityView; import forge.item.PaperCard; import forge.screens.match.MatchController; import forge.screens.match.views.VAvatar; import forge.screens.match.views.VStack; import forge.util.Utils; -import forge.view.CardView; -import forge.view.PlayerView; -import forge.view.SpellAbilityView; public class FChoiceList extends FList { public static final FSkinColor ITEM_COLOR = FSkinColor.get(Colors.CLR_ZEBRA); diff --git a/forge-gui-mobile/src/forge/toolbox/FOptionPane.java b/forge-gui-mobile/src/forge/toolbox/FOptionPane.java index 1d29fd5935d..174c586759c 100644 --- a/forge-gui-mobile/src/forge/toolbox/FOptionPane.java +++ b/forge-gui-mobile/src/forge/toolbox/FOptionPane.java @@ -16,7 +16,7 @@ import forge.screens.match.views.VPrompt; import forge.toolbox.FEvent.*; import forge.util.Callback; import forge.util.Utils; -import forge.view.CardView; +import forge.game.card.CardView; public class FOptionPane extends FDialog { public static final FSkinImage QUESTION_ICON = FSkinImage.QUESTION; diff --git a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java index fad37d90746..2e7108ab9eb 100644 --- a/forge-gui-mobile/src/forge/toolbox/GuiChoose.java +++ b/forge-gui-mobile/src/forge/toolbox/GuiChoose.java @@ -3,8 +3,8 @@ package forge.toolbox; import com.google.common.base.Function; import com.google.common.collect.Iterables; +import forge.game.card.CardView; import forge.util.Callback; -import forge.view.CardView; import org.apache.commons.lang3.StringUtils; diff --git a/forge-gui-mobile/src/forge/toolbox/GuiDialog.java b/forge-gui-mobile/src/forge/toolbox/GuiDialog.java index 5a6a884ee90..fdf1fb02134 100644 --- a/forge-gui-mobile/src/forge/toolbox/GuiDialog.java +++ b/forge-gui-mobile/src/forge/toolbox/GuiDialog.java @@ -1,13 +1,12 @@ package forge.toolbox; +import forge.game.card.CardView; import forge.util.Callback; -import forge.view.CardView; import org.apache.commons.lang3.StringUtils; /** * Holds player interactions using standard windows - * */ public class GuiDialog { private static final String[] defaultConfirmOptions = { "Yes", "No" }; diff --git a/forge-gui/src/main/java/forge/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/card/CardDetailUtil.java index 7c77fdcad4c..1341249b6af 100644 --- a/forge-gui/src/main/java/forge/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/card/CardDetailUtil.java @@ -11,14 +11,16 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Sets; +import forge.game.GameView; import forge.game.card.CardUtil; +import forge.game.card.CardView; +import forge.game.card.CardView.CardStateView; import forge.game.card.CounterType; import forge.item.InventoryItemFromSet; import forge.item.PreconDeck; import forge.item.SealedProduct; +import forge.match.MatchUtil; import forge.util.Lang; -import forge.view.CardView; -import forge.view.CardView.CardStateView; public class CardDetailUtil { private CardDetailUtil() { @@ -272,8 +274,8 @@ public class CardDetailUtil { } // text changes - final Map changedColorWords = state.getChangedColorWords(), - changedTypes = state.getChangedTypes(); + final Map changedColorWords = card.getChangedColorWords(); + final Map changedTypes = card.getChangedTypes(); if (!(changedColorWords.isEmpty() && changedTypes.isEmpty())) { if (area.length() != 0) { area.append("\n"); @@ -302,13 +304,15 @@ public class CardDetailUtil { } // counter text - for (final Entry c : card.getCounters().entrySet()) { - if (c.getValue().intValue() != 0) { - if (area.length() != 0) { - area.append("\n"); + if (card.getCounters() != null) { + for (final Entry c : card.getCounters().entrySet()) { + if (c.getValue().intValue() != 0) { + if (area.length() != 0) { + area.append("\n"); + } + area.append(c.getKey().getName() + " counters: "); + area.append(c.getValue()); } - area.append(c.getKey().getName() + " counters: "); - area.append(c.getValue()); } } @@ -332,7 +336,7 @@ public class CardDetailUtil { } // Regeneration Shields - final int regenShields = card.getRegenerationShields(); + final int regenShields = card.getShieldCount(); if (regenShields > 0) { if (area.length() != 0) { area.append("\n"); @@ -359,7 +363,7 @@ public class CardDetailUtil { } // chosen color - if (!card.getChosenColors().isEmpty()) { + if (card.getChosenColors() != null) { if (area.length() != 0) { area.append("\n"); } @@ -397,7 +401,7 @@ public class CardDetailUtil { } // equipped by - if (card.getEquippedBy().iterator().hasNext()) { + if (card.isEquipped()) { if (area.length() != 0) { area.append("\n"); } @@ -426,7 +430,7 @@ public class CardDetailUtil { } // enchanted by - if (card.getEnchantedBy().iterator().hasNext()) { + if (card.isEnchanted()) { if (area.length() != 0) { area.append("\n"); } @@ -441,7 +445,7 @@ public class CardDetailUtil { } // controlling - if (card.getGainControlTargets().iterator().hasNext()) { + if (card.getGainControlTargets() != null) { if (area.length() != 0) { area.append("\n"); } @@ -466,12 +470,12 @@ public class CardDetailUtil { } // Imprint - if (card.getImprinted().iterator().hasNext()) { + if (card.getImprintedCards() != null) { if (area.length() != 0) { area.append("\n"); } area.append("Imprinting: "); - for (final Iterator it = card.getImprinted().iterator(); it.hasNext();) { + for (final Iterator it = card.getImprintedCards().iterator(); it.hasNext();) { area.append(it.next()); if (it.hasNext()) { area.append(", "); @@ -480,7 +484,7 @@ public class CardDetailUtil { } // Haunt - if (card.getHauntedBy().iterator().hasNext()) { + if (card.getHauntedBy() != null) { if (area.length() != 0) { area.append("\n"); } @@ -500,25 +504,24 @@ public class CardDetailUtil { } // must block - if (card.getMustBlock().iterator().hasNext()) { + if (card.getMustBlockCards() != null) { if (area.length() != 0) { area.append("\n"); } - final String mustBlockThese = Lang.joinHomogenous(card.getMustBlock()); + final String mustBlockThese = Lang.joinHomogenous(card.getMustBlockCards()); area.append("Must block " + mustBlockThese); } - /*show current storm count for storm cards + //show current storm count for storm cards if (state.hasStorm()) { - Game game = GuiBase.getInterface().getGame(); - if (game != null) { + GameView gameView = MatchUtil.getGameView(); + if (gameView != null) { if (area.length() != 0) { area.append("\n\n"); } - area.append("Current Storm Count: " + game.getStack().getCardsCastThisTurn().size()); + area.append("Current Storm Count: " + gameView.getStormCount()); } - }*/ + } return area.toString(); } - } diff --git a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java index b19c702e730..a231f87ede4 100644 --- a/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java +++ b/forge-gui/src/main/java/forge/control/FControlGameEventHandler.java @@ -14,6 +14,7 @@ import com.google.common.eventbus.Subscribe; import forge.GuiBase; import forge.game.Game; import forge.game.card.Card; +import forge.game.card.CardView; import forge.game.event.GameEvent; import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventAttackersDeclared; @@ -44,6 +45,7 @@ import forge.game.event.GameEventTurnPhase; import forge.game.event.GameEventZone; import forge.game.event.IGameEventVisitor; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.zone.PlayerZone; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -52,18 +54,14 @@ import forge.match.MatchUtil; import forge.match.input.ButtonUtil; import forge.match.input.InputBase; import forge.model.FModel; +import forge.player.PlayerControllerHuman; import forge.properties.ForgePreferences.FPref; import forge.util.Lang; import forge.util.gui.SGuiChoose; import forge.util.maps.MapOfLists; -import forge.view.CardView; -import forge.view.LocalGameView; -import forge.view.PlayerView; public class FControlGameEventHandler extends IGameEventVisitor.Base { - private final LocalGameView gameView; - private final HashSet cardsProcessed = new HashSet(); - private final HashSet playersProcessed = new HashSet(); + private final PlayerControllerHuman humanController; private final HashSet cardsUpdate = new HashSet(); private final HashSet cardsRefreshDetails = new HashSet(); private final HashSet livesUpdate = new HashSet(); @@ -74,13 +72,8 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { private boolean gameOver, gameFinished; private PlayerView turnUpdate; - public FControlGameEventHandler(final LocalGameView gameView0) { - gameView = gameView0; - - // aggressively cache a view for each player (also caches cards) - for (Player player : gameView.getGame().getRegisteredPlayers()) { - gameView.getPlayerView(player, true); - } + public FControlGameEventHandler(final PlayerControllerHuman humanController0) { + humanController = humanController0; } private final Runnable processEvents = new Runnable() { @@ -88,19 +81,6 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { public void run() { processEventsQueued = false; - synchronized (cardsProcessed) { - if (!cardsProcessed.isEmpty()) { - gameView.updateCards(cardsProcessed); - cardsProcessed.clear(); - } - } - synchronized (playersProcessed) { - if (!playersProcessed.isEmpty()) { - gameView.updatePlayers(playersProcessed); - playersProcessed.clear(); - } - } - IMatchController controller = MatchUtil.getController(); synchronized (livesUpdate) { if (!livesUpdate.isEmpty()) { @@ -124,8 +104,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { } if (needCombatUpdate) { needCombatUpdate = false; - gameView.refreshCombat(); - controller.showCombat(gameView.getCombat()); + controller.showCombat(); } if (needStackUpdate) { needStackUpdate = false; @@ -155,16 +134,16 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { } if (gameOver) { gameOver = false; - gameView.getInputQueue().onGameOver(true); // this will unlock any game threads waiting for inputs to complete + humanController.getInputQueue().onGameOver(true); // this will unlock any game threads waiting for inputs to complete } if (gameFinished) { gameFinished = false; - PlayerView localPlayer = gameView.getLocalPlayerView(); + PlayerView localPlayer = humanController.getLocalPlayerView(); InputBase.cancelAwaitNextInput(); //ensure "Waiting for opponent..." doesn't appear behind WinLo controller.showPromptMessage(localPlayer, ""); //clear prompt behind WinLose overlay ButtonUtil.update(localPlayer, "", "", false, false, false); controller.finishGame(); - gameView.updateAchievements(); + humanController.updateAchievements(); } } }; @@ -182,38 +161,24 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { } private Void processCard(Card card, HashSet list) { - CardView view = gameView.getCardView(card, null); //delay update until later to avoid duplicating updates synchronized (list) { - list.add(view); - } - synchronized (cardsProcessed) { - cardsProcessed.add(view); + list.add(card.getView()); } return processEvent(); } private Void processCards(Collection cards, HashSet list) { if (cards.isEmpty()) { return null; } - List views = gameView.getCardViews(cards, null); //delay update until later to avoid duplicating updates synchronized (list) { - list.addAll(views); - } - synchronized (cardsProcessed) { - cardsProcessed.addAll(views); + for (Card c : cards) { + list.add(c.getView()); + } } return processEvent(); } - private PlayerView processPlayer(Player player) { - PlayerView view = gameView.getPlayerView(player, null); //delay update until later to avoid duplicating updates - synchronized (playersProcessed) { - playersProcessed.add(view); - } - return view; - } private Void processPlayer(Player player, HashSet list) { - PlayerView view = processPlayer(player); synchronized (list) { - list.add(view); + list.add(player.getView()); } return processEvent(); } @@ -225,14 +190,13 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { private Void updateZone(Player p, ZoneType z) { if (p == null || z == null) { return null; } - PlayerView view = processPlayer(p); synchronized (zonesUpdate) { for (Pair pair : zonesUpdate) { - if (pair.getLeft() == view && pair.getRight() == z) { + if (pair.getLeft() == p.getView() && pair.getRight() == z) { return null; //avoid adding the same pair multiple times } } - zonesUpdate.add(Pair.of(view, z)); + zonesUpdate.add(Pair.of(p.getView(), z)); } return processEvent(); } @@ -251,8 +215,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { @Override public Void visit(final GameEventTurnBegan event) { - turnUpdate = processPlayer(event.turnOwner); - + turnUpdate = event.turnOwner.getView(); if (FModel.getPreferences().getPrefBoolean(FPref.UI_STACK_CREATURES) && event.turnOwner != null) { // anything except stack will get here updateZone(event.turnOwner, ZoneType.Battlefield); @@ -264,10 +227,10 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { public Void visit(GameEventAnteCardsSelected ev) { final List options = Lists.newArrayList(); for (final Entry kv : ev.cards.entries()) { - final CardView fakeCard = new CardView(-1); //use fake card so real cards appear with proper formatting - fakeCard.getOriginal().setName(" -- From " + Lang.getPossesive(kv.getKey().getName()) + " deck --"); + //use fake card so real cards appear with proper formatting + final CardView fakeCard = new CardView(-1, " -- From " + Lang.getPossesive(kv.getKey().getName()) + " deck --"); options.add(fakeCard); - options.add(gameView.getCardView(kv.getValue(), true)); + options.add(kv.getValue().getView()); } SGuiChoose.reveal("These cards were chosen to ante", options); return null; diff --git a/forge-gui/src/main/java/forge/control/FControlGamePlayback.java b/forge-gui/src/main/java/forge/control/FControlGamePlayback.java index f848d74ff79..27e7abef558 100644 --- a/forge-gui/src/main/java/forge/control/FControlGamePlayback.java +++ b/forge-gui/src/main/java/forge/control/FControlGamePlayback.java @@ -9,6 +9,7 @@ import com.google.common.eventbus.Subscribe; import forge.FThreads; import forge.GuiBase; import forge.game.Game; +import forge.game.card.CardView; import forge.game.event.GameEvent; import forge.game.event.GameEventBlockersDeclared; import forge.game.event.GameEventGameFinished; @@ -19,9 +20,10 @@ import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventTurnPhase; import forge.game.event.IGameEventVisitor; +import forge.game.player.PlayerView; import forge.match.MatchUtil; import forge.match.input.InputPlaybackControl; -import forge.view.LocalGameView; +import forge.player.PlayerControllerHuman; public class FControlGamePlayback extends IGameEventVisitor.Base { private InputPlaybackControl inputPlayback; @@ -29,9 +31,9 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { private final CyclicBarrier gameThreadPauser = new CyclicBarrier(2); - private final LocalGameView gameView; - public FControlGamePlayback(final LocalGameView gameView0) { - gameView = gameView0; + private final PlayerControllerHuman humanController; + public FControlGamePlayback(final PlayerControllerHuman humanController0) { + humanController = humanController0; } private Game game; @@ -75,8 +77,7 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { */ @Override public Void visit(GameEventTurnPhase ev) { - boolean isUiToStop = MatchUtil.getController().stopAtPhase( - gameView.getPlayerView(ev.playerTurn, true), ev.phase); + boolean isUiToStop = MatchUtil.getController().stopAtPhase(PlayerView.get(ev.playerTurn), ev.phase); switch(ev.phase) { case COMBAT_END: @@ -101,13 +102,13 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { */ @Override public Void visit(GameEventGameFinished event) { - gameView.getInputQueue().removeInput(inputPlayback); + humanController.getInputQueue().removeInput(inputPlayback); return null; } @Override public Void visit(GameEventGameStarted event) { - gameView.getInputQueue().setInput(inputPlayback); + humanController.getInputQueue().setInput(inputPlayback); return null; } @@ -122,7 +123,7 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { - GuiBase.getInterface().setCard(gameView.getCardView(event.spell.getHostCard(), true)); + GuiBase.getInterface().setCard(CardView.get(event.spell.getHostCard())); } }); pauseForEvent(resolveDelay); @@ -137,7 +138,7 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { - GuiBase.getInterface().setCard(gameView.getCardView(event.sa.getHostCard(), true)); + GuiBase.getInterface().setCard(CardView.get(event.sa.getHostCard())); } }); pauseForEvent(castDelay); diff --git a/forge-gui/src/main/java/forge/view/WatchLocalGame.java b/forge-gui/src/main/java/forge/control/WatchLocalGame.java similarity index 79% rename from forge-gui/src/main/java/forge/view/WatchLocalGame.java rename to forge-gui/src/main/java/forge/control/WatchLocalGame.java index 76c14fa1538..ce24bae20a5 100644 --- a/forge-gui/src/main/java/forge/view/WatchLocalGame.java +++ b/forge-gui/src/main/java/forge/control/WatchLocalGame.java @@ -1,30 +1,24 @@ /** * */ -package forge.view; +package forge.control; +import forge.LobbyPlayer; import forge.game.Game; import forge.game.card.Card; +import forge.game.card.CardView; +import forge.game.player.Player; +import forge.game.player.PlayerView; +import forge.game.spellability.SpellAbility; import forge.match.input.Input; import forge.match.input.InputPlaybackControl; -import forge.match.input.InputQueue; -import forge.player.PlayerControllerHuman.DevModeCheats; +import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; -/** - * @author elcnesh - * - */ -public class WatchLocalGame extends LocalGameView { - /** - * @param game - * the @{link Game} to attach to. - * @param inputQueue - * the {@link InputQueue} of the game to enable playback - * controls, or {@code null} to disallow them. - */ - public WatchLocalGame(Game game0) { - super(game0); + +public class WatchLocalGame extends PlayerControllerHuman { + public WatchLocalGame(Game game0, Player p, LobbyPlayer lp) { + super(game0, p, lp); } @Override @@ -42,7 +36,7 @@ public class WatchLocalGame extends LocalGameView { @Override public void selectButtonOk() { - if (this.inputQueue == null) { + if (inputQueue == null) { return; } final Input i = inputQueue.getInput(); @@ -53,7 +47,7 @@ public class WatchLocalGame extends LocalGameView { @Override public void selectButtonCancel() { - if (this.inputQueue == null) { + if (inputQueue == null) { return; } final Input i = inputQueue.getInput(); @@ -90,7 +84,7 @@ public class WatchLocalGame extends LocalGameView { } @Override - public void selectAbility(final SpellAbilityView sa) { + public void selectAbility(final SpellAbility sa) { } @Override @@ -148,11 +142,6 @@ public class WatchLocalGame extends LocalGameView { return false; } - @Override - public boolean canViewAllCards() { - return false; - } - @Override public DevModeCheats cheat() { return null; diff --git a/forge-gui/src/main/java/forge/events/UiEventAttackerDeclared.java b/forge-gui/src/main/java/forge/events/UiEventAttackerDeclared.java index 2e61784bd86..9a4a17ede00 100644 --- a/forge-gui/src/main/java/forge/events/UiEventAttackerDeclared.java +++ b/forge-gui/src/main/java/forge/events/UiEventAttackerDeclared.java @@ -1,14 +1,10 @@ package forge.events; -import forge.view.CardView; -import forge.view.GameEntityView; +import forge.game.GameEntityView; +import forge.game.card.CardView; + -/** - * TODO: Write javadoc for this type. - * - */ public class UiEventAttackerDeclared extends UiEvent { - public final CardView attacker; public final GameEntityView defender; diff --git a/forge-gui/src/main/java/forge/events/UiEventBlockerAssigned.java b/forge-gui/src/main/java/forge/events/UiEventBlockerAssigned.java index 467a2f4742b..c7ec9ed21b6 100644 --- a/forge-gui/src/main/java/forge/events/UiEventBlockerAssigned.java +++ b/forge-gui/src/main/java/forge/events/UiEventBlockerAssigned.java @@ -1,9 +1,8 @@ package forge.events; -import forge.view.CardView; +import forge.game.card.CardView; public class UiEventBlockerAssigned extends UiEvent { - public final CardView blocker; public final CardView attackerBeingBlocked; @@ -16,6 +15,4 @@ public class UiEventBlockerAssigned extends UiEvent { public T visit(final IUiEventVisitor visitor) { return visitor.visit(this); } - - } \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java b/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java index 48b0a3dcb64..f5ff43f22c4 100644 --- a/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java +++ b/forge-gui/src/main/java/forge/gauntlet/GauntletWinLoseController.java @@ -8,19 +8,19 @@ import forge.LobbyPlayer; import forge.assets.FSkinProp; import forge.deck.Deck; import forge.game.GameType; +import forge.game.GameView; import forge.game.player.RegisteredPlayer; import forge.interfaces.IButton; import forge.interfaces.IWinLoseView; import forge.match.MatchUtil; import forge.model.FModel; import forge.player.GamePlayerUtil; -import forge.view.IGameView; public abstract class GauntletWinLoseController { - private final IGameView lastGame; + private final GameView lastGame; private final IWinLoseView view; - public GauntletWinLoseController(IWinLoseView view0, final IGameView game0) { + public GauntletWinLoseController(IWinLoseView view0, final GameView game0) { view = view0; lastGame = game0; } diff --git a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java index ea78e1ab515..2f9bac830f5 100644 --- a/forge-gui/src/main/java/forge/interfaces/IGuiBase.java +++ b/forge-gui/src/main/java/forge/interfaces/IGuiBase.java @@ -11,14 +11,14 @@ import forge.assets.FSkinProp; import forge.assets.ISkinImage; import forge.deck.CardPool; import forge.game.GameEntity; +import forge.game.GameEntityView; +import forge.game.card.CardView; import forge.game.player.DelayedReveal; import forge.game.player.IHasIcon; import forge.item.PaperCard; import forge.player.PlayerControllerHuman; import forge.sound.IAudioClip; import forge.sound.IAudioMusic; -import forge.view.CardView; -import forge.view.GameEntityView; public interface IGuiBase { boolean isRunningOnDesktop(); diff --git a/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java b/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java index a9c8baa47ad..e3d6a566d93 100644 --- a/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java +++ b/forge-gui/src/main/java/forge/limited/LimitedWinLoseController.java @@ -1,19 +1,19 @@ package forge.limited; +import forge.game.GameView; import forge.interfaces.IButton; import forge.interfaces.IWinLoseView; import forge.model.FModel; import forge.player.GamePlayerUtil; -import forge.view.IGameView; public abstract class LimitedWinLoseController { private final IWinLoseView view; - private final IGameView lastGame; + private final GameView lastGame; private final boolean wonMatch; private GauntletMini gauntlet; private boolean nextRound = false; - public LimitedWinLoseController(IWinLoseView view0, final IGameView game0) { + public LimitedWinLoseController(IWinLoseView view0, final GameView game0) { view = view0; lastGame = game0; gauntlet = FModel.getGauntletMini(); @@ -31,7 +31,8 @@ public abstract class LimitedWinLoseController { if (lastGame.isWinner(GamePlayerUtil.getGuiPlayer())) { gauntlet.addWin(); - } else { + } + else { gauntlet.addLoss(); } diff --git a/forge-gui/src/main/java/forge/match/IMatchController.java b/forge-gui/src/main/java/forge/match/IMatchController.java index fd3b4a7679c..71c16822b55 100644 --- a/forge-gui/src/main/java/forge/match/IMatchController.java +++ b/forge-gui/src/main/java/forge/match/IMatchController.java @@ -7,17 +7,16 @@ import java.util.Map; import org.apache.commons.lang3.tuple.Pair; import forge.LobbyPlayer; +import forge.game.GameEntityView; import forge.game.Match; +import forge.game.card.CardView; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerView; +import forge.game.spellability.SpellAbility; 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); @@ -25,7 +24,7 @@ public interface IMatchController { boolean hotSeatMode(); void openView(List sortedPlayers); void afterGameEnd(); - void showCombat(CombatView combat); + void showCombat(); void showPromptMessage(PlayerView playerView, String message); boolean stopAtPhase(PlayerView playerTurn, PhaseType phase); IButton getBtnOK(PlayerView playerView); @@ -50,6 +49,6 @@ public interface IMatchController { void updateLives(Iterable livesUpdate); void setPanelSelection(CardView hostCard); void hear(LobbyPlayer player, String message); - int getAbilityToPlay(List abilities, ITriggerEvent triggerEvent); + SpellAbility getAbilityToPlay(List abilities, ITriggerEvent triggerEvent); Map assignDamage(CardView attacker, List blockers, int damage, GameEntityView defender, boolean overrideOrder); } diff --git a/forge-gui/src/main/java/forge/match/MatchUtil.java b/forge-gui/src/main/java/forge/match/MatchUtil.java index 4f2870adbdc..f91be481aea 100644 --- a/forge-gui/src/main/java/forge/match/MatchUtil.java +++ b/forge-gui/src/main/java/forge/match/MatchUtil.java @@ -26,21 +26,24 @@ import forge.ai.LobbyPlayerAi; import forge.card.CardCharacteristicName; import forge.control.FControlGameEventHandler; import forge.control.FControlGamePlayback; +import forge.control.WatchLocalGame; import forge.events.IUiEventVisitor; import forge.events.UiEvent; import forge.events.UiEventAttackerDeclared; import forge.events.UiEventBlockerAssigned; import forge.game.Game; +import forge.game.GameEntityView; import forge.game.GameRules; import forge.game.GameType; +import forge.game.GameView; import forge.game.Match; import forge.game.card.Card; +import forge.game.card.CardView; import forge.game.card.CounterType; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.player.RegisteredPlayer; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.SpellAbilityStackInstance; import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.match.input.InputPlaybackControl; @@ -56,33 +59,12 @@ import forge.sound.SoundSystem; import forge.util.GuiDisplayUtil; import forge.util.NameGenerator; import forge.util.gui.SOptionPane; -import forge.view.Cache; -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.StackItemView; -import forge.view.WatchLocalGame; public class MatchUtil { private static IMatchController controller; private static Game game; private static Player currentPlayer; - private static final List gameViews = new ArrayList(); - - /** Cache of players. */ - public static final Cache players = new Cache<>(); - /** Cache of cards. */ - public static final Cache cards = new Cache<>(); - /** Cache of spellabilities. */ - public static final Cache spabs = new Cache<>(); - /** Cache of stack items. */ - public static final Cache stackItems = new Cache<>(); - /** Cache of combat. */ - public static CombatView cachedCombatView = null; - + private static final List humanControllers = new ArrayList(); private static int humanCount; private static final EventBus uiEvents; private static FControlGamePlayback playbackControl; @@ -177,23 +159,21 @@ public class MatchUtil { p.getLobbyPlayer().setAvatarIndex(avatarIndex); if (p.getController() instanceof PlayerControllerHuman) { - final PlayerControllerHuman controller = (PlayerControllerHuman) p.getController(); - LocalGameView gameView = controller.getGameView(); + final PlayerControllerHuman humanController = (PlayerControllerHuman) p.getController(); if (humanCount == 0) { currentPlayer = p; - game.subscribeToEvents(new FControlGameEventHandler(gameView)); + game.subscribeToEvents(new FControlGameEventHandler(humanController)); } - gameViews.add(gameView); + humanControllers.add(humanController); humanCount++; } } if (humanCount == 0) { //watch game but do not participate - LocalGameView gameView = new WatchLocalGame(game); currentPlayer = sortedPlayers.get(0); - gameView.setLocalPlayer(currentPlayer); - game.subscribeToEvents(new FControlGameEventHandler(gameView)); - gameViews.add(gameView); + PlayerControllerHuman humanController = new WatchLocalGame(game, currentPlayer, currentPlayer.getLobbyPlayer()); + game.subscribeToEvents(new FControlGameEventHandler(humanController)); + humanControllers.add(humanController); } else if (humanCount == sortedPlayers.size() && controller.hotSeatMode()) { //if there are no AI's, allow all players to see all cards (hotseat mode). @@ -205,16 +185,11 @@ public class MatchUtil { controller.openView(sortedPlayers); if (humanCount == 0) { - playbackControl = new FControlGamePlayback(getGameView()); + playbackControl = new FControlGamePlayback(getHumanController()); playbackControl.setGame(game); game.subscribeToEvents(playbackControl); } - //ensure opponents set properly - for (PlayerView pv : gameViews.get(0).getPlayers()) { - pv.setOpponents(gameViews.get(0).getPlayerViews(players.getKey(pv.getId()).getOpponents(), false)); - } - // 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() { @@ -236,18 +211,21 @@ public class MatchUtil { public static Game getGame() { return game; } - - public static LocalGameView getGameView() { - return getGameView(currentPlayer); + public static GameView getGameView() { + return game == null ? null : game.getView(); } - public static LocalGameView getGameView(Player player) { - switch (gameViews.size()) { + + public static PlayerControllerHuman getHumanController() { + return getHumanController(currentPlayer); + } + public static PlayerControllerHuman getHumanController(Player player) { + switch (humanControllers.size()) { case 1: - return gameViews.get(0); + return humanControllers.get(0); case 0: return null; default: - return gameViews.get(player.getId()); + return humanControllers.get(player.getId()); } } @@ -255,28 +233,28 @@ public class MatchUtil { return humanCount; } - public static LocalGameView getOtherGameView() { + public static PlayerControllerHuman getOtherHumanController() { //return other game view besides current game view - if (gameViews.size() < 2) { + if (humanControllers.size() < 2) { return null; } - LocalGameView gameView = getGameView(); - if (gameView == gameViews.get(0)) { - return gameViews.get(1); + PlayerControllerHuman humanController = getHumanController(); + if (humanController == humanControllers.get(0)) { + return humanControllers.get(1); } - return gameViews.get(0); + return humanControllers.get(0); } public static InputQueue getInputQueue() { - LocalGameView gameView = getGameView(); - if (gameView != null) { - return gameView.getInputQueue(); + PlayerControllerHuman humanController = getHumanController(); + if (humanController != null) { + return humanController.getInputQueue(); } return null; } public static void endCurrentTurn() { - getGameView().passPriorityUntilEndOfTurn(); + getHumanController().passPriorityUntilEndOfTurn(); } public static Player getCurrentPlayer() { @@ -285,13 +263,13 @@ public class MatchUtil { public static void setCurrentPlayer(Player currentPlayer0) { if (currentPlayer == currentPlayer0) { return; } currentPlayer = currentPlayer0; - if (gameViews.size() > 1) { - gameViews.get(0).updateAllCards(); //ensure card views updated when current player changes to account for changes in card visibility + if (humanControllers.size() > 1) { + //TODO: ensure card views updated when current player changes to account for changes in card visibility } } public static void alphaStrike() { - getGameView().alphaStrike(); + getHumanController().alphaStrike(); } public static Map getDamageToAssign(final CardView attacker, final List blockers, final int damage, final GameEntityView defender, final boolean overrideOrder) { @@ -380,11 +358,7 @@ public class MatchUtil { game = null; currentPlayer = null; - gameViews.clear(); - players.clear(); - cards.clear(); - spabs.clear(); - stackItems.clear(); + humanControllers.clear(); controller.afterGameEnd(); } diff --git a/forge-gui/src/main/java/forge/match/input/ButtonUtil.java b/forge-gui/src/main/java/forge/match/input/ButtonUtil.java index 1845b5414d0..0b55ac03f5d 100644 --- a/forge-gui/src/main/java/forge/match/input/ButtonUtil.java +++ b/forge-gui/src/main/java/forge/match/input/ButtonUtil.java @@ -17,9 +17,9 @@ */ package forge.match.input; +import forge.game.player.PlayerView; import forge.interfaces.IButton; import forge.match.MatchUtil; -import forge.view.PlayerView; /** * Manages match UI OK/Cancel button enabling and focus diff --git a/forge-gui/src/main/java/forge/match/input/Input.java b/forge-gui/src/main/java/forge/match/input/Input.java index e7e50834188..296dcfdb4f6 100644 --- a/forge-gui/src/main/java/forge/match/input/Input.java +++ b/forge-gui/src/main/java/forge/match/input/Input.java @@ -2,9 +2,9 @@ package forge.match.input; import forge.game.card.Card; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; import forge.util.ITriggerEvent; -import forge.view.PlayerView; public interface Input { PlayerView getOwner(); diff --git a/forge-gui/src/main/java/forge/match/input/InputAttack.java b/forge-gui/src/main/java/forge/match/input/InputAttack.java index b2b0b5ad40e..9db2d01529f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputAttack.java +++ b/forge-gui/src/main/java/forge/match/input/InputAttack.java @@ -28,19 +28,21 @@ import com.google.common.collect.Sets; import forge.events.UiEventAttackerDeclared; import forge.game.GameEntity; +import forge.game.GameEntityView; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardPredicates.Presets; +import forge.game.card.CardView; import forge.game.combat.AttackingBand; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.zone.ZoneType; import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; -import forge.view.CardView; /** *

@@ -51,7 +53,6 @@ import forge.view.CardView; * @version $Id: InputAttack.java 24769 2014-02-09 13:56:04Z Hellfish $ */ public class InputAttack extends InputSyncronizedBase { - /** Constant serialVersionUID=7849903731842214245L. */ private static final long serialVersionUID = 7849903731842214245L; private final Combat combat; @@ -67,7 +68,6 @@ public class InputAttack extends InputSyncronizedBase { defenders = combat.getDefenders(); } - /** {@inheritDoc} */ @Override public final void showMessage() { // TODO still seems to have some issues with multiple planeswalkers @@ -83,8 +83,8 @@ public class InputAttack extends InputSyncronizedBase { for (Pair attacker : mandatoryAttackers) { combat.addAttacker(attacker.getLeft(), attacker.getRight()); MatchUtil.fireEvent(new UiEventAttackerDeclared( - getController().getCardView(attacker.getLeft()), - getController().getGameEntityView(attacker.getRight()))); + CardView.get(attacker.getLeft()), + GameEntityView.get(attacker.getRight()))); } updateMessage(); } @@ -108,7 +108,6 @@ public class InputAttack extends InputSyncronizedBase { } } - /** {@inheritDoc} */ @Override protected final void onOk() { // TODO Add check to see if each must attack creature is attacking @@ -118,7 +117,6 @@ public class InputAttack extends InputSyncronizedBase { stop(); } - /** {@inheritDoc} */ @Override protected final void onCancel() { //either alpha strike or undeclare all attackers based on whether any attackers have been declared @@ -128,14 +126,15 @@ public class InputAttack extends InputSyncronizedBase { for (Card c : attackers) { undeclareAttacker(c); } - } else { + } + else { alphaStrike(); } updateMessage(); } void alphaStrike() { - //alpha strike + //alpha strike final List defenders = playerAttacks.getOpponents(); final Set refreshCards = Sets.newHashSet(); @@ -147,7 +146,7 @@ public class InputAttack extends InputSyncronizedBase { for (Player defender : defenders) { if (CombatUtil.canAttack(c, defender, combat)) { combat.addAttacker(c, defender); - refreshCards.add(getController().getCardView(c)); + refreshCards.add(CardView.get(c)); break; } } @@ -166,7 +165,6 @@ public class InputAttack extends InputSyncronizedBase { } } - /** {@inheritDoc} */ @Override protected final boolean onCardSelected(final Card card, final ITriggerEvent triggerEvent) { final List att = combat.getAttackers(); @@ -240,8 +238,8 @@ public class InputAttack extends InputSyncronizedBase { activateBand(activeBand); MatchUtil.fireEvent(new UiEventAttackerDeclared( - getController().getCardView(card), - getController().getGameEntityView(currentDefender))); + CardView.get(card), + GameEntityView.get(currentDefender))); } private boolean canUndeclareAttacker(Card card) { @@ -255,12 +253,12 @@ public class InputAttack extends InputSyncronizedBase { if (canUndeclareAttacker(card)) { // TODO Is there no way to attacks each turn cards to attack Planeswalkers? combat.removeFromCombat(card); - MatchUtil.setUsedToPay(getController().getCardView(card), false); + MatchUtil.setUsedToPay(CardView.get(card), false); // When removing an attacker clear the attacking band activateBand(null); MatchUtil.fireEvent(new UiEventAttackerDeclared( - getController().getCardView(card), null)); + CardView.get(card), null)); return true; } return false; @@ -270,10 +268,10 @@ public class InputAttack extends InputSyncronizedBase { currentDefender = def; for (final GameEntity ge : defenders) { if (ge instanceof Card) { - MatchUtil.setUsedToPay(getController().getCardView((Card) ge), ge == def); + MatchUtil.setUsedToPay(CardView.get((Card) ge), ge == def); } else if (ge instanceof Player) { - MatchUtil.setHighlighted(getController().getPlayerView((Player) ge), ge == def); + MatchUtil.setHighlighted(PlayerView.get((Player) ge), ge == def); } } @@ -283,14 +281,14 @@ public class InputAttack extends InputSyncronizedBase { private final void activateBand(final AttackingBand band) { if (activeBand != null) { for (final Card card : activeBand.getAttackers()) { - MatchUtil.setUsedToPay(getController().getCardView(card), false); + MatchUtil.setUsedToPay(CardView.get(card), false); } } activeBand = band; if (activeBand != null) { for (final Card card : activeBand.getAttackers()) { - MatchUtil.setUsedToPay(getController().getCardView(card), true); + MatchUtil.setUsedToPay(CardView.get(card), true); } } } @@ -314,6 +312,6 @@ public class InputAttack extends InputSyncronizedBase { showMessage(message); updatePrompt(); - MatchUtil.getController().showCombat(getController().getCombat()); // redraw sword icons + MatchUtil.getController().showCombat(); // redraw sword icons } } diff --git a/forge-gui/src/main/java/forge/match/input/InputBase.java b/forge-gui/src/main/java/forge/match/input/InputBase.java index ec92968f2d8..e852ca6f059 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputBase.java @@ -25,12 +25,11 @@ import forge.game.Game; import forge.game.card.Card; import forge.game.phase.PhaseHandler; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; -import forge.view.LocalGameView; -import forge.view.PlayerView; /** *

@@ -51,11 +50,8 @@ public abstract class InputBase implements java.io.Serializable, Input { public final PlayerControllerHuman getController() { return controller; } - public LocalGameView getGameView() { - return controller.getGameView(); - } public PlayerView getOwner() { - return controller.getPlayerView(controller.getPlayer()); + return controller.getPlayer().getView(); } private boolean finished = false; @@ -64,7 +60,7 @@ public abstract class InputBase implements java.io.Serializable, Input { finished = true; if (allowAwaitNextInput()) { - awaitNextInput(getGameView()); + awaitNextInput(controller); } } @@ -75,7 +71,7 @@ public abstract class InputBase implements java.io.Serializable, Input { private static final Timer awaitNextInputTimer = new Timer(); private static TimerTask awaitNextInputTask; - public static void awaitNextInput(final LocalGameView gameView) { + public static void awaitNextInput(final PlayerControllerHuman controller) { //delay updating prompt to await next input briefly so buttons don't flicker disabled then enabled awaitNextInputTask = new TimerTask() { @Override @@ -85,7 +81,7 @@ public abstract class InputBase implements java.io.Serializable, Input { public void run() { synchronized (awaitNextInputTimer) { if (awaitNextInputTask != null) { - updatePromptForAwait(gameView); + updatePromptForAwait(controller); awaitNextInputTask = null; } } @@ -97,20 +93,20 @@ public abstract class InputBase implements java.io.Serializable, Input { } public static void waitForOtherPlayer() { - final LocalGameView gameView = MatchUtil.getOtherGameView(); - if (gameView == null) { return; } + final PlayerControllerHuman controller = MatchUtil.getOtherHumanController(); + if (controller == null) { return; } cancelAwaitNextInput(); FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { - updatePromptForAwait(gameView); + updatePromptForAwait(controller); } }); } - private static void updatePromptForAwait(final LocalGameView gameView) { - PlayerView playerView = gameView.getLocalPlayerView(); + private static void updatePromptForAwait(final PlayerControllerHuman controller) { + PlayerView playerView = controller.getLocalPlayerView(); MatchUtil.getController().showPromptMessage(playerView, "Waiting for opponent..."); ButtonUtil.update(playerView, false, false, false); } diff --git a/forge-gui/src/main/java/forge/match/input/InputBlock.java b/forge-gui/src/main/java/forge/match/input/InputBlock.java index 9a2f77c4f6a..81f0d0886f5 100644 --- a/forge-gui/src/main/java/forge/match/input/InputBlock.java +++ b/forge-gui/src/main/java/forge/match/input/InputBlock.java @@ -22,6 +22,7 @@ import forge.events.UiEventBlockerAssigned; import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardPredicates.Presets; +import forge.game.card.CardView; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; import forge.game.event.GameEventCombatChanged; @@ -32,7 +33,6 @@ import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; import forge.util.ThreadUtil; import forge.util.gui.SGuiDialog; -import forge.view.CardView; /** *

@@ -87,7 +87,7 @@ public class InputBlock extends InputSyncronizedBase { showMessage(message); } - MatchUtil.getController().showCombat(getController().getCombat()); + MatchUtil.getController().showCombat(); } /** {@inheritDoc} */ @@ -117,7 +117,7 @@ public class InputBlock extends InputSyncronizedBase { if (triggerEvent != null && triggerEvent.getButton() == 3 && card.getController() == defender) { combat.removeFromCombat(card); MatchUtil.fireEvent(new UiEventBlockerAssigned( - getController().getCardView(card), (CardView) null)); + CardView.get(card), (CardView) null)); isCorrectAction = true; } else { @@ -133,7 +133,7 @@ public class InputBlock extends InputSyncronizedBase { //if creature already blocking current attacker, remove blocker from combat combat.removeBlockAssignment(currentAttacker, card); MatchUtil.fireEvent(new UiEventBlockerAssigned( - getController().getCardView(card), (CardView) null)); + CardView.get(card), (CardView) null)); isCorrectAction = true; } else { @@ -141,8 +141,8 @@ public class InputBlock extends InputSyncronizedBase { if (isCorrectAction) { combat.addBlocker(currentAttacker, card); MatchUtil.fireEvent(new UiEventBlockerAssigned( - getController().getCardView(card), - getController().getCardView(currentAttacker))); + CardView.get(card), + CardView.get(currentAttacker))); } } } @@ -162,7 +162,7 @@ public class InputBlock extends InputSyncronizedBase { private void setCurrentAttacker(final Card card) { currentAttacker = card; for (final Card c : combat.getAttackers()) { - MatchUtil.setUsedToPay(getController().getCardView(c), card == c); + MatchUtil.setUsedToPay(CardView.get(c), card == c); } } } diff --git a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java index e650fca1124..18c23dc98f5 100644 --- a/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java +++ b/forge-gui/src/main/java/forge/match/input/InputConfirmMulligan.java @@ -22,6 +22,7 @@ import java.util.List; import forge.game.Game; import forge.game.card.Card; +import forge.game.card.CardView; import forge.game.player.Player; import forge.game.zone.ZoneType; import forge.match.MatchUtil; @@ -30,7 +31,6 @@ import forge.util.ITriggerEvent; import forge.util.Lang; import forge.util.ThreadUtil; import forge.util.gui.SGuiDialog; -import forge.view.CardView; /** *

@@ -102,7 +102,7 @@ public class InputConfirmMulligan extends InputSyncronizedBase { if (isCommander) { // Clear the "selected" icon after clicking the done button for (final Card c : this.selected) { - MatchUtil.setUsedToPay(getController().getCardView(c), false); + MatchUtil.setUsedToPay(c.getView(), false); } } stop(); @@ -120,7 +120,7 @@ public class InputConfirmMulligan extends InputSyncronizedBase { return false; } - final CardView cView = getController().getCardView(c0); + final CardView cView = c0.getView(); if (isSerumPowder && SGuiDialog.confirm(cView, "Use " + cView + "'s ability?")) { cardSelectLocked = true; ThreadUtil.invokeInGameThread(new Runnable() { @@ -138,11 +138,11 @@ public class InputConfirmMulligan extends InputSyncronizedBase { if (isCommander) { // allow to choose cards for partial paris if (selected.contains(c0)) { - MatchUtil.setUsedToPay(getController().getCardView(c0), false); + MatchUtil.setUsedToPay(c0.getView(), false); selected.remove(c0); } else { - MatchUtil.setUsedToPay(getController().getCardView(c0), true); + MatchUtil.setUsedToPay(c0.getView(), true); selected.add(c0); } ButtonUtil.update(getOwner(), "Keep", "Exile", true, !selected.isEmpty(), true); diff --git a/forge-gui/src/main/java/forge/match/input/InputLockUI.java b/forge-gui/src/main/java/forge/match/input/InputLockUI.java index 0edea99343a..d69824c34e7 100644 --- a/forge-gui/src/main/java/forge/match/input/InputLockUI.java +++ b/forge-gui/src/main/java/forge/match/input/InputLockUI.java @@ -6,11 +6,11 @@ import forge.FThreads; import forge.game.Game; import forge.game.card.Card; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; import forge.match.MatchUtil; import forge.util.ITriggerEvent; import forge.util.ThreadUtil; -import forge.view.PlayerView; public class InputLockUI implements Input { private final AtomicInteger iCall = new AtomicInteger(); diff --git a/forge-gui/src/main/java/forge/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/match/input/InputPayMana.java index 2b648307c4c..63dcc28c2c7 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/match/input/InputPayMana.java @@ -18,6 +18,7 @@ import forge.game.card.Card; import forge.game.card.CardUtil; import forge.game.mana.ManaCostBeingPaid; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; @@ -54,13 +55,13 @@ public abstract class InputPayMana extends InputSyncronizedBase { //if player is floating mana, show mana pool to make it easier to use that mana wasFloatingMana = !player.getManaPool().isEmpty(); - zoneToRestore = wasFloatingMana ? MatchUtil.getController().showManaPool(getController().getPlayerView(player)) : null; + zoneToRestore = wasFloatingMana ? MatchUtil.getController().showManaPool(PlayerView.get(player)) : null; } @Override protected void onStop() { if (wasFloatingMana) { //hide mana pool if it was shown due to floating mana - MatchUtil.getController().hideManaPool(getController().getPlayerView(player), zoneToRestore); + MatchUtil.getController().hideManaPool(PlayerView.get(player), zoneToRestore); } } diff --git a/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java b/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java index aa2266391b6..e9019945d9f 100644 --- a/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java +++ b/forge-gui/src/main/java/forge/match/input/InputPlaybackControl.java @@ -3,9 +3,8 @@ package forge.match.input; import forge.control.FControlGamePlayback; import forge.game.Game; import forge.game.phase.PhaseHandler; +import forge.game.player.PlayerView; import forge.match.MatchUtil; -import forge.view.LocalGameView; -import forge.view.PlayerView; public class InputPlaybackControl extends InputSyncronizedBase implements InputSynchronized { private static final long serialVersionUID = 7979208993306642072L; @@ -23,18 +22,11 @@ public class InputPlaybackControl extends InputSyncronizedBase implements InputS setPause(false); } - @Override - public LocalGameView getGameView() { - return MatchUtil.getGameView(); - } @Override public PlayerView getOwner() { - return getGameView().getLocalPlayerView(); + return MatchUtil.getHumanController().getLocalPlayerView(); } - /* (non-Javadoc) - * @see forge.gui.input.InputBase#showMessage() - */ @Override protected void showMessage() { setPause(false); diff --git a/forge-gui/src/main/java/forge/match/input/InputProxy.java b/forge-gui/src/main/java/forge/match/input/InputProxy.java index 52d5bfe796b..71020ede01a 100644 --- a/forge-gui/src/main/java/forge/match/input/InputProxy.java +++ b/forge-gui/src/main/java/forge/match/input/InputProxy.java @@ -23,13 +23,12 @@ import java.util.concurrent.atomic.AtomicReference; import forge.FThreads; import forge.game.card.Card; +import forge.game.card.CardView; import forge.game.player.Player; +import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; +import forge.player.PlayerControllerHuman; import forge.util.ITriggerEvent; -import forge.view.CardView; -import forge.view.LocalGameView; -import forge.view.PlayerView; -import forge.view.SpellAbilityView; /** *

@@ -43,17 +42,17 @@ public class InputProxy implements Observer { /** The input. */ private AtomicReference input = new AtomicReference(); - private final LocalGameView gameView; + private final PlayerControllerHuman controller; // private static final boolean DEBUG_INPUT = true; // false; - public InputProxy(final LocalGameView gameView0) { - gameView = gameView0; + public InputProxy(final PlayerControllerHuman controller0) { + controller = controller0; } @Override public final void update(final Observable observable, final Object obj) { - final Input nextInput = gameView.getInputQueue().getActualInput(gameView); + final Input nextInput = controller.getInputQueue().getActualInput(controller); /* if(DEBUG_INPUT) System.out.printf("%s ... \t%s on %s, \tstack = %s%n", FThreads.debugGetStackTraceItem(6, true), nextInput == null ? "null" : nextInput.getClass().getSimpleName(), @@ -64,7 +63,7 @@ public class InputProxy implements Observer { @Override public void run() { Input current = getInput(); - gameView.getInputQueue().syncPoint(); + controller.getInputQueue().syncPoint(); //System.out.printf("\t%s > showMessage @ %s/%s during %s%n", FThreads.debugGetCurrThreadId(), nextInput.getClass().getSimpleName(), current.getClass().getSimpleName(), game.getPhaseHandler().debugPrintState()); current.showMessageInitial(); } @@ -99,7 +98,7 @@ public class InputProxy implements Observer { public final void selectPlayer(final PlayerView playerView, final ITriggerEvent triggerEvent) { final Input inp = getInput(); if (inp != null) { - final Player player = gameView.getPlayer(playerView); + final Player player = Player.get(playerView); if (player != null) { inp.selectPlayer(player, triggerEvent); } @@ -109,7 +108,7 @@ public class InputProxy implements Observer { public final boolean selectCard(final CardView cardView, final ITriggerEvent triggerEvent) { final Input inp = getInput(); if (inp != null) { - final Card card = gameView.getCard(cardView); + final Card card = Card.get(cardView); if (card != null) { return inp.selectCard(card, triggerEvent); } @@ -117,10 +116,9 @@ public class InputProxy implements Observer { return false; } - public final void selectAbility(final SpellAbilityView ab) { + public final void selectAbility(final SpellAbility sa) { final Input inp = getInput(); if (inp != null) { - final SpellAbility sa = gameView.getSpellAbility(ab); if (sa != null) { inp.selectAbility(sa); } diff --git a/forge-gui/src/main/java/forge/match/input/InputQueue.java b/forge-gui/src/main/java/forge/match/input/InputQueue.java index e25e1833c7f..a9ef3c48dbf 100644 --- a/forge-gui/src/main/java/forge/match/input/InputQueue.java +++ b/forge-gui/src/main/java/forge/match/input/InputQueue.java @@ -22,8 +22,9 @@ import java.util.concurrent.BlockingDeque; import java.util.concurrent.LinkedBlockingDeque; import forge.game.Game; +import forge.game.player.Player; import forge.match.MatchUtil; -import forge.view.IGameView; +import forge.player.PlayerControllerHuman; /** *

@@ -60,16 +61,9 @@ public class InputQueue extends Observable { updateObservers(); } - /** - *

- * updateInput. - *

- * - * @return a {@link forge.gui.input.InputBase} object. - */ - public final Input getActualInput(final IGameView gameView) { + public final Input getActualInput(final PlayerControllerHuman controller) { Input topMost = inputStack.peek(); // incoming input to Control - if (topMost != null && !gameView.isGameOver()) { + if (topMost != null && !controller.getGame().isGameOver()) { return topMost; } return inputLock; @@ -82,7 +76,7 @@ public class InputQueue extends Observable { public void setInput(final InputSynchronized input) { if (MatchUtil.getHumanCount() > 1) { //update current player if needed - MatchUtil.setCurrentPlayer(MatchUtil.players.getKey(input.getOwner().getId())); + MatchUtil.setCurrentPlayer(Player.get(input.getOwner())); } inputStack.push(input); InputBase.waitForOtherPlayer(); @@ -96,9 +90,6 @@ public class InputQueue extends Observable { } } - /** - * TODO: Write javadoc for this method. - */ public void onGameOver(boolean releaseAllInputs) { for (InputSynchronized inp : inputStack) { inp.relaseLatchWhenGameIsOver(); @@ -107,4 +98,4 @@ public class InputQueue extends Observable { } } } -} // InputControl +} diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java b/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java index 052def52b51..cc1d0122d0e 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectManyBase.java @@ -6,6 +6,7 @@ import com.google.common.collect.Iterables; import forge.game.GameEntity; import forge.game.card.Card; +import forge.game.card.CardView; import forge.match.MatchUtil; import forge.player.PlayerControllerHuman; @@ -75,14 +76,14 @@ public abstract class InputSelectManyBase extends InputSyn protected void onSelectStateChanged(final GameEntity c, final boolean newState) { if (c instanceof Card) { - MatchUtil.setUsedToPay(getController().getCardView((Card) c), newState); // UI supports card highlighting though this abstraction-breaking mechanism + MatchUtil.setUsedToPay(CardView.get((Card) c), newState); // UI supports card highlighting though this abstraction-breaking mechanism } } private void resetUsedToPay() { for (final GameEntity c : getSelected()) { if (c instanceof Card) { - MatchUtil.setUsedToPay(getController().getCardView((Card) c), false); + MatchUtil.setUsedToPay(CardView.get((Card) c), false); } } } diff --git a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java index 1be3f30013b..57c42a42ac0 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java +++ b/forge-gui/src/main/java/forge/match/input/InputSelectTargets.java @@ -10,6 +10,7 @@ import forge.game.GameEntity; import forge.game.GameObject; import forge.game.ability.ApiType; import forge.game.card.Card; +import forge.game.card.CardView; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; @@ -229,7 +230,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { private void addTarget(final GameEntity ge) { sa.getTargets().add(ge); if (ge instanceof Card) { - MatchUtil.setUsedToPay(getController().getCardView((Card) ge), true); + MatchUtil.setUsedToPay(CardView.get((Card) ge), true); lastTarget = (Card) ge; } final Integer val = targetDepth.get(ge); @@ -246,7 +247,7 @@ public final class InputSelectTargets extends InputSyncronizedBase { private void done() { for (final GameEntity c : targetDepth.keySet()) { if (c instanceof Card) { - MatchUtil.setUsedToPay(getController().getCardView((Card) c), false); + MatchUtil.setUsedToPay(CardView.get((Card) c), false); } } diff --git a/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java b/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java index bd470bfbd4e..f9dcef5ef38 100644 --- a/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java +++ b/forge-gui/src/main/java/forge/match/input/InputSyncronizedBase.java @@ -30,7 +30,7 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn } public void showAndWait() { - getGameView().getInputQueue().setInput(this); + getController().getInputQueue().setInput(this); awaitLatchRelease(); } @@ -46,7 +46,7 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn }); // thread irrelevant - getGameView().getInputQueue().removeInput(InputSyncronizedBase.this); + getController().getInputQueue().removeInput(InputSyncronizedBase.this); cdlDone.countDown(); } diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 012b1ebeae2..ef8edb25e88 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -12,6 +12,7 @@ import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardPredicates.Presets; +import forge.game.card.CardView; import forge.game.card.CounterType; import forge.game.cost.*; import forge.game.player.Player; @@ -25,14 +26,11 @@ import forge.util.ITriggerEvent; import forge.util.Lang; import forge.util.gui.SGuiChoose; import forge.util.gui.SGuiDialog; -import forge.view.CardView; -import forge.view.PlayerView; import java.util.*; import java.util.Map.Entry; public class HumanCostDecision extends CostDecisionMakerBase { - private final PlayerControllerHuman controller; private final SpellAbility ability; private final Card source; @@ -68,7 +66,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { @Override public PaymentDecision visit(CostChooseCreatureType cost) { String choice = controller.chooseSomeType("Creature", ability, new ArrayList(CardType.getCreatureTypes()), new ArrayList(), true); - if( null == choice ) + if (null == choice) return null; return PaymentDecision.type(choice); } @@ -294,9 +292,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (nNeeded == 0) { return PaymentDecision.number(0); } - final PlayerView view = SGuiChoose.oneOrNone(String.format("Exile from whose %s?", cost.getFrom()), - controller.getPlayerViews(payableZone)); - final Player p = controller.getPlayer(view); + final Player p = SGuiChoose.oneOrNone(String.format("Exile from whose %s?", cost.getFrom()), payableZone); if (p == null) { return null; } @@ -342,7 +338,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { // Generalize this if (sVar.equals("XChoice")) { c = chooseXValue(saList.size()); - } else { + } + else { c = AbilityUtils.calculateAmount(source, amount, ability); } } @@ -378,33 +375,26 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (list.size() > nNeeded || !player.getController().confirmPayment(cost, "Exile " + Lang.nounWithAmount(nNeeded, "card") + " from the top of your library?")) { return null; } - return PaymentDecision.card(list); } private PaymentDecision exileFromMiscZone(CostExile cost, SpellAbility sa, int nNeeded, List typeList) { - if (typeList.size() < nNeeded) - return null; - + if (typeList.size() < nNeeded) { return null; } + List exiled = new ArrayList(); for (int i = 0; i < nNeeded; i++) { - final CardView view = SGuiChoose.oneOrNone("Exile from " + cost.getFrom(), controller.getCardViews(typeList)); - final Card c = controller.getCard(view); + final Card c = SGuiChoose.oneOrNone("Exile from " + cost.getFrom(), typeList); + if (c == null) { return null; } - if (c != null) { - typeList.remove(c); - exiled.add(c); - } else { - return null; - } + typeList.remove(c); + exiled.add(c); } return PaymentDecision.card(exiled); } private PaymentDecision exileFromTopGraveType(SpellAbility sa, int nNeeded, List typeList) { - if (typeList.size() < nNeeded) - return null; - + if (typeList.size() < nNeeded) { return null; } + Collections.reverse(typeList); return PaymentDecision.card(Lists.newArrayList(Iterables.limit(typeList, nNeeded))); } @@ -420,12 +410,11 @@ public class HumanCostDecision extends CostDecisionMakerBase { List list = activator.getGame().getCardsIn(ZoneType.Exile); list = CardLists.getValidCards(list, cost.getType().split(";"), activator, source); - if (list.size() < c) + if (list.size() < c) { return null; - - final List choice = SGuiChoose.many("Choose an exiled card to put into graveyard", "To graveyard", c, - controller.getCardViews(list), controller.getCardView(source)); - return PaymentDecision.card(controller.getCards(choice)); + } + final List choice = SGuiChoose.many("Choose an exiled card to put into graveyard", "To graveyard", c, list, CardView.get(source)); + return PaymentDecision.card(choice); } @Override @@ -496,12 +485,11 @@ public class HumanCostDecision extends CostDecisionMakerBase { final StringBuilder sb = new StringBuilder(); sb.append(source.getName()).append(" - Choose an opponent to gain ").append(c).append(" life:"); - final PlayerView chosenToGainView = SGuiChoose.oneOrNone(sb.toString(), controller.getPlayerViews(oppsThatCanGainLife)); - final Player chosenToGain = controller.getPlayer(chosenToGainView); - if (null == chosenToGain) + final Player chosenToGain = SGuiChoose.oneOrNone(sb.toString(), oppsThatCanGainLife); + if (chosenToGain == null) { return null; - else - return PaymentDecision.players(Lists.newArrayList(chosenToGain)); + } + return PaymentDecision.players(Lists.newArrayList(chosenToGain)); } @Override @@ -579,7 +567,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (cost.from == ZoneType.Hand) { InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, list); - inp.setMessage("Put %d card(s) from your " + cost.from ); + inp.setMessage("Put %d card(s) from your " + cost.from); inp.setCancelAllowed(true); inp.showAndWait(); return inp.hasCancelled() ? null : PaymentDecision.card(inp.getSelected()); @@ -602,23 +590,18 @@ public class HumanCostDecision extends CostDecisionMakerBase { } } - private PaymentDecision putFromMiscZone(SpellAbility sa, int nNeeded, List typeList, ZoneType fromZone) { if (typeList.size() < nNeeded) { return null; } - final List viewList = controller.getCardViews(typeList); List chosen = new ArrayList(); for (int i = 0; i < nNeeded; i++) { - final CardView view = SGuiChoose.oneOrNone("Put from " + fromZone + " to library", viewList); - final Card c = controller.getCard(view); - + final Card c = SGuiChoose.oneOrNone("Put from " + fromZone + " to library", typeList); if (c == null) { return null; } - - viewList.remove(view); + typeList.remove(c); chosen.add(c); } return PaymentDecision.card(chosen); @@ -628,10 +611,8 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (nNeeded == 0) { return PaymentDecision.number(0); } - - final List players = controller.getPlayerViews(payableZone); - final PlayerView pView = SGuiChoose.oneOrNone(String.format("Put cards from whose %s?", fromZone), players); - final Player p = controller.getPlayer(pView); + + final Player p = SGuiChoose.oneOrNone(String.format("Put cards from whose %s?", fromZone), payableZone); if (p == null) { return null; } @@ -641,17 +622,13 @@ public class HumanCostDecision extends CostDecisionMakerBase { return null; } - final List viewList = controller.getCardViews(typeList); List chosen = new ArrayList(); for (int i = 0; i < nNeeded; i++) { - final CardView view = SGuiChoose.oneOrNone("Put cards from " + fromZone + " to Library", viewList); - final Card c = controller.getCard(view); - + final Card c = SGuiChoose.oneOrNone("Put cards from " + fromZone + " to Library", typeList); if (c == null) { return null; } - - viewList.remove(view); + typeList.remove(c); chosen.add(c); } return PaymentDecision.card(chosen); @@ -674,7 +651,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { inp.setCancelAllowed(true); inp.showAndWait(); - if(inp.hasCancelled()) + if (inp.hasCancelled()) return null; return PaymentDecision.card(inp.getSelected()); @@ -698,7 +675,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (cost.payCostFromSource()) { final Card card = ability.getHostCard(); if (card.getController() == player && card.isInPlay()) { - final CardView view = controller.getCardView(card); + final CardView view = CardView.get(card); return player.getController().confirmPayment(cost, "Return " + view + " to hand?") ? PaymentDecision.card(card) : null; } } @@ -708,25 +685,24 @@ public class HumanCostDecision extends CostDecisionMakerBase { InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, validCards); inp.setMessage("Return %d " + cost.getType() + " " + cost.getType() + " card(s) to hand"); inp.showAndWait(); - if (inp.hasCancelled()) + if (inp.hasCancelled()) { return null; - + } return PaymentDecision.card(inp.getSelected()); } return null; - } @Override public PaymentDecision visit(CostReveal cost) { final String amount = cost.getAmount(); - if (cost.payCostFromSource()) + if (cost.payCostFromSource()) { return PaymentDecision.card(source); - - if (cost.getType().equals("Hand")) + } + if (cost.getType().equals("Hand")) { return PaymentDecision.card(player.getCardsIn(ZoneType.Hand)); - + } InputSelectCardsFromList inp = null; if (cost.getType().equals("SameColor")) { Integer num = cost.convertAmount(); @@ -743,9 +719,9 @@ public class HumanCostDecision extends CostDecisionMakerBase { return false; } }); - if (num == 0) + if (num == 0) { return PaymentDecision.number(0); - + } inp = new InputSelectCardsFromList(controller, num, handList) { private static final long serialVersionUID = 8338626212893374798L; @@ -758,9 +734,9 @@ public class HumanCostDecision extends CostDecisionMakerBase { return super.onCardSelected(c, triggerEvent); } }; - inp.setMessage("Select " + Lang.nounWithAmount(num, "card" ) + " of same color to reveal."); - - } else { + inp.setMessage("Select " + Lang.nounWithAmount(num, "card") + " of same color to reveal."); + } + else { Integer num = cost.convertAmount(); List handList = player.getCardsIn(ZoneType.Hand); @@ -774,7 +750,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { num = AbilityUtils.calculateAmount(source, amount, ability); } } - if ( num == 0 ) + if (num == 0) return PaymentDecision.number(0);; inp = new InputSelectCardsFromList(controller, num, num, handList); @@ -873,7 +849,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { private int getDistibutedCounters() { int sum = 0; - for(Entry kv : cardsChosen.entrySet()) { + for (Entry kv : cardsChosen.entrySet()) { sum += kv.getValue().intValue(); } return sum; @@ -911,13 +887,13 @@ public class HumanCostDecision extends CostDecisionMakerBase { if (cost.payCostFromSource()) { int maxCounters = source.getCounters(cost.counter); if (amount.equals("All")) { - final CardView view = controller.getCardView(ability.getHostCard()); + final CardView view = CardView.get(ability.getHostCard()); if (!SGuiDialog.confirm(view, "Remove all counters?")) { return null; } cntRemoved = maxCounters; } - else if ( c == null && "XChoice".equals(sVarAmount)) { + else if (c == null && "XChoice".equals(sVarAmount)) { cntRemoved = chooseXValue(maxCounters); } @@ -953,7 +929,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { for (Card crd : inp.getSelected()) { int removed = inp.getTimesSelected(crd); // sum += removed; - if(removed < 2) continue; + if (removed < 2) continue; int oldVal = crd.getCounters().get(cost.counter).intValue(); crd.getCounters().put(cost.counter, Integer.valueOf(oldVal - removed + 1)); } @@ -964,12 +940,12 @@ public class HumanCostDecision extends CostDecisionMakerBase { List suspended = Lists.newArrayList(); for (final Card crd : validCards) { if (crd.getCounters(cost.counter) > 0) { - suspended.add(controller.getCardView(crd)); + suspended.add(CardView.get(crd)); } } final CardView view = SGuiChoose.oneOrNone("Remove counter(s) from a card in " + cost.zone, suspended); - final Card card = controller.getCard(view); + final Card card = Card.get(view); return null == card ? null : PaymentDecision.card(card, c); } @@ -1014,7 +990,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { inp.setMessage("Select a " + cost.getDescriptiveType() + " to sacrifice (%d left)"); inp.setCancelAllowed(true); inp.showAndWait(); - if ( inp.hasCancelled() ) + if (inp.hasCancelled()) return null; return PaymentDecision.card(inp.getSelected()); @@ -1115,7 +1091,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, typeList); inp.setMessage("Select a " + cost.getDescriptiveType() + " to tap (%d left)"); inp.showAndWait(); - if ( inp.hasCancelled() ) + if (inp.hasCancelled()) return null; return PaymentDecision.card(inp.getSelected()); @@ -1143,7 +1119,7 @@ public class HumanCostDecision extends CostDecisionMakerBase { InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, typeList); inp.setMessage("Select a " + cost.getDescriptiveType() + " to untap (%d left)"); inp.showAndWait(); - if( inp.hasCancelled() || inp.getSelected().size() != c ) + if (inp.hasCancelled() || inp.getSelected().size() != c) return null; return PaymentDecision.card(inp.getSelected()); } diff --git a/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java b/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java index 2311e32730b..bc7bc604ad3 100644 --- a/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java +++ b/forge-gui/src/main/java/forge/player/LobbyPlayerHuman.java @@ -23,7 +23,6 @@ public class LobbyPlayerHuman extends LobbyPlayer implements IGameEntitiesFactor Player player = new Player(GuiDisplayUtil.personalizeHuman(getName()), game, id); PlayerControllerHuman controller = new PlayerControllerHuman(game, player, this); player.setFirstController(controller); - controller.getGameView().setLocalPlayer(player); return player; } diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index 4545c50f9fc..7f9387a274c 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -46,9 +46,9 @@ import forge.deck.DeckSection; import forge.events.UiEventAttackerDeclared; import forge.game.Game; import forge.game.GameEntity; +import forge.game.GameEntityView; import forge.game.GameLogEntryType; import forge.game.GameObject; -import forge.game.GameOutcome; import forge.game.GameType; import forge.game.PlanarDice; import forge.game.ability.effects.CharmEffect; @@ -56,6 +56,7 @@ import forge.game.card.Card; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardShields; +import forge.game.card.CardView; import forge.game.card.CounterType; import forge.game.combat.Combat; import forge.game.combat.CombatUtil; @@ -68,6 +69,7 @@ import forge.game.player.DelayedReveal; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerController; +import forge.game.player.PlayerView; import forge.game.replacement.ReplacementEffect; import forge.game.spellability.AbilityManaPart; import forge.game.spellability.AbilitySub; @@ -93,6 +95,8 @@ import forge.match.input.InputConfirmMulligan; import forge.match.input.InputPassPriority; import forge.match.input.InputPayMana; import forge.match.input.InputProliferate; +import forge.match.input.InputProxy; +import forge.match.input.InputQueue; import forge.match.input.InputSelectCardsForConvoke; import forge.match.input.InputSelectCardsFromList; import forge.match.input.InputSelectEntitiesFromList; @@ -106,13 +110,6 @@ import forge.util.TextUtil; import forge.util.gui.SGuiChoose; import forge.util.gui.SGuiDialog; import forge.util.gui.SOptionPane; -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.StackItemView; /** * A prototype for player controller class @@ -120,36 +117,46 @@ import forge.view.StackItemView; * Handles phase skips for now. */ public class PlayerControllerHuman extends PlayerController { - private final GameView gameView; /** * Cards this player may look at right now, for example when searching a * library. */ private boolean mayLookAtAllCards = false; + private boolean disableAutoYields = false; + + protected final InputQueue inputQueue; + protected final InputProxy inputProxy; public PlayerControllerHuman(Game game0, Player p, LobbyPlayer lp) { super(game0, p, lp); - if (p.getController() == null || p.getLobbyPlayer() == lp) { - gameView = new GameView(game0); - } - else { //handle the case of one player controlling another - for (Player p0 : game.getPlayers()) { - if (p0.getLobbyPlayer() == lp) { - p = p0; - break; - } - } - gameView = (GameView)MatchUtil.getGameView(p); - } + inputProxy = new InputProxy(this); + inputQueue = new InputQueue(game, inputProxy); + } + public PlayerControllerHuman(Player p, LobbyPlayer lp, PlayerControllerHuman owner) { + super(owner.getGame(), p, lp); + inputProxy = owner.inputProxy; + inputQueue = owner.getInputQueue(); } - public LocalGameView getGameView() { - return gameView; + public final InputQueue getInputQueue() { + return inputQueue; + } + + public InputProxy getInputProxy() { + return inputProxy; + } + + public PlayerView getLocalPlayerView() { + return player.getView(); + } + + public boolean getDisableAutoYields() { + return disableAutoYields; + } + public void setDisableAutoYields(boolean disableAutoYields0) { + disableAutoYields = disableAutoYields0; } - /** - * @return the mayLookAtAllCards - */ public boolean mayLookAtAllCards() { return mayLookAtAllCards; } @@ -166,7 +173,7 @@ public class PlayerControllerHuman extends PlayerController { private void tempShowCard(Card c) { if (c == null) { return; } - CardView cv = gameView.getCardView(c, false); + CardView cv = c.getView(); if (!cv.mayBeShown()) { cv.setMayBeShown(true); tempShownCards.add(c); @@ -183,7 +190,7 @@ public class PlayerControllerHuman extends PlayerController { if (tempShownCards.isEmpty()) { return; } for (Card c : tempShownCards) { - MatchUtil.cards.get(c.getId()).setMayBeShown(false); + c.getView().setMayBeShown(false); } tempShownCards.clear(); } @@ -200,20 +207,16 @@ public class PlayerControllerHuman extends PlayerController { } public boolean isUiSetToSkipPhase(final Player turn, final PhaseType phase) { - return !MatchUtil.getController().stopAtPhase(getPlayerView(turn), phase); + return !MatchUtil.getController().stopAtPhase(PlayerView.get(turn), phase); } /** * Uses GUI to learn which spell the player (human in our case) would like to play */ public SpellAbility getAbilityToPlay(final List abilities, final ITriggerEvent triggerEvent) { - final int choice = MatchUtil.getController().getAbilityToPlay(gameView.getSpellAbilityViews(abilities), triggerEvent); - return gameView.getSpellAbility(choice); + return MatchUtil.getController().getAbilityToPlay(abilities, triggerEvent); } - /* (non-Javadoc) - * @see forge.game.player.PlayerController#mayPlaySpellAbilityForFree(forge.card.spellability.SpellAbility) - */ @Override public void playSpellAbilityForFree(SpellAbility copySA, boolean mayChoseNewTargets) { HumanPlay.playSaWithoutPayingManaCost(this, player.getGame(), copySA, mayChoseNewTargets); @@ -224,9 +227,6 @@ public class PlayerControllerHuman extends PlayerController { HumanPlay.playSpellAbilityNoStack(this, player, effectSA, !canSetupTargets); } - /* (non-Javadoc) - * @see forge.game.player.PlayerController#sideboard(forge.deck.Deck) - */ @Override public List sideboard(Deck deck, GameType gameType) { CardPool sideboard = deck.get(DeckSection.Sideboard); @@ -272,9 +272,6 @@ public class PlayerControllerHuman extends PlayerController { return newMain; } - /* (non-Javadoc) - * @see forge.game.player.PlayerController#assignCombatDamage() - */ @Override public Map assignCombatDamage(final Card attacker, final List blockers, final int damageDealt, @@ -284,16 +281,18 @@ public class PlayerControllerHuman extends PlayerController { final Map map = Maps.newHashMap(); if (defender != null && assignDamageAsIfNotBlocked(attacker)) { map.put(null, damageDealt); - } else { - final List vBlockers = getCardViews(blockers); + } + else { + final List vBlockers = CardView.getCollection(blockers); if ((attacker.hasKeyword("Trample") && defender != null) || (blockers.size() > 1)) { - final CardView vAttacker = getCardView(attacker); - final GameEntityView vDefender = getGameEntityView(defender); + final CardView vAttacker = CardView.get(attacker); + final GameEntityView vDefender = GameEntityView.get(defender); final Map result = MatchUtil.getDamageToAssign(vAttacker, vBlockers, damageDealt, vDefender, overrideOrder); for (final Entry e : result.entrySet()) { - map.put(gameView.getCard(e.getKey()), e.getValue()); + map.put(Card.get(e.getKey()), e.getValue()); } - } else { + } + else { map.put(blockers.get(0), damageDealt); } } @@ -303,12 +302,9 @@ public class PlayerControllerHuman extends PlayerController { private final boolean assignDamageAsIfNotBlocked(final Card attacker) { return attacker.hasKeyword("CARDNAME assigns its combat damage as though it weren't blocked.") || (attacker.hasKeyword("You may have CARDNAME assign its combat damage as though it weren't blocked.") - && SGuiDialog.confirm(getCardView(attacker), "Do you want to assign its combat damage as though it weren't blocked?")); + && SGuiDialog.confirm(CardView.get(attacker), "Do you want to assign its combat damage as though it weren't blocked?")); } - /* (non-Javadoc) - * @see forge.game.player.PlayerController#announceRequirements(java.lang.String) - */ @Override public Integer announceRequirements(SpellAbility ability, String announce, boolean canChooseZero) { int min = canChooseZero ? 0 : 1; @@ -359,7 +355,7 @@ public class PlayerControllerHuman extends PlayerController { return singleChosen == null ? Lists.newArrayList() : Lists.newArrayList(singleChosen); } - MatchUtil.getController().setPanelSelection(getCardView(sa.getHostCard())); + MatchUtil.getController().setPanelSelection(CardView.get(sa.getHostCard())); // try to use InputSelectCardsFromList when possible boolean cardsAreInMyHandOrBattlefield = true; @@ -381,10 +377,10 @@ public class PlayerControllerHuman extends PlayerController { } tempShowCards(sourceList); - final List choices = SGuiChoose.many(title, "Chosen Cards", min, max, getCardViews(sourceList), getCardView(sa.getHostCard())); + final List choices = SGuiChoose.many(title, "Chosen Cards", min, max, CardView.getCollection(sourceList), CardView.get(sa.getHostCard())); endTempShowCards(); - return getCards(choices); + return Card.getList(choices); } @SuppressWarnings("unchecked") @@ -431,7 +427,7 @@ public class PlayerControllerHuman extends PlayerController { final GameEntityView result = GuiBase.getInterface().chooseSingleEntityForEffect(title, optionList, delayedReveal, isOptional, this); endTempShowCards(); //assume tempShow called by GuiBase.getInterface().chooseSingleEntityForEffect - return (T) gameView.getGameEntity(result); + return (T) GameEntity.get(result); } @Override @@ -455,8 +451,7 @@ public class PlayerControllerHuman extends PlayerController { } // Human is supposed to read the message and understand from it what to choose - final SpellAbilityView choice = SGuiChoose.one(title, gameView.getSpellAbilityViews(spells)); - return gameView.getSpellAbility(choice); + return SGuiChoose.one(title, spells); } /* (non-Javadoc) @@ -464,18 +459,18 @@ public class PlayerControllerHuman extends PlayerController { */ @Override public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message) { - return SGuiDialog.confirm(getCardView(sa.getHostCard()), message); + return SGuiDialog.confirm(CardView.get(sa.getHostCard()), message); } @Override public boolean confirmBidAction(SpellAbility sa, PlayerActionConfirmMode bidlife, String string, int bid, Player winner) { - return SGuiDialog.confirm(getCardView(sa.getHostCard()), string + " Highest Bidder " + winner); + return SGuiDialog.confirm(CardView.get(sa.getHostCard()), string + " Highest Bidder " + winner); } @Override public boolean confirmStaticApplication(Card hostCard, GameEntity affected, String logic, String message) { - return SGuiDialog.confirm(getCardView(hostCard), message); + return SGuiDialog.confirm(CardView.get(hostCard), message); } @Override @@ -533,26 +528,26 @@ public class PlayerControllerHuman extends PlayerController { @Override public List orderBlockers(final Card attacker, final List blockers) { - final CardView vAttacker = getCardView(attacker); + final CardView vAttacker = CardView.get(attacker); MatchUtil.getController().setPanelSelection(vAttacker); - final List choices = SGuiChoose.order("Choose Damage Order for " + vAttacker, "Damaged First", getCardViews(blockers), vAttacker); - return gameView.getCards(choices); + final List choices = SGuiChoose.order("Choose Damage Order for " + vAttacker, "Damaged First", CardView.getCollection(blockers), vAttacker); + return Card.getList(choices); } @Override public List orderBlocker(final Card attacker, final Card blocker, final List oldBlockers) { - final CardView vAttacker = getCardView(attacker); + final CardView vAttacker = CardView.get(attacker); MatchUtil.getController().setPanelSelection(vAttacker); - final List choices = SGuiChoose.insertInList("Choose blocker after which to place " + vAttacker + " in damage order; cancel to place it first", getCardView(blocker), getCardViews(oldBlockers)); - return gameView.getCards(choices); + final List choices = SGuiChoose.insertInList("Choose blocker after which to place " + vAttacker + " in damage order; cancel to place it first", CardView.get(blocker), CardView.getCollection(oldBlockers)); + return Card.getList(choices); } @Override public List orderAttackers(final Card blocker, final List attackers) { - final CardView vBlocker = getCardView(blocker); + final CardView vBlocker = CardView.get(blocker); MatchUtil.getController().setPanelSelection(vBlocker); - final List choices = SGuiChoose.order("Choose Damage Order for " + vBlocker, "Damaged First", getCardViews(attackers), vBlocker); - return gameView.getCards(choices); + final List choices = SGuiChoose.order("Choose Damage Order for " + vBlocker, "Damaged First", CardView.getCollection(attackers), vBlocker); + return Card.getList(choices); } /* (non-Javadoc) @@ -569,7 +564,7 @@ public class PlayerControllerHuman extends PlayerController { String fm = MessageUtil.formatMessage(message, player, owner); if (!cards.isEmpty()) { tempShowCards(cards); - SGuiChoose.reveal(fm, getCardViews(cards)); + SGuiChoose.reveal(fm, cards); endTempShowCards(); } else { @@ -593,8 +588,7 @@ public class PlayerControllerHuman extends PlayerController { } } else { - final List toBottomViews = SGuiChoose.many("Select cards to be put on the bottom of your library", "Cards to put on the bottom", -1, getCardViews(topN), null); - toBottom = gameView.getCards(toBottomViews); + toBottom = SGuiChoose.many("Select cards to be put on the bottom of your library", "Cards to put on the bottom", -1, topN, null); topN.removeAll(toBottom); if (topN.isEmpty()) { toTop = null; @@ -603,8 +597,7 @@ public class PlayerControllerHuman extends PlayerController { toTop = topN; } else { - final List toTopViews = SGuiChoose.order("Arrange cards to be put on top of your library", "Cards arranged", getCardViews(topN), null); - toTop = gameView.getCards(toTopViews); + toTop = SGuiChoose.order("Arrange cards to be put on top of your library", "Cards arranged", topN, null); } } endTempShowCards(); @@ -615,7 +608,7 @@ public class PlayerControllerHuman extends PlayerController { public boolean willPutCardOnTop(final Card c) { final PaperCard pc = FModel.getMagicDb().getCommonCards().getCard(c.getName()); final Card c1 = (pc != null ? Card.fromPaperCard(pc, null) : c); - final CardView view = getCardView(c1); + final CardView view = CardView.get(c1); return SGuiDialog.confirm(view, "Put " + view + " on the top or bottom of your library?", new String[]{"Top", "Bottom"}); } @@ -625,22 +618,22 @@ public class PlayerControllerHuman extends PlayerController { tempShowCards(cards); switch (destinationZone) { case Library: - choices = SGuiChoose.order("Choose order of cards to put into the library", "Closest to top", getCardViews(cards), null); + choices = SGuiChoose.order("Choose order of cards to put into the library", "Closest to top", CardView.getCollection(cards), null); break; case Battlefield: - choices = SGuiChoose.order("Choose order of cards to put onto the battlefield", "Put first", getCardViews(cards), null); + choices = SGuiChoose.order("Choose order of cards to put onto the battlefield", "Put first", CardView.getCollection(cards), null); break; case Graveyard: - choices = SGuiChoose.order("Choose order of cards to put into the graveyard", "Closest to bottom", getCardViews(cards), null); + choices = SGuiChoose.order("Choose order of cards to put into the graveyard", "Closest to bottom", CardView.getCollection(cards), null); break; case PlanarDeck: - choices = SGuiChoose.order("Choose order of cards to put into the planar deck", "Closest to top", getCardViews(cards), null); + choices = SGuiChoose.order("Choose order of cards to put into the planar deck", "Closest to top", CardView.getCollection(cards), null); break; case SchemeDeck: - choices = SGuiChoose.order("Choose order of cards to put into the scheme deck", "Closest to top", getCardViews(cards), null); + choices = SGuiChoose.order("Choose order of cards to put into the scheme deck", "Closest to top", CardView.getCollection(cards), null); break; case Stack: - choices = SGuiChoose.order("Choose order of copies to cast", "Put first", getCardViews(cards), null); + choices = SGuiChoose.order("Choose order of copies to cast", "Put first", CardView.getCollection(cards), null); break; default: System.out.println("ZoneType " + destinationZone + " - Not Ordered"); @@ -648,7 +641,7 @@ public class PlayerControllerHuman extends PlayerController { return cards; } endTempShowCards(); - return getCards(choices); + return Card.getList(choices); } @Override @@ -656,9 +649,9 @@ public class PlayerControllerHuman extends PlayerController { if (p != player) { tempShowCards(valid); final List choices = SGuiChoose.many("Choose " + min + " card" + (min != 1 ? "s" : "") + " to discard", - "Discarded", min, min, getCardViews(valid), null); + "Discarded", min, min, CardView.getCollection(valid), null); endTempShowCards(); - return getCards(choices); + return Card.getList(choices); } InputSelectCardsFromList inp = new InputSelectCardsFromList(this, min, max, valid); @@ -669,7 +662,7 @@ public class PlayerControllerHuman extends PlayerController { @Override public void playMiracle(final SpellAbility miracle, final Card card) { - final CardView view = getCardView(card); + final CardView view = CardView.get(card); if (SGuiDialog.confirm(view, view + " - Drawn. Play for Miracle Cost?")) { HumanPlay.playSpellAbility(this, player, miracle); } @@ -688,7 +681,7 @@ public class PlayerControllerHuman extends PlayerController { System.out.println("Delve for " + chosenAmount); for (int i = 0; i < chosenAmount; i++) { - final CardView nowChosen = SGuiChoose.oneOrNone("Exile which card?", getCardViews(grave)); + final CardView nowChosen = SGuiChoose.oneOrNone("Exile which card?", CardView.getCollection(grave)); if (nowChosen == null) { // User canceled,abort delving. @@ -696,8 +689,8 @@ public class PlayerControllerHuman extends PlayerController { break; } - grave.remove(gameView.getCard(nowChosen)); - toExile.add(gameView.getCard(nowChosen)); + grave.remove(Card.get(nowChosen)); + toExile.add(Card.get(nowChosen)); } return toExile; } @@ -786,7 +779,7 @@ public class PlayerControllerHuman extends PlayerController { */ @Override public boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, String question) { - return SGuiDialog.confirm(getCardView(replacementEffect.getHostCard()), question); + return SGuiDialog.confirm(CardView.get(replacementEffect.getHostCard()), question); } @Override @@ -805,7 +798,7 @@ public class PlayerControllerHuman extends PlayerController { //ensure they're declared and then delay slightly so user can see as much for (Pair attacker : mandatoryAttackers) { combat.addAttacker(attacker.getLeft(), attacker.getRight()); - MatchUtil.fireEvent(new UiEventAttackerDeclared(getCardView(attacker.getLeft()), getGameEntityView(attacker.getRight()))); + MatchUtil.fireEvent(new UiEventAttackerDeclared(CardView.get(attacker.getLeft()), CardView.get(attacker.getRight()))); } try { Thread.sleep(FControlGamePlayback.combatDelay); @@ -835,10 +828,9 @@ public class PlayerControllerHuman extends PlayerController { //allow user to cancel auto-pass InputBase.cancelAwaitNextInput(); //don't overwrite prompt with awaiting opponent PhaseType phase = getAutoPassUntilPhase(); - PlayerView playerView = gameView.getLocalPlayerView(); - MatchUtil.getController().showPromptMessage(playerView, "Yielding until " + (phase == PhaseType.CLEANUP ? "end of turn" : phase.nameForUi.toString()) + + MatchUtil.getController().showPromptMessage(player.getView(), "Yielding until " + (phase == PhaseType.CLEANUP ? "end of turn" : phase.nameForUi.toString()) + ".\nYou may cancel this yield to take an action."); - ButtonUtil.update(playerView, false, true, false); + ButtonUtil.update(player.getView(), false, true, false); } } @@ -854,10 +846,10 @@ public class PlayerControllerHuman extends PlayerController { super.autoPassCancel(); //prevent prompt getting stuck on yielding message while actually waiting for next input opportunity - PlayerView playerView = gameView.getLocalPlayerView(); + PlayerView playerView = getLocalPlayerView(); MatchUtil.getController().showPromptMessage(playerView, ""); ButtonUtil.update(playerView, false, false, false); - InputBase.awaitNextInput(gameView); + InputBase.awaitNextInput(this); } @Override @@ -969,9 +961,9 @@ public class PlayerControllerHuman extends PlayerController { if (srcCards.isEmpty()) { return result; } - final List chosen = SGuiChoose.many("Choose cards to activate from opening hand and their order", "Activate first", -1, getCardViews(srcCards), null); + final List chosen = SGuiChoose.many("Choose cards to activate from opening hand and their order", "Activate first", -1, CardView.getCollection(srcCards), null); for (final CardView view : chosen) { - final Card c = getCard(view); + final Card c = Card.get(view); for (SpellAbility sa : usableFromOpeningHand) { if (sa.getHostCard() == c) { result.add(sa); @@ -999,7 +991,7 @@ public class PlayerControllerHuman extends PlayerController { case PlayOrDraw: labels = new String[]{"Play", "Draw"}; break; default: labels = kindOfChoice.toString().split("Or"); } - return SGuiDialog.confirm(getCardView(sa.getHostCard()), question, defaultVal == null || defaultVal.booleanValue(), labels); + return SGuiDialog.confirm(CardView.get(sa.getHostCard()), question, defaultVal == null || defaultVal.booleanValue(), labels); } @Override @@ -1060,7 +1052,7 @@ public class PlayerControllerHuman extends PlayerController { game.getGameLog().add(GameLogEntryType.LAND, message); } else { - SGuiDialog.message(message, sa.getHostCard() == null ? "" : getCardView(sa.getHostCard()).toString()); + SGuiDialog.message(message, sa.getHostCard() == null ? "" : CardView.get(sa.getHostCard()).toString()); } } @@ -1071,11 +1063,11 @@ public class PlayerControllerHuman extends PlayerController { */ @Override public List chooseModeForAbility(SpellAbility sa, int min, int num) { - List choices = getSpellAbilityViews(CharmEffect.makePossibleOptions(sa)); + List choices = CharmEffect.makePossibleOptions(sa); String modeTitle = String.format("%s activated %s - Choose a mode", sa.getActivatingPlayer(), sa.getHostCard()); List chosen = Lists.newArrayListWithCapacity(num); for (int i = 0; i < num; i++) { - SpellAbilityView a; + AbilitySub a; if (i < min) { a = SGuiChoose.one(modeTitle, choices); } @@ -1087,7 +1079,7 @@ public class PlayerControllerHuman extends PlayerController { } choices.remove(a); - chosen.add((AbilitySub) getSpellAbility(a)); + chosen.add(a); } return chosen; } @@ -1130,7 +1122,7 @@ public class PlayerControllerHuman extends PlayerController { if (colorNames.length > 2) { return MagicColor.fromName(SGuiChoose.one(message, colorNames)); } - int idxChosen = SGuiDialog.confirm(getCardView(c), message, colorNames) ? 0 : 1; + int idxChosen = SGuiDialog.confirm(CardView.get(c), message, colorNames) ? 0 : 1; return MagicColor.fromName(colorNames[idxChosen]); } @@ -1180,8 +1172,7 @@ public class PlayerControllerHuman extends PlayerController { public void orderAndPlaySimultaneousSa(List activePlayerSAs) { List orderedSAs = activePlayerSAs; if (activePlayerSAs.size() > 1) { // give a dual list form to create instead of needing to do it one at a time - final List orderedSAViews = SGuiChoose.order("Select order for Simultaneous Spell Abilities", "Resolve first", gameView.getSpellAbilityViews(activePlayerSAs), null); - orderedSAs = getSpellAbilities(orderedSAViews); + orderedSAs = SGuiChoose.order("Select order for Simultaneous Spell Abilities", "Resolve first", activePlayerSAs, null); } int size = orderedSAs.size(); for (int i = size - 1; i >= 0; i--) { @@ -1229,22 +1220,20 @@ public class PlayerControllerHuman extends PlayerController { final String p1Str = String.format("Pile 1 (%s cards)", pile1.size()); final String p2Str = String.format("Pile 2 (%s cards)", pile2.size()); final String[] possibleValues = { p1Str , p2Str }; - return SGuiDialog.confirm(getCardView(sa.getHostCard()), "Choose a Pile", possibleValues); + return SGuiDialog.confirm(CardView.get(sa.getHostCard()), "Choose a Pile", possibleValues); } tempShowCards(pile1); tempShowCards(pile2); final List cards = Lists.newArrayListWithCapacity(pile1.size() + pile2.size() + 2); - final CardView pileView1 = new CardView(Integer.MIN_VALUE); - pileView1.getOriginal().setName("--- Pile 1 ---"); + final CardView pileView1 = new CardView(Integer.MIN_VALUE, "--- Pile 1 ---"); cards.add(pileView1); - cards.addAll(getCardViews(pile1)); + cards.addAll(CardView.getCollection(pile1)); - final CardView pileView2 = new CardView(Integer.MIN_VALUE + 1); - pileView2.getOriginal().setName("--- Pile 2 ---"); + final CardView pileView2 = new CardView(Integer.MIN_VALUE + 1, "--- Pile 2 ---"); cards.add(pileView2); - cards.addAll(getCardViews(pile2)); + cards.addAll(CardView.getCollection(pile2)); // make sure Pile 1 or Pile 2 is clicked on boolean result; @@ -1320,362 +1309,117 @@ public class PlayerControllerHuman extends PlayerController { return lobbyPlayer == GamePlayerUtil.getGuiPlayer(); } - /* - * What follows are the View methods. - */ - private class GameView extends LocalGameView { - public GameView(Game game0) { - super(game0); - } - - @Override - public GameOutcome.AnteResult getAnteResult() { - return game.getOutcome().anteResult.get(player); - } - - @Override - public void updateAchievements() { - AchievementCollection.updateAll(PlayerControllerHuman.this); - } - - @Override - public boolean canUndoLastAction() { - if (!game.stack.canUndo(player)) { - return false; - } - final Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); - if (priorityPlayer == null || priorityPlayer != player) { - return false; - } - return true; - } - - @Override - public boolean tryUndoLastAction() { - if (!canUndoLastAction()) { - return false; - } - - if (game.getStack().undo()) { - final Input currentInput = inputQueue.getInput(); - if (currentInput instanceof InputPassPriority) { - currentInput.showMessageInitial(); //ensure prompt updated if needed - } - return true; - } - return false; - } - - @Override - public void selectButtonOk() { - getInputProxy().selectButtonOK(); - } - - @Override - public void selectButtonCancel() { - getInputProxy().selectButtonCancel(); - } - - @Override - public void confirm() { - if (inputQueue.getInput() instanceof InputConfirm) { - selectButtonOk(); - } - } - - @Override - public boolean passPriority() { - return passPriority(false); - } - @Override - public boolean passPriorityUntilEndOfTurn() { - return passPriority(true); - } - private boolean passPriority(final boolean passUntilEndOfTurn) { - final Input inp = gameView.getInputProxy().getInput(); - if (inp instanceof InputPassPriority) { - if (passUntilEndOfTurn) { - autoPassUntilEndOfTurn(); - } - inp.selectButtonOK(); - return true; - } - - FThreads.invokeInEdtNowOrLater(new Runnable() { - @Override - public void run() { - SOptionPane.showMessageDialog("Cannot pass priority at this time."); - } - }); - return false; - } - - @Override - public void useMana(final byte mana) { - final Input input = inputQueue.getInput(); - if (input instanceof InputPayMana) { - ((InputPayMana) input).useManaFromPool(mana); - } - } - - @Override - public void selectPlayer(final PlayerView player, final ITriggerEvent triggerEvent) { - getInputProxy().selectPlayer(player, triggerEvent); - } - - @Override - public boolean selectCard(final CardView card, final ITriggerEvent triggerEvent) { - return getInputProxy().selectCard(card, triggerEvent); - } - - @Override - public void selectAbility(final SpellAbilityView sa) { - getInputProxy().selectAbility(sa); - } - - @Override - public void alphaStrike() { - getInputProxy().alphaStrike(); - } - - /** - * Check whether a card may be shown. If {@code mayLookAtAllCards} is - * {@code true}, any card may be shown. - * - * @param c a card. - * @return whether the card may be shown. - * @see GameView#mayShowCardNoRedirect(CardView) - */ - @Override - public boolean mayShowCard(final Card c) { - if (mayLookAtAllCards) { - return true; - } - return c == null || tempShownCards.contains(c) || c.canBeShownTo(player); - } - - @Override - public boolean mayShowCardFace(final Card c) { - if (mayLookAtAllCards) { - return true; - } - return c == null || !c.isFaceDown() || c.canCardFaceBeShownTo(player); - } - - @Override - public Iterable getAutoYields() { - return PlayerControllerHuman.this.getAutoYields(); - } - - @Override - public boolean shouldAutoYield(final String key) { - return PlayerControllerHuman.this.shouldAutoYield(key); - } - - @Override - public void setShouldAutoYield(String key, boolean autoYield) { - PlayerControllerHuman.this.setShouldAutoYield(key, autoYield); - } - - @Override - public boolean getDisableAutoYields() { - return game.getDisableAutoYields(); - } - @Override - public void setDisableAutoYields(final boolean b) { - game.setDisableAutoYields(b); - } - - @Override - public boolean shouldAlwaysAcceptTrigger(final Integer trigger) { - return PlayerControllerHuman.this.shouldAlwaysAcceptTrigger(trigger); - } - - @Override - public boolean shouldAlwaysDeclineTrigger(final Integer trigger) { - return PlayerControllerHuman.this.shouldAlwaysDeclineTrigger(trigger); - } - - public boolean shouldAlwaysAskTrigger(final Integer trigger) { - return PlayerControllerHuman.this.shouldAlwaysAskTrigger(trigger); - } - - @Override - public void setShouldAlwaysAcceptTrigger(final Integer trigger) { - PlayerControllerHuman.this.setShouldAlwaysAcceptTrigger(trigger); - } - - @Override - public void setShouldAlwaysDeclineTrigger(final Integer trigger) { - PlayerControllerHuman.this.setShouldAlwaysDeclineTrigger(trigger); - } - - @Override - public void setShouldAlwaysAskTrigger(final Integer trigger) { - PlayerControllerHuman.this.setShouldAlwaysAskTrigger(trigger); - } - - @Override - public void autoPassCancel() { - PlayerControllerHuman.this.autoPassCancel(); - } - - @Override - public boolean canPlayUnlimitedLands() { - return PlayerControllerHuman.this.canPlayUnlimitedLands(); - } - - @Override - public boolean canViewAllCards() { - return PlayerControllerHuman.this.mayLookAtAllCards; - } - - @Override - public DevModeCheats cheat() { - return PlayerControllerHuman.this.cheat(); - } - } - - /** - * @param c - * @return - * @see forge.view.LocalGameView#getCombat(forge.game.combat.Combat) - */ - public CombatView getCombat() { - return gameView.getCombat(); - } - - /** - * @param si - * @return - * @see forge.view.LocalGameView#getStackItemView(forge.game.spellability.SpellAbilityStackInstance) - */ - public StackItemView getStackItemView(SpellAbilityStackInstance si) { - return gameView.getStackItemView(si); - } - - /** - * @param view - * @return - * @see forge.view.LocalGameView#getStackItem(forge.view.StackItemView) - */ - public SpellAbilityStackInstance getStackItem(StackItemView view) { - return gameView.getStackItem(view); - } - - /** - * @param e - * @return - * @see forge.view.LocalGameView#getGameEntityView(forge.game.GameEntity) - */ - public final GameEntityView getGameEntityView(GameEntity e) { - return gameView.getGameEntityView(e, false); - } - - /** - * @param players - * @return - * @see forge.view.LocalGameView#getPlayerViews(java.lang.Iterable) - */ - public final List getPlayerViews(Iterable players) { - return gameView.getPlayerViews(players, false); - } - - public PlayerView getPlayerView() { - return gameView.getPlayerView(getPlayer(), false); - } - public PlayerView getPlayerView(Player p) { - return gameView.getPlayerView(p, false); - } - - /** - * @param p - * @return - * @see forge.view.LocalGameView#getPlayer(forge.view.PlayerView) - */ - public Player getPlayer(PlayerView p) { - return gameView.getPlayer(p); - } - - /** - * @param c - * @return - * @see forge.view.LocalGameView#getCardView(forge.game.card.Card) - */ - public CardView getCardView(Card c) { - return gameView.getCardView(c, true); - } - - /** - * @param cards - * @return - * @see forge.view.LocalGameView#getCardViews(java.util.List) - */ - public final List getCardViews(final Iterable cards) { - return gameView.getCardViews(cards, true); - } - - /** - * @param c - * @return - * @see forge.view.LocalGameView#getCard(forge.view.CardView) - */ - public Card getCard(CardView c) { - return gameView.getCard(c); - } - - /** - * @param cards - * @return - * @see forge.view.LocalGameView#getCards(java.util.List) - */ - public final List getCards(List cards) { - return gameView.getCards(cards); - } - - /** - * @param sa - * @return - * @see forge.view.LocalGameView#getSpellAbilityView(forge.game.spellability.SpellAbility) - */ - public SpellAbilityView getSpellAbilityView(SpellAbility sa) { - return gameView.getSpellAbilityView(sa); - } - - /** - * @param cards - * @return - * @see forge.view.LocalGameView#getSpellAbilityViews(java.util.List) - */ - public final List getSpellAbilityViews( - final List spabs) { - return gameView.getSpellAbilityViews(spabs); - } - - /** - * @param c - * @return - * @see forge.view.LocalGameView#getSpellAbility(forge.view.SpellAbilityView) - */ - public SpellAbility getSpellAbility(SpellAbilityView c) { - return gameView.getSpellAbility(c); - } - - /** - * @param cards - * @return - * @see forge.view.LocalGameView#getSpellAbilities(java.util.List) - */ - public final List getSpellAbilities(List cards) { - return gameView.getSpellAbilities(cards); + public void updateAchievements() { + AchievementCollection.updateAll(this); } public boolean canUndoLastAction() { - return gameView.canUndoLastAction(); + if (!game.stack.canUndo(player)) { + return false; + } + final Player priorityPlayer = game.getPhaseHandler().getPriorityPlayer(); + if (priorityPlayer == null || priorityPlayer != player) { + return false; + } + return true; } public boolean tryUndoLastAction() { - return gameView.tryUndoLastAction(); + if (!canUndoLastAction()) { + return false; + } + + if (game.getStack().undo()) { + final Input currentInput = inputQueue.getInput(); + if (currentInput instanceof InputPassPriority) { + currentInput.showMessageInitial(); //ensure prompt updated if needed + } + return true; + } + return false; + } + + public void selectButtonOk() { + inputProxy.selectButtonOK(); + } + + public void selectButtonCancel() { + inputProxy.selectButtonCancel(); + } + + public void confirm() { + if (inputQueue.getInput() instanceof InputConfirm) { + selectButtonOk(); + } + } + + public boolean passPriority() { + return passPriority(false); + } + public boolean passPriorityUntilEndOfTurn() { + return passPriority(true); + } + private boolean passPriority(final boolean passUntilEndOfTurn) { + final Input inp = inputProxy.getInput(); + if (inp instanceof InputPassPriority) { + if (passUntilEndOfTurn) { + autoPassUntilEndOfTurn(); + } + inp.selectButtonOK(); + return true; + } + + FThreads.invokeInEdtNowOrLater(new Runnable() { + @Override + public void run() { + SOptionPane.showMessageDialog("Cannot pass priority at this time."); + } + }); + return false; + } + + public void useMana(final byte mana) { + final Input input = inputQueue.getInput(); + if (input instanceof InputPayMana) { + ((InputPayMana) input).useManaFromPool(mana); + } + } + + public void selectPlayer(final PlayerView player, final ITriggerEvent triggerEvent) { + inputProxy.selectPlayer(player, triggerEvent); + } + + public boolean selectCard(final CardView card, final ITriggerEvent triggerEvent) { + return inputProxy.selectCard(card, triggerEvent); + } + + public void selectAbility(final SpellAbility sa) { + inputProxy.selectAbility(sa); + } + + public void alphaStrike() { + inputProxy.alphaStrike(); + } + + /** + * Check whether a card may be shown. If {@code mayLookAtAllCards} is + * {@code true}, any card may be shown. + * + * @param c a card. + * @return whether the card may be shown. + * @see GameView#mayShowCardNoRedirect(CardView) + */ + public boolean mayShowCard(final Card c) { + if (mayLookAtAllCards) { + return true; + } + return c == null || tempShownCards.contains(c) || c.canBeShownTo(player); + } + public boolean mayShowCardFace(final Card c) { + if (mayLookAtAllCards) { + return true; + } + return c == null || !c.isFaceDown() || c.canCardFaceBeShownTo(player); } @Override @@ -1711,7 +1455,7 @@ public class PlayerControllerHuman extends PlayerController { public void setViewAllCards(final boolean canViewAll) { mayLookAtAllCards = canViewAll; for (final Player p : game.getPlayers()) { - MatchUtil.updateCards(gameView.getCardViews(p.getAllCards(), true)); + MatchUtil.updateCards(CardView.getCollection(p.getAllCards())); } } @@ -1935,8 +1679,8 @@ public class PlayerControllerHuman extends PlayerController { */ public void addCountersToPermanent() { final List cards = game.getCardsIn(ZoneType.Battlefield); - final CardView cardView = SGuiChoose.oneOrNone("Add counters to which card?", getCardViews(cards)); - final Card card = getCard(cardView); + final CardView cardView = SGuiChoose.oneOrNone("Add counters to which card?", CardView.getCollection(cards)); + final Card card = Card.get(cardView); if (card == null) { return; } final CounterType counter = SGuiChoose.oneOrNone("Which type of counter?", CounterType.values()); @@ -1983,9 +1727,7 @@ public class PlayerControllerHuman extends PlayerController { } public void setPlayerLife() { - final List players = game.getPlayers(); - final PlayerView playerView = SGuiChoose.oneOrNone("Set life for which player?", getPlayerViews(players)); - final Player player = getPlayer(playerView); + final Player player = SGuiChoose.oneOrNone("Set life for which player?", game.getPlayers()); if (player == null) { return; } final Integer life = SGuiChoose.getInteger("Set life to what?", 0); @@ -1995,7 +1737,7 @@ public class PlayerControllerHuman extends PlayerController { } public void winGame() { - Input input = gameView.getInputQueue().getInput(); + Input input = inputQueue.getInput(); if (!(input instanceof InputPassPriority)) { SOptionPane.showMessageDialog("You must have priority to use this feature.", "Win Game", SOptionPane.INFORMATION_ICON); return; @@ -2015,10 +1757,8 @@ public class PlayerControllerHuman extends PlayerController { } public void addCardToHand() { - final List players = game.getPlayers(); - final PlayerView pView = SGuiChoose.oneOrNone("Put card in hand for which player?", getPlayerViews(players)); - final Player p = getPlayer(pView); - if (null == p) { + final Player p = SGuiChoose.oneOrNone("Put card in hand for which player?", game.getPlayers()); + if (p == null) { return; } @@ -2037,10 +1777,8 @@ public class PlayerControllerHuman extends PlayerController { } public void addCardToBattlefield() { - final List players = game.getPlayers(); - final PlayerView pView = SGuiChoose.oneOrNone("Put card in play for which player?", getPlayerViews(players)); - final Player p = getPlayer(pView); - if (null == p) { + final Player p = SGuiChoose.oneOrNone("Put card in play for which player?", game.getPlayers()); + if (p == null) { return; } @@ -2068,11 +1806,10 @@ public class PlayerControllerHuman extends PlayerController { final SpellAbility sa; if (choices.size() == 1) { sa = choices.iterator().next(); - } else { - final SpellAbilityView saView = SGuiChoose.oneOrNone("Choose", getSpellAbilityViews(choices)); - sa = getSpellAbility(saView); } - + else { + sa = SGuiChoose.oneOrNone("Choose", choices); + } if (sa == null) { return; // happens if cancelled } @@ -2088,9 +1825,7 @@ public class PlayerControllerHuman extends PlayerController { } public void riggedPlanarRoll() { - final List players = game.getPlayers(); - final PlayerView playerView = SGuiChoose.oneOrNone("Which player should roll?", getPlayerViews(players)); - final Player player = getPlayer(playerView); + final Player player = SGuiChoose.oneOrNone("Which player should roll?", game.getPlayers()); if (player == null) { return; } final PlanarDice res = SGuiChoose.oneOrNone("Choose result", PlanarDice.values()); diff --git a/forge-gui/src/main/java/forge/player/TargetSelection.java b/forge-gui/src/main/java/forge/player/TargetSelection.java index 8ab2902a561..912124a6e4f 100644 --- a/forge-gui/src/main/java/forge/player/TargetSelection.java +++ b/forge-gui/src/main/java/forge/player/TargetSelection.java @@ -30,6 +30,7 @@ import forge.game.GameEntity; import forge.game.GameObject; import forge.game.card.Card; import forge.game.card.CardLists; +import forge.game.player.PlayerView; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetRestrictions; @@ -39,9 +40,6 @@ import forge.match.MatchUtil; import forge.match.input.InputSelectTargets; import forge.util.Aggregates; import forge.util.gui.SGuiChoose; -import forge.view.CardView; -import forge.view.PlayerView; -import forge.view.StackItemView; /** *

@@ -66,13 +64,6 @@ public class TargetSelection { private boolean bTargetingDone = false; - - /** - *

- * resetTargets. - *

- */ - public final boolean chooseTargets(Integer numTargets) { final TargetRestrictions tgt = getTgt(); final boolean canTarget = tgt != null && tgt.doesTarget(); @@ -140,7 +131,7 @@ public class TargetSelection { } final Map playersWithValidTargets = Maps.newHashMap(); for (Card card : validTargets) { - playersWithValidTargets.put(controller.getPlayerView(card.getController()), null); + playersWithValidTargets.put(PlayerView.get(card.getController()), null); } if (MatchUtil.getController().openZones(zone, playersWithValidTargets)) { InputSelectTargets inp = new InputSelectTargets(controller, validTargets, ability, mandatory); @@ -162,13 +153,6 @@ public class TargetSelection { // parameters for target selection. // however, due to the changes necessary for SA_Requirements this is much // different than the original - - /** - *

- * chooseValidInput. - *

- * @return - */ private final List getValidCardsToTarget() { final TargetRestrictions tgt = this.getTgt(); final Game game = ability.getActivatingPlayer().getGame(); @@ -217,37 +201,24 @@ public class TargetSelection { return choices; } - /** - *

- * chooseCardFromList. - *

- * - * @param choices - * a {@link forge.CardList} object. - * @param targeted - * a boolean. - * @param mandatory - * a boolean. - */ private final boolean chooseCardFromList(final List choices, final boolean targeted, final boolean mandatory) { // Send in a list of valid cards, and popup a choice box to target final Game game = ability.getActivatingPlayer().getGame(); - final List crdsBattle = Lists.newArrayList(); - final List crdsExile = Lists.newArrayList(); - final List crdsGrave = Lists.newArrayList(); - final List crdsLibrary = Lists.newArrayList(); - final List crdsStack = Lists.newArrayList(); - final List crdsAnte = Lists.newArrayList(); + final List crdsBattle = Lists.newArrayList(); + final List crdsExile = Lists.newArrayList(); + final List crdsGrave = Lists.newArrayList(); + final List crdsLibrary = Lists.newArrayList(); + final List crdsStack = Lists.newArrayList(); + final List crdsAnte = Lists.newArrayList(); for (final Card inZone : choices) { - final CardView view = controller.getCardView(inZone); Zone zz = game.getZoneOf(inZone); - if (zz.is(ZoneType.Battlefield)) crdsBattle.add(view); - else if (zz.is(ZoneType.Exile)) crdsExile.add(view); - else if (zz.is(ZoneType.Graveyard)) crdsGrave.add(view); - else if (zz.is(ZoneType.Library)) crdsLibrary.add(view); - else if (zz.is(ZoneType.Stack)) crdsStack.add(view); - else if (zz.is(ZoneType.Ante)) crdsAnte.add(view); + if (zz.is(ZoneType.Battlefield)) crdsBattle.add(inZone); + else if (zz.is(ZoneType.Exile)) crdsExile.add(inZone); + else if (zz.is(ZoneType.Graveyard)) crdsGrave.add(inZone); + else if (zz.is(ZoneType.Library)) crdsLibrary.add(inZone); + else if (zz.is(ZoneType.Stack)) crdsStack.add(inZone); + else if (zz.is(ZoneType.Ante)) crdsAnte.add(inZone); } List choicesFiltered = new ArrayList(); if (!crdsBattle.isEmpty()) { @@ -284,7 +255,8 @@ public class TargetSelection { Object chosen = null; if (!choices.isEmpty() && mandatory) { chosen = SGuiChoose.one(getTgt().getVTSelection(), choicesFiltered); - } else { + } + else { chosen = SGuiChoose.oneOrNone(getTgt().getVTSelection(), choicesFiltered); } if (chosen == null) { @@ -295,21 +267,12 @@ public class TargetSelection { return true; } - if (chosen instanceof CardView) { - final Card chosenCard = controller.getCard((CardView) chosen); - ability.getTargets().add(chosenCard); + if (chosen instanceof Card) { + ability.getTargets().add((Card) chosen); } return true; } - /** - *

- * chooseCardFromStack. - *

- * - * @param mandatory - * a boolean. - */ private final boolean chooseCardFromStack(final boolean mandatory) { final TargetRestrictions tgt = this.getTgt(); final String message = tgt.getVTSelection(); @@ -322,8 +285,9 @@ public class TargetSelection { if (ability.equals(abilityOnStack)) { // By peeking at stack item, target is set to its SI state. So set it back before adding targets ability.resetTargets(); - } else if (ability.canTargetSpellAbility(abilityOnStack)) { - selectOptions.add(controller.getStackItemView(si)); + } + else if (ability.canTargetSpellAbility(abilityOnStack)) { + selectOptions.add(si); } } @@ -340,15 +304,18 @@ public class TargetSelection { if (selectOptions.isEmpty()) { // Not enough targets, cancel targeting return false; - } else { + } + else { final Object madeChoice = SGuiChoose.oneOrNone(message, selectOptions); if (madeChoice == null) { return false; } - if (madeChoice instanceof StackItemView) { - ability.getTargets().add(controller.getStackItem((StackItemView)madeChoice).getSpellAbility(true)); - } else // 'FINISH TARGETING' chosen + if (madeChoice instanceof SpellAbilityStackInstance) { + ability.getTargets().add(((SpellAbilityStackInstance)madeChoice).getSpellAbility(true)); + } + else {// 'FINISH TARGETING' chosen bTargetingDone = true; + } } } return true; diff --git a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java index 0ac5d316af0..8eab0d943a2 100644 --- a/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java +++ b/forge-gui/src/main/java/forge/quest/QuestWinLoseController.java @@ -8,9 +8,11 @@ import forge.card.UnOpenedProduct; import forge.game.GameEndReason; import forge.game.GameFormat; import forge.game.GameOutcome; +import forge.game.GameView; import forge.game.player.GameLossReason; import forge.game.player.PlayerOutcome; import forge.game.player.PlayerStatistics; +import forge.game.player.PlayerView; import forge.interfaces.IButton; import forge.interfaces.IWinLoseView; import forge.item.*; @@ -23,8 +25,6 @@ import forge.quest.data.QuestPreferences.DifficultyPrefs; import forge.quest.data.QuestPreferences.QPref; import forge.util.MyRandom; import forge.util.gui.SGuiChoose; -import forge.view.IGameView; -import forge.view.PlayerView; import org.apache.commons.lang3.StringUtils; @@ -35,13 +35,13 @@ import java.util.List; import java.util.Map.Entry; public abstract class QuestWinLoseController { - private final IGameView lastGame; + private final GameView lastGame; private final transient boolean wonMatch; private final transient boolean isAnte; private final transient QuestController qData; private final transient QuestEvent qEvent; - public QuestWinLoseController(final IGameView game0) { + public QuestWinLoseController(final GameView game0) { lastGame = game0; qData = FModel.getQuest(); qEvent = qData.getCurrentEvent(); @@ -88,7 +88,7 @@ public abstract class QuestWinLoseController { public void run() { if (isAnte) { // Won/lost cards should already be calculated (even in a draw) - GameOutcome.AnteResult anteResult = lastGame.getAnteResult(); + GameOutcome.AnteResult anteResult = lastGame.getAnteResult(questPlayer); if (anteResult != null) { if (anteResult.wonCards != null) { qc.getCards().addAllCards(anteResult.wonCards); diff --git a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java index 6a034ef70aa..cd5c25c9d3a 100644 --- a/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java +++ b/forge-gui/src/main/java/forge/util/gui/SGuiChoose.java @@ -14,7 +14,7 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import forge.GuiBase; -import forge.view.CardView; +import forge.game.card.CardView; public class SGuiChoose { /** diff --git a/forge-gui/src/main/java/forge/util/gui/SGuiDialog.java b/forge-gui/src/main/java/forge/util/gui/SGuiDialog.java index d18a1238605..f36256a3231 100644 --- a/forge-gui/src/main/java/forge/util/gui/SGuiDialog.java +++ b/forge-gui/src/main/java/forge/util/gui/SGuiDialog.java @@ -2,7 +2,7 @@ package forge.util.gui; import org.apache.commons.lang3.StringUtils; -import forge.view.CardView; +import forge.game.card.CardView; /** * Holds player interactions using standard windows diff --git a/forge-gui/src/main/java/forge/util/gui/SOptionPane.java b/forge-gui/src/main/java/forge/util/gui/SOptionPane.java index ca8243d7a47..09c5742fe13 100644 --- a/forge-gui/src/main/java/forge/util/gui/SOptionPane.java +++ b/forge-gui/src/main/java/forge/util/gui/SOptionPane.java @@ -2,7 +2,7 @@ package forge.util.gui; import forge.GuiBase; import forge.assets.FSkinProp; -import forge.view.CardView; +import forge.game.card.CardView; public class SOptionPane { public static final FSkinProp QUESTION_ICON = FSkinProp.ICO_QUESTION; diff --git a/forge-gui/src/main/java/forge/view/Cache.java b/forge-gui/src/main/java/forge/view/Cache.java deleted file mode 100644 index 081040f61ab..00000000000 --- a/forge-gui/src/main/java/forge/view/Cache.java +++ /dev/null @@ -1,173 +0,0 @@ -package forge.view; - -import java.util.Collection; -import java.util.Map; - -import com.google.common.collect.Collections2; -import com.google.common.collect.Maps; - -import forge.game.IIdentifiable; - -/** - * Implementation of a two-way cache, containing bidirectional mappings from - * keys of type {@code K} to values of type {@code V}. - * - * Keys and values are checked for equality using the - * {@link Object#equals(Object)} method. - * - * @author elcnesh - * - * @param - * the type of this Cache's keys. - * @param - * the type of this Cache's values. - */ -public class Cache { - - private final Map cache; - private final Map inverseCache; - - /** - * Create a new, empty Cache instance. - */ - public Cache() { - this.cache = Maps.newTreeMap(); - this.inverseCache = Maps.newTreeMap(); - } - - /** - * @param key - * a key. - * @return {@code true} if and only if this Cache contains the specified - * key. - */ - public boolean containsKey(final int keyId) { - return cache.containsKey(keyId); - } - - /** - * Get the value associated to a key. - * - * @param key - * a key. - * @return the value associated to key, or {@code null} if no such value - * exists. - */ - public V get(final int keyId) { - return cache.get(keyId); - } - - /** - * Get the key associated to a value. - * - * @param value - * a value. - * @return the key associated to value, or {@code null} if no such key - * exists. - */ - public K getKey(final int valueId) { - return inverseCache.get(valueId); - } - - /** - * Get a value as it is present in this Cache, compared using the equals - * method. - * - * @param value - * @return a value equal to value, if such a value is present in the Cache; - * {@code null} otherwise. - */ - public synchronized V getCurrentValue(final V value) { - for (final V currentValue : cache.values()) { - if (currentValue.equals(value)) { - return currentValue; - } - } - return null; - } - - /** - * Add a mapping to this Cache. - * - * If either argument is {@code null}, this method silently returns. - * Otherwise, any existing mapping from the provided key to the provided - * value is removed, as well as its inverse. After that, the provided - * mapping and its inverse are added to this Cache. - * - * @param key - * the key of the new mapping. - * @param value - * the value to map to. - * @see java.util.Map#put(java.lang.Object, java.lang.Object) - */ - public void put(final K key, final V value) { - if (key == null || value == null) { - return; - } - - synchronized (this) { - final int keyId = key.getId(), valueId = value.getId(); - - // remove value mapping if it exists already - if (inverseCache.containsKey(valueId)) { - cache.values().remove(value); - inverseCache.remove(valueId); - } - - // remove key mapping if it exists already - if (cache.containsKey(keyId)) { - inverseCache.values().remove(key); - cache.remove(keyId); - } - - // put the new values - cache.put(keyId, value); - inverseCache.put(valueId, key); - } - } - - /** - * Update the key of a particular entry. If the supplied key is {@code null} - * or if the Cache didn't already contain a mapping for the supplied id, - * this method silently returns. - * - * @param valueId - * the id of the value to which the key is associated. - * @param key - * the new key. - */ - public void updateKey(final int valueId, final K key) { - if (key == null || !inverseCache.containsKey(valueId)) { - return; - } - - synchronized (this) { - inverseCache.put(valueId, key); - } - } - - public Iterable getKeys() { - return inverseCache.values(); - } - - public Iterable getValues() { - return cache.values(); - } - - /** - * Clear all the mappings in this Cache, except for any key that exists in - * the argument. - * - * @param keys - * the keys to retain. - */ - public synchronized void retainAllKeys(final Collection keys) { - cache.keySet().retainAll(Collections2.transform(keys, IIdentifiable.FN_GET_ID)); - inverseCache.values().retainAll(keys); - } - - public void clear() { - cache.clear(); - inverseCache.clear(); - } -} diff --git a/forge-gui/src/main/java/forge/view/CardView.java b/forge-gui/src/main/java/forge/view/CardView.java deleted file mode 100644 index 12ce813bfb6..00000000000 --- a/forge-gui/src/main/java/forge/view/CardView.java +++ /dev/null @@ -1,1043 +0,0 @@ -package forge.view; - -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; - -import org.apache.commons.lang3.StringUtils; - -import com.google.common.base.Predicates; -import com.google.common.collect.ImmutableList; -import com.google.common.collect.ImmutableMap; -import com.google.common.collect.ImmutableSet; -import com.google.common.collect.Iterables; - -import forge.ImageKeys; -import forge.card.CardEdition; -import forge.card.CardRarity; -import forge.card.CardType; -import forge.card.ColorSet; -import forge.card.mana.ManaCost; -import forge.game.card.CounterType; -import forge.game.zone.ZoneType; - -/** - * Representation of a {@link forge.game.card.Card}, containing only the - * information relevant to a user interface. - * - * Conversion from and to Cards happens through {@link LocalGameView}. - * - * @author elcnesh - */ -public class CardView extends GameEntityView { - private final CardStateView - original = new CardStateView(), - alternate = new CardStateView(); - - private boolean hasAltState; - - private final int id; - private boolean mayBeShown; - private PlayerView owner, controller; - private ZoneType zone; - private boolean isCloned, isFaceDown, isFlipCard, isFlipped, isSplitCard, isTransformed; - private String setCode; - private CardRarity rarity; - private boolean isAttacking, isBlocking, isPhasedOut, isSick, isTapped, isToken; - private Map counters; - private int damage, assignedDamage, regenerationShields, preventNextDamage; - private String chosenType; - private List chosenColors; - private PlayerView chosenPlayer; - private String namedCard; - private CardView equipping; - private Iterable equippedBy; - private CardView enchantingCard; - private PlayerView enchantingPlayer; - private Iterable enchantedBy; - private CardView fortifying; - private Iterable fortifiedBy; - private Iterable gainControlTargets; - private CardView cloneOrigin; - private Iterable imprinted, hauntedBy; - private CardView haunting; - private Iterable mustBlock; - private CardView pairedWith; - - public CardView(int id0) { - this.id = id0; - this.reset(); - } - - public void reset() { - final Iterable emptyIterable = ImmutableSet.of(); - this.mayBeShown = false; - this.hasAltState = false; - this.owner = null; - this.controller = null; - this.zone = null; - this.isCloned = false; - this.isFaceDown = false; - this.isFlipped = false; - this.isSplitCard = false; - this.isTransformed = false; - this.setCode = ""; - this.rarity = CardRarity.Unknown; - this.isAttacking = this.isBlocking = this.isPhasedOut = this.isSick = this.isTapped = false; - this.counters = ImmutableMap.of(); - this.damage = this.assignedDamage = this.regenerationShields = this.preventNextDamage = 0; - this.chosenType = ""; - this.chosenColors = ImmutableList.of(); - this.chosenPlayer = null; - this.namedCard = ""; - this.equipping = null; - this.equippedBy = emptyIterable; - this.enchantingCard = null; - this.enchantingPlayer = null; - this.enchantedBy = emptyIterable; - this.fortifying = null; - this.fortifiedBy = emptyIterable; - this.gainControlTargets = emptyIterable; - this.cloneOrigin = null; - this.imprinted = emptyIterable; - this.hauntedBy = emptyIterable; - this.haunting = null; - this.mustBlock = emptyIterable; - - this.original.reset(); - this.alternate.reset(); - } - - /** - * @return the id - */ - @Override - public int getId() { - return id; - } - - public boolean mayBeShown() { - return this.mayBeShown; - } - public void setMayBeShown(boolean b0) { - this.mayBeShown = b0; - } - - /** - * @return the owner - */ - public PlayerView getOwner() { - return owner; - } - - /** - * @param owner the owner to set - */ - public void setOwner(PlayerView owner) { - this.owner = owner; - } - - /** - * @return the controller - */ - public PlayerView getController() { - return controller; - } - - /** - * @param controller the controller to set - */ - public void setController(final PlayerView controller) { - this.controller = controller; - } - - /** - * @return the zone - */ - public ZoneType getZone() { - return zone; - } - - /** - * @param zone the zone to set - */ - public void setZone(ZoneType zone) { - this.zone = zone; - } - - /** - * @return the hasAltState - */ - public boolean hasAltState() { - return hasAltState; - } - - /** - * @param hasAltState the hasAltState to set - */ - public void setHasAltState(final boolean hasAltState) { - this.hasAltState = hasAltState; - } - - /** - * @return the isCloned - */ - public boolean isCloned() { - return isCloned; - } - - /** - * @param isCloned the isCloned to set - */ - public void setCloned(boolean isCloned) { - this.isCloned = isCloned; - } - - /** - * @return the isFaceDown - */ - public boolean isFaceDown() { - return isFaceDown; - } - - /** - * @param isFaceDown the isFaceDown to set - */ - public void setFaceDown(final boolean isFaceDown) { - this.isFaceDown = isFaceDown; - } - - /** - * @return the isFlipCard - */ - public boolean isFlipCard() { - return isFlipCard; - } - - /** - * @param isFlipCard the isFlipCard to set - */ - public void setFlipCard(boolean isFlipCard) { - this.isFlipCard = isFlipCard; - } - - /** - * @return the isFlipped - */ - public boolean isFlipped() { - return isFlipped; - } - - /** - * @param isFlipped the isFlipped to set - */ - public void setFlipped(final boolean isFlipped) { - this.isFlipped = isFlipped; - } - - /** - * @return the isSplitCard - */ - public boolean isSplitCard() { - return isSplitCard; - } - - /** - * @param isSplitCard the isSplitCard to set - */ - public void setSplitCard(boolean isSplitCard) { - this.isSplitCard = isSplitCard; - } - - /** - * @return the isTransformed - */ - public boolean isTransformed() { - return isTransformed; - } - - /** - * @param isTransformed the isTransformed to set - */ - public void setTransformed(final boolean isTransformed) { - this.isTransformed = isTransformed; - } - - /** - * @return the setCode - */ - public String getSetCode() { - return setCode; - } - - /** - * @param setCode the setCode to set - */ - public void setSetCode(final String setCode) { - this.setCode = setCode; - } - - /** - * @return the rarity - */ - public CardRarity getRarity() { - return rarity; - } - - /** - * @param rarity the rarity to set - */ - public void setRarity(final CardRarity rarity) { - this.rarity = rarity; - } - - /** - * @return the isAttacking - */ - public boolean isAttacking() { - return isAttacking; - } - - /** - * @param isAttacking the isAttacking to set - */ - public void setAttacking(boolean isAttacking) { - this.isAttacking = isAttacking; - } - - /** - * @return the isBlocking - */ - public boolean isBlocking() { - return isBlocking; - } - - /** - * @param isBlocking the isBlocking to set - */ - public void setBlocking(boolean isBlocking) { - this.isBlocking = isBlocking; - } - - /** - * @return the isPhasedOut - */ - public boolean isPhasedOut() { - return isPhasedOut; - } - - /** - * @param isPhasedOut the isPhasedOut to set - */ - public void setPhasedOut(final boolean isPhasedOut) { - this.isPhasedOut = isPhasedOut; - } - - /** - * @return the isSick - */ - public boolean isSick() { - return isSick; - } - - /** - * @param isSick the isSick to set - */ - public void setSick(boolean isSick) { - this.isSick = isSick; - } - - /** - * @return the isTapped - */ - public boolean isTapped() { - return isTapped; - } - - /** - * @param isTapped the isTapped to set - */ - public void setTapped(boolean isTapped) { - this.isTapped = isTapped; - } - - /** - * @return the isToken - */ - public boolean isToken() { - return isToken; - } - - /** - * @return the counters - */ - public Map getCounters() { - return counters; - } - - /** - * @param counters the counters to set - */ - public void setCounters(final Map counters) { - this.counters = Collections.unmodifiableMap(counters); - } - - /** - * @return the damage - */ - public int getDamage() { - return damage; - } - - /** - * @param damage the damage to set - */ - public void setDamage(final int damage) { - this.damage = damage; - } - - /** - * @return the assignedDamage - */ - public int getAssignedDamage() { - return assignedDamage; - } - - /** - * @param assignedDamage the assignedDamage to set - */ - public void setAssignedDamage(final int assignedDamage) { - this.assignedDamage = assignedDamage; - } - - public int getLethalDamage() { - return this.getOriginal().getToughness() - this.getDamage() - this.getAssignedDamage(); - } - - /** - * @return the regenerationShields - */ - public int getRegenerationShields() { - return regenerationShields; - } - - /** - * @param regenerationShields the regenerationShields to set - */ - public void setRegenerationShields(final int regenerationShields) { - this.regenerationShields = regenerationShields; - } - - /** - * @return the preventNextDamage - */ - public int getPreventNextDamage() { - return preventNextDamage; - } - - /** - * @param preventNextDamage the preventNextDamage to set - */ - public void setPreventNextDamage(final int preventNextDamage) { - this.preventNextDamage = preventNextDamage; - } - - /** - * @return the chosenType - */ - public String getChosenType() { - return chosenType; - } - - /** - * @param chosenType the chosenType to set - */ - public void setChosenType(final String chosenType) { - this.chosenType = chosenType; - } - - /** - * @return the chosenColors - */ - public List getChosenColors() { - return chosenColors; - } - - /** - * @param chosenColors the chosenColors to set - */ - public void setChosenColors(final List chosenColors) { - this.chosenColors = Collections.unmodifiableList(chosenColors); - } - - /** - * @return the chosenPlayer - */ - public PlayerView getChosenPlayer() { - return chosenPlayer; - } - - /** - * @param chosenPlayer the chosenPlayer to set - */ - public void setChosenPlayer(final PlayerView chosenPlayer) { - this.chosenPlayer = chosenPlayer; - } - - /** - * @param isToken the isToken to set - */ - public void setToken(final boolean isToken) { - this.isToken = isToken; - } - - /** - * @return the namedCard - */ - public String getNamedCard() { - return namedCard; - } - - /** - * @param namedCard the namedCard to set - */ - public void setNamedCard(final String namedCard) { - this.namedCard = namedCard; - } - - /** - * @return the equipping - */ - public CardView getEquipping() { - return equipping; - } - - /** - * @param equipping the equipping to set - */ - public void setEquipping(final CardView equipping) { - this.equipping = equipping; - } - - /** - * @return the equippedBy - */ - public Iterable getEquippedBy() { - return equippedBy; - } - - /** - * @param equippedBy the equippedBy to set - */ - public void setEquippedBy(final Iterable equippedBy) { - this.equippedBy = Iterables.unmodifiableIterable(equippedBy); - } - - public boolean isEquipped() { - return this.getEquippedBy().iterator().hasNext(); - } - - /** - * @return the enchantingCard - */ - public CardView getEnchantingCard() { - return enchantingCard; - } - - /** - * @param enchantingCard the enchantingCards to set - */ - public void setEnchantingCard(final CardView enchantingCard) { - this.enchantingCard = enchantingCard; - } - - /** - * @return the enchantingPlayer - */ - public PlayerView getEnchantingPlayer() { - return enchantingPlayer; - } - - /** - * @param enchantingPlayer the enchantingPlayer to set - */ - public void setEnchantingPlayer(final PlayerView enchantingPlayer) { - this.enchantingPlayer = enchantingPlayer; - } - - /** - * @return the enchantedBy - */ - public Iterable getEnchantedBy() { - return enchantedBy; - } - - /** - * @param enchantedBy the enchantedBy to set - */ - public void setEnchantedBy(final Iterable enchantedBy) { - this.enchantedBy = Iterables.unmodifiableIterable(enchantedBy); - } - - public boolean isEnchanted() { - return getEnchantedBy().iterator().hasNext(); - } - - /** - * @return the fortifying - */ - public CardView getFortifying() { - return fortifying; - } - - /** - * @param fortifying the fortifying to set - */ - public void setFortifying(CardView fortifying) { - this.fortifying = fortifying; - } - - /** - * @return the fortifiedBy - */ - public Iterable getFortifiedBy() { - return fortifiedBy; - } - - /** - * @param fortifiedBy the fortifiedBy to set - */ - public void setFortifiedBy(final Iterable fortifiedBy) { - this.fortifiedBy = Iterables.unmodifiableIterable(fortifiedBy); - } - - public boolean isFortified() { - return getFortifiedBy().iterator().hasNext(); - } - - /** - * @return the gainControlTargets - */ - public Iterable getGainControlTargets() { - return gainControlTargets; - } - - /** - * @param gainControlTargets the gainControlTargets to set - */ - public void setGainControlTargets(final Iterable gainControlTargets) { - this.gainControlTargets = Iterables.unmodifiableIterable(gainControlTargets); - } - - /** - * @return the cloneOrigin - */ - public CardView getCloneOrigin() { - return cloneOrigin; - } - - /** - * @param cloneOrigin the cloneOrigin to set - */ - public void setCloneOrigin(final CardView cloneOrigin) { - this.cloneOrigin = cloneOrigin; - } - - /** - * @return the imprinted - */ - public Iterable getImprinted() { - return imprinted; - } - - /** - * @param imprinted the imprinted to set - */ - public void setImprinted(final Iterable imprinted) { - this.imprinted = Iterables.unmodifiableIterable(imprinted); - } - - /** - * @return the hauntedBy - */ - public Iterable getHauntedBy() { - return hauntedBy; - } - - /** - * @param hauntedBy the hauntedBy to set - */ - public void setHauntedBy(final Iterable hauntedBy) { - this.hauntedBy = Iterables.unmodifiableIterable(hauntedBy); - } - - /** - * @return the haunting - */ - public CardView getHaunting() { - return haunting; - } - - /** - * @param haunting the haunting to set - */ - public void setHaunting(final CardView haunting) { - this.haunting = haunting; - } - - /** - * @return the mustBlock - */ - public Iterable getMustBlock() { - return mustBlock; - } - - /** - * @param mustBlock the mustBlock to set - */ - public void setMustBlock(final Iterable mustBlock) { - this.mustBlock = Iterables.unmodifiableIterable(mustBlock); - } - - public CardView getPairedWith() { - return pairedWith; - } - - public void setPairedWith(final CardView pairedWith) { - this.pairedWith = pairedWith; - } - - public CardStateView getOriginal() { - return this.original; - } - - public CardStateView getAlternate() { - return this.alternate; - } - - public CardStateView getState(final boolean alternate) { - return alternate ? this.alternate : this.original; - } - - @Override - public String toString() { - if (this.getId() <= 0) { //if fake card, just return name - return this.getOriginal().getName(); - } - - if (!mayBeShown) { - return "(Unknown card)"; - } - - if (StringUtils.isEmpty(this.getOriginal().getName())) { - if (this.hasAltState()) { - return "Face-down card (" + this.getAlternate().getName() + ")"; - } - return "(" + this.getId() + ")"; - } - - return this.getOriginal().getName() + " (" + this.getId() + ")"; - } - - public String determineName(final CardStateView state) { - if (state == original) { - return this.toString(); - } - - return this.getAlternate().getName() + " (" + this.getId() + ")"; - } - - public class CardStateView { - private String name; - private ColorSet colors; - private String imageKey; - private Set type; - private ManaCost manaCost; - private int power, toughness, loyalty; - private String text; - private Map changedColorWords, - changedTypes; - private boolean hasDeathtouch, hasInfect, hasStorm, hasTrample; - private int foilIndex; - - public CardStateView() { - this.reset(); - } - - public void reset() { - this.name = ""; - this.colors = ColorSet.getNullColor(); - this.imageKey = ImageKeys.HIDDEN_CARD; - this.type = Collections.emptySet(); - this.manaCost = ManaCost.NO_COST; - this.power = 0; - this.toughness = 0; - this.loyalty = 0; - this.text = ""; - this.changedColorWords = ImmutableMap.of(); - this.changedTypes = ImmutableMap.of(); - this.hasDeathtouch = false; - this.hasInfect = false; - this.hasStorm = false; - this.hasTrample = false; - this.foilIndex = 0; - } - - @Override - public String toString() { - return this.getCard().determineName(this); - } - - public CardView getCard() { - return CardView.this; - } - - /** - * @return the name - */ - public String getName() { - return name; - } - - /** - * @param name the name to set - */ - public void setName(String name) { - this.name = name; - } - - /** - * @return the colors - */ - public ColorSet getColors() { - return colors; - } - - /** - * @param colors the colors to set - */ - public void setColors(final ColorSet colors) { - this.colors = colors; - } - - /** - * @return the imageKey - */ - public String getImageKey(boolean ignoreMayBeShown) { - return mayBeShown || ignoreMayBeShown ? imageKey : ImageKeys.HIDDEN_CARD; - } - - /** - * @param imageKey the imageKey to set - */ - public void setImageKey(final String imageKey) { - this.imageKey = imageKey; - } - - /** - * @return the type - */ - public Set getType() { - return type; - } - - /** - * @param type the type to set - */ - public void setType(final Set type) { - this.type = type; - } - - /** - * @return the manaCost - */ - public ManaCost getManaCost() { - return manaCost; - } - - /** - * @param manaCost the manaCost to set - */ - public void setManaCost(final ManaCost manaCost) { - this.manaCost = manaCost; - } - - /** - * @return the power - */ - public int getPower() { - return power; - } - - /** - * @param power the power to set - */ - public void setPower(final int power) { - this.power = power; - } - - /** - * @return the toughness - */ - public int getToughness() { - return toughness; - } - - /** - * @param toughness the toughness to set - */ - public void setToughness(final int toughness) { - this.toughness = toughness; - } - - /** - * @return the loyalty - */ - public int getLoyalty() { - return loyalty; - } - - /** - * @param loyalty the loyalty to set - */ - public void setLoyalty(final int loyalty) { - this.loyalty = loyalty; - } - - /** - * @return the text - */ - public String getText() { - return text; - } - - /** - * @param text the text to set - */ - public void setText(final String text) { - this.text = text; - } - - /** - * @return the changedColorWords - */ - public Map getChangedColorWords() { - return changedColorWords; - } - - /** - * @param changedColorWords the changedColorWords to set - */ - public void setChangedColorWords(final Map changedColorWords) { - this.changedColorWords = Collections.unmodifiableMap(changedColorWords); - } - - /** - * @return the changedTypes - */ - public Map getChangedTypes() { - return changedTypes; - } - - /** - * @param changedTypes the changedTypes to set - */ - public void setChangedTypes(final Map changedTypes) { - this.changedTypes = Collections.unmodifiableMap(changedTypes); - } - - /** - * @return the hasDeathtouch - */ - public boolean hasDeathtouch() { - return hasDeathtouch; - } - - /** - * @param hasDeathtouch the hasDeathtouch to set - */ - public void setHasDeathtouch(boolean hasDeathtouch) { - this.hasDeathtouch = hasDeathtouch; - } - - /** - * @return the hasInfect - */ - public boolean hasInfect() { - return hasInfect; - } - - /** - * @param hasInfect the hasInfect to set - */ - public void setHasInfect(boolean hasInfect) { - this.hasInfect = hasInfect; - } - - /** - * @return the hasStorm - */ - public boolean hasStorm() { - return hasStorm; - } - - /** - * @param hasStorm the hasStorm to set - */ - public void setHasStorm(boolean hasStorm) { - this.hasStorm = hasStorm; - } - - /** - * @return the hasTrample - */ - public boolean hasTrample() { - return hasTrample; - } - - /** - * @param hasTrample the hasTrample to set - */ - public void setHasTrample(boolean hasTrample) { - this.hasTrample = hasTrample; - } - - /** - * @return the foilIndex - */ - public int getFoilIndex() { - return foilIndex; - } - - /** - * @param foilIndex the foilIndex to set - */ - public void setFoilIndex(final int foilIndex) { - this.foilIndex = foilIndex; - } - - public void setRandomFoil() { - this.setFoilIndex(CardEdition.getRandomFoil(getSetCode())); - } - - public boolean isBasicLand() { - return this.isLand() && Iterables.any(type, Predicates.in(CardType.getBasicTypes())); - } - public boolean isCreature() { - return this.type.contains("Creature"); - } - public boolean isLand() { - return this.type.contains("Land"); - } - public boolean isPlane() { - return this.type.contains("Plane"); - } - public boolean isPhenomenon() { - return this.type.contains("Phenomenon"); - } - public boolean isPlaneswalker() { - return this.type.contains("Planeswalker"); - } - } -} diff --git a/forge-gui/src/main/java/forge/view/CombatView.java b/forge-gui/src/main/java/forge/view/CombatView.java deleted file mode 100644 index b86071e5193..00000000000 --- a/forge-gui/src/main/java/forge/view/CombatView.java +++ /dev/null @@ -1,131 +0,0 @@ -package forge.view; - -import java.util.List; -import java.util.Map; - -import com.google.common.base.Predicates; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - -/** - * Representation of a {@link forge.game.combat.Combat}, containing only the - * information relevant to a user interface. - * - * Conversion from and to Combat happens through {@link LocalGameView}. - * - * @author elcnesh - */ -public class CombatView { - - private Map attackersWithDefenders = Maps.newHashMap(); - private Map> attackersWithBlockers = Maps.newHashMap(); - private Map, GameEntityView> bandsWithDefenders = Maps.newHashMap(); - private Map, Iterable> bandsWithBlockers = Maps.newHashMap(); - - private Map> attackersWithPlannedBlockers = Maps.newHashMap(); - private Map, Iterable> bandsWithPlannedBlockers = Maps.newHashMap(); - - public CombatView() { - } - - public int getNumAttackers() { - return attackersWithDefenders.size(); - } - - public boolean isAttacking(final CardView card) { - return attackersWithDefenders.containsKey(card); - } - - public Iterable getAttackers() { - return attackersWithDefenders.keySet(); - } - - public Iterable getDefenders() { - return Sets.newHashSet(attackersWithDefenders.values()); - } - - public GameEntityView getDefender(final CardView attacker) { - return attackersWithDefenders.get(attacker); - } - - public boolean isBlocking(final CardView card) { - for (final Iterable blockers : attackersWithBlockers.values()) { - if (blockers == null) { - continue; - } - if (Iterables.contains(blockers, card)) { - return true; - } - } - return false; - } - - /** - * @param attacker - * @return the blockers associated with an attacker, or {@code null} if the - * attacker is unblocked. - */ - public Iterable getBlockers(final CardView attacker) { - return attackersWithBlockers.get(attacker); - } - - /** - * @param attacker - * @return the blockers associated with an attacker, or {@code null} if the - * attacker is unblocked (planning stage, for targeting overlay). - */ - public Iterable getPlannedBlockers(final CardView attacker) { - return attackersWithPlannedBlockers.get(attacker); - } - - /** - * Get an {@link Iterable} of the blockers of the specified band, or - * {@code null} if that band is unblocked. - * - * @param attackingBand - * an {@link Iterable} representing an attacking band. - * @return an {@link Iterable} of {@link CardView} objects, or {@code null}. - */ - public Iterable getBlockers(final Iterable attackingBand) { - return bandsWithBlockers.get(attackingBand); - } - - /** - * Get an {@link Iterable} of the blockers of the specified band, or - * {@code null} if that band is unblocked (planning stage, for targeting overlay). - * - * @param attackingBand - * an {@link Iterable} representing an attacking band. - * @return an {@link Iterable} of {@link CardView} objects, or {@code null}. - */ - public Iterable getPlannedBlockers(final Iterable attackingBand) { - return bandsWithPlannedBlockers.get(attackingBand); - } - - public Iterable getAttackersOf(final GameEntityView defender) { - return Maps.filterValues(attackersWithDefenders, Predicates.equalTo(defender)).keySet(); - } - public Iterable> getAttackingBandsOf(final GameEntityView defender) { - return Maps.filterValues(bandsWithDefenders, Predicates.equalTo(defender)).keySet(); - } - - public void addAttackingBand(final Iterable attackingBand, final GameEntityView defender, final Iterable blockers, final Iterable plannedBlockers) { - final List attackingBandCopy = Lists.newArrayList(attackingBand), - blockersCopy, plannedBlockersCopy; - - blockersCopy = blockers == null ? null : Lists.newArrayList(blockers); - plannedBlockersCopy = plannedBlockers == null ? null : Lists.newArrayList(plannedBlockers); - - for (final CardView attacker : attackingBandCopy) { - this.attackersWithDefenders.put(attacker, defender); - this.attackersWithBlockers.put(attacker, blockersCopy); - this.attackersWithPlannedBlockers.put(attacker, plannedBlockersCopy); - } - this.bandsWithDefenders.put(attackingBandCopy, defender); - this.bandsWithBlockers.put(attackingBandCopy, blockersCopy); - this.bandsWithPlannedBlockers.put(attackingBandCopy, plannedBlockersCopy); - } - -} diff --git a/forge-gui/src/main/java/forge/view/GameEntityView.java b/forge-gui/src/main/java/forge/view/GameEntityView.java deleted file mode 100644 index 849ca3f2a5d..00000000000 --- a/forge-gui/src/main/java/forge/view/GameEntityView.java +++ /dev/null @@ -1,14 +0,0 @@ -package forge.view; - -import forge.game.IIdentifiable; - -/** - * Representation of a {@link forge.game.GameEntity}. Contains no methods, but - * {@link toString} may be assumed to be overridden in subclasses to provide a - * user-friendly string representation of the object. - * - * @author elcnesh - */ -public abstract class GameEntityView implements IIdentifiable { - -} diff --git a/forge-gui/src/main/java/forge/view/IGameView.java b/forge-gui/src/main/java/forge/view/IGameView.java deleted file mode 100644 index b0e69e44a28..00000000000 --- a/forge-gui/src/main/java/forge/view/IGameView.java +++ /dev/null @@ -1,246 +0,0 @@ -package forge.view; - -import java.util.List; -import java.util.Observer; - -import forge.LobbyPlayer; -import forge.card.MagicColor; -import forge.deck.Deck; -import forge.game.GameLog; -import forge.game.GameLogEntry; -import forge.game.GameLogEntryType; -import forge.game.GameOutcome; -import forge.game.GameType; -import forge.game.phase.PhaseType; -import forge.match.input.Input; -import forge.match.input.InputConfirm; -import forge.player.PlayerControllerHuman.DevModeCheats; -import forge.util.ITriggerEvent; - -/** - * Interface providing access to a game from a client. The access is assumed to - * be based on a single player. - * - * @author elcnesh - */ -public interface IGameView { - - // Game-related methods - public abstract boolean isCommander(); - public abstract GameType getGameType(); - public abstract int getTurnNumber(); - public abstract boolean isCommandZoneNeeded(); - public abstract boolean isWinner(LobbyPlayer p); - public abstract LobbyPlayer getWinningPlayer(); - public abstract int getWinningTeam(); - - // Match-related methods - public abstract boolean isFirstGameInMatch(); - public abstract boolean isMatchOver(); - public abstract int getNumGamesInMatch(); - public abstract int getNumPlayedGamesInMatch(); - public abstract Iterable getOutcomesOfMatch(); - public abstract boolean isMatchWonBy(LobbyPlayer p); - public abstract int getGamesWonBy(LobbyPlayer p); - public abstract GameOutcome.AnteResult getAnteResult(); - public abstract Deck getDeck(LobbyPlayer player); - - public abstract boolean isGameOver(); - public abstract void updateAchievements(); - - public abstract int getPoisonCountersToLose(); - - public abstract void subscribeToEvents(Object subscriber); - - /** - * Get the game's current combat. - * - * @return a representation of the combat, or {@code null} if there is - * currently no ongoing combat. - */ - public abstract CombatView getCombat(); - - /** - * Add an observer to the game log. - * - * @param o - * the {@link Observer} to be sent log updates. - * @see GameLog - */ - public abstract void addLogObserver(Observer o); - - /** - * Get all log entries up to a certain level. - * - * @param maxLogLevel - * the maximum {@link GameLogEntryType} of log entries to return. - * @return a list of {@link GameLogEntry}. - * @see GameLog - * @see GameLogEntry - * @see GameLogEntryType - */ - public abstract List getLogEntries(GameLogEntryType maxLogLevel); - - /** - * Get all log entries of a certain level. - * - * @param logLevel - * the {@link GameLogEntryType} of log entries to return. - * @return a list of {@link GameLogEntry}, each of which is of type - * logLevel. - * @see GameLog - * @see GameLogEntry - * @see GameLogEntryType - */ - public abstract List getLogEntriesExact(GameLogEntryType logLevel); - - // Input controls - /** - * @return {@code true} if and only if the last action performed by this - * player can be undone. - */ - public abstract boolean canUndoLastAction(); - - /** - * Try to undo the last action performed by this player. - * - * @return {@code true} if and only if the action was successfully reverted. - * @see IGameView#canUndoLastAction() - */ - public abstract boolean tryUndoLastAction(); - - /** - * Have this player perform the action currently associated with pressing - * the "OK" button. - */ - public abstract void selectButtonOk(); - - /** - * Have this player perform the action currently associated with pressing - * the "Cancel" button. - */ - public abstract void selectButtonCancel(); - - /** - * Have this player press the "OK" button if and only if the top - * {@link Input} is an instance of {@link InputConfirm}. - */ - public abstract void confirm(); - - /** - * Have this player pass priority. - * @return whether priority was successfully passed. - */ - public abstract boolean passPriority(); - - /** - * Have this player silently pass priority until the end of the current - * turn, unless an event occurs. - * - * @return whether priority was successfully passed. - */ - public abstract boolean passPriorityUntilEndOfTurn(); - - /** - * If possible, have this player use one mana of the specified kind. - * - * @param mana - * the mana to spend. - * @see MagicColor - */ - public abstract void useMana(byte mana); - - /** - * If possible, have this player select a player. - * - * @param player - * the player to select. - * @param triggerEvent - * the event used to select the player. - */ - public abstract void selectPlayer(PlayerView player, ITriggerEvent triggerEvent); - - /** - * If possible, have this player select a card. - * - * @param card - * the card to select. - * @param triggerEvent - * the event used to select the card. - */ - public abstract boolean selectCard(CardView card, ITriggerEvent triggerEvent); - - /** - * If possible, have this player select a spellability. - * - * @param sa - * the spellability to select. - * @param triggerEvent - * the event used to select the spellability. - */ - public abstract void selectAbility(SpellAbilityView sa); - - /** - * If possible, have this player attack with as many creatures that can do - * so. - */ - public abstract void alphaStrike(); - - /** - * Ask for a list containing the players involved in this game. - * - * @return a list of players. - */ - public abstract List getPlayers(); - - /** - * Get the player whose turn it currently is. - * - * @return the player whose turn it is, or {@code null} if it is no-one's - * turn (eg. because the current player has lost the game this - * turn). - */ - public abstract PlayerView getPlayerTurn(); - - /** - * @return the current phase the game is in. - */ - public abstract PhaseType getPhase(); - - /** - * @return a list of items currently on the stack. - */ - public abstract List getStack(); - - /** - * @return the top item on the stack, or {@code null} if the stack is empty. - */ - public abstract StackItemView peekStack(); - - // Auto-yield related methods - public abstract Iterable getAutoYields(); - public abstract boolean shouldAutoYield(String key); - public abstract void setShouldAutoYield(String key, boolean autoYield); - public abstract boolean getDisableAutoYields(); - public abstract void setDisableAutoYields(boolean b); - - public abstract boolean shouldAlwaysAcceptTrigger(Integer trigger); - public abstract boolean shouldAlwaysDeclineTrigger(Integer trigger); - public abstract boolean shouldAlwaysAskTrigger(Integer trigger); - - public abstract void setShouldAlwaysAcceptTrigger(Integer trigger); - public abstract void setShouldAlwaysDeclineTrigger(Integer trigger); - public abstract void setShouldAlwaysAskTrigger(Integer trigger); - - /** - * Request cancellation of a previous request to pass priority - * automatically. - */ - public abstract void autoPassCancel(); - - public abstract boolean canPlayUnlimitedLands(); - public abstract boolean canViewAllCards(); - - //method used to wrap all functions that cheat - public abstract DevModeCheats cheat(); -} \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/view/LocalGameView.java b/forge-gui/src/main/java/forge/view/LocalGameView.java deleted file mode 100644 index 22dd3873342..00000000000 --- a/forge-gui/src/main/java/forge/view/LocalGameView.java +++ /dev/null @@ -1,574 +0,0 @@ -package forge.view; - -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.Observer; - -import com.google.common.base.Function; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - -import forge.LobbyPlayer; -import forge.card.MagicColor; -import forge.deck.Deck; -import forge.game.Game; -import forge.game.GameEntity; -import forge.game.GameLogEntry; -import forge.game.GameLogEntryType; -import forge.game.GameOutcome; -import forge.game.GameType; -import forge.game.card.Card; -import forge.game.card.CardFactoryUtil; -import forge.game.combat.AttackingBand; -import forge.game.combat.Combat; -import forge.game.phase.PhaseType; -import forge.game.player.Player; -import forge.game.player.RegisteredPlayer; -import forge.game.spellability.SpellAbility; -import forge.game.spellability.SpellAbilityStackInstance; -import forge.game.zone.ZoneType; -import forge.match.MatchUtil; -import forge.match.input.InputProxy; -import forge.match.input.InputQueue; - -public abstract class LocalGameView implements IGameView { - protected final Game game; - protected final InputQueue inputQueue; - protected final InputProxy inputProxy; - private PlayerView localPlayerView; - - public LocalGameView(Game game0) { - game = game0; - inputProxy = new InputProxy(this); - inputQueue = new InputQueue(game, inputProxy); - } - - public final Game getGame() { - return game; - } - - public final InputQueue getInputQueue() { - return inputQueue; - } - - public InputProxy getInputProxy() { - return inputProxy; - } - - public PlayerView getLocalPlayerView() { - return localPlayerView; - } - - public void setLocalPlayer(Player localPlayer) { - localPlayerView = getPlayerView(localPlayer, false); - } - - /* (non-Javadoc) - * @see forge.view.IGameView#isCommander() - */ - @Override - public boolean isCommander() { - return game.getRules().hasAppliedVariant(GameType.Commander); - } - /* (non-Javadoc) - * @see forge.view.IGameView#getGameType() - */ - @Override - public GameType getGameType() { - return game.getMatch().getRules().getGameType(); - } - - @Override - public int getTurnNumber() { - return game.getPhaseHandler().getTurn(); - } - - @Override - public boolean isCommandZoneNeeded() { - return game.getMatch().getRules().getGameType().isCommandZoneNeeded(); - } - - @Override - public boolean isWinner(final LobbyPlayer p) { - return game.getOutcome() == null ? null : game.getOutcome().isWinner(p); - } - - @Override - public LobbyPlayer getWinningPlayer() { - return game.getOutcome() == null ? null : game.getOutcome().getWinningLobbyPlayer(); - } - - @Override - public int getWinningTeam() { - return game.getOutcome() == null ? -1 : game.getOutcome().getWinningTeam(); - } - - /* (non-Javadoc) - * @see forge.view.IGameView#isFirstGameInMatch() - */ - @Override - public boolean isFirstGameInMatch() { - return game.getMatch().getPlayedGames().isEmpty(); - } - - @Override - public boolean isMatchOver() { - return game.getMatch().isMatchOver(); - } - - @Override - public int getNumGamesInMatch() { - return game.getMatch().getRules().getGamesPerMatch(); - } - - @Override - public int getNumPlayedGamesInMatch() { - return game.getMatch().getPlayedGames().size(); - } - - @Override - public Iterable getOutcomesOfMatch() { - return Iterables.unmodifiableIterable(game.getMatch().getPlayedGames()); - } - - @Override - public boolean isMatchWonBy(final LobbyPlayer p) { - return game.getMatch().isWonBy(p); - } - - @Override - public int getGamesWonBy(final LobbyPlayer p) { - return game.getMatch().getGamesWonBy(p); - } - - @Override - public GameOutcome.AnteResult getAnteResult() { - return null; - } - - @Override - public Deck getDeck(final LobbyPlayer player) { - for (final RegisteredPlayer rp : game.getMatch().getPlayers()) { - if (rp.getPlayer().equals(player)) { - return rp.getDeck(); - } - } - return null; - } - - /* (non-Javadoc) - * @see forge.view.IGameView#isGameOver() - */ - @Override - public boolean isGameOver() { - return game.isGameOver(); - } - - @Override - public int getPoisonCountersToLose() { - return game.getRules().getPoisonCountersToLose(); - } - - /* (non-Javadoc) - * @see forge.view.IGameView#subscribeToEvents(java.lang.Object) - */ - @Override - public void subscribeToEvents(final Object subscriber) { - game.subscribeToEvents(subscriber); - } - - @Override - public CombatView getCombat() { - synchronized (MatchUtil.class) { - if (MatchUtil.cachedCombatView != null) { - return MatchUtil.cachedCombatView; - } - - final Combat combat = game.getCombat(); - final CombatView combatView; - if (combat == null) { - combatView = null; - } else { - combatView = new CombatView(); - for (final AttackingBand b : combat.getAttackingBands()) { - if (b == null) continue; - final GameEntity defender = combat.getDefenderByAttacker(b); - final List blockers = combat.getBlockers(b); - final boolean isBlocked = b.isBlocked() == Boolean.TRUE; - combatView.addAttackingBand( - getCardViews(b.getAttackers(), true), - getGameEntityView(defender, true), - blockers == null || !isBlocked ? null : getCardViews(blockers, true), - blockers == null ? null : getCardViews(blockers, true)); - } - } - MatchUtil.cachedCombatView = combatView; - return combatView; - } - } - - public final void refreshCombat() { - synchronized (MatchUtil.class) { - MatchUtil.cachedCombatView = null; - this.getCombat(); - } - } - - @Override - public void addLogObserver(final Observer o) { - game.getGameLog().addObserver(o); - } - - @Override - public List getLogEntries(final GameLogEntryType maxLogLevel) { - return game.getGameLog().getLogEntries(maxLogLevel); - } - - @Override - public List getLogEntriesExact(final GameLogEntryType logLevel) { - return game.getGameLog().getLogEntriesExact(logLevel); - } - - /* (non-Javadoc) - * @see forge.view.IGameView#getRegisteredPlayers() - */ - @Override - public List getPlayers() { - return getPlayerViews(game.getRegisteredPlayers(), false); - } - public List getPlayers(Boolean update) { - return getPlayerViews(game.getRegisteredPlayers(), update); - } - - @Override - public PlayerView getPlayerTurn() { - return getPlayerView(game.getPhaseHandler().getPlayerTurn(), false); - } - - @Override - public PhaseType getPhase() { - return game.getPhaseHandler().getPhase(); - } - - /* (non-Javadoc) - * @see forge.view.IGameView#getStack() - */ - @Override - public List getStack() { - final List stack = Lists.newArrayList(game.getStack()); - final List items = Collections.unmodifiableList(getStack(stack)); - // clear the cache - MatchUtil.stackItems.retainAllKeys(stack); - return items; - } - - /* (non-Javadoc) - * @see forge.view.IGameView#peekStack() - */ - @Override - public StackItemView peekStack() { - final SpellAbilityStackInstance top = game.getStack().peek(); - if (top == null) { - return null; - } - return getStack(Lists.newArrayList(top)).iterator().next(); - } - - private List getStack(final Iterable stack) { - MatchUtil.stackItems.retainAllKeys(Lists.newArrayList(stack)); - final List items = Lists.newLinkedList(); - for (final SpellAbilityStackInstance si : stack) { - final int id = si.getId(); - if (MatchUtil.stackItems.containsKey(id)) { - items.add(MatchUtil.stackItems.get(id)); - } else { - items.add(getStackItemView(si)); - } - } - return items; - } - - public StackItemView getStackItemView(final SpellAbilityStackInstance si) { - if (si == null) { - return null; - } - - final StackItemView newItem = new StackItemView(si, this); - MatchUtil.stackItems.put(si, newItem); - return newItem; - } - - public SpellAbilityStackInstance getStackItem(final StackItemView view) { - if (view == null) { - return null; - } - return MatchUtil.stackItems.getKey(view.getId()); - } - - public final GameEntityView getGameEntityView(final GameEntity e, final Boolean update) { - if (e instanceof Card) { - return getCardView((Card)e, update); - } - if (e instanceof Player) { - return getPlayerView((Player)e, update); - } - return null; - } - - public final List getGameEntityViews(final Iterable entities, final Boolean update) { - List views = new ArrayList(); - for (GameEntity e : entities) { - views.add(getGameEntityView(e, update)); - } - return views; - } - - public final GameEntity getGameEntity(final GameEntityView view) { - if (view instanceof CardView) { - return getCard((CardView) view); - } - if (view instanceof PlayerView) { - return getPlayer((PlayerView) view); - } - return null; - } - - public void updatePlayers(Iterable views) { - for (PlayerView pv : views) { - writePlayerToView(getPlayer(pv), pv, true); - } - } - - public final List getPlayerViews(final Iterable players, final Boolean update) { - List views = new ArrayList(); - for (Player p : players) { - views.add(getPlayerView(p, update)); - } - return views; - } - - public Player getPlayer(final PlayerView p) { - if (p == null) { - return null; - } - return MatchUtil.players.getKey(p.getId()); - } - - public PlayerView getPlayerView(final Player p, final Boolean update) { - if (p == null) { - return null; - } - - PlayerView view = MatchUtil.players.get(p.getId()); - if (view == null) { - view = new PlayerView(p.getLobbyPlayer(), p.getId()); - if (update != null) { //passing null signifies to delay writing card to view even first time - writePlayerToView(p, view, update); - } - MatchUtil.players.put(p, view); - } - else if (Boolean.TRUE.equals(update)) { - writePlayerToView(p, view, true); - } - return view; - } - - private void writePlayerToView(final Player p, final PlayerView view, final Boolean update) { - view.setCommanderInfo(CardFactoryUtil.getCommanderInfo(p).trim().replace("\r\n", "; ")); - view.setKeywords(p.getKeywords()); - view.setLife(p.getLife()); - view.setMaxHandSize(p.getMaxHandSize()); - view.setNumDrawnThisTurn(p.getNumDrawnThisTurn()); - view.setPoisonCounters(p.getPoisonCounters()); - view.setPreventNextDamage(p.getPreventNextDamageTotalShields()); - view.setHasUnlimitedHandSize(p.isUnlimitedHandSize()); - view.setAnteCards(getCardViews(p.getCardsIn(ZoneType.Ante), update)); - view.setBfCards(getCardViews(p.getCardsIn(ZoneType.Battlefield, false), update)); - view.setCommandCards(getCardViews(p.getCardsIn(ZoneType.Command), update)); - view.setExileCards(getCardViews(p.getCardsIn(ZoneType.Exile), update)); - view.setFlashbackCards(getCardViews(p.getCardsActivableInExternalZones(false), update)); - view.setGraveCards(getCardViews(p.getCardsIn(ZoneType.Graveyard), update)); - final List handCards = p.getCardsIn(ZoneType.Hand), - libraryCards = p.getCardsIn(ZoneType.Library); - view.setHandCards(getCardViews(handCards, update)); - view.setLibraryCards(getCardViews(libraryCards, update)); - view.setnHandCards(handCards.size()); - view.setnLibraryCards(libraryCards.size()); - - for (final byte b : MagicColor.WUBRGC) { - view.setMana(b, p.getManaPool().getAmountOfColor(b)); - } - } - - public CardView getCardView(final Card c, final Boolean update) { - if (c == null || c != c.getCardForUi()) { - return null; - } - - CardView view = MatchUtil.cards.get(c.getId()); - if (view == null) { - view = new CardView(c.getId()); - if (update != null) { //passing null signifies to delay writing card to view even first time - writeCardToView(c, view, MatchUtil.getGameView()); - } - MatchUtil.cards.put(c, view); - } - else { - if (Boolean.TRUE.equals(update)) { - writeCardToView(c, view, MatchUtil.getGameView()); - } - MatchUtil.cards.updateKey(view.getId(), c); //ensure the Card reference in the cache is not outdated - } - return view; - } - - public void updateCards(Iterable views) { - LocalGameView gameView = MatchUtil.getGameView(); - for (CardView cv : views) { - writeCardToView(getCard(cv), cv, gameView); - } - } - - public void updateAllCards() { - LocalGameView gameView = MatchUtil.getGameView(); - for (Card c : MatchUtil.cards.getKeys()) { - writeCardToView(c, getCardView(c, false), gameView); - } - } - - public final List getCardViews(final Iterable cards, final Boolean update) { - List cardViews = new ArrayList(); - for (Card c : cards) { - CardView cv = getCardView(c, update); - if (cv != null) { - cardViews.add(cv); - } - } - return cardViews; - } - - public Card getCard(final CardView c) { - if (c == null) { - return null; - } - return MatchUtil.cards.getKey(c.getId()); - } - - private final Function FN_GET_CARD = new Function() { - @Override - public Card apply(final CardView input) { - return getCard(input); - } - }; - - public final List getCards(final List cards) { - return ViewUtil.transformIfNotNull(cards, FN_GET_CARD); - } - - private void writeCardToView(final Card c, final CardView view, final LocalGameView gameView) { - // First, write the values independent of other views - ViewUtil.writeNonDependentCardViewProperties(c, view, gameView.mayShowCard(c), gameView.mayShowCardFace(c)); - - // Next, write the values that depend on other views - final Combat combat = game.getCombat(); - view.setOwner(getPlayerView(c.getOwner(), false)); - view.setController(getPlayerView(c.getController(), false)); - view.setAttacking(combat != null && combat.isAttacking(c)); - view.setBlocking(combat != null && combat.isBlocking(c)); - view.setChosenPlayer(getPlayerView(c.getChosenPlayer(), false)); - view.setEquipping(getCardView(c.getEquipping(), false)); - view.setEquippedBy(getCardViews(c.getEquippedBy(false), false)); - view.setEnchantingCard(getCardView(c.getEnchantingCard(), false)); - view.setEnchantingPlayer(getPlayerView(c.getEnchantingPlayer(), false)); - view.setEnchantedBy(getCardViews(c.getEnchantedBy(false), false)); - view.setFortifiedBy(getCardViews(c.getFortifiedBy(false), false)); - view.setGainControlTargets(getCardViews(c.getGainControlTargets(), false)); - view.setCloneOrigin(getCardView(c.getCloneOrigin(), false)); - view.setImprinted(getCardViews(c.getImprintedCards(), false)); - view.setHauntedBy(getCardViews(c.getHauntedBy(), false)); - view.setHaunting(getCardView(c.getHaunting(), false)); - view.setMustBlock(c.getMustBlockCards() == null ? Collections.emptySet() : getCardViews(c.getMustBlockCards(), false)); - view.setPairedWith(getCardView(c.getPairedWith(), false)); - } - - public SpellAbilityView getSpellAbilityView(final SpellAbility sa) { - if (sa == null) { - return null; - } - - final SpellAbilityView view; - if (MatchUtil.spabs.containsKey(sa.getId())) { - view = MatchUtil.spabs.get(sa.getId()); - writeSpellAbilityToView(sa, view); - } else { - view = new SpellAbilityView(sa.getId()); - writeSpellAbilityToView(sa, view); - MatchUtil.spabs.put(sa, view); - } - return view; - } - - private final Function FN_GET_SPAB_VIEW = new Function() { - @Override - public SpellAbilityView apply(final SpellAbility input) { - return getSpellAbilityView(input); - } - }; - - public final List getSpellAbilityViews(final List cards) { - return ViewUtil.transformIfNotNull(cards, FN_GET_SPAB_VIEW); - } - - public SpellAbility getSpellAbility(final SpellAbilityView spabView) { - if (spabView == null) { - return null; - } - return getSpellAbility(spabView.getId()); - } - public SpellAbility getSpellAbility(final int id) { - return id >= 0 ? MatchUtil.spabs.getKey(id) : null; - } - - private final Function FN_GET_SPAB = new Function() { - @Override - public SpellAbility apply(final SpellAbilityView input) { - return getSpellAbility(input); - } - }; - - public final List getSpellAbilities(final List cards) { - return ViewUtil.transformIfNotNull(cards, FN_GET_SPAB); - } - - private void writeSpellAbilityToView(final SpellAbility sa, final SpellAbilityView view) { - view.setHostCard(getCardView(sa.getHostCard(), false)); - view.setDescription(sa.toUnsuppressedString()); - view.setCanPlay(sa.canPlay()); - view.setPromptIfOnlyPossibleAbility(sa.promptIfOnlyPossibleAbility()); - } - - @Override - public boolean getDisableAutoYields() { - return this.game.getDisableAutoYields(); - } - @Override - public void setDisableAutoYields(final boolean b) { - this.game.setDisableAutoYields(b); - } - - /** - * @param c - * a card. - * @return whether this player may view the specified card. - */ - protected abstract boolean mayShowCard(Card c); - - /** - * @param c - * a card. - * @return whether this player may view the front card face of the specified - * card. - */ - protected abstract boolean mayShowCardFace(Card c); -} diff --git a/forge-gui/src/main/java/forge/view/PlayerView.java b/forge-gui/src/main/java/forge/view/PlayerView.java deleted file mode 100644 index f0c99d0527e..00000000000 --- a/forge-gui/src/main/java/forge/view/PlayerView.java +++ /dev/null @@ -1,384 +0,0 @@ -package forge.view; - -import java.util.List; -import java.util.Map; -import java.util.Set; - -import com.google.common.collect.ImmutableList; -import com.google.common.collect.Lists; -import com.google.common.collect.Maps; -import com.google.common.collect.Sets; - -import forge.LobbyPlayer; -import forge.card.MagicColor; -import forge.game.zone.ZoneType; - -/** - * Representation of a {@link forge.game.player.Player}, containing only the - * information relevant to a user interface. - * - * Conversion from and to Players happens through {@link LocalGameView}. - * - * @author elcnesh - */ -public class PlayerView extends GameEntityView { - - private final LobbyPlayer lobbyPlayer; - private final int id; - - private Set opponents; - private int life, poisonCounters, maxHandSize, numDrawnThisTurn, preventNextDamage; - private List keywords; - private String commanderInfo; - private List - anteCards = Lists.newArrayList(), - bfCards = Lists.newArrayList(), - commandCards = Lists.newArrayList(), - exileCards = Lists.newArrayList(), - flashbackCards = Lists.newArrayList(), - graveCards = Lists.newArrayList(), - handCards = Lists.newArrayList(), - libraryCards = Lists.newArrayList(); - private int - nHandCards, - nLibraryCards; - private boolean hasUnlimitedHandSize; - private Map mana = Maps.newHashMapWithExpectedSize(MagicColor.NUMBER_OR_COLORS + 1); - - public PlayerView(final LobbyPlayer lobbyPlayer, final int id) { - this.lobbyPlayer = lobbyPlayer; - this.id = id; - } - - /** - * @return the lobbyPlayer - */ - public LobbyPlayer getLobbyPlayer() { - return lobbyPlayer; - } - - @Override - public int getId() { - return id; - } - - @Override - public boolean equals(final Object obj) { - return obj instanceof PlayerView && this.getId() == ((PlayerView) obj).getId(); - } - - @Override - public int hashCode() { - return id; - } - - public void setOpponents(final Iterable opponents) { - this.opponents = Sets.newHashSet(opponents); - } - - public boolean isOpponentOf(final PlayerView other) { - return opponents.contains(other); - } - - public String getName() { - return this.getLobbyPlayer().getName(); - } - - @Override - public String toString() { - return this.getName(); - } - - /** - * @return the life - */ - public int getLife() { - return life; - } - - /** - * @param life the life to set - */ - public void setLife(final int life) { - this.life = life; - } - - /** - * @return the poisonCounters - */ - public int getPoisonCounters() { - return poisonCounters; - } - - /** - * @param poisonCounters the poisonCounters to set - */ - public void setPoisonCounters(final int poisonCounters) { - this.poisonCounters = poisonCounters; - } - - /** - * @return the maxHandSize - */ - public int getMaxHandSize() { - return maxHandSize; - } - - /** - * @param maxHandSize the maxHandSize to set - */ - public void setMaxHandSize(final int maxHandSize) { - this.maxHandSize = maxHandSize; - } - - /** - * @return the numDrawnThisTurn - */ - public int getNumDrawnThisTurn() { - return numDrawnThisTurn; - } - - /** - * @param numDrawnThisTurn the numDrawnThisTurn to set - */ - public void setNumDrawnThisTurn(final int numDrawnThisTurn) { - this.numDrawnThisTurn = numDrawnThisTurn; - } - - /** - * @return the preventNextDamage - */ - public int getPreventNextDamage() { - return preventNextDamage; - } - - /** - * @param preventNextDamage the preventNextDamage to set - */ - public void setPreventNextDamage(final int preventNextDamage) { - this.preventNextDamage = preventNextDamage; - } - - /** - * @return the keywords - */ - public List getKeywords() { - return keywords; - } - - /** - * @param keywords the keywords to set - */ - public void setKeywords(final Iterable keywords) { - this.keywords = ImmutableList.copyOf(keywords); - } - - /** - * @return the commanderInfo - */ - public String getCommanderInfo() { - return commanderInfo; - } - - /** - * @param commanderInfo the commanderInfo to set - */ - public void setCommanderInfo(final String commanderInfo) { - this.commanderInfo = commanderInfo; - } - - /** - * @return the anteCards - */ - public List getAnteCards() { - return anteCards; - } - - /** - * @param anteCards the anteCards to set - */ - public void setAnteCards(final List anteCards) { - this.anteCards = ImmutableList.copyOf(anteCards); - } - - /** - * @return the bfCards - */ - public List getBfCards() { - return bfCards; - } - - /** - * @param bfCards the bfCards to set - */ - public void setBfCards(final List bfCards) { - this.bfCards = ImmutableList.copyOf(bfCards); - } - - /** - * @return the commandCards - */ - public List getCommandCards() { - return commandCards; - } - - /** - * @param commandCards the commandCards to set - */ - public void setCommandCards(List commandCards) { - this.commandCards = ImmutableList.copyOf(commandCards); - } - - /** - * @return the exileCards - */ - public List getExileCards() { - return exileCards; - } - - /** - * @param exileCards the exileCards to set - */ - public void setExileCards(final List exileCards) { - this.exileCards = ImmutableList.copyOf(exileCards); - } - - /** - * @return the flashbackCards - */ - public List getFlashbackCards() { - return flashbackCards; - } - - /** - * @param flashbackCards the flashbackCards to set - */ - public void setFlashbackCards(final List flashbackCards) { - this.flashbackCards = ImmutableList.copyOf(flashbackCards); - } - - /** - * @return the graveCards - */ - public List getGraveCards() { - return graveCards; - } - - /** - * @param graveCards the graveCards to set - */ - public void setGraveCards(final List graveCards) { - this.graveCards = ImmutableList.copyOf(graveCards); - } - - /** - * @return the handCards - */ - public List getHandCards() { - return handCards; - } - - /** - * @param handCards the handCards to set - */ - public void setHandCards(final List handCards) { - this.handCards = ImmutableList.copyOf(handCards); - } - - /** - * @return the libraryCards - */ - public List getLibraryCards() { - return libraryCards; - } - - /** - * @param libraryCards the libraryCards to set - */ - public void setLibraryCards(final List libraryCards) { - this.libraryCards = ImmutableList.copyOf(libraryCards); - } - - public List getCards(final ZoneType zone) { - switch (zone) { - case Ante: - return getAnteCards(); - case Battlefield: - return getBfCards(); - case Command: - return getCommandCards(); - case Exile: - return getExileCards(); - case Graveyard: - return getGraveCards(); - case Hand: - return getHandCards(); - case Library: - return getLibraryCards(); - default: - return ImmutableList.of(); - } - } - - public int getNCards(final ZoneType zone) { - switch (zone) { - case Hand: - return getnHandCards(); - case Library: - return getnLibraryCards(); - default: - return getCards(zone).size(); - } - } - - /** - * @return the nHandCards - */ - public int getnHandCards() { - return nHandCards; - } - - /** - * @param nHandCards the nHandCards to set - */ - public void setnHandCards(int nHandCards) { - this.nHandCards = nHandCards; - } - - /** - * @return the nLibraryCards - */ - public int getnLibraryCards() { - return nLibraryCards; - } - - /** - * @param nLibraryCards the nLibraryCards to set - */ - public void setnLibraryCards(int nLibraryCards) { - this.nLibraryCards = nLibraryCards; - } - - /** - * @return the hasUnlimitedHandSize - */ - public boolean hasUnlimitedHandSize() { - return hasUnlimitedHandSize; - } - - /** - * @param hasUnlimitedHandSize the hasUnlimitedHandSize to set - */ - public void setHasUnlimitedHandSize(final boolean hasUnlimitedHandSize) { - this.hasUnlimitedHandSize = hasUnlimitedHandSize; - } - - public int getMana(final Byte color) { - return this.mana.containsKey(color) ? this.mana.get(color).intValue() : 0; - } - - public void setMana(final byte color, final int mana) { - this.mana.put(Byte.valueOf(color), Integer.valueOf(mana)); - } - -} \ No newline at end of file diff --git a/forge-gui/src/main/java/forge/view/SpellAbilityView.java b/forge-gui/src/main/java/forge/view/SpellAbilityView.java deleted file mode 100644 index 43add274032..00000000000 --- a/forge-gui/src/main/java/forge/view/SpellAbilityView.java +++ /dev/null @@ -1,90 +0,0 @@ -package forge.view; - -import forge.game.IIdentifiable; - -/** - * Representation of a {@link forge.game.spellability.SpellAbility}, containing - * only the information relevant to a user interface. - * - * Conversion from and to SpellAbilities happens through {@link LocalGameView}. - * - * @author elcnesh - */ -public class SpellAbilityView implements IIdentifiable { - - private final int id; - private CardView hostCard; - private String description; - private boolean canPlay, promptIfOnlyPossibleAbility; - - public SpellAbilityView(final int id) { - this.id = id; - } - - @Override - public int getId() { - return id; - } - - @Override - public String toString() { - return this.getDescription(); - } - - /** - * @return the hostCard - */ - public CardView getHostCard() { - return hostCard; - } - - /** - * @param hostCard the hostCard to set - */ - public void setHostCard(CardView hostCard) { - this.hostCard = hostCard; - } - - /** - * @return the description - */ - public String getDescription() { - return description; - } - - /** - * @param description the description to set - */ - public void setDescription(String description) { - this.description = description; - } - - /** - * @return the canPlay - */ - public boolean canPlay() { - return canPlay; - } - - /** - * @param canPlay the canPlay to set - */ - public void setCanPlay(boolean canPlay) { - this.canPlay = canPlay; - } - - /** - * @return the promptIfOnlyPossibleAbility - */ - public boolean isPromptIfOnlyPossibleAbility() { - return promptIfOnlyPossibleAbility; - } - - /** - * @param promptIfOnlyPossibleAbility the promptIfOnlyPossibleAbility to set - */ - public void setPromptIfOnlyPossibleAbility(boolean promptIfOnlyPossibleAbility) { - this.promptIfOnlyPossibleAbility = promptIfOnlyPossibleAbility; - } - -} diff --git a/forge-gui/src/main/java/forge/view/StackItemView.java b/forge-gui/src/main/java/forge/view/StackItemView.java deleted file mode 100644 index 4e651278612..00000000000 --- a/forge-gui/src/main/java/forge/view/StackItemView.java +++ /dev/null @@ -1,91 +0,0 @@ -package forge.view; - -import forge.game.IIdentifiable; -import forge.game.spellability.SpellAbilityStackInstance; - -/** - * Representation of a {@link forge.game.spellability.SpellAbilityStackInstance} - * , containing only the information relevant to a user interface. - * - * Conversion from and to SpellAbilityStackInstances happens through - * {@link LocalGameView}. - * - * @author elcnesh - */ -public class StackItemView implements IIdentifiable { - - private final int id; - private final String key; - private final int sourceTrigger; - private final String text; - private final CardView source; - private final PlayerView activatingPlayer; - private final Iterable targetCards; - private final Iterable targetPlayers; - private final boolean ability, optionalTrigger; - private final StackItemView subInstance; - - public StackItemView(SpellAbilityStackInstance si, LocalGameView gameView) { - id = si.getId(); - key = si.getSpellAbility(false).toUnsuppressedString(); - sourceTrigger = si.getSpellAbility(false).getSourceTrigger(); - text = si.getStackDescription(); - source = gameView.getCardView(si.getSourceCard(), true); - activatingPlayer = gameView.getPlayerView(si.getActivator(), false); - targetCards = gameView.getCardViews(si.getTargetChoices().getTargetCards(), false); - targetPlayers = gameView.getPlayerViews(si.getTargetChoices().getTargetPlayers(), false); - ability = si.isAbility(); - optionalTrigger = si.isOptionalTrigger(); - subInstance = si.getSubInstance() == null ? null : new StackItemView(si.getSubInstance(), gameView); - } - - @Override - public int getId() { - return id; - } - - public String getKey() { - return key; - } - - public int getSourceTrigger() { - return sourceTrigger; - } - - public String getText() { - return text; - } - - public CardView getSource() { - return source; - } - - public PlayerView getActivatingPlayer() { - return activatingPlayer; - } - - public Iterable getTargetCards() { - return targetCards; - } - - public Iterable getTargetPlayers() { - return targetPlayers; - } - - public StackItemView getSubInstance() { - return subInstance; - } - - public boolean isAbility() { - return ability; - } - - public boolean isOptionalTrigger() { - return optionalTrigger; - } - - @Override - public String toString() { - return text; - } -} diff --git a/forge-gui/src/main/java/forge/view/ViewUtil.java b/forge-gui/src/main/java/forge/view/ViewUtil.java deleted file mode 100644 index cfbb3acbcc2..00000000000 --- a/forge-gui/src/main/java/forge/view/ViewUtil.java +++ /dev/null @@ -1,164 +0,0 @@ -package forge.view; - -import java.util.LinkedList; -import java.util.List; - -import com.google.common.base.Function; -import com.google.common.base.Predicate; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; - -import forge.card.CardCharacteristicName; -import forge.game.card.Card; -import forge.game.card.CardCharacteristics; -import forge.item.IPaperCard; -import forge.view.CardView.CardStateView; - -/** - * Static class providing utility methods to the view classes. - * - * @author elcnesh - */ -public final class ViewUtil { - - private ViewUtil() { - } - - /** - * Write those properties of a {@link Card} to a {@link CardView} that do - * not depend on other cards. - * - * @param c - * the {@link Card} to read from. - * @param view - * the {@link CardView} to write to. - */ - public static void writeNonDependentCardViewProperties(final Card c, final CardView view, final boolean mayShowCard, final boolean mayShowCardFace) { - final boolean hasAltState = c.isDoubleFaced() || c.isFlipCard() || c.isSplitCard() || (c.isFaceDown() && mayShowCardFace); - view.setMayBeShown(mayShowCard); - view.setZone(c.getZone() == null ? null : c.getZone().getZoneType()); - view.setHasAltState(hasAltState); - view.setFaceDown(c.isFaceDown()); - view.setCloned(c.isCloned()); - view.setFlipCard(c.isFlipCard()); - view.setFlipped(c.getCurState().equals(CardCharacteristicName.Flipped)); - view.setSplitCard(c.isSplitCard()); - view.setTransformed(c.getCurState().equals(CardCharacteristicName.Transformed)); - view.setSetCode(c.getCurSetCode()); - view.setRarity(c.getRarity()); - view.setPhasedOut(c.isPhasedOut()); - view.setSick(c.isInPlay() && c.isSick()); - view.setTapped(c.isTapped()); - view.setToken(c.isToken()); - view.setCounters(c.getCounters()); - view.setDamage(c.getDamage()); - view.setAssignedDamage(c.getTotalAssignedDamage()); - view.setRegenerationShields(c.getShieldCount()); - view.setPreventNextDamage(c.getPreventNextDamageTotalShields()); - view.setChosenType(c.getChosenType()); - view.setChosenColors(Lists.newArrayList(c.getChosenColors())); - view.setNamedCard(c.getNamedCard()); - - if (c.isSplitCard()) { - final CardCharacteristicName orig, alt; - if (c.getCurState() == CardCharacteristicName.RightSplit) { - // If right half on stack, place it first - orig = CardCharacteristicName.RightSplit; - alt = CardCharacteristicName.LeftSplit; - } else { - orig = CardCharacteristicName.LeftSplit; - alt = CardCharacteristicName.RightSplit; - } - writeCardStateViewProperties(c, view.getOriginal(), orig); - writeCardStateViewProperties(c, view.getAlternate(), alt); - return; - } - - final CardStateView origView = view.getOriginal(); - origView.setName(c.getName()); - origView.setColors(c.determineColor()); - origView.setImageKey(c.getImageKey() ); - origView.setType(c.getType()); - origView.setManaCost(c.getManaCost()); - origView.setPower(c.getNetAttack()); - origView.setToughness(c.getNetDefense()); - origView.setLoyalty(c.getCurrentLoyalty()); - origView.setText(c.getText()); - origView.setChangedColorWords(c.getChangedTextColorWords()); - origView.setChangedTypes(c.getChangedTextTypeWords()); - origView.setManaCost(c.getManaCost()); - origView.setHasDeathtouch(c.hasKeyword("Deathtouch")); - origView.setHasInfect(c.hasKeyword("Infect")); - origView.setHasStorm(c.hasKeyword("Storm")); - origView.setHasTrample(c.hasKeyword("Trample")); - origView.setFoilIndex(c.getCharacteristics().getFoil()); - - final CardStateView altView = view.getAlternate(); - CardCharacteristicName altState = null; - if (hasAltState) { - if (c.isFlipCard() && !c.getCurState().equals(CardCharacteristicName.Flipped)) { - altState = CardCharacteristicName.Flipped; - } else if (c.isDoubleFaced() && !c.getCurState().equals(CardCharacteristicName.Transformed)) { - altState = CardCharacteristicName.Transformed; - } else { - altState = CardCharacteristicName.Original; - } - - if (altState != null) { - writeCardStateViewProperties(c, altView, altState); - } - } - - if (altState == null) { - altView.reset(); - } - } - - private static void writeCardStateViewProperties(final Card c, final CardStateView view, final CardCharacteristicName state) { - final CardCharacteristics chars = c.getState(state); - view.setName(chars.getName()); - view.setColors(chars.determineColor()); - view.setImageKey(chars.getImageKey()); - view.setType(chars.getType()); - view.setManaCost(chars.getManaCost()); - view.setPower(chars.getBaseAttack()); - view.setToughness(chars.getBaseDefense()); - view.setLoyalty(0); // Q why is loyalty not a property of CardCharacteristic? A: because no alt states have a base loyalty (only candidate is Garruk Relentless). - view.setText(chars.getOracleText()); - view.setFoilIndex(chars.getFoil()); - } - - public static CardView getCardForUi(final IPaperCard pc) { - final Card c = Card.getCardForUi(pc); - if (c.getCardForUi() != c) { - return null; - } - final CardView view = new CardView(c.getId()); - writeNonDependentCardViewProperties(c, view, true, true); - return view; - } - - public static List transformIfNotNull(final Iterable input, final Function transformation) { - return transformIfNotNull(input, transformation, new LinkedList()); - } - public static > L transformIfNotNull(final Iterable input, final Function transformation, L ret) { - synchronized (input) { - for (final T t : input) { - final V v = transformation.apply(t); - if (v != null) { - ret.add(v); - } - } - } - return ret; - } - - public static boolean mayViewAny(final Iterable cards) { - return Iterables.any(cards, new Predicate() { - @Override - public boolean apply(final CardView input) { - return input.getId() >= 0; - } - }); - } -}