* UI: added deck export to MTG Arena format (#4243);

This commit is contained in:
Oleg Agafonov 2019-03-22 20:33:36 +04:00
parent dc0da80d82
commit caf1a98759
7 changed files with 125 additions and 10 deletions

View file

@ -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;

View file

@ -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);
}

View file

@ -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<String, Integer> amount = new HashMap<>();
List<String> deckMain = prepareCardsList(deck.getCards(), amount, "M@");
List<String> deckSideboard = prepareCardsList(deck.getSideboard(), amount, "S@");
printCards(out, deckMain, amount, "M@");
if (deckSideboard.size() > 0) {
out.println();
printCards(out, deckSideboard, amount, "S@");
}
}
private List<String> prepareCardsList(List<DeckCardInfo> sourceCards, Map<String, Integer> amount, String prefix) {
List<String> 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<String> deck, Map<String, Integer> 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;
}
}

View file

@ -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());
}
}

View file

@ -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