diff --git a/Mage.Client/src/main/java/mage/client/cards/Cards.java b/Mage.Client/src/main/java/mage/client/cards/Cards.java index 10aea186eee..035951f573a 100644 --- a/Mage.Client/src/main/java/mage/client/cards/Cards.java +++ b/Mage.Client/src/main/java/mage/client/cards/Cards.java @@ -34,22 +34,19 @@ package mage.client.cards; +import mage.cards.MageCard; +import mage.client.plugins.impl.Plugins; +import mage.client.util.CardsViewUtil; +import mage.client.util.Config; +import mage.view.*; + +import javax.swing.border.Border; import java.awt.*; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.Map; import java.util.Map.Entry; import java.util.UUID; -import javax.swing.border.Border; -import mage.cards.MageCard; -import mage.client.plugins.impl.Plugins; -import mage.client.util.CardsViewUtil; -import mage.client.util.Config; -import mage.view.CardView; -import mage.view.CardsView; -import mage.view.PermanentView; -import mage.view.SimpleCardsView; -import mage.view.StackAbilityView; /** * @@ -111,10 +108,10 @@ public class Cards extends javax.swing.JPanel { } public boolean loadCards(SimpleCardsView cardsView, BigCard bigCard, UUID gameId) { - return loadCards(CardsViewUtil.convertSimple(cardsView), bigCard, gameId); + return loadCards(CardsViewUtil.convertSimple(cardsView), bigCard, gameId, null); } - public boolean loadCards(CardsView cardsView, BigCard bigCard, UUID gameId) { + public boolean loadCards(CardsView cardsView, BigCard bigCard, UUID gameId, java.util.List order) { boolean changed = false; for (Iterator> i = cards.entrySet().iterator(); i.hasNext();) { @@ -148,7 +145,7 @@ public class Cards extends javax.swing.JPanel { } if (changed) { - layoutCards(getCardDimension()); + layoutCards(getCardDimension(), cards, order); } if (!isVisibleIfEmpty) { @@ -195,14 +192,27 @@ public class Cards extends javax.swing.JPanel { } } - private void layoutCards(Dimension dimension) { + private void layoutCards(Dimension dimension, Map cards, java.util.List order) { if (Plugins.getInstance().isCardPluginLoaded()) { int dx = GAP_X; - for (MageCard card: cards.values()) { - card.setLocation(dx, 0); - card.setCardBounds(dx, 0, dimension.width, dimension.height); - dx += dimension.width + GAP_X; - } + if (order != null) { + for (UUID cardId : order) { + MageCard card = cards.get(cardId); + if (card != null) { + card.setLocation(dx, 0); + card.setCardBounds(dx, 0, dimension.width, dimension.height); + dx += dimension.width + GAP_X; + } else { + System.err.println("[ERROR] Cards.java: couldn't find a card from ordered list!"); + } + } + } else { + for (MageCard card: cards.values()) { + card.setLocation(dx, 0); + card.setCardBounds(dx, 0, dimension.width, dimension.height); + dx += dimension.width + GAP_X; + } + } } } @@ -254,7 +264,7 @@ public class Cards extends javax.swing.JPanel { public void setCardDimension(Dimension dimension) { this.cardDimension = dimension; - layoutCards(cardDimension); + layoutCards(cardDimension, cards, null); } public void setZone(String zone) { diff --git a/Mage.Client/src/main/java/mage/client/game/CombatGroup.java b/Mage.Client/src/main/java/mage/client/game/CombatGroup.java index 103ce480a8a..80d71fff751 100644 --- a/Mage.Client/src/main/java/mage/client/game/CombatGroup.java +++ b/Mage.Client/src/main/java/mage/client/game/CombatGroup.java @@ -34,12 +34,12 @@ package mage.client.game; -import java.util.UUID; - import mage.client.cards.BigCard; import mage.client.util.Config; import mage.view.CombatGroupView; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -62,9 +62,9 @@ public class CombatGroup extends javax.swing.JPanel { public void update(CombatGroupView combatGroup) { this.lblDefender.setText(combatGroup.getDefenderName()); - this.attackers.loadCards(combatGroup.getAttackers(), bigCard, gameId); + this.attackers.loadCards(combatGroup.getAttackers(), bigCard, gameId, null); // attackers.setPreferredSize(new Dimension(Config.dimensions.frameWidth + 6, Config.dimensions.frameHeight + 6)); - this.blockers.loadCards(combatGroup.getBlockers(), bigCard, gameId); + this.blockers.loadCards(combatGroup.getBlockers(), bigCard, gameId, null); // blockers.setPreferredSize(new Dimension(Config.dimensions.frameWidth + 6, Config.dimensions.frameHeight + 6)); this.attackers.setVisible(true); this.blockers.setVisible(true); diff --git a/Mage.Client/src/main/java/mage/client/game/GamePanel.java b/Mage.Client/src/main/java/mage/client/game/GamePanel.java index 3e6177182fe..0b7d3f4df80 100644 --- a/Mage.Client/src/main/java/mage/client/game/GamePanel.java +++ b/Mage.Client/src/main/java/mage/client/game/GamePanel.java @@ -397,7 +397,7 @@ public class GamePanel extends javax.swing.JPanel { } } - this.stack.loadCards(game.getStack(), bigCard, gameId); + this.stack.loadCards(game.getStack(), bigCard, gameId, game.getStackOrder()); GameManager.getInstance().setStackSize(game.getStack().size()); for (ExileView exile: game.getExile()) { diff --git a/Mage.Common/src/mage/view/GameView.java b/Mage.Common/src/mage/view/GameView.java index 940c08df14c..f4e5f5a8ea9 100644 --- a/Mage.Common/src/mage/view/GameView.java +++ b/Mage.Common/src/mage/view/GameView.java @@ -28,12 +28,6 @@ package mage.view; -import java.io.Serializable; -import java.util.ArrayList; -import java.util.List; -import java.util.Map; -import java.util.UUID; - import mage.Constants; import mage.Constants.PhaseStep; import mage.Constants.TurnPhase; @@ -49,6 +43,9 @@ import mage.game.stack.StackAbility; import mage.game.stack.StackObject; import mage.players.Player; +import java.io.Serializable; +import java.util.*; + /** * * @author BetaSteward_at_googlemail.com @@ -60,6 +57,7 @@ public class GameView implements Serializable { private SimpleCardsView hand; private Map opponentHands; private CardsView stack = new CardsView(); + private List stackOrder = new ArrayList(); private List exiles = new ArrayList(); private List revealed = new ArrayList(); private List lookedAt = new ArrayList(); @@ -95,7 +93,9 @@ public class GameView implements Serializable { else { stack.put(stackObject.getId(), new CardView((Spell)stackObject)); } + stackOrder.add(stackObject.getId()); } + Collections.reverse(stackOrder); for (ExileZone exileZone: state.getExile().getExileZones()) { exiles.add(new ExileView(exileZone, game)); } @@ -202,4 +202,8 @@ public class GameView implements Serializable { public boolean getSpecial() { return special; } + + public List getStackOrder() { + return stackOrder; + } } diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SoulsAttendant.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SoulsAttendant.java index 61c2b5bb023..9e7495d9ed1 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/SoulsAttendant.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/SoulsAttendant.java @@ -27,7 +27,6 @@ */ package mage.sets.riseoftheeldrazi; -import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Rarity; import mage.MageInt; @@ -35,6 +34,8 @@ import mage.abilities.common.AnotherCreatureEntersBattlefieldTriggeredAbility; import mage.abilities.effects.common.GainLifeEffect; import mage.cards.CardImpl; +import java.util.UUID; + /** * * @author North @@ -51,6 +52,7 @@ public class SoulsAttendant extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(1); + // Whenever another creature enters the battlefield, you may gain 1 life. this.addAbility(new AnotherCreatureEntersBattlefieldTriggeredAbility(new GainLifeEffect(1), true)); } diff --git a/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java b/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java index d4dd98d2299..f6d5c0b78f1 100644 --- a/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java +++ b/Mage.Sets/src/mage/sets/worldwake/StoneforgeMystic.java @@ -28,7 +28,6 @@ package mage.sets.worldwake; -import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Rarity; import mage.Constants.Zone; @@ -44,6 +43,8 @@ import mage.filter.FilterCard; import mage.target.common.TargetCardInHand; import mage.target.common.TargetCardInLibrary; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -66,9 +67,11 @@ public class StoneforgeMystic extends CardImpl { this.power = new MageInt(1); this.toughness = new MageInt(2); - TargetCardInLibrary target = new TargetCardInLibrary(1, 1, filter); + // When Stoneforge Mystic enters the battlefield, you may search your library for an Equipment card, reveal it, put it into your hand, then shuffle your library. + TargetCardInLibrary target = new TargetCardInLibrary(1, 1, filter); this.addAbility(new EntersBattlefieldTriggeredAbility(new SearchLibraryRevealPutInHandEffect(target), true)); + // {1}{W}, {T}: You may put an Equipment card from your hand onto the battlefield. SimpleActivatedAbility ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new PlayTargetWithoutPayingManaEffect(), new ManaCostsImpl("{1}{W}")); ability.addCost(new TapSourceCost()); ability.addTarget(new TargetCardInHand(0, 1, filter));