moved deckmanager from AllZone to FModel, had to set lazy initialization due to CardDb late initialization.

set even better filter on draft and sealed folders
This commit is contained in:
Maxmtg
2012-02-22 04:58:15 +00:00
parent e905c8abbf
commit 1c44a2c204
16 changed files with 67 additions and 83 deletions

View File

@@ -29,7 +29,6 @@ import forge.card.cardfactory.PreloadingCardFactory;
import forge.card.replacement.ReplacementHandler; import forge.card.replacement.ReplacementHandler;
import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerHandler;
import forge.control.input.InputControl; import forge.control.input.InputControl;
import forge.deck.CardCollections;
import forge.game.GameState; import forge.game.GameState;
import forge.game.limited.CardRatings; import forge.game.limited.CardRatings;
import forge.properties.ForgeProps; import forge.properties.ForgeProps;
@@ -87,16 +86,6 @@ public final class AllZone {
/** Constant <code>CARD_RATINGS</code>. */ /** Constant <code>CARD_RATINGS</code>. */
private static CardRatings cardRatings = new CardRatings(); private static CardRatings cardRatings = new CardRatings();
private static CardCollections collections;
public static final CardCollections getDecks() {
if (null == collections) {
collections = new CardCollections(ForgeProps.getFile(NewConstants.NEW_DECKS));
}
return collections;
}
/** /**
* <p> * <p>
* getHumanPlayer. * getHumanPlayer.

View File

@@ -13,7 +13,6 @@ import javax.swing.JOptionPane;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import forge.AllZone;
import forge.CardList; import forge.CardList;
import forge.Constant; import forge.Constant;
import forge.PlayerType; import forge.PlayerType;
@@ -230,7 +229,7 @@ public class ControlConstructed {
} }
// Custom deck // Custom deck
else { else {
deck = AllZone.getDecks().getConstructed().get(selection[0]); deck = Singletons.getModel().getDecks().getConstructed().get(selection[0]);
} }
return deck; return deck;
@@ -323,7 +322,7 @@ public class ControlConstructed {
final List<String> customNames = new ArrayList<String>(); final List<String> customNames = new ArrayList<String>();
customNames.clear(); customNames.clear();
final IFolderMap<Deck> allDecks = AllZone.getDecks().getConstructed(); final IFolderMap<Deck> allDecks = Singletons.getModel().getDecks().getConstructed();
for (final Deck d : allDecks) { customNames.add(d.getName()); } for (final Deck d : allDecks) { customNames.add(d.getName()); }
return oa2sa(customNames.toArray()); return oa2sa(customNames.toArray());

View File

@@ -9,8 +9,8 @@ import java.util.List;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import forge.AllZone;
import forge.Constant; import forge.Constant;
import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.deck.DeckGroup; import forge.deck.DeckGroup;
import forge.game.GameNew; import forge.game.GameNew;
@@ -122,7 +122,7 @@ public class ControlDraft {
} }
}); });
DeckGroup opponentDecks = AllZone.getDecks().getDraft().get(human.getName()); DeckGroup opponentDecks = Singletons.getModel().getDecks().getDraft().get(human.getName());
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
@@ -181,7 +181,7 @@ public class ControlDraft {
public void updateHumanDecks() { public void updateHumanDecks() {
List<Deck> human = new ArrayList<Deck>(); List<Deck> human = new ArrayList<Deck>();
for (DeckGroup d : AllZone.getDecks().getDraft()) { for (DeckGroup d : Singletons.getModel().getDecks().getDraft()) {
human.add(d.getHumanDeck()); human.add(d.getHumanDeck());
} }
view.getLstHumanDecks().setDecks(human); view.getLstHumanDecks().setDecks(human);

View File

@@ -15,7 +15,6 @@ import net.slightlymagic.braids.util.UtilFunctions;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Constant; import forge.Constant;
import forge.Singletons; import forge.Singletons;
@@ -116,7 +115,7 @@ public class ControlSealed {
}); });
Constant.Runtime.HUMAN_DECK[0] = human; Constant.Runtime.HUMAN_DECK[0] = human;
Constant.Runtime.COMPUTER_DECK[0] = AllZone.getDecks().getSealed().get(human.getName()).getAiDecks().get(0); Constant.Runtime.COMPUTER_DECK[0] = Singletons.getModel().getDecks().getSealed().get(human.getName()).getAiDecks().get(0);
SwingUtilities.invokeLater(new Runnable() { SwingUtilities.invokeLater(new Runnable() {
@Override @Override
@@ -136,7 +135,7 @@ public class ControlSealed {
// Since AI decks are tied directly to the human choice, // Since AI decks are tied directly to the human choice,
// they're just mapped in a parallel map and grabbed when the game starts. // they're just mapped in a parallel map and grabbed when the game starts.
for (DeckGroup d : AllZone.getDecks().getSealed()) { for (DeckGroup d : Singletons.getModel().getDecks().getSealed()) {
aiDecks.put(d.getName(), d.getAiDecks().get(0)); aiDecks.put(d.getName(), d.getAiDecks().get(0));
humanDecks.add(d.getHumanDeck()); humanDecks.add(d.getHumanDeck());
} }
@@ -199,7 +198,7 @@ public class ControlSealed {
DeckGroup sealed = new DeckGroup(sDeckName); DeckGroup sealed = new DeckGroup(sDeckName);
sealed.setHumanDeck(deck); sealed.setHumanDeck(deck);
sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList())); sealed.addAiDeck(sd.buildAIDeck(sDeck.toForgeCardList()));
AllZone.getDecks().getSealed().add(sealed); Singletons.getModel().getDecks().getSealed().add(sealed);
Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed); Singletons.getControl().getControlHome().getControlUtilities().showDeckEditor(GameType.Sealed, sealed);

View File

@@ -8,7 +8,6 @@ import javax.swing.JOptionPane;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.JTextArea; import javax.swing.JTextArea;
import forge.AllZone;
import forge.Command; import forge.Command;
import forge.GuiDownloadPicturesLQ; import forge.GuiDownloadPicturesLQ;
import forge.GuiDownloadPrices; import forge.GuiDownloadPrices;
@@ -158,12 +157,10 @@ public class ControlUtilities {
DeckEditorBase<?, T> editor = null; DeckEditorBase<?, T> editor = null;
if (gt0 == GameType.Constructed) { if (gt0 == GameType.Constructed) {
editor = (DeckEditorBase<?, T>) new DeckEditorConstructed(); editor = (DeckEditorBase<?, T>) new DeckEditorConstructed();
} } else if (gt0 == GameType.Draft) {
if (gt0 == GameType.Draft) { editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(AllZone.getDecks().getDraft()); } else if (gt0 == GameType.Sealed) {
} editor = (DeckEditorBase<?, T>) new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
if (gt0 == GameType.Sealed) {
editor = (DeckEditorBase<?, T>) new DeckEditorLimited(AllZone.getDecks().getSealed());
} }

View File

@@ -10,8 +10,8 @@ import forge.util.IFolderMap;
/** /**
* TODO: Write javadoc for this type. * Holds editable maps of decks saved to disk.
* * Adding or removing items to(from) such map turns into immediate file update
*/ */
public class CardCollections { public class CardCollections {
private final IFolderMap<Deck> constructed; private final IFolderMap<Deck> constructed;

View File

@@ -34,10 +34,9 @@ import forge.util.IItemSerializer;
* *
*/ */
public class DeckGroupSerializer extends StorageReaderFolder<DeckGroup> implements IItemSerializer<DeckGroup> { public class DeckGroupSerializer extends StorageReaderFolder<DeckGroup> implements IItemSerializer<DeckGroup> {
/** private final String HUMAN_DECK_FILE = "human.dck";
* TODO: Write javadoc for Constructor.
* @param deckDir0
*/
public DeckGroupSerializer(File deckDir0) { public DeckGroupSerializer(File deckDir0) {
super(deckDir0); super(deckDir0);
} }
@@ -55,7 +54,7 @@ public class DeckGroupSerializer extends StorageReaderFolder<DeckGroup> implemen
public void save(DeckGroup unit) { public void save(DeckGroup unit) {
final File f = makeFileFor(unit); final File f = makeFileFor(unit);
f.mkdir(); f.mkdir();
FileUtil.writeFile(new File(f, "human.dck"), unit.getHumanDeck().save()); FileUtil.writeFile(new File(f, HUMAN_DECK_FILE), unit.getHumanDeck().save());
List<Deck> aiDecks = unit.getAiDecks(); List<Deck> aiDecks = unit.getAiDecks();
for (int i = 1; i <= aiDecks.size(); i++) { for (int i = 1; i <= aiDecks.size(); i++) {
FileUtil.writeFile(new File(f, "ai-" + i + ".dck"), aiDecks.get(i - 1).save()); FileUtil.writeFile(new File(f, "ai-" + i + ".dck"), aiDecks.get(i - 1).save());
@@ -64,7 +63,7 @@ public class DeckGroupSerializer extends StorageReaderFolder<DeckGroup> implemen
protected final DeckGroup read(File file) { protected final DeckGroup read(File file) {
Deck human = Deck.fromFile(new File(file, "human.dck")); Deck human = Deck.fromFile(new File(file, HUMAN_DECK_FILE));
if (null == human) { if (null == human) {
return null; return null;
} }
@@ -109,7 +108,9 @@ public class DeckGroupSerializer extends StorageReaderFolder<DeckGroup> implemen
@Override @Override
public boolean accept(File dir, String name) { public boolean accept(File dir, String name) {
return dir.isDirectory() && !dir.isHidden() && StringUtils.isNotEmpty(name) && !name.startsWith("."); boolean isVisibleFolder = dir.isDirectory() && !dir.isHidden();
boolean hasGoodName = StringUtils.isNotEmpty(name) && !name.startsWith(".");
return isVisibleFolder && hasGoodName && new File(dir, HUMAN_DECK_FILE).exists();
} }
}; };
} }

View File

@@ -35,6 +35,7 @@ import forge.AllZone;
import forge.Card; import forge.Card;
import forge.CardList; import forge.CardList;
import forge.Constant; import forge.Constant;
import forge.Singletons;
import forge.card.BoosterGenerator; import forge.card.BoosterGenerator;
import forge.card.CardBlock; import forge.card.CardBlock;
import forge.card.CardEdition; import forge.card.CardEdition;
@@ -208,7 +209,7 @@ public final class BoosterDraft implements IBoosterDraft {
for (final String element : dList) { for (final String element : dList) {
if (element.endsWith(fileExtension)) { if (element.endsWith(fileExtension)) {
final List<String> dfData = FileUtil.readFile(lookupFolder + element); final List<String> dfData = FileUtil.readFile(lookupFolder + element);
customs.add(CustomLimited.parse(dfData, AllZone.getDecks().getCubes())); customs.add(CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes()));
} }
} }
return customs; return customs;

View File

@@ -31,6 +31,7 @@ import forge.CardList;
import forge.CardListFilter; import forge.CardListFilter;
import forge.CardListUtil; import forge.CardListUtil;
import forge.Constant; import forge.Constant;
import forge.Singletons;
import forge.card.BoosterGenerator; import forge.card.BoosterGenerator;
import forge.card.CardBlock; import forge.card.CardBlock;
import forge.card.CardEdition; import forge.card.CardEdition;
@@ -138,7 +139,7 @@ public class SealedDeck {
for (final String element : dList) { for (final String element : dList) {
if (element.endsWith(".sealed")) { if (element.endsWith(".sealed")) {
final ArrayList<String> dfData = FileUtil.readFile("res/sealed/" + element); final ArrayList<String> dfData = FileUtil.readFile("res/sealed/" + element);
final CustomLimited cs = CustomLimited.parse(dfData, AllZone.getDecks().getCubes()); final CustomLimited cs = CustomLimited.parse(dfData, Singletons.getModel().getDecks().getCubes());
customs.add(cs); customs.add(cs);
} }
} }

View File

@@ -38,8 +38,8 @@ import javax.swing.JLabel;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import net.slightlymagic.braids.util.lambda.Lambda0; import net.slightlymagic.braids.util.lambda.Lambda0;
import net.slightlymagic.maxmtg.Predicate; import net.slightlymagic.maxmtg.Predicate;
import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
import forge.gui.deckeditor.elements.CardPanelHeavy; import forge.gui.deckeditor.elements.CardPanelHeavy;
@@ -154,7 +154,7 @@ public final class DeckEditorConstructed extends DeckEditorBase<CardPrinted, Dec
} }
Lambda0<Deck> newCreator = new Lambda0<Deck>() { @Override public Deck apply() { return new Deck(); } }; Lambda0<Deck> newCreator = new Lambda0<Deck>() { @Override public Deck apply() { return new Deck(); } };
controller = new DeckController<Deck>(AllZone.getDecks().getConstructed(), this, newCreator); controller = new DeckController<Deck>(Singletons.getModel().getDecks().getConstructed(), this, newCreator);
} }
private void jbInit() { private void jbInit() {

View File

@@ -37,7 +37,6 @@ import javax.swing.JTable;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
import net.slightlymagic.maxmtg.Predicate; import net.slightlymagic.maxmtg.Predicate;
import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Constant; import forge.Constant;
import forge.Singletons; import forge.Singletons;
@@ -326,13 +325,13 @@ public class DraftingProcess extends DeckEditorBase<CardPrinted, DeckGroup> {
final Deck human = this.getPlayersDeck(); final Deck human = this.getPlayersDeck();
final DeckGroup all = new DeckGroup("Draft " + s); final DeckGroup finishedDraft = new DeckGroup("Draft " + s);
all.setHumanDeck(human); finishedDraft.setHumanDeck(human);
all.addAiDecks(computer); finishedDraft.addAiDecks(computer);
// DeckManager deckManager = new // DeckManager deckManager = new
// DeckManager(ForgeProps.getFile(NEW_DECKS)); // DeckManager(ForgeProps.getFile(NEW_DECKS));
AllZone.getDecks().getDraft().add(all); // write file right here Singletons.getModel().getDecks().getDraft().add(finishedDraft); // write file right here
// close and open next screen // close and open next screen
this.dispose(); this.dispose();

View File

@@ -35,6 +35,7 @@ import forge.ConstantStringArrayList;
import forge.GameAction; import forge.GameAction;
import forge.Singletons; import forge.Singletons;
import forge.control.input.InputControl; import forge.control.input.InputControl;
import forge.deck.CardCollections;
import forge.game.GameState; import forge.game.GameState;
import forge.game.GameSummary; import forge.game.GameSummary;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
@@ -74,6 +75,9 @@ public enum FModel {
private final QuestEventManager questEventManager; private final QuestEventManager questEventManager;
private final GameState gameState; private final GameState gameState;
private final FMatchState matchState; private final FMatchState matchState;
// have to implement lazy initialization - at the moment of FModel.ctor() CardDb is not ready yet.
private CardCollections decks;
/** /**
* Constructor. * Constructor.
@@ -305,6 +309,16 @@ public enum FModel {
return this.questEventManager; return this.questEventManager;
} }
/**
* Returns all player's decks for constructed, sealed and whatever
* @return {@link forge.decks.CardCollections}
*/
public final CardCollections getDecks() {
if (decks == null)
this.decks = new CardCollections(ForgeProps.getFile(NewConstants.NEW_DECKS));
return decks;
}
/** /**
* Gets the game action model. * Gets the game action model.
* *

View File

@@ -24,12 +24,10 @@ import java.util.TreeMap;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import net.slightlymagic.braids.util.lambda.Lambda1;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
/** /**
* TODO: Write javadoc for this type. * This class treats every line of a given file as a source for a named object.
* *
*/ */
public abstract class StorageReaderFile<T extends IHasName> implements IItemReader<T> { public abstract class StorageReaderFile<T extends IHasName> implements IItemReader<T> {
@@ -56,17 +54,17 @@ public abstract class StorageReaderFile<T extends IHasName> implements IItemRead
public Map<String, T> readAll() { public Map<String, T> readAll() {
final Map<String, T> result = new TreeMap<String, T>(); final Map<String, T> result = new TreeMap<String, T>();
final ArrayList<String> fData = FileUtil.readFile(file); final ArrayList<String> fData = FileUtil.readFile(file);
Lambda1<Boolean, String> filter = getLineFilter();
for (final String s : fData) { for (final String s : fData) {
if (!filter.apply(s)) { if (!lineContainsObject(s)) {
continue; continue;
} }
T item = read(s); T item = read(s);
if (null == item) { if (null == item) {
String msg = "An object stored in " + file.getPath() + " failed to load.\nPlease submit this as a bug with the mentioned file attached."; String msg = "An object stored in " + file.getPath() + " failed to load.\nPlease submit this as a bug with the mentioned file attached.";
JOptionPane.showMessageDialog(null, msg); // This becomes bugged if uncommented, but i need these messages to debug other peoples decks // Max Mtg JOptionPane.showMessageDialog(null, msg);
continue; continue;
} }
@@ -85,14 +83,8 @@ public abstract class StorageReaderFile<T extends IHasName> implements IItemRead
protected abstract T read(String line); protected abstract T read(String line);
protected Lambda1<Boolean, String> getLineFilter() { protected boolean lineContainsObject(String line) {
return new Lambda1<Boolean, String>() { return !StringUtils.isBlank(line) && !line.trim().startsWith("#");
@Override
public Boolean apply(String arg1) {
return !StringUtils.isBlank(arg1) && !arg1.trim().startsWith("#");
}
};
} }
} }

View File

@@ -33,7 +33,9 @@ import org.apache.commons.lang3.StringUtils;
import forge.error.ErrorViewer; import forge.error.ErrorViewer;
/** /**
* TODO: Write javadoc for this type. * This class treats every file in the given folder as a source for a named object.
* The descendant should implement read method to deserialize a single item.
* So that readAll will return a map of Name => Object as read from disk
* *
*/ */
public abstract class StorageReaderFolder<T extends IHasName> implements IItemReader<T> { public abstract class StorageReaderFolder<T extends IHasName> implements IItemReader<T> {
@@ -67,18 +69,6 @@ public abstract class StorageReaderFolder<T extends IHasName> implements IItemRe
} }
} }
// only accepts numbers, letters or dashes up to 20 characters in length
/**
*
* Clean deck name.
*
* @param in
* a String
* @return a String
*/
@Override @Override
public Map<String, T> readAll() { public Map<String, T> readAll() {
final Map<String, T> result = new TreeMap<String, T>(); final Map<String, T> result = new TreeMap<String, T>();
@@ -112,16 +102,16 @@ public abstract class StorageReaderFolder<T extends IHasName> implements IItemRe
/** /**
* TODO: Write javadoc for this method. * Read the object from file
* @param file * @param file
* @return * @return the object deserialized by inherited class
*/ */
protected abstract T read(File file); protected abstract T read(File file);
/** /**
* TODO: Write javadoc for this method. * TODO: Write javadoc for this method.
* @return * @return FilenameFilter to pick only relevant objects for deserialization
*/ */
protected abstract FilenameFilter getFileFilter(); protected abstract FilenameFilter getFileFilter();

View File

@@ -21,7 +21,6 @@ import javax.swing.ListSelectionModel;
import javax.swing.border.LineBorder; import javax.swing.border.LineBorder;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Singletons; import forge.Singletons;
import forge.deck.Deck; import forge.deck.Deck;
@@ -150,7 +149,7 @@ public class ConstructedDeckSelectPanel extends JPanel {
if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstCustom")) { if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstCustom")) {
final String deckName = ((JList) e.getSource()).getSelectedValue().toString(); final String deckName = ((JList) e.getSource()).getSelectedValue().toString();
showDecklist(AllZone.getDecks().getConstructed().get(deckName)); showDecklist(Singletons.getModel().getDecks().getConstructed().get(deckName));
} }
else if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstQuest")) { else if (e.getClickCount() == 2 && ((JList) e.getSource()).getName().equals("lstQuest")) {
final String deckName = ((JList) e.getSource()).getSelectedValue().toString(); final String deckName = ((JList) e.getSource()).getSelectedValue().toString();

View File

@@ -21,6 +21,7 @@ import forge.AllZone;
import forge.Command; import forge.Command;
import forge.Constant; import forge.Constant;
import forge.Singletons; import forge.Singletons;
import forge.deck.CardCollections;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.GameType; import forge.game.GameType;
import forge.gui.deckeditor.DeckEditorConstructed; import forge.gui.deckeditor.DeckEditorConstructed;
@@ -367,13 +368,13 @@ public class DeckLister extends JPanel {
cEditor.setVisible(true); cEditor.setVisible(true);
break; break;
case Sealed: case Sealed:
final DeckEditorLimited sEditor = new DeckEditorLimited(AllZone.getDecks().getSealed()); final DeckEditorLimited sEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getSealed());
sEditor.show(cmdEditorExit); sEditor.show(cmdEditorExit);
sEditor.getController().load(d0.getName()); sEditor.getController().load(d0.getName());
sEditor.setVisible(true); sEditor.setVisible(true);
break; break;
case Draft: case Draft:
final DeckEditorLimited dEditor = new DeckEditorLimited(AllZone.getDecks().getDraft()); final DeckEditorLimited dEditor = new DeckEditorLimited(Singletons.getModel().getDecks().getDraft());
dEditor.show(cmdEditorExit); dEditor.show(cmdEditorExit);
dEditor.getController().load(d0.getName()); dEditor.getController().load(d0.getName());
dEditor.setVisible(true); dEditor.setVisible(true);
@@ -391,12 +392,14 @@ public class DeckLister extends JPanel {
if (n == JOptionPane.NO_OPTION) { if (n == JOptionPane.NO_OPTION) {
return; return;
} }
final CardCollections deckManager = Singletons.getModel().getDecks();
if (gametype.equals(GameType.Draft)) { if (gametype.equals(GameType.Draft)) {
AllZone.getDecks().getDraft().delete(d0.getName()); deckManager.getDraft().delete(d0.getName());
} }
else if (gametype.equals(GameType.Sealed)) { else if (gametype.equals(GameType.Sealed)) {
AllZone.getDecks().getSealed().delete(d0.getName()); deckManager.getSealed().delete(d0.getName());
} }
else if (gametype.equals(GameType.Quest)) { else if (gametype.equals(GameType.Quest)) {
AllZone.getQuestData().getMyDecks().delete(d0.getName()); AllZone.getQuestData().getMyDecks().delete(d0.getName());
@@ -404,7 +407,7 @@ public class DeckLister extends JPanel {
Singletons.getView().getViewHome().getBtnQuest().grabFocus(); Singletons.getView().getViewHome().getBtnQuest().grabFocus();
} }
else { else {
AllZone.getDecks().getConstructed().delete(d0.getName()); deckManager.getConstructed().delete(d0.getName());
} }
this.remove(r0); this.remove(r0);