From caf1a98759fa49c3469723ccfc32221436e4f0d3 Mon Sep 17 00:00:00 2001 From: Oleg Agafonov Date: Fri, 22 Mar 2019 20:33:36 +0400 Subject: [PATCH] * UI: added deck export to MTG Arena format (#4243); --- .../java/mage/cards/decks/DeckFormats.java | 6 +- .../mage/cards/decks/DeckFormatsTest.java | 6 +- .../decks/exporter/MtgArenaDeckExporter.java | 75 +++++++++++++++++++ .../exporter/MtgArenaDeckExporterTest.java | 38 ++++++++++ ...porter.java => MtgOnlineDeckExporter.java} | 4 +- ...st.java => MtgOnlineDeckExporterTest.java} | 4 +- .../decks/exporter/XmageDeckExporterTest.java | 2 +- 7 files changed, 125 insertions(+), 10 deletions(-) create mode 100644 Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporter.java create mode 100644 Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporterTest.java rename Mage/src/main/java/mage/cards/decks/exporter/{MtgoDeckExporter.java => MtgOnlineDeckExporter.java} (94%) rename Mage/src/test/java/mage/cards/decks/exporter/{MtgoDeckExporterTest.java => MtgOnlineDeckExporterTest.java} (93%) diff --git a/Mage/src/main/java/mage/cards/decks/DeckFormats.java b/Mage/src/main/java/mage/cards/decks/DeckFormats.java index 5d815f62c46..8100bb909bc 100644 --- a/Mage/src/main/java/mage/cards/decks/DeckFormats.java +++ b/Mage/src/main/java/mage/cards/decks/DeckFormats.java @@ -1,7 +1,8 @@ package mage.cards.decks; import mage.cards.decks.exporter.DeckExporter; -import mage.cards.decks.exporter.MtgoDeckExporter; +import mage.cards.decks.exporter.MtgArenaDeckExporter; +import mage.cards.decks.exporter.MtgOnlineDeckExporter; import mage.cards.decks.exporter.XmageDeckExporter; import javax.swing.filechooser.FileFilter; @@ -14,7 +15,8 @@ import java.util.Optional; public enum DeckFormats { XMAGE(new XmageDeckExporter()), - MTGO(new MtgoDeckExporter()); + MTG_ONLINE(new MtgOnlineDeckExporter()), + MTG_ARENA(new MtgArenaDeckExporter()); private final DeckExporter exporter; diff --git a/Mage/src/main/java/mage/cards/decks/DeckFormatsTest.java b/Mage/src/main/java/mage/cards/decks/DeckFormatsTest.java index 79adf56e0aa..2b0e71e5027 100644 --- a/Mage/src/main/java/mage/cards/decks/DeckFormatsTest.java +++ b/Mage/src/main/java/mage/cards/decks/DeckFormatsTest.java @@ -35,10 +35,10 @@ public class DeckFormatsTest { // 3. double ext String fileName = "C:\\xmage\\deck" + "." + DeckFormats.XMAGE.getExporter().getDefaultFileExt() - + "." + DeckFormats.MTGO.getExporter().getDefaultFileExt(); - Assert.assertEquals("Must find mtgo", DeckFormats.getFormatForExtension(fileName).get(), DeckFormats.MTGO); + + "." + DeckFormats.MTG_ONLINE.getExporter().getDefaultFileExt(); + Assert.assertEquals("Must find mtgo", DeckFormats.getFormatForExtension(fileName).get(), DeckFormats.MTG_ONLINE); fileName = "C:\\xmage\\deck" - + "." + DeckFormats.MTGO.getExporter().getDefaultFileExt() + + "." + DeckFormats.MTG_ONLINE.getExporter().getDefaultFileExt() + "." + DeckFormats.XMAGE.getExporter().getDefaultFileExt(); Assert.assertEquals("Must find xmage", DeckFormats.getFormatForExtension(fileName).get(), DeckFormats.XMAGE); } diff --git a/Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporter.java b/Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporter.java new file mode 100644 index 00000000000..220637ecff6 --- /dev/null +++ b/Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporter.java @@ -0,0 +1,75 @@ +package mage.cards.decks.exporter; + +import mage.cards.decks.DeckCardInfo; +import mage.cards.decks.DeckCardLists; +import mage.cards.decks.DeckFileFilter; + +import javax.swing.filechooser.FileFilter; +import java.io.PrintWriter; +import java.util.*; + +/** + * @author JayDi85 + */ +public class MtgArenaDeckExporter extends DeckExporter { + + private final String ext = "mtga"; + private final String description = "MTG Arena's deck format (*.mtga)"; + private final FileFilter fileFilter = new DeckFileFilter(ext, description); + + @Override + public void writeDeck(PrintWriter out, DeckCardLists deck) { + Map amount = new HashMap<>(); + List deckMain = prepareCardsList(deck.getCards(), amount, "M@"); + List deckSideboard = prepareCardsList(deck.getSideboard(), amount, "S@"); + + printCards(out, deckMain, amount, "M@"); + if (deckSideboard.size() > 0) { + out.println(); + printCards(out, deckSideboard, amount, "S@"); + } + } + + private List prepareCardsList(List sourceCards, Map amount, String prefix) { + List res = new ArrayList<>(); + for (DeckCardInfo card : sourceCards) { + String name = card.getCardName() + " (" + card.getSetCode().toUpperCase(Locale.ENGLISH) + ") " + card.getCardNum(); + String code = prefix + name; + int curAmount = amount.getOrDefault(code, 0); + if (curAmount == 0) { + res.add(name); + } + amount.put(code, curAmount + card.getQuantity()); + } + return res; + } + + private void printCards(PrintWriter out, List deck, Map amount, String prefix) { + if (deck.size() == 0) return; + + boolean firstCard = true; + for (String name : deck) { + if (!firstCard) out.println(); + out.print(amount.get(prefix + name)); + out.print(' '); + out.print(name); + firstCard = false; + } + out.println(); + } + + @Override + public FileFilter getFileFilter() { + return fileFilter; + } + + @Override + public String getDescription() { + return description; + } + + @Override + public String getDefaultFileExt() { + return ext; + } +} diff --git a/Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporterTest.java b/Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporterTest.java new file mode 100644 index 00000000000..773a0d19a38 --- /dev/null +++ b/Mage/src/main/java/mage/cards/decks/exporter/MtgArenaDeckExporterTest.java @@ -0,0 +1,38 @@ +package mage.cards.decks.exporter; + +import mage.cards.decks.DeckCardInfo; +import mage.cards.decks.DeckCardLists; +import org.junit.Test; + +import java.io.ByteArrayOutputStream; +import java.io.IOException; + +import static org.junit.Assert.assertEquals; + +/** + * @author JayDi85 + */ +public class MtgArenaDeckExporterTest { + + @Test + public void writeDeck() throws IOException { + ByteArrayOutputStream baos = new ByteArrayOutputStream(); + DeckCardLists deck = new DeckCardLists(); + deck.getCards().add(new DeckCardInfo("Forest", "1", "RNA", 2)); + deck.getCards().add(new DeckCardInfo("Plains", "2", "RNA", 3)); + deck.getCards().add(new DeckCardInfo("Plains", "2", "RNA", 5)); // must combine + deck.getCards().add(new DeckCardInfo("Mountain", "3", "RNA", 1)); + deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 2)); + deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 5)); // must combine + deck.getSideboard().add(new DeckCardInfo("Mountain", "2", "RNA", 3)); + DeckExporter exporter = new MtgArenaDeckExporter(); + exporter.writeDeck(baos, deck); + assertEquals("2 Forest (RNA) 1" + System.lineSeparator() + + "8 Plains (RNA) 2" + System.lineSeparator() + + "1 Mountain (RNA) 3" + System.lineSeparator() + + System.lineSeparator() + + "7 Island (RNA) 1" + System.lineSeparator() + + "3 Mountain (RNA) 2" + System.lineSeparator(), + baos.toString()); + } +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/cards/decks/exporter/MtgoDeckExporter.java b/Mage/src/main/java/mage/cards/decks/exporter/MtgOnlineDeckExporter.java similarity index 94% rename from Mage/src/main/java/mage/cards/decks/exporter/MtgoDeckExporter.java rename to Mage/src/main/java/mage/cards/decks/exporter/MtgOnlineDeckExporter.java index 3ff2af5c67c..5cf545b9116 100644 --- a/Mage/src/main/java/mage/cards/decks/exporter/MtgoDeckExporter.java +++ b/Mage/src/main/java/mage/cards/decks/exporter/MtgOnlineDeckExporter.java @@ -11,10 +11,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; -public class MtgoDeckExporter extends DeckExporter { +public class MtgOnlineDeckExporter extends DeckExporter { private final String ext = "dek"; - private final String description = "MTGO's deck format (*.dek)"; + private final String description = "MTG Online's deck format (*.dek)"; private final FileFilter fileFilter = new DeckFileFilter(ext, description); @Override diff --git a/Mage/src/test/java/mage/cards/decks/exporter/MtgoDeckExporterTest.java b/Mage/src/test/java/mage/cards/decks/exporter/MtgOnlineDeckExporterTest.java similarity index 93% rename from Mage/src/test/java/mage/cards/decks/exporter/MtgoDeckExporterTest.java rename to Mage/src/test/java/mage/cards/decks/exporter/MtgOnlineDeckExporterTest.java index 3a6df51748c..7deb0cb70e6 100644 --- a/Mage/src/test/java/mage/cards/decks/exporter/MtgoDeckExporterTest.java +++ b/Mage/src/test/java/mage/cards/decks/exporter/MtgOnlineDeckExporterTest.java @@ -9,7 +9,7 @@ import java.io.IOException; import static org.junit.Assert.assertEquals; -public class MtgoDeckExporterTest { +public class MtgOnlineDeckExporterTest { @Test public void writeDeck() throws IOException { @@ -22,7 +22,7 @@ public class MtgoDeckExporterTest { deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 2)); deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 5)); // must combine deck.getSideboard().add(new DeckCardInfo("Mountain", "2", "RNA", 3)); - MtgoDeckExporter exporter = new MtgoDeckExporter(); + DeckExporter exporter = new MtgOnlineDeckExporter(); exporter.writeDeck(baos, deck); assertEquals("2 Forest" + System.lineSeparator() + "8 Plains" + System.lineSeparator() + diff --git a/Mage/src/test/java/mage/cards/decks/exporter/XmageDeckExporterTest.java b/Mage/src/test/java/mage/cards/decks/exporter/XmageDeckExporterTest.java index e54a2644b70..f905f63a0e4 100644 --- a/Mage/src/test/java/mage/cards/decks/exporter/XmageDeckExporterTest.java +++ b/Mage/src/test/java/mage/cards/decks/exporter/XmageDeckExporterTest.java @@ -22,7 +22,7 @@ public class XmageDeckExporterTest { deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 2)); deck.getSideboard().add(new DeckCardInfo("Island", "1", "RNA", 5)); // must combine deck.getSideboard().add(new DeckCardInfo("Mountain", "2", "RNA", 3)); - XmageDeckExporter exporter = new XmageDeckExporter(); + DeckExporter exporter = new XmageDeckExporter(); exporter.writeDeck(baos, deck); assertEquals("2 [RNA:1] Forest" + System.lineSeparator() + "8 [RNA:2] Plains" + System.lineSeparator() +