diff --git a/.gitattributes b/.gitattributes index d352c14a76a..ab28842fb96 100644 --- a/.gitattributes +++ b/.gitattributes @@ -16110,6 +16110,7 @@ forge-m-base/src/forge/toolbox/FButton.java -text forge-m-base/src/forge/toolbox/FCardPanel.java -text forge-m-base/src/forge/toolbox/FContainer.java -text forge-m-base/src/forge/toolbox/FDisplayObject.java -text +forge-m-base/src/forge/toolbox/FFileChooser.java -text forge-m-base/src/forge/toolbox/FGestureAdapter.java -text forge-m-base/src/forge/toolbox/FLabel.java -text forge-m-base/src/forge/toolbox/FList.java -text @@ -16123,8 +16124,6 @@ forge-m-base/src/forge/utils/Constants.java -text forge-m-base/src/forge/utils/Evaluator.java -text forge-m-base/src/forge/utils/ForgePreferences.java -text forge-m-base/src/forge/utils/ForgeProfileProperties.java -text -forge-m-base/src/forge/utils/GuiDisplayUtil.java -text -forge-m-base/src/forge/utils/GuiUtils.java -text forge-m-base/src/forge/utils/Preferences.java -text forge-m-base/src/forge/utils/PreferencesStore.java -text forge-m-base/src/forge/utils/Utils.java -text diff --git a/forge-m-base/src/forge/toolbox/FFileChooser.java b/forge-m-base/src/forge/toolbox/FFileChooser.java new file mode 100644 index 00000000000..5ac4e864c4a --- /dev/null +++ b/forge-m-base/src/forge/toolbox/FFileChooser.java @@ -0,0 +1,17 @@ +package forge.toolbox; + +import java.io.File; + +public class FFileChooser { + + public boolean show(String title) { + // TODO Auto-generated method stub + return false; + } + + public File getSelectedFile() { + // TODO Auto-generated method stub + return null; + } + +} diff --git a/forge-m-base/src/forge/utils/GuiDisplayUtil.java b/forge-m-base/src/forge/utils/GuiDisplayUtil.java deleted file mode 100644 index 12546c87829..00000000000 --- a/forge-m-base/src/forge/utils/GuiDisplayUtil.java +++ /dev/null @@ -1,485 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.utils; - -import com.google.common.base.Predicates; -import com.google.common.collect.Lists; - -import forge.card.CardCharacteristicName; -import forge.game.Game; -import forge.game.GameType; -import forge.game.PlanarDice; -import forge.game.card.Card; -import forge.game.card.CardLists; -import forge.game.card.CardPredicates; -import forge.game.card.CounterType; -import forge.game.phase.PhaseType; -import forge.game.player.Player; -import forge.game.spellability.AbilityManaPart; -import forge.game.spellability.SpellAbility; -import forge.game.trigger.TriggerType; -import forge.game.zone.ZoneType; -import forge.item.IPaperCard; -import forge.item.PaperCard; -import forge.model.FModel; -import forge.player.HumanPlay; -import forge.screens.match.FControl; -import forge.screens.match.input.InputSelectCardsFromList; -import forge.toolbox.FOptionPane; -import forge.toolbox.GuiChoose; -import forge.toolbox.GuiDialog; -import forge.utils.ForgePreferences.FPref; - -import javax.swing.*; - -import java.io.*; -import java.util.*; -import java.util.Map.Entry; - -public final class GuiDisplayUtil { - private GuiDisplayUtil() { - throw new AssertionError(); - } - - public static void devModeGenerateMana() { - final Card dummy = new Card(-777777); - dummy.setOwner(getGame().getPhaseHandler().getPriorityPlayer()); - Map produced = new HashMap(); - produced.put("Produced", "W W W W W W W U U U U U U U B B B B B B B G G G G G G G R R R R R R R 7"); - final AbilityManaPart abMana = new AbilityManaPart(dummy, produced); - getGame().getAction().invoke(new Runnable() { - @Override public void run() { abMana.produceMana(null); } - }); - } - - public static void devSetupGameState() { - int humanLife = -1; - int computerLife = -1; - - final Map humanCardTexts = new EnumMap(ZoneType.class); - final Map aiCardTexts = new EnumMap(ZoneType.class); - - String tChangePlayer = "NONE"; - String tChangePhase = "NONE"; - - final String wd = "."; - final JFileChooser fc = new JFileChooser(wd); - final int rc = fc.showDialog(null, "Select Game State File"); - if (rc != JFileChooser.APPROVE_OPTION) { - return; - } - - try { - final FileInputStream fstream = new FileInputStream(fc.getSelectedFile().getAbsolutePath()); - final DataInputStream in = new DataInputStream(fstream); - final BufferedReader br = new BufferedReader(new InputStreamReader(in)); - - String temp = ""; - - while ((temp = br.readLine()) != null) { - - final String[] tempData = temp.split("="); - if (tempData.length < 2 || temp.charAt(0) == '#') { - continue; - } - - final String categoryName = tempData[0].toLowerCase(); - final String categoryValue = tempData[1]; - - if (categoryName.equals("humanlife")) humanLife = Integer.parseInt(categoryValue); - else if (categoryName.equals("ailife")) computerLife = Integer.parseInt(categoryValue); - - else if (categoryName.equals("activeplayer")) tChangePlayer = categoryValue.trim().toLowerCase(); - else if (categoryName.equals("activephase")) tChangePhase = categoryValue; - - else if (categoryName.equals("humancardsinplay")) humanCardTexts.put(ZoneType.Battlefield, categoryValue); - else if (categoryName.equals("aicardsinplay")) aiCardTexts.put(ZoneType.Battlefield, categoryValue); - else if (categoryName.equals("humancardsinhand")) humanCardTexts.put(ZoneType.Hand, categoryValue); - else if (categoryName.equals("aicardsinhand")) aiCardTexts.put(ZoneType.Hand, categoryValue); - else if (categoryName.equals("humancardsingraveyard")) humanCardTexts.put(ZoneType.Graveyard, categoryValue); - else if (categoryName.equals("aicardsingraveyard")) aiCardTexts.put(ZoneType.Graveyard, categoryValue); - else if (categoryName.equals("humancardsinlibrary")) humanCardTexts.put(ZoneType.Library, categoryValue); - else if (categoryName.equals("aicardsinlibrary")) aiCardTexts.put(ZoneType.Library, categoryValue); - else if (categoryName.equals("humancardsinexile")) humanCardTexts.put(ZoneType.Exile, categoryValue); - else if (categoryName.equals("aicardsinexile")) aiCardTexts.put(ZoneType.Exile, categoryValue); - - } - - in.close(); - } - catch (final FileNotFoundException fnfe) { - FOptionPane.showErrorDialog("File not found: " + fc.getSelectedFile().getAbsolutePath()); - } - catch (final Exception e) { - FOptionPane.showErrorDialog("Error loading battle setup file!"); - return; - } - - setupGameState(humanLife, computerLife, humanCardTexts, aiCardTexts, tChangePlayer, tChangePhase); - } - - private static void setupGameState(final int humanLife, final int computerLife, final Map humanCardTexts, - final Map aiCardTexts, final String tChangePlayer, final String tChangePhase) { - - final Game game = getGame(); - game.getAction().invoke(new Runnable() { - @Override - public void run() { - final Player human = game.getPlayers().get(0); - final Player ai = game.getPlayers().get(1); - - Player newPlayerTurn = tChangePlayer.equals("human") ? newPlayerTurn = human : tChangePlayer.equals("ai") ? newPlayerTurn = ai : null; - PhaseType newPhase = tChangePhase.trim().equalsIgnoreCase("none") ? null : PhaseType.smartValueOf(tChangePhase); - - game.getPhaseHandler().devModeSet(newPhase, newPlayerTurn); - - - game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); - - devSetupPlayerState(humanLife, humanCardTexts, human); - devSetupPlayerState(computerLife, aiCardTexts, ai); - - game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); - - game.getAction().checkStaticAbilities(); - } - }); - } - - private static void devSetupPlayerState(int life, Map cardTexts, final Player p) { - Map> humanCards = new EnumMap>(ZoneType.class); - for(Entry kv : cardTexts.entrySet()) { - humanCards.put(kv.getKey(), GuiDisplayUtil.devProcessCardsForZone(kv.getValue().split(";"), p)); - } - - if (life > 0) p.setLife(life, null); - for (Entry> kv : humanCards.entrySet()) { - if (kv.getKey() == ZoneType.Battlefield) { - for (final Card c : kv.getValue()) { - p.getZone(ZoneType.Hand).add(c); - p.getGame().getAction().moveToPlay(c); - c.setSickness(false); - } - } else { - p.getZone(kv.getKey()).setCards(kv.getValue()); - } - } - } - - /** - *

- * devProcessCardsForZone. - *

- * - * @param data - * an array of {@link java.lang.String} objects. - * @param player - * a {@link forge.game.player.Player} object. - * @return a {@link forge.CardList} object. - */ - private static List devProcessCardsForZone(final String[] data, final Player player) { - final List cl = new ArrayList(); - for (final String element : data) { - final String[] cardinfo = element.trim().split("\\|"); - - final Card c = Card.fromPaperCard(FModel.getMagicDb().getCommonCards().getCard(cardinfo[0]), player); - - boolean hasSetCurSet = false; - for (final String info : cardinfo) { - if (info.startsWith("Set:")) { - c.setCurSetCode(info.substring(info.indexOf(':') + 1)); - hasSetCurSet = true; - } else if (info.equalsIgnoreCase("Tapped:True")) { - c.tap(); - } else if (info.startsWith("Counters:")) { - final String[] counterStrings = info.substring(info.indexOf(':') + 1).split(","); - for (final String counter : counterStrings) { - c.addCounter(CounterType.valueOf(counter), 1, true); - } - } else if (info.equalsIgnoreCase("SummonSick:True")) { - c.setSickness(true); - } else if (info.equalsIgnoreCase("FaceDown:True")) { - c.setState(CardCharacteristicName.FaceDown); - } - } - - if (!hasSetCurSet) { - c.setCurSetCode(c.getMostRecentSet()); - } - - cl.add(c); - } - return cl; - } - - /** - *

- * devModeTutor. - *

- * - * @since 1.0.15 - */ - public static void devModeTutor() { - Player pPriority = getGame().getPhaseHandler().getPriorityPlayer(); - if (pPriority == null) { - GuiDialog.message("No player has priority now, can't tutor from their deck at the moment"); - return; - } - final List lib = pPriority.getCardsIn(ZoneType.Library); - final Card card = GuiChoose.oneOrNone("Choose a card", lib); - if (card == null) { return; } - - getGame().getAction().invoke(new Runnable() { - @Override - public void run() { - getGame().getAction().moveToHand(card); - } - }); - } - - /** - *

- * devModeAddCounter. - *

- * - * @since 1.0.15 - */ - public static void devModeAddCounter() { - final Card card = GuiChoose.oneOrNone("Add counters to which card?", getGame().getCardsIn(ZoneType.Battlefield)); - if (card == null) { return; } - - final CounterType counter = GuiChoose.oneOrNone("Which type of counter?", CounterType.values()); - if (counter == null) { return; } - - final Integer count = GuiChoose.getInteger("How many counters?", 1, Integer.MAX_VALUE, 10); - if (count == null) { return; } - - card.addCounter(counter, count, false); - } - - /** - *

- * devModeTapPerm. - *

- * - * @since 1.0.15 - */ - public static void devModeTapPerm() { - final Game game = getGame(); - game.getAction().invoke(new Runnable() { - @Override - public void run() { - final List untapped = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Predicates.not(CardPredicates.Presets.TAPPED)); - InputSelectCardsFromList inp = new InputSelectCardsFromList(0, Integer.MAX_VALUE, untapped); - inp.setCancelAllowed(true); - inp.setMessage("Choose permanents to tap"); - inp.showAndWait(); - if (!inp.hasCancelled()) { - for (Card c : inp.getSelected()) { - c.tap(); - } - } - } - }); - } - - /** - *

- * devModeUntapPerm. - *

- * - * @since 1.0.15 - */ - public static void devModeUntapPerm() { - final Game game = getGame(); - - - - game.getAction().invoke(new Runnable() { - @Override - public void run() { - final List tapped = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.TAPPED); - InputSelectCardsFromList inp = new InputSelectCardsFromList(0, Integer.MAX_VALUE, tapped); - inp.setCancelAllowed(true); - inp.setMessage("Choose permanents to untap"); - inp.showAndWait(); - if( !inp.hasCancelled() ) - for(Card c : inp.getSelected()) - c.untap(); - } - }); - } - - - /** - *

- * devModeSetLife. - *

- * - * @since 1.1.3 - */ - public static void devModeSetLife() { - final List players = getGame().getPlayers(); - final Player player = GuiChoose.oneOrNone("Set life for which player?", players); - if (player == null) { return; } - - final Integer life = GuiChoose.getInteger("Set life to what?", 0); - if (life == null) { return; } - - player.setLife(life, null); - } - - /** - *

- * devModeTutorAnyCard. - *

- * - * @since 1.2.7 - */ - public static void devModeCardToHand() { - final List players = getGame().getPlayers(); - final Player p = GuiChoose.oneOrNone("Put card in hand for which player?", players); - if (null == p) { - return; - } - - final List cards = Lists.newArrayList(FModel.getMagicDb().getCommonCards().getUniqueCards()); - Collections.sort(cards); - - // use standard forge's list selection dialog - final IPaperCard c = GuiChoose.oneOrNone("Name the card", cards); - if (c == null) { - return; - } - - getGame().getAction().invoke(new Runnable() { @Override public void run() { - getGame().getAction().moveToHand(Card.fromPaperCard(c, p)); - }}); - } - - public static void devModeCardToBattlefield() { - final List players = getGame().getPlayers(); - final Player p = GuiChoose.oneOrNone("Put card in play for which player?", players); - if (null == p) { - return; - } - - final List cards = Lists.newArrayList(FModel.getMagicDb().getCommonCards().getUniqueCards()); - Collections.sort(cards); - - // use standard forge's list selection dialog - final IPaperCard c = GuiChoose.oneOrNone("Name the card", cards); - if (c == null) { - return; - } - - final Game game = getGame(); - game.getAction().invoke(new Runnable() { - @Override public void run() { - final Card forgeCard = Card.fromPaperCard(c, p); - - if (c.getRules().getType().isLand()) { - game.getAction().moveToPlay(forgeCard); - } else { - final List choices = forgeCard.getBasicSpells(); - if (choices.isEmpty()) { - return; // when would it happen? - } - - final SpellAbility sa = choices.size() == 1 ? choices.get(0) : GuiChoose.oneOrNone("Choose", choices); - if (sa == null) { - return; // happens if cancelled - } - - game.getAction().moveToHand(forgeCard); // this is really needed (for rollbacks at least) - // Human player is choosing targets for an ability controlled by chosen player. - sa.setActivatingPlayer(p); - HumanPlay.playSaWithoutPayingManaCost(game, sa, true); - } - game.getStack().addAllTirggeredAbilitiesToStack(); // playSa could fire some triggers - } - }); - } - - public static void devModeRiggedPlanarRoll() { - final List players = getGame().getPlayers(); - final Player player = GuiChoose.oneOrNone("Which player should roll?", players); - if (player == null) { return; } - - final PlanarDice res = GuiChoose.oneOrNone("Choose result", PlanarDice.values()); - if (res == null) { return; } - - System.out.println("Rigging planar dice roll: " + res.toString()); - - //DBG - //System.out.println("ActivePlanes: " + getGame().getActivePlanes()); - //System.out.println("CommandPlanes: " + getGame().getCardsIn(ZoneType.Command)); - - - - getGame().getAction().invoke(new Runnable() { - @Override - public void run() { - PlanarDice.roll(player, res); - } - }); - } - - public static void devModePlaneswalkTo() { - final Game game = getGame(); - if (!game.getRules().hasAppliedVariant(GameType.Planechase)) { return; } - final Player p = game.getPhaseHandler().getPlayerTurn(); - - final List allPlanars = new ArrayList(); - for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { - if (c.getRules().getType().isPlane() || c.getRules().getType().isPhenomenon()) { - allPlanars.add(c); - } - } - Collections.sort(allPlanars); - - // use standard forge's list selection dialog - final IPaperCard c = GuiChoose.oneOrNone("Name the card", allPlanars); - if (c == null) { return; } - final Card forgeCard = Card.fromPaperCard(c, p); - - forgeCard.setOwner(p); - getGame().getAction().invoke(new Runnable() { - @Override - public void run() { - getGame().getAction().changeZone(null, p.getZone(ZoneType.PlanarDeck), forgeCard, 0); - PlanarDice.roll(p, PlanarDice.Planeswalk); - } - }); - } - - private static Game getGame() { - return FControl.getGame(); - } - - public static String getPlayerName() { - return FModel.getPreferences().getPref(FPref.PLAYER_NAME); - } - - public static String personalizeHuman(String text) { - String playerName = FModel.getPreferences().getPref(FPref.PLAYER_NAME); - return text.replaceAll("(?i)human", playerName); - } - - -} // end class GuiDisplayUtil diff --git a/forge-m-base/src/forge/utils/GuiUtils.java b/forge-m-base/src/forge/utils/GuiUtils.java deleted file mode 100644 index e2f3ada3ad3..00000000000 --- a/forge-m-base/src/forge/utils/GuiUtils.java +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.utils; - -import forge.game.card.Card; -import forge.screens.match.FControl; -import forge.screens.match.views.VPlayerPanel; -import forge.toolbox.FCardPanel; - -import javax.swing.*; - -import java.awt.*; -import java.awt.event.ActionEvent; -import java.awt.event.ActionListener; -import java.io.File; -import java.io.IOException; - -/** - *

- * GuiUtils class. - *

- * - * @author Forge - * @version $Id: GuiUtils.java 24769 2014-02-09 13:56:04Z Hellfish $ - */ -public final class GuiUtils { - private GuiUtils() { - throw new AssertionError(); - } - - /** - * Attempts to create a font from a filename. Concise error reported if - * exceptions found. - * - * @param filename - * String - * @return Font - */ - public static Font newFont(final String filename) { - final File file = new File(filename); - Font ttf = null; - - try { - ttf = Font.createFont(Font.TRUETYPE_FONT, file); - } catch (final FontFormatException e) { - System.err.println("GuiUtils > newFont: bad font format \"" + filename + "\""); - } catch (final IOException e) { - System.err.println("GuiUtils > newFont: can't find \"" + filename + "\""); - } - return ttf; - } - - - - private static final int minItemWidth = 100; - private static final int itemHeight = 25; - - public static void setMenuItemSize(JMenuItem item) { - item.setPreferredSize(new Dimension(Math.max(item.getPreferredSize().width, minItemWidth), itemHeight)); - } - - public static JMenu createMenu(String label) { - if (label.startsWith("")) { //adjust label if HTML - label = "" + "
" + label.substring(6, label.length() - 7) + "
"; - } - JMenu menu = new JMenu(label); - setMenuItemSize(menu); - return menu; - } - - public static JMenuItem createMenuItem(String label, KeyStroke accelerator, final Runnable onClick, boolean enabled, boolean bold) { - if (label.startsWith("")) { //adjust label if HTML - label = "" + "
" + label.substring(6, label.length() - 7) + "
"; - } - JMenuItem item = new JMenuItem(label); - item.addActionListener(new ActionListener() { - @Override - public void actionPerformed(ActionEvent arg0) { - if (null != onClick) { - onClick.run(); - } - } - }); - item.setEnabled(enabled); - item.setAccelerator(accelerator); - if (bold) { - item.setFont(item.getFont().deriveFont(Font.BOLD)); - } - setMenuItemSize(item); - return item; - } - - public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick) { - parent.add(createMenuItem(label, accelerator, onClick, true, false)); - } - - public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick) { - parent.add(createMenuItem(label, accelerator, onClick, true, false)); - } - - public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) { - parent.add(createMenuItem(label, accelerator, onClick, enabled, false)); - } - - public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled) { - parent.add(createMenuItem(label, accelerator, onClick, enabled, false)); - } - - public static void addMenuItem(JPopupMenu parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) { - parent.add(createMenuItem(label, accelerator, onClick, enabled, bold)); - } - - public static void addMenuItem(JMenuItem parent, String label, KeyStroke accelerator, Runnable onClick, boolean enabled, boolean bold) { - parent.add(createMenuItem(label, accelerator, onClick, enabled, bold)); - } - - public static void addSeparator(JPopupMenu parent) { - parent.add(new JSeparator()); - } - - public static void addSeparator(JMenuItem parent) { - parent.add(new JSeparator()); - } -} diff --git a/forge-m-base/src/forge/utils/Utils.java b/forge-m-base/src/forge/utils/Utils.java index 40732719f19..f21383f49cb 100644 --- a/forge-m-base/src/forge/utils/Utils.java +++ b/forge-m-base/src/forge/utils/Utils.java @@ -1,7 +1,23 @@ package forge.utils; -import com.badlogic.gdx.Gdx; +import java.io.BufferedReader; +import java.io.DataInputStream; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStreamReader; +import java.util.ArrayList; +import java.util.Collections; +import java.util.EnumMap; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Map.Entry; +import com.badlogic.gdx.Gdx; +import com.google.common.base.Predicates; +import com.google.common.collect.Lists; + +import forge.card.CardCharacteristicName; import forge.card.CardDb; import forge.deck.Deck; import forge.deck.generation.DeckGenerator2Color; @@ -9,7 +25,30 @@ import forge.deck.generation.DeckGenerator3Color; import forge.deck.generation.DeckGenerator5Color; import forge.deck.generation.DeckGeneratorBase; import forge.deck.generation.DeckGeneratorMonoColor; +import forge.game.Game; +import forge.game.GameType; +import forge.game.PlanarDice; +import forge.game.card.Card; +import forge.game.card.CardLists; +import forge.game.card.CardPredicates; +import forge.game.card.CounterType; +import forge.game.phase.PhaseType; +import forge.game.player.Player; +import forge.game.spellability.AbilityManaPart; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; +import forge.item.IPaperCard; +import forge.item.PaperCard; import forge.model.FModel; +import forge.player.HumanPlay; +import forge.screens.match.FControl; +import forge.screens.match.input.InputSelectCardsFromList; +import forge.toolbox.FFileChooser; +import forge.toolbox.FOptionPane; +import forge.toolbox.GuiChoose; +import forge.toolbox.GuiDialog; +import forge.utils.ForgePreferences.FPref; public class Utils { private final static float ppcX = Gdx.graphics.getPpcX(); @@ -44,5 +83,426 @@ public class Utils { return deck; } return null; + }public static void devModeGenerateMana() { + final Card dummy = new Card(-777777); + dummy.setOwner(getGame().getPhaseHandler().getPriorityPlayer()); + Map produced = new HashMap(); + produced.put("Produced", "W W W W W W W U U U U U U U B B B B B B B G G G G G G G R R R R R R R 7"); + final AbilityManaPart abMana = new AbilityManaPart(dummy, produced); + getGame().getAction().invoke(new Runnable() { + @Override public void run() { abMana.produceMana(null); } + }); + } + + public static void devSetupGameState() { + int humanLife = -1; + int computerLife = -1; + + final Map humanCardTexts = new EnumMap(ZoneType.class); + final Map aiCardTexts = new EnumMap(ZoneType.class); + + String tChangePlayer = "NONE"; + String tChangePhase = "NONE"; + + final FFileChooser fc = new FFileChooser(); + if (!fc.show("Select Game State File")) { + return; + } + + try { + final FileInputStream fstream = new FileInputStream(fc.getSelectedFile().getAbsolutePath()); + final DataInputStream in = new DataInputStream(fstream); + final BufferedReader br = new BufferedReader(new InputStreamReader(in)); + + String temp = ""; + + while ((temp = br.readLine()) != null) { + + final String[] tempData = temp.split("="); + if (tempData.length < 2 || temp.charAt(0) == '#') { + continue; + } + + final String categoryName = tempData[0].toLowerCase(); + final String categoryValue = tempData[1]; + + if (categoryName.equals("humanlife")) humanLife = Integer.parseInt(categoryValue); + else if (categoryName.equals("ailife")) computerLife = Integer.parseInt(categoryValue); + + else if (categoryName.equals("activeplayer")) tChangePlayer = categoryValue.trim().toLowerCase(); + else if (categoryName.equals("activephase")) tChangePhase = categoryValue; + + else if (categoryName.equals("humancardsinplay")) humanCardTexts.put(ZoneType.Battlefield, categoryValue); + else if (categoryName.equals("aicardsinplay")) aiCardTexts.put(ZoneType.Battlefield, categoryValue); + else if (categoryName.equals("humancardsinhand")) humanCardTexts.put(ZoneType.Hand, categoryValue); + else if (categoryName.equals("aicardsinhand")) aiCardTexts.put(ZoneType.Hand, categoryValue); + else if (categoryName.equals("humancardsingraveyard")) humanCardTexts.put(ZoneType.Graveyard, categoryValue); + else if (categoryName.equals("aicardsingraveyard")) aiCardTexts.put(ZoneType.Graveyard, categoryValue); + else if (categoryName.equals("humancardsinlibrary")) humanCardTexts.put(ZoneType.Library, categoryValue); + else if (categoryName.equals("aicardsinlibrary")) aiCardTexts.put(ZoneType.Library, categoryValue); + else if (categoryName.equals("humancardsinexile")) humanCardTexts.put(ZoneType.Exile, categoryValue); + else if (categoryName.equals("aicardsinexile")) aiCardTexts.put(ZoneType.Exile, categoryValue); + + } + + in.close(); + } + catch (final FileNotFoundException fnfe) { + FOptionPane.showErrorDialog("File not found: " + fc.getSelectedFile().getAbsolutePath()); + } + catch (final Exception e) { + FOptionPane.showErrorDialog("Error loading battle setup file!"); + return; + } + + setupGameState(humanLife, computerLife, humanCardTexts, aiCardTexts, tChangePlayer, tChangePhase); + } + + private static void setupGameState(final int humanLife, final int computerLife, final Map humanCardTexts, + final Map aiCardTexts, final String tChangePlayer, final String tChangePhase) { + + final Game game = getGame(); + game.getAction().invoke(new Runnable() { + @Override + public void run() { + final Player human = game.getPlayers().get(0); + final Player ai = game.getPlayers().get(1); + + Player newPlayerTurn = tChangePlayer.equals("human") ? newPlayerTurn = human : tChangePlayer.equals("ai") ? newPlayerTurn = ai : null; + PhaseType newPhase = tChangePhase.trim().equalsIgnoreCase("none") ? null : PhaseType.smartValueOf(tChangePhase); + + game.getPhaseHandler().devModeSet(newPhase, newPlayerTurn); + + + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + + devSetupPlayerState(humanLife, humanCardTexts, human); + devSetupPlayerState(computerLife, aiCardTexts, ai); + + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + + game.getAction().checkStaticAbilities(); + } + }); + } + + private static void devSetupPlayerState(int life, Map cardTexts, final Player p) { + Map> humanCards = new EnumMap>(ZoneType.class); + for(Entry kv : cardTexts.entrySet()) { + humanCards.put(kv.getKey(), devProcessCardsForZone(kv.getValue().split(";"), p)); + } + + if (life > 0) p.setLife(life, null); + for (Entry> kv : humanCards.entrySet()) { + if (kv.getKey() == ZoneType.Battlefield) { + for (final Card c : kv.getValue()) { + p.getZone(ZoneType.Hand).add(c); + p.getGame().getAction().moveToPlay(c); + c.setSickness(false); + } + } else { + p.getZone(kv.getKey()).setCards(kv.getValue()); + } + } + } + + /** + *

+ * devProcessCardsForZone. + *

+ * + * @param data + * an array of {@link java.lang.String} objects. + * @param player + * a {@link forge.game.player.Player} object. + * @return a {@link forge.CardList} object. + */ + private static List devProcessCardsForZone(final String[] data, final Player player) { + final List cl = new ArrayList(); + for (final String element : data) { + final String[] cardinfo = element.trim().split("\\|"); + + final Card c = Card.fromPaperCard(FModel.getMagicDb().getCommonCards().getCard(cardinfo[0]), player); + + boolean hasSetCurSet = false; + for (final String info : cardinfo) { + if (info.startsWith("Set:")) { + c.setCurSetCode(info.substring(info.indexOf(':') + 1)); + hasSetCurSet = true; + } else if (info.equalsIgnoreCase("Tapped:True")) { + c.tap(); + } else if (info.startsWith("Counters:")) { + final String[] counterStrings = info.substring(info.indexOf(':') + 1).split(","); + for (final String counter : counterStrings) { + c.addCounter(CounterType.valueOf(counter), 1, true); + } + } else if (info.equalsIgnoreCase("SummonSick:True")) { + c.setSickness(true); + } else if (info.equalsIgnoreCase("FaceDown:True")) { + c.setState(CardCharacteristicName.FaceDown); + } + } + + if (!hasSetCurSet) { + c.setCurSetCode(c.getMostRecentSet()); + } + + cl.add(c); + } + return cl; + } + + /** + *

+ * devModeTutor. + *

+ * + * @since 1.0.15 + */ + public static void devModeTutor() { + Player pPriority = getGame().getPhaseHandler().getPriorityPlayer(); + if (pPriority == null) { + GuiDialog.message("No player has priority now, can't tutor from their deck at the moment"); + return; + } + final List lib = pPriority.getCardsIn(ZoneType.Library); + final Card card = GuiChoose.oneOrNone("Choose a card", lib); + if (card == null) { return; } + + getGame().getAction().invoke(new Runnable() { + @Override + public void run() { + getGame().getAction().moveToHand(card); + } + }); + } + + /** + *

+ * devModeAddCounter. + *

+ * + * @since 1.0.15 + */ + public static void devModeAddCounter() { + final Card card = GuiChoose.oneOrNone("Add counters to which card?", getGame().getCardsIn(ZoneType.Battlefield)); + if (card == null) { return; } + + final CounterType counter = GuiChoose.oneOrNone("Which type of counter?", CounterType.values()); + if (counter == null) { return; } + + final Integer count = GuiChoose.getInteger("How many counters?", 1, Integer.MAX_VALUE, 10); + if (count == null) { return; } + + card.addCounter(counter, count, false); + } + + /** + *

+ * devModeTapPerm. + *

+ * + * @since 1.0.15 + */ + public static void devModeTapPerm() { + final Game game = getGame(); + game.getAction().invoke(new Runnable() { + @Override + public void run() { + final List untapped = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Predicates.not(CardPredicates.Presets.TAPPED)); + InputSelectCardsFromList inp = new InputSelectCardsFromList(0, Integer.MAX_VALUE, untapped); + inp.setCancelAllowed(true); + inp.setMessage("Choose permanents to tap"); + inp.showAndWait(); + if (!inp.hasCancelled()) { + for (Card c : inp.getSelected()) { + c.tap(); + } + } + } + }); + } + + /** + *

+ * devModeUntapPerm. + *

+ * + * @since 1.0.15 + */ + public static void devModeUntapPerm() { + final Game game = getGame(); + + + + game.getAction().invoke(new Runnable() { + @Override + public void run() { + final List tapped = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.TAPPED); + InputSelectCardsFromList inp = new InputSelectCardsFromList(0, Integer.MAX_VALUE, tapped); + inp.setCancelAllowed(true); + inp.setMessage("Choose permanents to untap"); + inp.showAndWait(); + if( !inp.hasCancelled() ) + for(Card c : inp.getSelected()) + c.untap(); + } + }); + } + + + /** + *

+ * devModeSetLife. + *

+ * + * @since 1.1.3 + */ + public static void devModeSetLife() { + final List players = getGame().getPlayers(); + final Player player = GuiChoose.oneOrNone("Set life for which player?", players); + if (player == null) { return; } + + final Integer life = GuiChoose.getInteger("Set life to what?", 0); + if (life == null) { return; } + + player.setLife(life, null); + } + + /** + *

+ * devModeTutorAnyCard. + *

+ * + * @since 1.2.7 + */ + public static void devModeCardToHand() { + final List players = getGame().getPlayers(); + final Player p = GuiChoose.oneOrNone("Put card in hand for which player?", players); + if (null == p) { + return; + } + + final List cards = Lists.newArrayList(FModel.getMagicDb().getCommonCards().getUniqueCards()); + Collections.sort(cards); + + // use standard forge's list selection dialog + final IPaperCard c = GuiChoose.oneOrNone("Name the card", cards); + if (c == null) { + return; + } + + getGame().getAction().invoke(new Runnable() { @Override public void run() { + getGame().getAction().moveToHand(Card.fromPaperCard(c, p)); + }}); + } + + public static void devModeCardToBattlefield() { + final List players = getGame().getPlayers(); + final Player p = GuiChoose.oneOrNone("Put card in play for which player?", players); + if (null == p) { + return; + } + + final List cards = Lists.newArrayList(FModel.getMagicDb().getCommonCards().getUniqueCards()); + Collections.sort(cards); + + // use standard forge's list selection dialog + final IPaperCard c = GuiChoose.oneOrNone("Name the card", cards); + if (c == null) { + return; + } + + final Game game = getGame(); + game.getAction().invoke(new Runnable() { + @Override public void run() { + final Card forgeCard = Card.fromPaperCard(c, p); + + if (c.getRules().getType().isLand()) { + game.getAction().moveToPlay(forgeCard); + } else { + final List choices = forgeCard.getBasicSpells(); + if (choices.isEmpty()) { + return; // when would it happen? + } + + final SpellAbility sa = choices.size() == 1 ? choices.get(0) : GuiChoose.oneOrNone("Choose", choices); + if (sa == null) { + return; // happens if cancelled + } + + game.getAction().moveToHand(forgeCard); // this is really needed (for rollbacks at least) + // Human player is choosing targets for an ability controlled by chosen player. + sa.setActivatingPlayer(p); + HumanPlay.playSaWithoutPayingManaCost(game, sa, true); + } + game.getStack().addAllTirggeredAbilitiesToStack(); // playSa could fire some triggers + } + }); + } + + public static void devModeRiggedPlanarRoll() { + final List players = getGame().getPlayers(); + final Player player = GuiChoose.oneOrNone("Which player should roll?", players); + if (player == null) { return; } + + final PlanarDice res = GuiChoose.oneOrNone("Choose result", PlanarDice.values()); + if (res == null) { return; } + + System.out.println("Rigging planar dice roll: " + res.toString()); + + //DBG + //System.out.println("ActivePlanes: " + getGame().getActivePlanes()); + //System.out.println("CommandPlanes: " + getGame().getCardsIn(ZoneType.Command)); + + + + getGame().getAction().invoke(new Runnable() { + @Override + public void run() { + PlanarDice.roll(player, res); + } + }); + } + + public static void devModePlaneswalkTo() { + final Game game = getGame(); + if (!game.getRules().hasAppliedVariant(GameType.Planechase)) { return; } + final Player p = game.getPhaseHandler().getPlayerTurn(); + + final List allPlanars = new ArrayList(); + for (PaperCard c : FModel.getMagicDb().getVariantCards().getAllCards()) { + if (c.getRules().getType().isPlane() || c.getRules().getType().isPhenomenon()) { + allPlanars.add(c); + } + } + Collections.sort(allPlanars); + + // use standard forge's list selection dialog + final IPaperCard c = GuiChoose.oneOrNone("Name the card", allPlanars); + if (c == null) { return; } + final Card forgeCard = Card.fromPaperCard(c, p); + + forgeCard.setOwner(p); + getGame().getAction().invoke(new Runnable() { + @Override + public void run() { + getGame().getAction().changeZone(null, p.getZone(ZoneType.PlanarDeck), forgeCard, 0); + PlanarDice.roll(p, PlanarDice.Planeswalk); + } + }); + } + + private static Game getGame() { + return FControl.getGame(); + } + + public static String getPlayerName() { + return FModel.getPreferences().getPref(FPref.PLAYER_NAME); + } + + public static String personalizeHuman(String text) { + String playerName = FModel.getPreferences().getPref(FPref.PLAYER_NAME); + return text.replaceAll("(?i)human", playerName); } }