diff --git a/Mage.Client/src/main/java/mage/client/MageFrame.java b/Mage.Client/src/main/java/mage/client/MageFrame.java index 641ba54ddb..3848dc7941 100644 --- a/Mage.Client/src/main/java/mage/client/MageFrame.java +++ b/Mage.Client/src/main/java/mage/client/MageFrame.java @@ -27,6 +27,57 @@ */ package mage.client; +import java.awt.AlphaComposite; +import java.awt.Color; +import java.awt.Component; +import java.awt.Cursor; +import java.awt.Graphics2D; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.SplashScreen; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.ComponentAdapter; +import java.awt.event.ComponentEvent; +import java.awt.event.ItemEvent; +import java.awt.event.ItemListener; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; +import java.beans.PropertyVetoException; +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import java.util.concurrent.Executors; +import java.util.concurrent.ScheduledExecutorService; +import java.util.concurrent.TimeUnit; +import java.util.prefs.Preferences; +import javax.imageio.ImageIO; +import javax.swing.AbstractButton; +import javax.swing.Box; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JCheckBoxMenuItem; +import javax.swing.JComponent; +import javax.swing.JDesktopPane; +import javax.swing.JEditorPane; +import javax.swing.JFrame; +import javax.swing.JInternalFrame; +import javax.swing.JLabel; +import javax.swing.JLayeredPane; +import javax.swing.JOptionPane; +import javax.swing.JPanel; +import javax.swing.JPopupMenu; +import javax.swing.JToggleButton; +import javax.swing.JToolBar.Separator; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.UIManager; +import javax.swing.event.PopupMenuEvent; +import javax.swing.event.PopupMenuListener; import mage.cards.decks.Deck; import mage.cards.repository.CardCriteria; import mage.cards.repository.CardInfo; @@ -42,7 +93,14 @@ import mage.client.components.tray.MageTray; import mage.client.constants.Constants.DeckEditorMode; import mage.client.deckeditor.DeckEditorPane; import mage.client.deckeditor.collection.viewer.CollectionViewerPane; -import mage.client.dialog.*; +import mage.client.dialog.AboutDialog; +import mage.client.dialog.ConnectDialog; +import mage.client.dialog.ErrorDialog; +import mage.client.dialog.FeedbackDialog; +import mage.client.dialog.GameEndDialog; +import mage.client.dialog.PreferencesDialog; +import mage.client.dialog.TableWaitingDialog; +import mage.client.dialog.UserRequestDialog; import mage.client.draft.DraftPane; import mage.client.draft.DraftPanel; import mage.client.game.GamePane; @@ -67,37 +125,16 @@ import mage.remote.Session; import mage.remote.SessionImpl; import mage.utils.MageVersion; import mage.view.GameEndView; +import mage.view.UserRequestMessage; +import net.java.truevfs.access.TArchiveDetector; +import net.java.truevfs.access.TConfig; +import net.java.truevfs.kernel.spec.FsAccessOption; import org.apache.log4j.Logger; import org.mage.card.arcane.ManaSymbols; import org.mage.plugins.card.constants.Constants; import org.mage.plugins.card.images.DownloadPictures; import org.mage.plugins.card.utils.impl.ImageManagerImpl; -import javax.imageio.ImageIO; -import javax.swing.*; -import javax.swing.JToolBar.Separator; -import javax.swing.event.PopupMenuEvent; -import javax.swing.event.PopupMenuListener; -import java.awt.*; -import java.awt.event.*; -import java.awt.image.BufferedImage; -import java.beans.PropertyVetoException; -import java.io.IOException; -import java.io.InputStream; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; -import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; -import java.util.prefs.Preferences; -import static mage.client.dialog.PreferencesDialog.KEY_CONNECT_FLAG; -import mage.view.UserRequestMessage; -import net.java.truevfs.access.TArchiveDetector; -import net.java.truevfs.access.TConfig; -import net.java.truevfs.kernel.spec.FsAccessOption; - /** * @author BetaSteward_at_googlemail.com */ @@ -521,7 +558,7 @@ public class MageFrame extends javax.swing.JFrame implements MageClient { } public void btnSymbolsActionPerformed(java.awt.event.ActionEvent evt) { - if (JOptionPane.showConfirmDialog(this, "Do you want to download mana symbols?") == JOptionPane.OK_OPTION) { + if (JOptionPane.showConfirmDialog(this, "Do you want to download game symbols and additional image files?", "Download additional resources", JOptionPane.YES_NO_OPTION) == JOptionPane.OK_OPTION) { Plugins.getInstance().downloadSymbols(); } } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java b/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java index 937caff535..7c99afe599 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/CardPluginImpl.java @@ -1,5 +1,21 @@ package org.mage.plugins.card; +import java.awt.BorderLayout; +import java.awt.Dimension; +import java.awt.Frame; +import java.awt.Image; +import java.awt.Rectangle; +import java.awt.event.WindowAdapter; +import java.awt.event.WindowEvent; +import java.awt.image.BufferedImage; +import java.util.ArrayList; +import java.util.Collection; +import java.util.List; +import java.util.Map; +import java.util.UUID; +import javax.swing.JComponent; +import javax.swing.JDialog; +import javax.swing.JLayeredPane; import mage.cards.MagePermanent; import mage.cards.action.ActionCallback; import mage.constants.Rarity; @@ -20,20 +36,13 @@ import org.mage.plugins.card.constants.Constants; import org.mage.plugins.card.dl.DownloadGui; import org.mage.plugins.card.dl.DownloadJob; import org.mage.plugins.card.dl.Downloader; +import org.mage.plugins.card.dl.sources.CardFrames; import org.mage.plugins.card.dl.sources.DirectLinksForDownload; import org.mage.plugins.card.dl.sources.GathererSets; import org.mage.plugins.card.dl.sources.GathererSymbols; import org.mage.plugins.card.images.ImageCache; import org.mage.plugins.card.info.CardInfoPaneImpl; -import javax.swing.*; -import java.awt.*; -import java.awt.event.WindowAdapter; -import java.awt.event.WindowEvent; -import java.awt.image.BufferedImage; -import java.util.*; -import java.util.List; - /** * {@link CardPlugin} implementation. * @@ -496,6 +505,11 @@ public class CardPluginImpl implements CardPlugin { g.getDownloader().add(job); } + it = new CardFrames(imagesPath); + for(DownloadJob job:it) { + g.getDownloader().add(job); + } + it = new DirectLinksForDownload(imagesPath); for(DownloadJob job:it) { g.getDownloader().add(job); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/DownloadJob.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/DownloadJob.java index 7d4dbdbec2..42b67cf7a5 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/DownloadJob.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/DownloadJob.java @@ -15,12 +15,11 @@ import java.io.OutputStream; import java.net.Proxy; import java.net.URL; import java.net.URLConnection; - import javax.swing.BoundedRangeModel; import javax.swing.DefaultBoundedRangeModel; - import org.mage.plugins.card.dl.beans.properties.Property; import org.mage.plugins.card.dl.lm.AbstractLaternaBean; +import org.mage.plugins.card.utils.CardImageUtils; /** @@ -86,9 +85,11 @@ public class DownloadJob extends AbstractLaternaBean { */ public void setError(String message, Exception error) { if (message == null) { - message = error.toString(); + + message = "Download of " + this.getName() + "from " + this.getSource().toString() + " caused error: " + error.toString(); } - log.warn(message, error); +// log.warn(message, error); + log.warn(message); this.state.setValue(State.ABORTED); this.error.setValue(error); this.message.setValue(message); @@ -132,11 +133,11 @@ public class DownloadJob extends AbstractLaternaBean { } public static Source fromURL(final String url) { - return fromURL(null, url); + return fromURL(CardImageUtils.getProxyFromPreferences(), url); } public static Source fromURL(final URL url) { - return fromURL(null, url); + return fromURL(CardImageUtils.getProxyFromPreferences(), url); } public static Source fromURL(final Proxy proxy, final String url) { @@ -159,6 +160,12 @@ public class DownloadJob extends AbstractLaternaBean { public int length() throws IOException { return getConnection().getContentLength(); } + + @Override + public String toString() { + return proxy != null ? proxy.type().toString()+" " :"" + url; + } + }; } @@ -182,6 +189,11 @@ public class DownloadJob extends AbstractLaternaBean { public int length() throws IOException { return getConnection().getContentLength(); } + + @Override + public String toString() { + return proxy != null ? proxy.type().toString()+" " :"" + url; + } }; } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/Downloader.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/Downloader.java index e945991f49..1ff78368e1 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/Downloader.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/Downloader.java @@ -11,6 +11,7 @@ import java.io.BufferedOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.ConnectException; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ExecutorService; @@ -158,6 +159,14 @@ public class Downloader extends AbstractLaternaBean implements Disposable { } } job.setState(State.FINISHED); + } catch(ConnectException ex) { + String message; + if (ex.getMessage() != null) { + message = ex.getMessage(); + } else { + message = "Unknown error"; + } + logger.warn("Error resource download " + job.getName() +" from "+ job.getSource().toString() + ": " + message); } catch(IOException ex) { job.setError(ex); } diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardFrames.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardFrames.java new file mode 100644 index 0000000000..b46652d7ab --- /dev/null +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/CardFrames.java @@ -0,0 +1,100 @@ +/* + * Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved. + * + * Redistribution and use in source and binary forms, with or without modification, are + * permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this list of + * conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, this list + * of conditions and the following disclaimer in the documentation and/or other materials + * provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR + * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR + * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON + * ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING + * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF + * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + * + * The views and conclusions contained in the software and documentation are those of the + * authors and should not be interpreted as representing official policies, either expressed + * or implied, of BetaSteward_at_googlemail.com. + */ +package org.mage.plugins.card.dl.sources; + +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import org.mage.plugins.card.dl.DownloadJob; +import static org.mage.plugins.card.dl.DownloadJob.fromURL; +import static org.mage.plugins.card.dl.DownloadJob.toFile; + +/** + * + * @author LevelX2 + */ + +public class CardFrames implements Iterable { + + private static final String FRAMES_PATH = File.separator + "frames"; + private static final File DEFAULT_OUT_DIR = new File("plugins" + File.separator + "images" + FRAMES_PATH); + private static File outDir = DEFAULT_OUT_DIR; + + static final String BASE_DOWNLOAD_URL = "http://ct-magefree.rhcloud.com/resources/img/"; + static final String TEXTURES_FOLDER = "textures"; + static final String PT_BOXES_FOLDER = "pt"; + + private static final String[] TEXTURES = {"U", "R", "G", "B", "W", "A", + "BG_LAND", "BR_LAND", "WU_LAND", "WB_LAND", "UB_LAND", "GW_LAND", "RW_LAND", + "RG_LAND", "GU_LAND", "UR_LAND" + // NOT => "BW_LAND","BU_LAND","WG_LAND","WR_LAND", + }; + private static final String[] PT_BOXES = {"U", "R", "G", "B", "W", "A"}; + + public CardFrames(String path) { + if (path == null) { + useDefaultDir(); + } else { + changeOutDir(path); + } + } + + @Override + public Iterator iterator() { + ArrayList jobs = new ArrayList<>(); + for (String texture : TEXTURES) { + jobs.add(generateDownloadJob(TEXTURES_FOLDER, texture)); + } + for (String pt_box : PT_BOXES) { + jobs.add(generateDownloadJob(PT_BOXES_FOLDER, pt_box)); + } + return jobs.iterator(); + } + + private DownloadJob generateDownloadJob(String dirName, String name) { + File dst = new File(outDir, name + ".png"); + String url = BASE_DOWNLOAD_URL + dirName + "/" + name + ".png"; + return new DownloadJob("frames-" + dirName + "-" + name, fromURL(url), toFile(dst)); + } + + private void useDefaultDir() { + outDir = DEFAULT_OUT_DIR; + } + + private void changeOutDir(String path) { + File file = new File(path + FRAMES_PATH); + if (file.exists()) { + outDir = file; + } else { + file.mkdirs(); + if (file.exists()) { + outDir = file; + } + } + } +} diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSymbols.java b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSymbols.java index cadc5d7b6a..85fe8ad34b 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSymbols.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/dl/sources/GathererSymbols.java @@ -8,12 +8,10 @@ package org.mage.plugins.card.dl.sources; import com.google.common.collect.AbstractIterator; -import org.mage.plugins.card.dl.DownloadJob; - import java.io.File; -import java.util.Iterator; - import static java.lang.String.format; +import java.util.Iterator; +import org.mage.plugins.card.dl.DownloadJob; import static org.mage.plugins.card.dl.DownloadJob.fromURL; import static org.mage.plugins.card.dl.DownloadJob.toFile; @@ -70,7 +68,9 @@ public class GathererSymbols implements Iterable { sym = "" + (numeric++); } else { sizeIndex++; - if(sizeIndex == sizes.length) return endOfData(); + if(sizeIndex == sizes.length) { + return endOfData(); + } symIndex = 0; numeric = 0; @@ -80,9 +80,17 @@ public class GathererSymbols implements Iterable { String symbol = sym.replaceAll("/", ""); File dst = new File(dir, symbol + ".jpg"); - if(symbol.equals("T")) symbol = "tap"; - else if(symbol.equals("Q")) symbol = "untap"; - else if(symbol.equals("S")) symbol = "snow"; + switch (symbol) { + case "T": + symbol = "tap"; + break; + case "Q": + symbol = "untap"; + break; + case "S": + symbol = "snow"; + break; + } String url = format(urlFmt, sizes[sizeIndex], symbol); diff --git a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java index 0192af02f5..20cd026bb2 100644 --- a/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java +++ b/Mage.Client/src/main/java/org/mage/plugins/card/utils/CardImageUtils.java @@ -1,8 +1,14 @@ package org.mage.plugins.card.utils; +import java.net.InetSocketAddress; +import java.net.Proxy; import java.util.HashMap; +import java.util.prefs.Preferences; +import mage.client.MageFrame; import mage.client.constants.Constants; import mage.client.dialog.PreferencesDialog; +import mage.remote.Connection; +import mage.remote.Connection.ProxyType; import net.java.truevfs.access.TFile; import org.apache.log4j.Logger; import org.mage.plugins.card.images.CardDownloadData; @@ -150,4 +156,15 @@ public class CardImageUtils { return imageDir + TFile.separator + imageName; } + + public static Proxy getProxyFromPreferences() { + Preferences prefs = MageFrame.getPreferences(); + Connection.ProxyType proxyType = Connection.ProxyType.valueByText(prefs.get("proxyType", "None")); + if (!proxyType.equals(ProxyType.NONE)) { + String proxyServer = prefs.get("proxyAddress", ""); + int proxyPort = Integer.parseInt(prefs.get("proxyPort", "0")); + return new Proxy(Proxy.Type.HTTP, new InetSocketAddress(proxyServer, proxyPort)); + } + return null; + } } diff --git a/Mage.Common/src/mage/view/GameEndView.java b/Mage.Common/src/mage/view/GameEndView.java index 5f700d9dc6..67030aa269 100644 --- a/Mage.Common/src/mage/view/GameEndView.java +++ b/Mage.Common/src/mage/view/GameEndView.java @@ -107,9 +107,9 @@ public class GameEndView implements Serializable { } } else if (matchPlayer.getPlayer().hasIdleTimeout()) { if (matchPlayer.getPlayer().equals(you)) { - additonalText.append("You lost the match for beeing idle. "); + additonalText.append("You lost the match for being idle. "); } else { - additonalText.append(matchPlayer.getName()).append(" lost for beeing idle. "); + additonalText.append(matchPlayer.getName()).append(" lost for being idle. "); } } else if (matchPlayer.hasQuit()) { if (matchPlayer.getPlayer().equals(you)) { diff --git a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java index dda37ca177..0f7fe7b383 100644 --- a/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java +++ b/Mage.Server.Plugins/Mage.Player.AI/src/main/java/mage/player/ai/ComputerPlayer.java @@ -511,7 +511,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { while (!target.isChosen() && !cardsInHand.isEmpty() && target.getMaxNumberOfTargets() > target.getTargets().size()) { Card card = pickBestCard(cardsInHand, null, target, source, game); if (card != null) { - if (target.canTarget(card.getId(), source, game)) { + if (target.canTarget(getId(), card.getId(), source, game)) { target.addTarget(card.getId(), source, game); cardsInHand.remove(card); if (target.isChosen()) { @@ -525,7 +525,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { findPlayables(game); if (unplayable.size() > 0) { for (int i = unplayable.size() - 1; i >= 0; i--) { - if (target.canTarget(unplayable.values().toArray(new Card[0])[i].getId(), source, game)) { + if (target.canTarget(getId(), unplayable.values().toArray(new Card[0])[i].getId(), source, game)) { target.addTarget(unplayable.values().toArray(new Card[0])[i].getId(), source, game); if (target.isChosen()) { return true; @@ -535,7 +535,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } if (hand.size() > 0) { for (int i = 0; i < hand.size(); i++) { - if (target.canTarget(hand.toArray(new UUID[0])[i], source, game)) { + if (target.canTarget(getId(), hand.toArray(new UUID[0])[i], source, game)) { target.addTarget(hand.toArray(new UUID[0])[i], source, game); if (target.isChosen()) { return true; @@ -600,13 +600,13 @@ public class ComputerPlayer extends PlayerImpl implements Player { if (targets.isEmpty()) { if (outcome.isGood()) { - if (target.canTarget(abilityControllerId, source, game)) { + if (target.canTarget(getId(), abilityControllerId, source, game)) { target.addTarget(abilityControllerId, source, game); return true; } } else { - if (target.canTarget(opponentId, source, game)) { + if (target.canTarget(getId(), opponentId, source, game)) { target.addTarget(opponentId, source, game); return true; } @@ -627,13 +627,13 @@ public class ComputerPlayer extends PlayerImpl implements Player { } if (outcome.isGood()) { - if (target.canTarget(abilityControllerId, source, game)) { + if (target.canTarget(getId(),abilityControllerId, source, game)) { target.addTarget(abilityControllerId, source, game); return true; } } else { - if (target.canTarget(opponentId, source, game)) { + if (target.canTarget(getId(),opponentId, source, game)) { target.addTarget(opponentId, source, game); return true; } @@ -757,7 +757,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = game.getBattlefield().getActivePermanents(new FilterPlaneswalkerPermanent(), opponentId, game); if (targets != null && !targets.isEmpty()) { for (Permanent planeswalker: targets) { - if (target.canTarget(planeswalker.getId(), source, game)) { + if (target.canTarget(getId(),planeswalker.getId(), source, game)) { target.addTarget(planeswalker.getId(), source, game); } if (target.isChosen()) { @@ -766,7 +766,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } } if (!target.isChosen()) { - if (target.canTarget(opponentId, source, game)) { + if (target.canTarget(getId() ,opponentId, source, game)) { target.addTarget(opponentId, source, game); } } @@ -818,7 +818,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { card = pickWorstCard(cards, null, target, source, game); } if (source != null) { - if (target.canTarget(this.getId(), card.getId(), source, game)) { + if (target.canTarget(getId(), card.getId(), source, game)) { return card; } } @@ -849,21 +849,21 @@ public class ComputerPlayer extends PlayerImpl implements Player { targets = threats(opponentId, source.getSourceId(), new FilterCreaturePermanent(), game, target.getTargets()); } for (Permanent permanent: targets) { - if (target.canTarget(permanent.getId(), source, game)) { + if (target.canTarget(getId() ,permanent.getId(), source, game)) { if (permanent.getToughness().getValue() <= target.getAmountRemaining()) { target.addTarget(permanent.getId(), permanent.getToughness().getValue(), source, game); return true; } } } - if (outcome.isGood() && target.canTarget(playerId, playerId, source, game)) { + if (outcome.isGood() && target.canTarget(getId(), getId(), source, game)) { target.addTarget(opponentId, target.getAmountRemaining(), source, game); return true; - } else if (target.canTarget(playerId, opponentId, source, game)){ + } else if (target.canTarget(getId(), opponentId, source, game)){ // no permanent target so take opponent target.addTarget(opponentId, target.getAmountRemaining(), source, game); return true; - } else if (target.canTarget(playerId, playerId, source, game)) { + } else if (target.canTarget(getId(), playerId, source, game)) { target.addTarget(opponentId, target.getAmountRemaining(), source, game); return true; } @@ -1778,7 +1778,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } else if (score > maxScore) { // we need better card if (target != null && source != null && game != null) { // but also check it can be targeted - betterCard = target.canTarget(card.getId(), source, game); + betterCard = target.canTarget(getId(), card.getId(), source, game); } else { // target object wasn't provided, so acceptings it anyway betterCard = true; @@ -1807,7 +1807,7 @@ public class ComputerPlayer extends PlayerImpl implements Player { } else if (score < minScore) { // we need worse card if (target != null && source != null && game != null) { // but also check it can be targeted - worseCard = target.canTarget(card.getId(), source, game); + worseCard = target.canTarget(getId(), card.getId(), source, game); } else { // target object wasn't provided, so accepting it anyway worseCard = true; diff --git a/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java b/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java index 367ea5e026..b347b38e6a 100644 --- a/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java +++ b/Mage.Sets/src/mage/sets/urzassaga/ShowAndTell.java @@ -43,7 +43,6 @@ import mage.filter.predicate.Predicates; import mage.filter.predicate.mageobject.CardTypePredicate; import mage.game.Game; import mage.players.Player; -import mage.players.PlayerList; import mage.target.common.TargetCardInHand; /** @@ -76,11 +75,12 @@ class ShowAndTellEffect extends OneShotEffect { private static final FilterCard filter = new FilterCard("artifact, creature, enchantment, or land card"); static { - filter.add(Predicates.or( - new CardTypePredicate(CardType.ARTIFACT), - new CardTypePredicate(CardType.CREATURE), - new CardTypePredicate(CardType.ENCHANTMENT), - new CardTypePredicate(CardType.LAND))); + List cardTypes = new ArrayList<>(); + cardTypes.add(new CardTypePredicate(CardType.ARTIFACT)); + cardTypes.add(new CardTypePredicate(CardType.CREATURE)); + cardTypes.add(new CardTypePredicate(CardType.ENCHANTMENT)); + cardTypes.add(new CardTypePredicate(CardType.LAND)); + filter.add(Predicates.or(cardTypes)); } public ShowAndTellEffect() { @@ -105,24 +105,23 @@ class ShowAndTellEffect extends OneShotEffect { } List cardsToPutIntoPlay = new ArrayList<>(); TargetCardInHand target = new TargetCardInHand(filter); - PlayerList playerList = game.getPlayerList().copy(); - playerList.setCurrent(game.getActivePlayerId()); - Player player = game.getPlayer(game.getActivePlayerId()); - do { - if (player.chooseUse(outcome, "Put an artifact, creature, enchantment, or land card from hand onto the battlefield?", game)) { - target.clearChosen(); - if (player.chooseTarget(outcome, target, source, game)) { - Card card = game.getCard(target.getFirstTarget()); - if (card != null) { - cardsToPutIntoPlay.add(card); + + for(UUID playerId: game.getState().getPlayersInRange(controller.getId(), game)) { + Player player = game.getPlayer(playerId); + if (player != null) { + if (player.chooseUse(outcome, "Put an artifact, creature, enchantment, or land card from hand onto the battlefield?", game)) { + target.clearChosen(); + if (player.chooseTarget(outcome, target, source, game)) { + Card card = game.getCard(target.getFirstTarget()); + if (card != null) { + cardsToPutIntoPlay.add(card); + } } - } + } } - player = playerList.getNextInRange(controller, game); - } while (!player.getId().equals(game.getActivePlayerId())); - + } for (Card card: cardsToPutIntoPlay) { - player = game.getPlayer(card.getOwnerId()); + Player player = game.getPlayer(card.getOwnerId()); if (player != null) { player.putOntoBattlefieldWithInfo(card, game, Zone.HAND, source.getSourceId()); } diff --git a/Mage/src/mage/abilities/keyword/RenownAbility.java b/Mage/src/mage/abilities/keyword/RenownAbility.java index 506071634a..b6920d6d94 100644 --- a/Mage/src/mage/abilities/keyword/RenownAbility.java +++ b/Mage/src/mage/abilities/keyword/RenownAbility.java @@ -48,6 +48,11 @@ public class RenownAbility extends TriggeredAbilityImpl { return event.getType() == GameEvent.EventType.DAMAGED_PLAYER; } + @Override + public boolean checkInterveningIfClause(Game game) { + return getSourceObject(game) != null && !((Permanent)getSourceObject(game)).isRenown(); + } + @Override public boolean checkTrigger(GameEvent event, Game game) { return event.getSourceId().equals(getSourceId()) @@ -83,7 +88,7 @@ class BecomeRenownSourceEffect extends OneShotEffect { @Override public boolean apply(Game game, Ability source) { Permanent permanent = game.getPermanent(source.getSourceId()); - if (permanent != null && !permanent.isRenown() && source instanceof RenownAbility) { + if (permanent != null && source instanceof RenownAbility) { game.informPlayers(permanent.getLogName() + " is now renown"); int renownValue = ((RenownAbility) source).getRenownValue(); // handle renown = X