Merge commit 'b95d7ca705' into Network_Upgrade

Conflicts:
	.gitignore
	Mage.Client/src/main/java/mage/client/dialog/PreferencesDialog.java
	Mage.Server/src/main/java/mage/server/Session.java
This commit is contained in:
LevelX2 2015-09-27 15:06:14 +02:00
commit 36a48780e4
672 changed files with 29942 additions and 5627 deletions

192
.gitignore vendored
View file

@ -1,95 +1,97 @@
syntax: glob
Mage.Client/*.dck
Mage.Client/db
Mage.Client/gamelogs
Mage.Client/mageclient.log
Mage.Client/plugins/images
Mage.Client/plugins/plugin.data
Mage.Client/target
Mage.Common/target
Mage.Plugins/Mage.Card.Plugin/target
Mage.Plugins/Mage.Counter.Plugin/target
Mage.Plugins/Mage.Theme.Plugin/target
Mage.Plugins/Mage.Rating.Plugin/target
Mage.Server.Console/target/
Mage.Server.Console/mageadmin.log
Mage.Server.Plugins/Mage.Deck.Constructed/target
Mage.Server.Plugins/Mage.Deck.Limited/target
Mage.Server.Plugins/Mage.Game.CommanderDuel/target
Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/target/
Mage.Server.Plugins/Mage.Game.FreeForAll/target
Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target
Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target
Mage.Server.Plugins/Mage.Player.AI.DraftBot/target
Mage.Server.Plugins/Mage.Player.AI.MA/target
Mage.Server.Plugins/Mage.Player.AI/target
Mage.Server.Plugins/Mage.Player.AIMCTS/target
Mage.Server.Plugins/Mage.Player.AIMinimax/target
Mage.Server.Plugins/Mage.Player.Human/target
Mage.Server.Plugins/Mage.Tournament.BoosterDraft/target
Mage.Server.Plugins/Mage.Tournament.Constructed/target
Mage.Server.Plugins/Mage.Tournament.Sealed/target
Mage.Server/config/init.txt
Mage.Server/saved
Mage.Server/target
Mage.Server/db
Mage.Server/cache
Mage.Server/mageserver.log
Mage.Server/magediag.log
Mage.Sets/target
Mage.Stats/server.log
Mage.Stats/mageserver.log
Mage.Stats/magediag.log
Mage.Tests/target
Mage.Tests/cache
Mage.Tests/db
Mage.Tests/Mage.log
Mage.Tests/watchdog.log
Mage/target
Mage.Updater/target
mage.updater.client/target
releases
Utils/author.txt
.DS_Store
.metadata
.project
.settings
.idea
syntax: regexp
\.class
\.jar
\.iml
\.ipr
\.iws
\.log
nbactions.xml
nbactions-*.xml
nb-configuration.xml
glob:Mage.Client/cheat.dck
glob:Mage.Client/test.dck
mage-bundle.zip
mage-stats-ws.war
Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target
\.orig\..*$
\.orig$
\.chg\..*$
\.rej$
\.conflict\~$
/Mage.Server.Plugins/Mage.Player.AIMCTS/target/
*.classpath
*.iml
/submitted
/Mage.Server/config/ai.please.cast.this.txt
/Mage.Stats/target/
/Utils/*_unimplemented.txt
*.netbeans_automatic_build
*.txt
Mage.Client/serverlist.txt
/Mage.Network/target/
/Mage.Server.Tests/target/
/Mage.Server.Tests/db
/Mage.Server.Tests/*.log
syntax: glob
Mage.Client/*.dck
Mage.Client/db
Mage.Client/gamelogs
Mage.Client/mageclient.log
Mage.Client/plugins/images
Mage.Client/plugins/plugin.data
Mage.Client/target
Mage.Common/target
Mage.Plugins/Mage.Card.Plugin/target
Mage.Plugins/Mage.Counter.Plugin/target
Mage.Plugins/Mage.Theme.Plugin/target
Mage.Plugins/Mage.Rating.Plugin/target
Mage.Server.Console/target/
Mage.Server.Console/mageadmin.log
Mage.Server.Plugins/Mage.Deck.Constructed/target
Mage.Server.Plugins/Mage.Deck.Limited/target
Mage.Server.Plugins/Mage.Game.CommanderDuel/target
Mage.Server.Plugins/Mage.Game.CommanderFreeForAll/target/
Mage.Server.Plugins/Mage.Game.FreeForAll/target
Mage.Server.Plugins/Mage.Game.TinyLeadersDuel/target
Mage.Server.Plugins/Mage.Game.TwoPlayerDuel/target
Mage.Server.Plugins/Mage.Player.AI.DraftBot/target
Mage.Server.Plugins/Mage.Player.AI.MA/target
Mage.Server.Plugins/Mage.Player.AI/target
Mage.Server.Plugins/Mage.Player.AIMCTS/target
Mage.Server.Plugins/Mage.Player.AIMinimax/target
Mage.Server.Plugins/Mage.Player.Human/target
Mage.Server.Plugins/Mage.Tournament.BoosterDraft/target
Mage.Server.Plugins/Mage.Tournament.Constructed/target
Mage.Server.Plugins/Mage.Tournament.Sealed/target
Mage.Server/config/init.txt
Mage.Server/saved
Mage.Server/target
Mage.Server/db
Mage.Server/cache
Mage.Server/mageserver.log
Mage.Server/magediag.log
Mage.Sets/target
Mage.Stats/server.log
Mage.Stats/mageserver.log
Mage.Stats/magediag.log
Mage.Tests/target
Mage.Tests/cache
Mage.Tests/db
Mage.Tests/Mage.log
Mage.Tests/watchdog.log
Mage/target
Mage.Updater/target
mage.updater.client/target
releases
Utils/author.txt
.DS_Store
.metadata
.project
.settings
.idea
syntax: regexp
\.class
\.jar
\.iml
\.ipr
\.iws
\.log
nbactions.xml
nbactions-*.xml
nb-configuration.xml
glob:Mage.Client/cheat.dck
glob:Mage.Client/test.dck
mage-bundle.zip
mage-stats-ws.war
Mage.Server.Plugins/Mage.Draft.8PlayerBooster/target
\.orig\..*$
\.orig$
\.chg\..*$
\.rej$
\.conflict\~$
/Mage.Server.Plugins/Mage.Player.AIMCTS/target/
*.classpath
*.iml
/submitted
/Mage.Server/config/ai.please.cast.this.txt
/Mage.Stats/target/
/Utils/*_unimplemented.txt
*.netbeans_automatic_build
*.txt
Mage.Client/serverlist.txt
/Mage.Network/target/
/Mage.Server.Tests/target/
/Mage.Server.Tests/db
/Mage.Server.Tests/*.log
Mage.Client/serverlist.txt
/bin/

View file

@ -1,6 +1,6 @@
XMage.de 1 (Europe/Germany) fast :xmage.de:17171
woogerworks (North America/USA) :xmage.woogerworks.info:17171
XMage.info 1 (Europe/France) new network code -> see forum :176.31.186.181:17171
IceMage (Europe/Netherlands) :ring0.cc:17171
XMage BR (South America/Brazil) :ec2-54-233-67-0.sa-east-1.compute.amazonaws.com:17171
Seedds Server (Asia) :115.29.203.80:17171
localhost -> connect to your local server (must be started):localhost:17171

View file

@ -1,16 +1,16 @@
/*
* 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
@ -20,7 +20,7 @@
* 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.
@ -31,7 +31,6 @@
*
* Created on 30-Mar-2010, 9:25:40 PM
*/
package mage.client.cards;
import java.awt.Component;
@ -54,6 +53,7 @@ import mage.client.plugins.impl.Plugins;
import mage.client.util.Config;
import mage.client.util.Event;
import mage.client.util.Listener;
import mage.utils.CardUtil;
import mage.view.CardView;
import mage.view.CardsView;
import org.mage.card.arcane.CardPanel;
@ -82,7 +82,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
public void clear() {
for(MouseListener ml: this.getMouseListeners()) {
for (MouseListener ml : this.getMouseListeners()) {
this.removeMouseListener(ml);
}
this.clearCardEventListeners();
@ -101,7 +101,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
this.bigCard = bigCard;
this.gameId = gameId;
if (merge) {
for (CardView card: showCards.values()) {
for (CardView card : showCards.values()) {
if (!cards.containsKey(card.getId())) {
addCard(card, bigCard, gameId, drawImage);
}
@ -115,7 +115,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
} else {
this.clearCards();
for (CardView card: showCards.values()) {
for (CardView card : showCards.values()) {
addCard(card, bigCard, gameId, drawImage);
}
}
@ -144,7 +144,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
int curRow = 0;
if (cards.size() > 0) {
Rectangle rectangle = new Rectangle(Config.dimensions.frameWidth, Config.dimensions.frameHeight);
List<MageCard> sortedCards = new ArrayList<MageCard>(cards.values());
List<MageCard> sortedCards = new ArrayList<>(cards.values());
switch (sortSetting.getSortBy()) {
case NAME:
Collections.sort(sortedCards, new CardNameComparator());
@ -155,15 +155,16 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
case COLOR:
Collections.sort(sortedCards, new CardColorComparator());
break;
case COLOR_DETAILED:
Collections.sort(sortedCards, new CardColorDetailedComparator());
case COLOR_IDENTITY:
Collections.sort(sortedCards, new CardColorDetailedIdentity());
break;
case CASTING_COST:
Collections.sort(sortedCards, new CardCostComparator());
break;
}
MageCard lastCard = null;
for (MageCard cardImg: sortedCards) {
for (MageCard cardImg : sortedCards) {
if (sortSetting.isPilesToggle()) {
if (lastCard == null) {
lastCard = cardImg;
@ -187,8 +188,9 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
curRow = 0;
}
break;
case COLOR_DETAILED:
if (cardImg.getOriginal().getColor().hashCode() != lastCard.getOriginal().getColor().hashCode()) {
case COLOR_IDENTITY:
if (CardUtil.getColorIdentitySortValue(cardImg.getOriginal().getManaCost(), cardImg.getOriginal().getColor(), cardImg.getOriginal().getRules())
!= CardUtil.getColorIdentitySortValue(lastCard.getOriginal().getManaCost(), lastCard.getOriginal().getColor(), lastCard.getOriginal().getRules())) {
curColumn++;
curRow = 0;
}
@ -206,8 +208,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
moveToFront(cardImg);
curRow++;
lastCard = cardImg;
}
else {
} else {
rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20);
cardImg.setBounds(rectangle);
cardImg.setCardBounds(rectangle.x, rectangle.y, Config.dimensions.frameWidth, Config.dimensions.frameHeight);
@ -221,15 +222,15 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
}
resizeArea();
revalidate();
repaint();
revalidate();
repaint();
}
private void clearCards() {
// remove possible mouse listeners, preventing gc
for (MageCard mageCard: cards.values()) {
for (MageCard mageCard : cards.values()) {
if (mageCard instanceof CardPanel) {
((CardPanel)mageCard).cleanUp();
((CardPanel) mageCard).cleanUp();
}
}
this.cards.clear();
@ -237,7 +238,7 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
private void removeAllCardImg() {
for (Component comp: getComponents()) {
for (Component comp : getComponents()) {
if (comp instanceof Card || comp instanceof MageCard) {
remove(comp);
}
@ -245,14 +246,14 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
private void removeCardImg(UUID cardId) {
for (Component comp: getComponents()) {
for (Component comp : getComponents()) {
if (comp instanceof Card) {
if (((Card)comp).getCardId().equals(cardId)) {
if (((Card) comp).getCardId().equals(cardId)) {
remove(comp);
comp = null;
}
} else if (comp instanceof MageCard) {
if (((MageCard)comp).getOriginal().getId().equals(cardId)) {
if (((MageCard) comp).getOriginal().getId().equals(cardId)) {
remove(comp);
comp = null;
}
@ -275,10 +276,10 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
cardEventSource.clearListeners();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@ -296,10 +297,8 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
);
}// </editor-fold>//GEN-END:initComponents
// Variables declaration - do not modify//GEN-BEGIN:variables
// End of variables declaration//GEN-END:variables
@Override
public void mouseClicked(MouseEvent e) {
if (e.getClickCount() == 2 && !e.isConsumed()) {
@ -322,22 +321,26 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
@Override
public void mousePressed(MouseEvent e) {}
public void mousePressed(MouseEvent e) {
}
@Override
public void mouseReleased(MouseEvent e) {}
public void mouseReleased(MouseEvent e) {
}
@Override
public void mouseEntered(MouseEvent e) {}
public void mouseEntered(MouseEvent e) {
}
@Override
public void mouseExited(MouseEvent e) {}
public void mouseExited(MouseEvent e) {
}
private void resizeArea() {
Dimension area = new Dimension(0, 0);
Dimension size = getPreferredSize();
for (Component comp: getComponents()) {
for (Component comp : getComponents()) {
Rectangle r = comp.getBounds();
if (r.x + r.width > area.width) {
area.width = r.x + r.width;
@ -348,13 +351,13 @@ public class CardGrid extends javax.swing.JLayeredPane implements MouseListener,
}
if (size.height != area.height || size.width != area.width) {
setPreferredSize(area);
}
}
}
@Override
public void refresh() {
revalidate();
repaint();
repaint();
}
@Override
@ -379,8 +382,7 @@ class CardRarityComparator implements Comparator<MageCard> {
int val = o1.getOriginal().getRarity().compareTo(o2.getOriginal().getRarity());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
}
else {
} else {
return val;
}
}
@ -394,8 +396,7 @@ class CardCostComparator implements Comparator<MageCard> {
int val = Integer.valueOf(o1.getOriginal().getConvertedManaCost()).compareTo(Integer.valueOf(o2.getOriginal().getConvertedManaCost()));
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
}
else {
} else {
return val;
}
}
@ -409,23 +410,22 @@ class CardColorComparator implements Comparator<MageCard> {
int val = o1.getOriginal().getColor().compareTo(o2.getOriginal().getColor());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
}
else {
} else {
return val;
}
}
}
class CardColorDetailedComparator implements Comparator<MageCard> {
class CardColorDetailedIdentity implements Comparator<MageCard> {
@Override
public int compare(MageCard o1, MageCard o2) {
int val = o1.getOriginal().getColor().hashCode() - o2.getOriginal().getColor().hashCode();
int val = CardUtil.getColorIdentitySortValue(o1.getOriginal().getManaCost(), o1.getOriginal().getColor(), o1.getOriginal().getRules())
- CardUtil.getColorIdentitySortValue(o2.getOriginal().getManaCost(), o2.getOriginal().getColor(), o2.getOriginal().getRules());
if (val == 0) {
return o1.getOriginal().getName().compareTo(o2.getOriginal().getName());
}
else {
} else {
return val;
}
}

View file

@ -1,37 +1,36 @@
/*
* 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.
*/
* 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.
*/
/*
* CardsList.java
*
* Created on Dec 18, 2009, 10:40:12 AM
*/
package mage.client.cards;
import java.awt.Color;
@ -59,7 +58,7 @@ import mage.client.constants.Constants.DeckEditorMode;
import mage.client.constants.Constants.SortBy;
import static mage.client.constants.Constants.SortBy.CASTING_COST;
import static mage.client.constants.Constants.SortBy.COLOR;
import static mage.client.constants.Constants.SortBy.COLOR_DETAILED;
import static mage.client.constants.Constants.SortBy.COLOR_IDENTITY;
import static mage.client.constants.Constants.SortBy.RARITY;
import mage.client.deckeditor.SortSetting;
import mage.client.deckeditor.table.TableModel;
@ -67,7 +66,7 @@ import mage.client.deckeditor.table.UpdateCountsCallback;
import mage.client.dialog.PreferencesDialog;
import mage.client.plugins.impl.Plugins;
import mage.client.util.CardViewColorComparator;
import mage.client.util.CardViewColorDetailedComparator;
import mage.client.util.CardViewColorIdentityComparator;
import mage.client.util.CardViewCostComparator;
import mage.client.util.CardViewNameComparator;
import mage.client.util.CardViewRarityComparator;
@ -86,7 +85,7 @@ import org.mage.card.arcane.CardPanel;
* @author BetaSteward_at_googlemail.com
*/
public class CardsList extends javax.swing.JPanel implements MouseListener, ICardGrid {
protected CardEventSource cardEventSource = new CardEventSource();
private Dimension cardDimension;
private CardsView cards;
@ -98,8 +97,10 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
private TableModel mainModel;
private JTable mainTable;
private ICardGrid currentView;
/** Creates new form Cards */
/**
* Creates new form Cards
*/
public CardsList() {
initComponents();
makeTransparent();
@ -115,22 +116,22 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
mainModel.removeTableModelListener(mainTable);
mainModel.clear();
}
if(cardArea != null) {
for(MouseListener ml: cardArea.getMouseListeners()) {
if (cardArea != null) {
for (MouseListener ml : cardArea.getMouseListeners()) {
cardArea.removeMouseListener(ml);
}
}
if(mainTable != null) {
for(MouseListener ml: mainTable.getMouseListeners()) {
if (mainTable != null) {
for (MouseListener ml : mainTable.getMouseListeners()) {
mainTable.removeMouseListener(ml);
}
}
if (currentView != null) {
currentView.clearCardEventListeners();
}
for (Component comp :cardArea.getComponents()) {
if (comp instanceof CardPanel) {
((CardPanel)comp).cleanUp();
for (Component comp : cardArea.getComponents()) {
if (comp instanceof CardPanel) {
((CardPanel) comp).cleanUp();
}
}
mageCards.clear();
@ -208,20 +209,20 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
// activate spinner for card number change
mainModel.setNumberEditable(true);
TableColumnModel tcm = mainTable.getColumnModel();
TableColumn tc = tcm.getColumn(0);
TableColumn tc = tcm.getColumn(0);
tc.setMaxWidth(55);
tc.setMinWidth(55);
tc.setPreferredWidth(55);
tc.setCellEditor(new TableSpinnerEditor(this));
tc.setCellEditor(new TableSpinnerEditor(this));
}
}
public void handleSetNumber(int number) {
if (mainTable.getSelectedRowCount() == 1) {
mainModel.setNumber(mainTable.getSelectedRow(), number);
}
}
}
public void handleDoubleClick() {
if (mainTable.getSelectedRowCount() > 0) {
int[] n = mainTable.getSelectedRows();
@ -232,7 +233,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
}
}
}
public void handleAltDoubleClick() {
if (mainTable.getSelectedRowCount() > 0) {
int[] n = mainTable.getSelectedRows();
@ -243,7 +244,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
}
}
}
public ICardGrid getMainModel() {
return mainModel;
}
@ -256,7 +257,6 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
return list;
}
public void loadCards(CardsView showCards, BigCard bigCard, UUID gameId) {
int selectedRow = -1;
if (currentView.equals(mainModel)) {
@ -270,7 +270,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
chkPiles.setSelected(sortSetting.isPilesToggle());
currentView.loadCards(showCards, sortSetting, bigCard, gameId);
if (selectedRow >= 0) {
selectedRow = Math.min(selectedRow, mainTable.getRowCount()-1);
selectedRow = Math.min(selectedRow, mainTable.getRowCount() - 1);
if (selectedRow >= 0) {
mainTable.setRowSelectionInterval(selectedRow, selectedRow);
}
@ -281,7 +281,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
if (cards == null) {
cards = new CardsView();
}
currentView.loadCards(cards, sortSetting, bigCard, gameId);
currentView.loadCards(cards, sortSetting, bigCard, gameId);
}
@Override
@ -295,22 +295,21 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
Comparator<CardView> comparator = null;
Map<UUID, MageCard> oldMageCards = mageCards;
mageCards = new LinkedHashMap<>();
//Find card view
for(UUID uuid : cards.keySet()){
if(oldMageCards.containsKey(uuid)){
for (UUID uuid : cards.keySet()) {
if (oldMageCards.containsKey(uuid)) {
mageCards.put(uuid, oldMageCards.get(uuid));
oldMageCards.remove(uuid);
}
else{
} else {
mageCards.put(uuid, addCard(cards.get(uuid), bigCard, gameId));
}
}
//Remove unused cards
for(MageCard card : oldMageCards.values()){
for (MageCard card : oldMageCards.values()) {
cardArea.remove(card);
}
if (cards != null && cards.size() > 0) {
Rectangle rectangle = new Rectangle(Config.dimensions.frameWidth, Config.dimensions.frameHeight);
List<CardView> sortedCards = new ArrayList<>(cards.values());
@ -324,25 +323,25 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
case COLOR:
comparator = new CardViewColorComparator();
break;
case COLOR_DETAILED:
comparator = new CardViewColorDetailedComparator();
case COLOR_IDENTITY:
comparator = new CardViewColorIdentityComparator();
break;
case CASTING_COST:
comparator = new CardViewCostComparator();
break;
}
if(comparator != null){
if (comparator != null) {
Collections.sort(sortedCards, new CardViewNameComparator());
Collections.sort(sortedCards, comparator);
}
CardView lastCard = null;
for (CardView card: sortedCards) {
for (CardView card : sortedCards) {
if (sortSetting.isPilesToggle()) {
if (lastCard == null) {
lastCard = card;
}
if(comparator != null){
if(comparator.compare(card, lastCard) > 0){
if (comparator != null) {
if (comparator.compare(card, lastCard) > 0) {
curColumn++;
maxRow = Math.max(maxRow, curRow);
curRow = 0;
@ -350,7 +349,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
}
rectangle.setLocation(curColumn * Config.dimensions.frameWidth, curRow * 20);
setCardBounds(mageCards.get(card.getId()), rectangle);
curRow++;
lastCard = card;
} else {
@ -368,21 +367,21 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
maxRow = Math.max(maxRow, curRow);
maxColumn = Math.max(maxColumn, curColumn);
updateCounts();
cardArea.setPreferredSize(new Dimension((maxColumn+1) * Config.dimensions.frameWidth, Config.dimensions.frameHeight + maxRow*20));
cardArea.setPreferredSize(new Dimension((maxColumn + 1) * Config.dimensions.frameWidth, Config.dimensions.frameHeight + maxRow * 20));
cardArea.revalidate();
this.revalidate();
this.repaint();
this.setVisible(true);
}
private void updateCounts(){
private void updateCounts() {
int landCount = 0;
int creatureCount = 0;
int sorceryCount = 0;
int instantCount = 0;
int enchantmentCount = 0;
for (CardView card: cards.values()) {
if (card.getCardTypes().contains(CardType.LAND)) {
for (CardView card : cards.values()) {
if (card.getCardTypes().contains(CardType.LAND)) {
landCount++;
}
if (card.getCardTypes().contains(CardType.CREATURE)) {
@ -398,7 +397,7 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
enchantmentCount++;
}
}
int count = cards != null ? cards.size() : 0;
this.lblCount.setText(Integer.toString(count));
this.lblCreatureCount.setText(Integer.toString(creatureCount));
@ -418,7 +417,6 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
cardImg.addMouseListener(this);
return cardImg;
}
private void setCardBounds(MageCard card, Rectangle rectangle) {
card.setBounds(rectangle);
@ -456,10 +454,10 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
mainModel.clearCardEventListeners();
}
/** This method is called from within the constructor to
* initialize the form.
* WARNING: Do NOT modify this code. The content of this method is
* always regenerated by the Form Editor.
/**
* This method is called from within the constructor to initialize the form.
* WARNING: Do NOT modify this code. The content of this method is always
* regenerated by the Form Editor.
*/
@SuppressWarnings("unchecked")
// <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
@ -678,9 +676,9 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
currentView = mainModel;
panelCardArea.setViewportView(mainTable);
cbSortBy.setEnabled(false);
chkPiles.setEnabled(false);
chkPiles.setEnabled(false);
PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "listView");
redrawCards();
redrawCards();
}//GEN-LAST:event_jToggleListViewActionPerformed
private void cbSortByActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_cbSortByActionPerformed
@ -698,8 +696,8 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
panelCardArea.setViewportView(cardArea);
cbSortBy.setEnabled(true);
chkPiles.setEnabled(true);
PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "cardView");
redrawCards();
PreferencesDialog.saveValue(PreferencesDialog.KEY_DRAFT_VIEW, "cardView");
redrawCards();
}//GEN-LAST:event_jToggleCardViewActionPerformed
// Variables declaration - do not modify//GEN-BEGIN:variables
@ -725,28 +723,26 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
@Override
public void mousePressed(MouseEvent e) {
if (e.getClickCount() >= 1 && !e.isConsumed()) {
if (e.getClickCount() >= 1 && !e.isConsumed()) {
Object obj = e.getSource();
if (e.getClickCount() == 2) {
e.consume();
if (obj instanceof Card) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((Card)obj).getOriginal(), "alt-double-click");
}
else {
cardEventSource.doubleClick(((Card)obj).getOriginal(), "double-click");
cardEventSource.altDoubleClick(((Card) obj).getOriginal(), "alt-double-click");
} else {
cardEventSource.doubleClick(((Card) obj).getOriginal(), "double-click");
}
} else if (obj instanceof MageCard) {
if (e.isAltDown()) {
cardEventSource.altDoubleClick(((MageCard)obj).getOriginal(), "alt-double-click");
}
else {
cardEventSource.doubleClick(((MageCard)obj).getOriginal(), "double-click");
cardEventSource.altDoubleClick(((MageCard) obj).getOriginal(), "alt-double-click");
} else {
cardEventSource.doubleClick(((MageCard) obj).getOriginal(), "double-click");
}
}
}
if (obj instanceof MageCard) {
checkMenu(e, ((MageCard)obj).getOriginal());
checkMenu(e, ((MageCard) obj).getOriginal());
} else {
checkMenu(e, null);
}
@ -758,14 +754,14 @@ public class CardsList extends javax.swing.JPanel implements MouseListener, ICar
if (!e.isConsumed()) {
Object obj = e.getSource();
if (obj instanceof MageCard) {
checkMenu(e, ((MageCard)obj).getOriginal());
checkMenu(e, ((MageCard) obj).getOriginal());
} else {
checkMenu(e, null);
}
}
}
private void checkMenu(MouseEvent Me, SimpleCardView card){
private void checkMenu(MouseEvent Me, SimpleCardView card) {
if (Me.isPopupTrigger()) {
Me.consume();
cardEventSource.showPopupMenuEvent(card, Me.getComponent(), Me.getX(), Me.getY(), "show-popup-menu");

View file

@ -1,31 +1,30 @@
/*
* 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.
*/
* 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 mage.client.constants;
import java.io.File;
@ -37,6 +36,7 @@ import javax.swing.border.Border;
* @author BetaSteward_at_googlemail.com
*/
public final class Constants {
private Constants() {
throw new AssertionError();
}
@ -69,7 +69,7 @@ public final class Constants {
public static final int POWBOX_TEXT_MAX_LEFT = 212;
public static final int DAMAGE_MAX_LEFT = 180;
public static final Border EMPTY_BORDER = BorderFactory.createEmptyBorder(2,2,2,2);
public static final Border EMPTY_BORDER = BorderFactory.createEmptyBorder(2, 2, 2, 2);
public static final double SCALE_FACTOR = 0.5;
@ -80,26 +80,29 @@ public final class Constants {
public static final String RESOURCE_PATH_SET = IO.imageBaseDir + "sets" + File.separator;
public static final String RESOURCE_PATH_SET_SMALL = RESOURCE_PATH_SET + File.separator + "small" + File.separator;
public static final String BASE_SOUND_PATH = "sounds" + File.separator;
public static final String BASE_MUSICS_PATH = "music" + File.separator ;
public static final String BASE_MUSICS_PATH = "music" + File.separator;
public interface IO {
String imageBaseDir = "plugins" + File.separator + "images" + File.separator;
String IMAGE_PROPERTIES_FILE = "image.url.properties";
}
public enum DeckEditorMode {
FREE_BUILDING,
LIMITED_BUILDING,
SIDEBOARDING
}
public enum SortBy {
CASTING_COST ("Casting Cost"),
RARITY ("Rarity"),
COLOR ("Color"),
COLOR_DETAILED ("Color Detailed"),
NAME ("Name"),
UNSORTED ("Unsorted");
CASTING_COST("Casting Cost"),
RARITY("Rarity"),
COLOR("Color"),
COLOR_IDENTITY("Color Identity"),
NAME("Name"),
UNSORTED("Unsorted");
private final String text;
@ -120,8 +123,8 @@ public final class Constants {
return RARITY;
case "Color":
return COLOR;
case "Color Detailed":
return COLOR_DETAILED;
case "Color Identity":
return COLOR_IDENTITY;
case "Name":
return NAME;
default:

View file

@ -42,9 +42,7 @@ import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import java.util.prefs.BackingStoreException;
import java.util.prefs.Preferences;
import javax.swing.BorderFactory;
@ -63,6 +61,10 @@ import mage.client.MageFrame;
import mage.client.util.Config;
import mage.client.util.ImageHelper;
import mage.client.util.gui.BufferedImageBuilder;
import static mage.constants.Constants.DEFAULT_AVATAR_ID;
import static mage.constants.Constants.MAX_AVATAR_ID;
import static mage.constants.Constants.MIN_AVATAR_ID;
import mage.players.net.UserData;
import mage.players.net.UserGroup;
import mage.players.net.UserSkipPrioritySteps;
import mage.remote.Connection;
@ -264,29 +266,12 @@ public class PreferencesDialog extends javax.swing.JDialog {
public static String PHASE_ON = "on";
public static String PHASE_OFF = "off";
public static final int DEFAULT_AVATAR_ID = 51;
private static int selectedAvatarId = DEFAULT_AVATAR_ID;
private static final Set<Integer> available_avatars = new HashSet<>();
private static final Map<Integer, JPanel> panels = new HashMap<>();
private static final Border GREEN_BORDER = BorderFactory.createLineBorder(Color.GREEN, 3);
private static final Border BLACK_BORDER = BorderFactory.createLineBorder(Color.BLACK, 3);
static {
available_avatars.add(51);
available_avatars.add(13);
available_avatars.add(9);
available_avatars.add(53);
available_avatars.add(10);
available_avatars.add(39);
available_avatars.add(19);
available_avatars.add(30);
available_avatars.add(25);
available_avatars.add(22);
available_avatars.add(77);
available_avatars.add(62);
}
private static int selectedAvatarId = DEFAULT_AVATAR_ID;
private final JFileChooser fc = new JFileChooser();
@ -433,20 +418,30 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabAvatars = new javax.swing.JPanel();
avatarPane = new javax.swing.JScrollPane();
avatarPanel = new javax.swing.JPanel();
jLabel12 = new javax.swing.JLabel();
jPanel10 = new javax.swing.JPanel();
jPanel13 = new javax.swing.JPanel();
jPanel11 = new javax.swing.JPanel();
jPanel12 = new javax.swing.JPanel();
jPanel13 = new javax.swing.JPanel();
jPanel14 = new javax.swing.JPanel();
jPanel15 = new javax.swing.JPanel();
jLabel13 = new javax.swing.JLabel();
jPanel16 = new javax.swing.JPanel();
jPanel17 = new javax.swing.JPanel();
jPanel18 = new javax.swing.JPanel();
jPanel19 = new javax.swing.JPanel();
jPanel20 = new javax.swing.JPanel();
jPanel21 = new javax.swing.JPanel();
jPanel22 = new javax.swing.JPanel();
jPanel23 = new javax.swing.JPanel();
jPanel24 = new javax.swing.JPanel();
jPanel25 = new javax.swing.JPanel();
jPanel26 = new javax.swing.JPanel();
jPanel27 = new javax.swing.JPanel();
jPanel28 = new javax.swing.JPanel();
jPanel29 = new javax.swing.JPanel();
jPanel30 = new javax.swing.JPanel();
jPanel31 = new javax.swing.JPanel();
jPanel32 = new javax.swing.JPanel();
jPanel33 = new javax.swing.JPanel();
tabConnection = new javax.swing.JPanel();
lblProxyType = new javax.swing.JLabel();
cbProxyType = new javax.swing.JComboBox<ProxyType>();
@ -608,16 +603,16 @@ public class PreferencesDialog extends javax.swing.JDialog {
main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(main_gameLayout.createSequentialGroup()
.addContainerGap()
.addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbAllowRequestToShowHandCards, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addGroup(main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(showPlayerNamesPermanently, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(nonLandPermanentsInOnePile, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(showAbilityPickerForced, javax.swing.GroupLayout.Alignment.LEADING))
.addComponent(cbShowStormCounter, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(cbConfirmEmptyManaPool, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(cbAskMoveToGraveOrder, javax.swing.GroupLayout.PREFERRED_SIZE, 546, javax.swing.GroupLayout.PREFERRED_SIZE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(cbConfirmEmptyManaPool, javax.swing.GroupLayout.DEFAULT_SIZE, 485, Short.MAX_VALUE)
.addComponent(cbAllowRequestToShowHandCards, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cbShowStormCounter, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cbAskMoveToGraveOrder, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap(7, Short.MAX_VALUE))
);
main_gameLayout.setVerticalGroup(
main_gameLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -666,9 +661,9 @@ public class PreferencesDialog extends javax.swing.JDialog {
main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(main_gamelogLayout.createSequentialGroup()
.addContainerGap()
.addGroup(main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(cbDraftLogAutoSave, javax.swing.GroupLayout.PREFERRED_SIZE, 528, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(main_gamelogLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
.addComponent(cbDraftLogAutoSave, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cbGameLogAutoSave, javax.swing.GroupLayout.DEFAULT_SIZE, 473, Short.MAX_VALUE))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
);
main_gamelogLayout.setVerticalGroup(
@ -687,8 +682,10 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addGroup(tabMainLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(main_card, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(main_game, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(main_gamelog, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(tabMainLayout.createSequentialGroup()
.addComponent(main_game, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
tabMainLayout.setVerticalGroup(
@ -915,7 +912,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(jLabelEndOfTurn)
.addComponent(checkBoxEndTurnOthers))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(phases_stopSettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(phases_stopSettings, javax.swing.GroupLayout.DEFAULT_SIZE, 183, Short.MAX_VALUE)
.addContainerGap())
);
@ -962,24 +959,27 @@ public class PreferencesDialog extends javax.swing.JDialog {
panelCardImages.setLayout(panelCardImagesLayout);
panelCardImagesLayout.setHorizontalGroup(
panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelCardImagesLayout.createSequentialGroup()
.addGap(24, 24, 24)
.addComponent(txtImageFolderPath)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnBrowseImageLocation))
.addGroup(panelCardImagesLayout.createSequentialGroup()
.addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbUseDefaultImageFolder)
.addComponent(cbCheckForNewImages)
.addGroup(panelCardImagesLayout.createSequentialGroup()
.addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelCardImagesLayout.createSequentialGroup()
.addContainerGap()
.addComponent(labelPreferedImageLanguage))
.addComponent(cbSaveToZipFiles, javax.swing.GroupLayout.Alignment.LEADING))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(cbPreferedImageLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbUseDefaultImageFolder)
.addComponent(cbCheckForNewImages)
.addGroup(panelCardImagesLayout.createSequentialGroup()
.addGroup(panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, panelCardImagesLayout.createSequentialGroup()
.addContainerGap()
.addComponent(labelPreferedImageLanguage))
.addComponent(cbSaveToZipFiles, javax.swing.GroupLayout.Alignment.LEADING))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(cbPreferedImageLanguage, javax.swing.GroupLayout.PREFERRED_SIZE, 153, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGap(0, 190, Short.MAX_VALUE))
.addGroup(panelCardImagesLayout.createSequentialGroup()
.addGap(24, 24, 24)
.addComponent(txtImageFolderPath)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnBrowseImageLocation)))
.addContainerGap())
);
panelCardImagesLayout.setVerticalGroup(
panelCardImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -1061,32 +1061,29 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGap(19, 19, 19)
.addComponent(jLabel14))
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGap(25, 25, 25)
.addComponent(jLabel15)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addComponent(txtBattlefieldImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 336, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGap(19, 19, 19)
.addComponent(jLabel14))
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGap(25, 25, 25)
.addComponent(jLabel15)))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnBrowseBattlefieldImage))
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addComponent(txtBackgroundImagePath, javax.swing.GroupLayout.PREFERRED_SIZE, 332, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(txtBackgroundImagePath)
.addComponent(txtBattlefieldImagePath))
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(btnBrowseBackgroundImage)))
.addGap(0, 0, Short.MAX_VALUE))
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbUseRandomBattleImage)
.addComponent(cbUseDefaultBattleImage)
.addComponent(cbUseDefaultBackground))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(btnBrowseBackgroundImage, javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(btnBrowseBattlefieldImage, javax.swing.GroupLayout.Alignment.TRAILING)))
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
.addGroup(panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(cbUseRandomBattleImage)
.addComponent(cbUseDefaultBattleImage)
.addComponent(cbUseDefaultBackground))
.addGap(0, 0, Short.MAX_VALUE)))
.addContainerGap())
);
panelBackgroundImagesLayout.linkSize(javax.swing.SwingConstants.HORIZONTAL, new java.awt.Component[] {txtBackgroundImagePath, txtBattlefieldImagePath});
panelBackgroundImagesLayout.setVerticalGroup(
panelBackgroundImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(panelBackgroundImagesLayout.createSequentialGroup()
@ -1115,8 +1112,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addGroup(tabImagesLayout.createSequentialGroup()
.addContainerGap()
.addGroup(tabImagesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(panelCardImages, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panelBackgroundImages, javax.swing.GroupLayout.Alignment.TRAILING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addComponent(panelCardImages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(panelBackgroundImages, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
);
tabImagesLayout.setVerticalGroup(
@ -1248,249 +1245,459 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabsPanel.addTab("Sounds", tabSounds);
jLabel12.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel12.setText("Choose your avatar:");
avatarPane.setMaximumSize(new java.awt.Dimension(508, 772));
avatarPane.setMinimumSize(new java.awt.Dimension(508, 772));
avatarPane.setPreferredSize(new java.awt.Dimension(508, 772));
avatarPanel.setMaximumSize(new java.awt.Dimension(508, 772));
avatarPanel.setMinimumSize(new java.awt.Dimension(508, 772));
avatarPanel.setPreferredSize(new java.awt.Dimension(508, 772));
avatarPanel.setLayout(new java.awt.GridLayout(6, 4, 20, 20));
jPanel10.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel10.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel10.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel10.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel10Layout = new javax.swing.GroupLayout(jPanel10);
jPanel10.setLayout(jPanel10Layout);
jPanel10Layout.setHorizontalGroup(
jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel10Layout.setVerticalGroup(
jPanel10Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel13.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13);
jPanel13.setLayout(jPanel13Layout);
jPanel13Layout.setHorizontalGroup(
jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
jPanel13Layout.setVerticalGroup(
jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
);
avatarPanel.add(jPanel10);
jPanel11.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel11.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel11.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel11.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel11Layout = new javax.swing.GroupLayout(jPanel11);
jPanel11.setLayout(jPanel11Layout);
jPanel11Layout.setHorizontalGroup(
jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel11Layout.setVerticalGroup(
jPanel11Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel11);
jPanel12.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel12.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel12.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel12.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel12Layout = new javax.swing.GroupLayout(jPanel12);
jPanel12.setLayout(jPanel12Layout);
jPanel12Layout.setHorizontalGroup(
jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel12Layout.setVerticalGroup(
jPanel12Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel12);
jPanel13.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel13.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel13.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel13.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel13Layout = new javax.swing.GroupLayout(jPanel13);
jPanel13.setLayout(jPanel13Layout);
jPanel13Layout.setHorizontalGroup(
jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel13Layout.setVerticalGroup(
jPanel13Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 0, Short.MAX_VALUE)
);
avatarPanel.add(jPanel13);
jPanel14.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel14.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel14.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel14.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel14Layout = new javax.swing.GroupLayout(jPanel14);
jPanel14.setLayout(jPanel14Layout);
jPanel14Layout.setHorizontalGroup(
jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel14Layout.setVerticalGroup(
jPanel14Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel14);
jPanel15.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel15.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel15.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel15.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel15Layout = new javax.swing.GroupLayout(jPanel15);
jPanel15.setLayout(jPanel15Layout);
jPanel15Layout.setHorizontalGroup(
jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel15Layout.setVerticalGroup(
jPanel15Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jLabel13.setFont(new java.awt.Font("Tahoma", 1, 11)); // NOI18N
jLabel13.setText("New avatars:");
avatarPanel.add(jPanel15);
jPanel16.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel16.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel16.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel16.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel16Layout = new javax.swing.GroupLayout(jPanel16);
jPanel16.setLayout(jPanel16Layout);
jPanel16Layout.setHorizontalGroup(
jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel16Layout.setVerticalGroup(
jPanel16Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel16);
jPanel17.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel17.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel17.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel17.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel17Layout = new javax.swing.GroupLayout(jPanel17);
jPanel17.setLayout(jPanel17Layout);
jPanel17Layout.setHorizontalGroup(
jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel17Layout.setVerticalGroup(
jPanel17Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel17);
jPanel18.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel18.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel18.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel18.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel18Layout = new javax.swing.GroupLayout(jPanel18);
jPanel18.setLayout(jPanel18Layout);
jPanel18Layout.setHorizontalGroup(
jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel18Layout.setVerticalGroup(
jPanel18Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel18);
jPanel19.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel19.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel19.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel19.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel19Layout = new javax.swing.GroupLayout(jPanel19);
jPanel19.setLayout(jPanel19Layout);
jPanel19Layout.setHorizontalGroup(
jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel19Layout.setVerticalGroup(
jPanel19Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel19);
jPanel20.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel20.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel20.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel20.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel20Layout = new javax.swing.GroupLayout(jPanel20);
jPanel20.setLayout(jPanel20Layout);
jPanel20Layout.setHorizontalGroup(
jPanel20Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel20Layout.setVerticalGroup(
jPanel20Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel20);
jPanel21.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel21.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel21.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel21.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel21Layout = new javax.swing.GroupLayout(jPanel21);
jPanel21.setLayout(jPanel21Layout);
jPanel21Layout.setHorizontalGroup(
jPanel21Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel21Layout.setVerticalGroup(
jPanel21Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 100, Short.MAX_VALUE)
.addGap(0, 110, Short.MAX_VALUE)
);
javax.swing.GroupLayout avatarPanelLayout = new javax.swing.GroupLayout(avatarPanel);
avatarPanel.setLayout(avatarPanelLayout);
avatarPanelLayout.setHorizontalGroup(
avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(avatarPanelLayout.createSequentialGroup()
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(avatarPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel12))
.addGroup(avatarPanelLayout.createSequentialGroup()
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(avatarPanelLayout.createSequentialGroup()
.addGap(30, 30, 30)
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jPanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel19, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(33, 33, 33)
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel13, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel14, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel20, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
.addGroup(avatarPanelLayout.createSequentialGroup()
.addContainerGap()
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(avatarPanelLayout.createSequentialGroup()
.addGap(20, 20, 20)
.addComponent(jPanel16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(33, 33, 33)
.addComponent(jPanel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jLabel13))))
.addGap(32, 32, 32)
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel18, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel21, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))))
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
avatarPanel.add(jPanel21);
jPanel22.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel22.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel22.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel22.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel22Layout = new javax.swing.GroupLayout(jPanel22);
jPanel22.setLayout(jPanel22Layout);
jPanel22Layout.setHorizontalGroup(
jPanel22Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanelLayout.setVerticalGroup(
avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(avatarPanelLayout.createSequentialGroup()
.addContainerGap()
.addComponent(jLabel12)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel11, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel13, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel10, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(26, 26, 26)
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(jPanel15, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel12, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel14, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(23, 23, 23)
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addComponent(jPanel19, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel20, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel21, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addGroup(avatarPanelLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
.addGroup(avatarPanelLayout.createSequentialGroup()
.addComponent(jLabel13)
.addGap(18, 18, 18)
.addComponent(jPanel16, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(jPanel17, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addComponent(jPanel18, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(25, 25, 25))
jPanel22Layout.setVerticalGroup(
jPanel22Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel22);
jPanel23.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel23.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel23.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel23.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel23Layout = new javax.swing.GroupLayout(jPanel23);
jPanel23.setLayout(jPanel23Layout);
jPanel23Layout.setHorizontalGroup(
jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel23Layout.setVerticalGroup(
jPanel23Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel23);
jPanel24.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel24.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel24.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel24.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel24Layout = new javax.swing.GroupLayout(jPanel24);
jPanel24.setLayout(jPanel24Layout);
jPanel24Layout.setHorizontalGroup(
jPanel24Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel24Layout.setVerticalGroup(
jPanel24Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel24);
jPanel25.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel25.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel25.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel25.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel25Layout = new javax.swing.GroupLayout(jPanel25);
jPanel25.setLayout(jPanel25Layout);
jPanel25Layout.setHorizontalGroup(
jPanel25Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel25Layout.setVerticalGroup(
jPanel25Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel25);
jPanel26.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel26.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel26.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel26.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel26Layout = new javax.swing.GroupLayout(jPanel26);
jPanel26.setLayout(jPanel26Layout);
jPanel26Layout.setHorizontalGroup(
jPanel26Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel26Layout.setVerticalGroup(
jPanel26Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel26);
jPanel27.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel27.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel27.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel27.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel27Layout = new javax.swing.GroupLayout(jPanel27);
jPanel27.setLayout(jPanel27Layout);
jPanel27Layout.setHorizontalGroup(
jPanel27Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel27Layout.setVerticalGroup(
jPanel27Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel27);
jPanel28.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel28.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel28.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel28.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel28Layout = new javax.swing.GroupLayout(jPanel28);
jPanel28.setLayout(jPanel28Layout);
jPanel28Layout.setHorizontalGroup(
jPanel28Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel28Layout.setVerticalGroup(
jPanel28Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel28);
jPanel29.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel29.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel29.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel29.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel29Layout = new javax.swing.GroupLayout(jPanel29);
jPanel29.setLayout(jPanel29Layout);
jPanel29Layout.setHorizontalGroup(
jPanel29Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel29Layout.setVerticalGroup(
jPanel29Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel29);
jPanel30.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel30.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel30.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel30.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel30Layout = new javax.swing.GroupLayout(jPanel30);
jPanel30.setLayout(jPanel30Layout);
jPanel30Layout.setHorizontalGroup(
jPanel30Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel30Layout.setVerticalGroup(
jPanel30Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel30);
jPanel31.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel31.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel31.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel31.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel31Layout = new javax.swing.GroupLayout(jPanel31);
jPanel31.setLayout(jPanel31Layout);
jPanel31Layout.setHorizontalGroup(
jPanel31Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel31Layout.setVerticalGroup(
jPanel31Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel31);
jPanel32.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel32.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel32.setMinimumSize(new java.awt.Dimension(102, 102));
jPanel32.setPreferredSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel32Layout = new javax.swing.GroupLayout(jPanel32);
jPanel32.setLayout(jPanel32Layout);
jPanel32Layout.setHorizontalGroup(
jPanel32Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel32Layout.setVerticalGroup(
jPanel32Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel32);
jPanel33.setBorder(new javax.swing.border.LineBorder(new java.awt.Color(204, 204, 204), 1, true));
jPanel33.setMaximumSize(new java.awt.Dimension(102, 102));
jPanel33.setMinimumSize(new java.awt.Dimension(102, 102));
javax.swing.GroupLayout jPanel33Layout = new javax.swing.GroupLayout(jPanel33);
jPanel33.setLayout(jPanel33Layout);
jPanel33Layout.setHorizontalGroup(
jPanel33Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
jPanel33Layout.setVerticalGroup(
jPanel33Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGap(0, 110, Short.MAX_VALUE)
);
avatarPanel.add(jPanel33);
avatarPane.setViewportView(avatarPanel);
javax.swing.GroupLayout tabAvatarsLayout = new javax.swing.GroupLayout(tabAvatars);
tabAvatars.setLayout(tabAvatarsLayout);
tabAvatarsLayout.setHorizontalGroup(
tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 590, Short.MAX_VALUE)
.addGroup(tabAvatarsLayout.createSequentialGroup()
.addComponent(avatarPane, javax.swing.GroupLayout.PREFERRED_SIZE, 527, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
);
tabAvatarsLayout.setVerticalGroup(
tabAvatarsLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addComponent(avatarPane, javax.swing.GroupLayout.DEFAULT_SIZE, 432, Short.MAX_VALUE)
.addComponent(avatarPane, javax.swing.GroupLayout.PREFERRED_SIZE, 418, Short.MAX_VALUE)
);
tabsPanel.addTab("Avatars", tabAvatars);
@ -1629,7 +1836,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addContainerGap()
.addComponent(lblURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 96, javax.swing.GroupLayout.PREFERRED_SIZE)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(txtURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 421, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(txtURLServerList, javax.swing.GroupLayout.PREFERRED_SIZE, 370, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGroup(connection_serversLayout.createSequentialGroup()
.addGap(141, 141, 141)
.addComponent(jLabel17)))
@ -1651,15 +1858,14 @@ public class PreferencesDialog extends javax.swing.JDialog {
tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tabConnectionLayout.createSequentialGroup()
.addContainerGap()
.addGroup(tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(tabConnectionLayout.createSequentialGroup()
.addGroup(tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
.addComponent(pnlProxySettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addGroup(javax.swing.GroupLayout.Alignment.LEADING, tabConnectionLayout.createSequentialGroup()
.addComponent(lblProxyType)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
.addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE)
.addGap(0, 0, Short.MAX_VALUE))
.addComponent(pnlProxySettings, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, 126, javax.swing.GroupLayout.PREFERRED_SIZE))
.addComponent(connection_servers, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
.addContainerGap())
.addContainerGap(16, Short.MAX_VALUE))
);
tabConnectionLayout.setVerticalGroup(
tabConnectionLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -1672,7 +1878,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
.addComponent(cbProxyType, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
.addGap(18, 18, 18)
.addComponent(pnlProxySettings, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap(90, Short.MAX_VALUE))
.addContainerGap(107, Short.MAX_VALUE))
);
pnlProxySettings.getAccessibleContext().setAccessibleDescription("");
@ -1700,12 +1906,12 @@ public class PreferencesDialog extends javax.swing.JDialog {
layout.setHorizontalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
.addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
.addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
.addContainerGap(405, Short.MAX_VALUE)
.addComponent(saveButton)
.addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
.addComponent(exitButton, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
.addContainerGap())
.addComponent(tabsPanel)
.addComponent(tabsPanel, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
);
layout.setVerticalGroup(
layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
@ -1795,10 +2001,11 @@ public class PreferencesDialog extends javax.swing.JDialog {
save(prefs, dialog.txtURLServerList, KEY_CONNECTION_URL_SERVER_LIST);
// Avatar
if (available_avatars.contains(selectedAvatarId)) {
prefs.put(KEY_AVATAR, String.valueOf(selectedAvatarId));
updateCache(KEY_AVATAR, String.valueOf(selectedAvatarId));
if (selectedAvatarId < MIN_AVATAR_ID || selectedAvatarId > MAX_AVATAR_ID) {
selectedAvatarId = DEFAULT_AVATAR_ID;
}
prefs.put(KEY_AVATAR, String.valueOf(selectedAvatarId));
updateCache(KEY_AVATAR, String.valueOf(selectedAvatarId));
try {
MageFrame.getClient().setPreferences(getUserData());
@ -2275,7 +2482,7 @@ public class PreferencesDialog extends javax.swing.JDialog {
} catch (NumberFormatException n) {
selectedAvatarId = DEFAULT_AVATAR_ID;
} finally {
if (!available_avatars.contains(selectedAvatarId)) {
if (selectedAvatarId < MIN_AVATAR_ID || selectedAvatarId > MAX_AVATAR_ID) {
selectedAvatarId = DEFAULT_AVATAR_ID;
}
}
@ -2441,26 +2648,37 @@ public class PreferencesDialog extends javax.swing.JDialog {
private void addAvatars() {
try {
addAvatar(jPanel10, 51, true, false);
addAvatar(jPanel10, 10, true, false);
addAvatar(jPanel11, 11, false, false);
addAvatar(jPanel12, 12, false, false);
addAvatar(jPanel13, 13, false, false);
addAvatar(jPanel11, 9, false, false);
addAvatar(jPanel12, 53, false, false);
addAvatar(jPanel14, 10, false, false);
addAvatar(jPanel15, 39, false, false);
addAvatar(jPanel14, 14, false, false);
addAvatar(jPanel15, 15, false, false);
addAvatar(jPanel16, 16, false, false);
addAvatar(jPanel17, 17, false, false);
addAvatar(jPanel18, 18, false, false);
addAvatar(jPanel19, 19, false, false);
addAvatar(jPanel20, 30, false, false);
addAvatar(jPanel21, 25, false, false);
addAvatar(jPanel20, 20, false, false);
addAvatar(jPanel21, 21, false, false);
addAvatar(jPanel22, 22, false, false);
addAvatar(jPanel23, 23, false, false);
addAvatar(jPanel24, 24, false, false);
addAvatar(jPanel25, 25, false, false);
addAvatar(jPanel26, 26, false, false);
addAvatar(jPanel27, 27, false, false);
addAvatar(jPanel28, 28, false, false);
addAvatar(jPanel29, 29, false, false);
addAvatar(jPanel30, 30, false, false);
addAvatar(jPanel31, 31, false, false);
addAvatar(jPanel32, 32, false, false);
addAvatar(jPanel16, 22, false, false);
addAvatar(jPanel17, 77, false, false);
addAvatar(jPanel18, 62, false, false);
} catch (Exception e) {
log.error(e, e);
}
}
public void setSelectedId(int id) {
if (available_avatars.contains(id)) {
if (id >= MIN_AVATAR_ID && id <= MAX_AVATAR_ID) {
for (JPanel panel : panels.values()) {
panel.setBorder(BLACK_BORDER);
}
@ -2473,7 +2691,8 @@ public class PreferencesDialog extends javax.swing.JDialog {
String path = "/avatars/" + String.valueOf(id) + ".jpg";
panels.put(id, jPanel);
Image image = ImageHelper.getImageFromResources(path);
Rectangle r = new Rectangle(90, 90);
Rectangle r = new Rectangle(jPanel.getWidth() - 5, jPanel.getHeight() - 5);
BufferedImage bufferedImage;
if (!locked) {
bufferedImage = BufferedImageBuilder.bufferImage(image, BufferedImage.TYPE_INT_ARGB);
@ -2571,8 +2790,6 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JCheckBox displayBigCardsInHand;
private javax.swing.JButton exitButton;
private javax.swing.JLabel jLabel11;
private javax.swing.JLabel jLabel12;
private javax.swing.JLabel jLabel13;
private javax.swing.JLabel jLabel14;
private javax.swing.JLabel jLabel15;
private javax.swing.JLabel jLabel16;
@ -2599,6 +2816,18 @@ public class PreferencesDialog extends javax.swing.JDialog {
private javax.swing.JPanel jPanel19;
private javax.swing.JPanel jPanel20;
private javax.swing.JPanel jPanel21;
private javax.swing.JPanel jPanel22;
private javax.swing.JPanel jPanel23;
private javax.swing.JPanel jPanel24;
private javax.swing.JPanel jPanel25;
private javax.swing.JPanel jPanel26;
private javax.swing.JPanel jPanel27;
private javax.swing.JPanel jPanel28;
private javax.swing.JPanel jPanel29;
private javax.swing.JPanel jPanel30;
private javax.swing.JPanel jPanel31;
private javax.swing.JPanel jPanel32;
private javax.swing.JPanel jPanel33;
private javax.swing.JLabel labelPreferedImageLanguage;
private javax.swing.JLabel lblProxyPassword;
private javax.swing.JLabel lblProxyPort;

View file

@ -59,6 +59,9 @@ import mage.client.util.ImageHelper;
import mage.client.util.gui.BufferedImageBuilder;
import mage.client.util.gui.countryBox.CountryUtil;
import mage.components.ImagePanel;
import static mage.constants.Constants.DEFAULT_AVATAR_ID;
import static mage.constants.Constants.MAX_AVATAR_ID;
import static mage.constants.Constants.MIN_AVATAR_ID;
import mage.constants.ManaType;
import mage.utils.timer.PriorityTimer;
import mage.view.ManaPoolView;
@ -91,7 +94,7 @@ public class PlayerPanelExt extends javax.swing.JPanel {
private static final int AVATAR_COUNT = 77;
private static final String DEFAULT_AVATAR_PATH = "/avatars/51.jpg";
private static final String DEFAULT_AVATAR_PATH = "/avatars/" + DEFAULT_AVATAR_ID + ".jpg";
private static final int PANEL_WIDTH = 94;
private static final int PANEL_HEIGHT = 242;
@ -236,8 +239,8 @@ public class PlayerPanelExt extends javax.swing.JPanel {
if (!MageFrame.isLite()) {
int id = player.getUserData().getAvatarId();
if (id <= 0) {
id = PreferencesDialog.DEFAULT_AVATAR_ID;
if (!(id >= 1000) && (id <= 0 || (id <= MIN_AVATAR_ID && id > MAX_AVATAR_ID))) {
id = DEFAULT_AVATAR_ID;
}
if (id != avatarId) {
avatarId = id;

View file

@ -25,21 +25,21 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.client.util;
import java.util.Comparator;
import mage.utils.CardUtil;
import mage.view.CardView;
/**
*
* @author BetaSteward_at_googlemail.com
*/
public class CardViewColorDetailedComparator implements Comparator<CardView> {
public class CardViewColorIdentityComparator implements Comparator<CardView> {
@Override
public int compare(CardView o1, CardView o2) {
return o1.getColor().hashCode() - o2.getColor().hashCode();
return CardUtil.getColorIdentitySortValue(o1.getManaCost(), o1.getColor(), o1.getRules())
- CardUtil.getColorIdentitySortValue(o2.getManaCost(), o2.getColor(), o2.getRules());
}
}
}

View file

@ -1,16 +1,16 @@
/*
* Copyright 2011 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
@ -20,12 +20,11 @@
* 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 mage.client.util;
import java.util.Comparator;
@ -39,7 +38,7 @@ public class CardViewCostComparator implements Comparator<CardView> {
@Override
public int compare(CardView o1, CardView o2) {
return Integer.valueOf(o1.getConvertedManaCost()).compareTo(Integer.valueOf(o2.getConvertedManaCost()));
return Integer.valueOf(o1.getConvertedManaCost()).compareTo(o2.getConvertedManaCost());
}
}

View file

@ -49,7 +49,7 @@ public class GathererSets implements Iterable<DownloadJob> {
"THS", "BNG", "JOU",
"CNS", "VMA", "TPR",
"KTK", "FRF", "DTK",
"BFZ"};
"BFZ", "EXP", "OGW"};
private static final HashMap<String, String> symbolsReplacements = new HashMap<>();
static {

View file

@ -16,6 +16,8 @@ public class MagicCardsImageSource implements CardImageSource {
private static final Map<String, String> setNameTokenReplacement = new HashMap<String, String>() {
{
put("ORG", "oath-of-the-gatewatch");
put("EXP", "zendikar-expeditions");
put("BFZ", "battle-for-zendikar");
put("FVL", "from-the-vault-legends");
put("FVD", "from-the-vault-dragons");

View file

@ -36,7 +36,10 @@ import java.net.Proxy;
import java.net.URL;
import java.net.URLEncoder;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
import java.util.prefs.Preferences;
import mage.client.MageFrame;
import mage.remote.Connection;
@ -56,6 +59,7 @@ public class MythicspoilerComSource implements CardImageSource {
private static CardImageSource instance;
private static Map<String, String> setsAliases;
private static Map<String, String> cardNameAliases;
private static Map<String, Set<String>> cardNameAliasesStart;
private final Map<String, Map<String, String>> sets;
public static CardImageSource getInstance() {
@ -71,8 +75,9 @@ public class MythicspoilerComSource implements CardImageSource {
}
public MythicspoilerComSource() {
sets = new HashMap<>();
sets = new LinkedHashMap<>();
setsAliases = new HashMap<>();
setsAliases.put("exp", "bfz");
cardNameAliases = new HashMap<>();
// set+wrong name from web side => correct card name
cardNameAliases.put("MM2-otherwordlyjourney", "otherworldlyjourney");
@ -81,12 +86,21 @@ public class MythicspoilerComSource implements CardImageSource {
cardNameAliases.put("THS-soldierofpantheon", "soldierofthepantheon");
cardNameAliases.put("THS-vulpinegolaith", "vulpinegoliath");
cardNameAliases.put("ORI-kothopedhoarderofsouls", "kothophedsoulhoarder");
cardNameAliases.put("BFZ-unisonstrike", "tandemtactics");
cardNameAliases.put("BFZ-eldrazidevastator", "eldrazidevastator");
cardNameAliases.put("BFZ-kozliekschanneler", "kozilekschanneler");
cardNameAliasesStart = new HashMap<>();
HashSet<String> names = new HashSet<>();
names.add("eldrazidevastator.jpg");
cardNameAliasesStart.put("BFZ", names);
}
private Map<String, String> getSetLinks(String cardSet) {
Map<String, String> setLinks = new HashMap<>();
try {
String setNames = setsAliases.get(cardSet.toLowerCase());
Set<String> aliasesStart = cardNameAliasesStart.get(cardSet);
if (setNames == null) {
setNames = cardSet.toLowerCase();
}
@ -119,33 +133,42 @@ public class MythicspoilerComSource implements CardImageSource {
}
Elements cardsImages = doc.select("img[src^=cards/]"); // starts with cards/
if (!aliasesStart.isEmpty()) {
for (String text : aliasesStart) {
cardsImages.addAll(doc.select("img[src^=" + text + "]"));
}
}
if (cardsImages.isEmpty()) {
break;
}
for (Element cardsImage : cardsImages) {
String cardLink = cardsImage.attr("src");
String cardName = null;
if (cardLink.startsWith("cards/") && cardLink.endsWith(".jpg")) {
String cardName = cardLink.substring(6, cardLink.length() - 4);
if (cardName != null && !cardName.isEmpty()) {
if (cardNameAliases.containsKey(cardSet + "-" + cardName)) {
cardName = cardNameAliases.get(cardSet + "-" + cardName);
}
if (cardName.endsWith("1") || cardName.endsWith("2") || cardName.endsWith("3") || cardName.endsWith("4") || cardName.endsWith("5")) {
if (!cardName.startsWith("forest")
&& !cardName.startsWith("swamp")
&& !cardName.startsWith("mountain")
&& !cardName.startsWith("island")
&& !cardName.startsWith("plains")) {
cardName = cardName.substring(0, cardName.length() - 1);
}
}
setLinks.put(cardName, baseUrl + cardLink);
}
cardName = cardLink.substring(6, cardLink.length() - 4);
} else if (aliasesStart.contains(cardLink)) {
cardName = cardLink.substring(0, cardLink.length() - 4);;
}
if (cardName != null && !cardName.isEmpty()) {
if (cardNameAliases.containsKey(cardSet + "-" + cardName)) {
cardName = cardNameAliases.get(cardSet + "-" + cardName);
}
if (cardName.endsWith("1") || cardName.endsWith("2") || cardName.endsWith("3") || cardName.endsWith("4") || cardName.endsWith("5")) {
if (!cardName.startsWith("forest")
&& !cardName.startsWith("swamp")
&& !cardName.startsWith("mountain")
&& !cardName.startsWith("island")
&& !cardName.startsWith("plains")) {
cardName = cardName.substring(0, cardName.length() - 1);
}
}
setLinks.put(cardName, baseUrl + cardLink);
}
}
}
} catch (IOException ex) {
System.out.println("Exception when parsing the mythicspoiler page: " + ex.getMessage());
}

View file

@ -25,8 +25,8 @@ import org.mage.plugins.card.utils.CardImageUtils;
/**
* This class stores ALL card images in a cache with soft values. this means
* that the images may be garbage collected when they are not needed any more, but will
* be kept as long as possible.
* that the images may be garbage collected when they are not needed any more,
* but will be kept as long as possible.
*
* Key format: "<cardname>#<setname>#<type>#<collectorID>#<param>"
*
@ -46,8 +46,7 @@ public class ImageCache {
private static final Map<String, BufferedImage> imageCache;
/**
* Common pattern for keys.
* Format: "<cardname>#<setname>#<collectorID>"
* Common pattern for keys. Format: "<cardname>#<setname>#<collectorID>"
*/
private static final Pattern KEY_PATTERN = Pattern.compile("(.*)#(.*)#(.*)#(.*)#(.*)");
@ -104,16 +103,16 @@ public class ImageCache {
thumbnailFile = new TFile(thumbnailPath);
} catch (Exception ex) {
}
boolean exists =false;
boolean exists = false;
if (thumbnailFile != null) {
try {
exists = thumbnailFile.exists();
} catch(Exception ex) {
} catch (Exception ex) {
exists = false;
}
}
if (exists) {
log.debug("loading thumbnail for " + key + ", path="+thumbnailPath);
log.debug("loading thumbnail for " + key + ", path=" + thumbnailPath);
return loadImage(thumbnailFile);
} else {
BufferedImage image = loadImage(file);
@ -187,30 +186,15 @@ public class ImageCache {
}
public static BufferedImage getThumbnail(CardView card) {
String key = getKey(card) + "#thumb";
if (card.getUsesVariousArt()) {
key += "#usesVariousArt";
}
// log.debug("#key: " + key);
return getImage(key);
return getImage(getKey(card, card.getName(), "#thumb"));
}
public static BufferedImage getImageOriginal(CardView card) {
String key = getKey(card);
if (card.getUsesVariousArt()) {
key += "#usesVariousArt";
}
// log.warn("#key: " + key);
return getImage(key);
return getImage(getKey(card, card.getName(), ""));
}
public static BufferedImage getImageOriginalAlternateName(CardView card) {
String key = getKeyAlternateName(card, card.getAlternateName());
if (card.getUsesVariousArt()) {
key += "#usesVariousArt";
}
// log.warn("#key: " + key);
return getImage(key);
return getImage(getKey(card, card.getAlternateName(), ""));
}
/**
@ -230,7 +214,7 @@ public class ImageCache {
if (ex.getCause() instanceof NullPointerException) {
return null;
}
log.error(ex,ex);
log.error(ex, ex);
return null;
}
}
@ -238,32 +222,25 @@ public class ImageCache {
/**
* Returns the map key for a card, without any suffixes for the image size.
*/
private static String getKey(CardView card) {
StringBuilder sb = new StringBuilder(card.getName()).append("#");
sb.append(card.getExpansionSetCode()).append("#");
sb.append(card.getType()).append("#");
sb.append(card.getCardNumber()).append("#");
sb.append(card.getTokenSetCode() == null ? "":card.getTokenSetCode());
return sb.toString();
}
/**
* Returns the map key for the flip image of a card, without any suffixes for the image size.
*/
private static String getKeyAlternateName(CardView card, String alternateName) {
StringBuilder sb = new StringBuilder(alternateName).append("#");
sb.append(card.getExpansionSetCode()).append("#");
sb.append(card.getType()).append("#");
sb.append(card.getCardNumber()).append("#");
sb.append(card.getTokenSetCode() == null ? "":card.getTokenSetCode());
return sb.toString();
private static String getKey(CardView card, String name, String suffix) {
return name + "#" + card.getExpansionSetCode() + "#" + card.getType() + "#" + card.getCardNumber() + "#"
+ (card.getTokenSetCode() == null ? "" : card.getTokenSetCode())
+ suffix
+ (card.getUsesVariousArt() ? "#usesVariousArt" : "");
}
// /**
// * Returns the map key for the flip image of a card, without any suffixes for the image size.
// */
// private static String getKeyAlternateName(CardView card, String alternateName) {
// return alternateName + "#" + card.getExpansionSetCode() + "#" +card.getType()+ "#" + card.getCardNumber() + "#"
// + (card.getTokenSetCode() == null ? "":card.getTokenSetCode());
// }
/**
* Load image from file
*
* @param file
* file to load image from
* @param file file to load image from
* @return {@link BufferedImage}
*/
public static BufferedImage loadImage(TFile file) {
@ -297,7 +274,7 @@ public class ImageCache {
ImageIO.write(image, "jpg", outputStream);
}
} catch (IOException e) {
log.error(e,e);
log.error(e, e);
imageFile.delete();
}
return image;
@ -305,6 +282,7 @@ public class ImageCache {
/**
* Returns an image scaled to the size given
*
* @param original
* @return
*/
@ -344,6 +322,7 @@ public class ImageCache {
/**
* Returns an image scaled to the size appropriate for the card picture
* panel
*
* @param original
* @param sizeNeed
* @return
@ -356,6 +335,7 @@ public class ImageCache {
/**
* Returns the image appropriate to display the card in the picture panel
*
* @param card
* @param width
* @param height
@ -365,11 +345,7 @@ public class ImageCache {
if (Constants.THUMBNAIL_SIZE_FULL.width + 10 > width) {
return getThumbnail(card);
}
String key = getKey(card);
if (card.getUsesVariousArt()) {
key += "#usesVariousArt";
}
// log.warn("getImage: " + key);
String key = getKey(card, card.getName(), "");
BufferedImage original = getImage(key);
if (original == null) {
log.debug(key + " not found");

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.7 KiB

After

Width:  |  Height:  |  Size: 6.3 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.3 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.6 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 7 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 5.9 KiB

After

Width:  |  Height:  |  Size: 5.9 KiB

Before After
Before After

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

After

Width:  |  Height:  |  Size: 8.8 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.6 KiB

After

Width:  |  Height:  |  Size: 7.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 6 KiB

After

Width:  |  Height:  |  Size: 6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.9 KiB

After

Width:  |  Height:  |  Size: 7.4 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 9.5 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 8.5 KiB

After

Width:  |  Height:  |  Size: 8.5 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 9.2 KiB

After

Width:  |  Height:  |  Size: 9.2 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

After

Width:  |  Height:  |  Size: 9.3 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9 KiB

After

Width:  |  Height:  |  Size: 10 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 11 KiB

After

Width:  |  Height:  |  Size: 11 KiB

Before After
Before After

View file

Before

Width:  |  Height:  |  Size: 5.6 KiB

After

Width:  |  Height:  |  Size: 5.6 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 23 KiB

View file

@ -1,5 +1,17 @@
#Generate|TOK:BFZ|Eldrazi Scion|
#Generate|TOK:BFZ|Elemental|
#Generate|TOK:BFZ|Dragon|
#Generate|TOK:BFZ|Eldrazi|
#Generate|TOK:BFZ|Eldrazi Scion 1|
#Generate|TOK:BFZ|Eldrazi Scion 2|
#Generate|TOK:BFZ|Eldrazi Scion 3|
#Generate|TOK:BFZ|Elemental 1|
#Generate|TOK:BFZ|Elemental 2|
#Generate|TOK:BFZ|Knight Ally|
#Generate|TOK:BFZ|Kor Ally|
#Generate|TOK:BFZ|Octopus|
#Generate|TOK:BFZ|Plant|
#|Generate|EMBLEM!:BFZ|Emblem Gideon, Ally of Zendikar|
#|Generate|EMBLEM!:BFZ|Emblem Kiora, Master of the Depths|
#|Generate|EMBLEM!:BFZ|Emblem Ob Nixilis Reignited|
#Generate|TOK:DDP|Eldrazi Spawn 1|
#Generate|TOK:DDP|Eldrazi Spawn 2|

View file

@ -64,6 +64,6 @@ ddd=gvl
unh=uh
dde=pvc
# Remove setname as soon as the images can be downloaded
ignore.urls=TOK,V15,DDP
ignore.urls=TOK, OGW
# sets ordered by release time (newest goes first)
token.lookup.order=DDP,BFZ,FVD,FVE,FVL,FVR,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC
token.lookup.order=OGW,EXP,DDP,BFZ,FVD,FVE,FVL,FVR,V12,V13,V14,V15,TPR,MPRP,DD3,DDO,ORI,MM2,PTC,DTK,FRF,KTK,M15,VMA,CNS,JOU,BNG,THS,DDL,M14,MMA,DGM,GTC,RTR,M13,AVR,DDI,DKA,ISD,M12,NPH,MBS,SOM,M11,ROE,DDE,WWK,ZEN,M10,GVL,ARB,DVD,CFX,JVC,ALA,EVE,SHM,EVG,MOR,LRW,10E,CLS,CHK,GRC

View file

@ -67,6 +67,10 @@ public final class Constants {
public static final double SCALE_FACTOR = 0.5;
public static final int MIN_AVATAR_ID = 10;
public static final int MAX_AVATAR_ID = 32;
public static final int DEFAULT_AVATAR_ID = 10;
/**
* Time each player has during the game to play using his\her priority.
*/

View file

@ -1,5 +1,7 @@
package mage.utils;
import java.util.List;
import mage.ObjectColor;
import mage.cards.Card;
import mage.cards.MagePermanent;
import mage.constants.CardType;
@ -13,6 +15,12 @@ import mage.view.CardView;
*/
public class CardUtil {
private static final String regexBlack = ".*\\x7b.{0,2}B.{0,2}\\x7d.*";
private static final String regexBlue = ".*\\x7b.{0,2}U.{0,2}\\x7d.*";
private static final String regexRed = ".*\\x7b.{0,2}R.{0,2}\\x7d.*";
private static final String regexGreen = ".*\\x7b.{0,2}G.{0,2}\\x7d.*";
private static final String regexWhite = ".*\\x7b.{0,2}W.{0,2}\\x7d.*";
public static boolean isCreature(CardView card) {
return is(card, CardType.CREATURE);
}
@ -48,4 +56,34 @@ public class CardUtil {
public static boolean isLand(Card card) {
return card.getCardType().contains(CardType.LAND);
}
public static int getColorIdentitySortValue(List<String> manaCost, ObjectColor originalColor, List<String> rules) {
ObjectColor color = new ObjectColor(originalColor);
for (String rule : rules) {
rule = rule.replaceAll("(?i)<i.*?</i>", ""); // Ignoring reminder text in italic
if (rule.matches(regexBlack)) {
color.setBlack(true);
}
if (rule.matches(regexBlue)) {
color.setBlue(true);
}
if (rule.matches(regexGreen)) {
color.setGreen(true);
}
if (rule.matches(regexRed)) {
color.setRed(true);
}
if (rule.matches(regexWhite)) {
color.setWhite(true);
}
}
int hash = 3;
hash = 23 * hash + (color.isWhite() || manaCost.contains("{W}") ? 1 : 0);
hash = 23 * hash + (color.isBlue() || manaCost.contains("{U}") ? 1 : 0);
hash = 23 * hash + (color.isBlack() || manaCost.contains("{B}") ? 1 : 0);
hash = 23 * hash + (color.isRed() || manaCost.contains("{R}") ? 1 : 0);
hash = 23 * hash + (color.isGreen() || manaCost.contains("{G}") ? 1 : 0);
return hash;
}
}

View file

@ -41,7 +41,7 @@ public class MageVersion implements Serializable, Comparable<MageVersion> {
public final static int MAGE_VERSION_MAJOR = 1;
public final static int MAGE_VERSION_MINOR = 4;
public final static int MAGE_VERSION_PATCH = 4;
public final static String MAGE_VERSION_MINOR_PATCH = "v3";
public final static String MAGE_VERSION_MINOR_PATCH = "v7";
public final static String MAGE_VERSION_INFO = "";
private final int major;

View file

@ -485,7 +485,12 @@ public class HumanPlayer extends PlayerImpl {
public boolean chooseTarget(Outcome outcome, Cards cards, TargetCard target, Ability source, Game game) {
updateGameStatePriority("chooseTarget(5)", game);
while (!abort) {
boolean required = target.isRequired(source);
boolean required;
if (target.isRequiredExplicitlySet()) {
required = target.isRequired();
} else {
required = target.isRequired(source);
}
// if there is no cards to select from, then add possibility to cancel choosing action
if (cards == null) {
required = false;

View file

@ -34,10 +34,10 @@ import mage.game.draft.DraftCube;
* @author fireshoes
*/
public class MTGOLegacyCube2015 extends DraftCube {
public class MTGOLegacyCubeMarch2015 extends DraftCube {
public MTGOLegacyCube2015() {
super("MTGO Legacy Cube 2015 (600 cards)");
public MTGOLegacyCubeMarch2015() {
super("MTGO Legacy Cube March 2015 (600 cards)");
cubeCards.add(new DraftCube.CardIdentity("Accorder Paladin",""));
cubeCards.add(new DraftCube.CardIdentity("Abrupt Decay",""));
cubeCards.add(new DraftCube.CardIdentity("Acidic Slime",""));
@ -88,6 +88,7 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Bitterblossom",""));
cubeCards.add(new DraftCube.CardIdentity("Blade of the Bloodchief",""));
cubeCards.add(new DraftCube.CardIdentity("Blade Splicer",""));
cubeCards.add(new DraftCube.CardIdentity("Blood Artist",""));
cubeCards.add(new DraftCube.CardIdentity("Blood Crypt",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodbraid Elf",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodcrazed Neonate",""));
@ -95,13 +96,13 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Bloodline Keeper",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodlord of Vaasgoth",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodstained Mire",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodthrone Vampire",""));
cubeCards.add(new DraftCube.CardIdentity("Bogardan Hellkite",""));
cubeCards.add(new DraftCube.CardIdentity("Bone Shredder",""));
cubeCards.add(new DraftCube.CardIdentity("Bonesplitter",""));
cubeCards.add(new DraftCube.CardIdentity("Bonfire of the Damned",""));
cubeCards.add(new DraftCube.CardIdentity("Boon Satyr",""));
cubeCards.add(new DraftCube.CardIdentity("Boros Charm",""));
cubeCards.add(new DraftCube.CardIdentity("Boros Elite",""));
cubeCards.add(new DraftCube.CardIdentity("Boros Reckoner",""));
cubeCards.add(new DraftCube.CardIdentity("Brago, King Eternal",""));
cubeCards.add(new DraftCube.CardIdentity("Brainstorm",""));
@ -113,7 +114,6 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Burst Lightning",""));
cubeCards.add(new DraftCube.CardIdentity("Call of the Herd",""));
cubeCards.add(new DraftCube.CardIdentity("Captivating Vampire",""));
cubeCards.add(new DraftCube.CardIdentity("Carnophage",""));
cubeCards.add(new DraftCube.CardIdentity("Caves of Koilos",""));
cubeCards.add(new DraftCube.CardIdentity("Chain Lightning",""));
cubeCards.add(new DraftCube.CardIdentity("Chainer's Edict",""));
@ -257,7 +257,6 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Glacial Fortress",""));
cubeCards.add(new DraftCube.CardIdentity("Glen Elendra Archmage",""));
cubeCards.add(new DraftCube.CardIdentity("Glorious Anthem",""));
cubeCards.add(new DraftCube.CardIdentity("Gnarled Scarhide",""));
cubeCards.add(new DraftCube.CardIdentity("Go for the Throat",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Bombardment",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Bushwhacker",""));
@ -281,6 +280,7 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Hallowed Spiritkeeper",""));
cubeCards.add(new DraftCube.CardIdentity("Hammer of Purphoros",""));
cubeCards.add(new DraftCube.CardIdentity("Harmonize",""));
cubeCards.add(new DraftCube.CardIdentity("Harrow",""));
cubeCards.add(new DraftCube.CardIdentity("Hellrider",""));
cubeCards.add(new DraftCube.CardIdentity("Herald of Torment",""));
cubeCards.add(new DraftCube.CardIdentity("Hero of Bladehold",""));
@ -359,6 +359,7 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Mana Leak",""));
cubeCards.add(new DraftCube.CardIdentity("Mana Tithe",""));
cubeCards.add(new DraftCube.CardIdentity("Manic Vandal",""));
cubeCards.add(new DraftCube.CardIdentity("Mardu Woe Reaper",""));
cubeCards.add(new DraftCube.CardIdentity("Marsh Flats",""));
cubeCards.add(new DraftCube.CardIdentity("Martial Coup",""));
cubeCards.add(new DraftCube.CardIdentity("Massacre Wurm",""));
@ -382,7 +383,6 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Monastery Swiftspear",""));
cubeCards.add(new DraftCube.CardIdentity("Mother of Runes",""));
cubeCards.add(new DraftCube.CardIdentity("Mox Diamond",""));
cubeCards.add(new DraftCube.CardIdentity("Mulch",""));
cubeCards.add(new DraftCube.CardIdentity("Mulldrifter",""));
cubeCards.add(new DraftCube.CardIdentity("Murderous Cut",""));
cubeCards.add(new DraftCube.CardIdentity("Mutavault",""));
@ -638,6 +638,5 @@ public class MTGOLegacyCube2015 extends DraftCube {
cubeCards.add(new DraftCube.CardIdentity("Yosei, the Morning Star",""));
cubeCards.add(new DraftCube.CardIdentity("Young Pyromancer",""));
cubeCards.add(new DraftCube.CardIdentity("Zealous Conscripts",""));
}
}

View file

@ -0,0 +1,642 @@
/*
* 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 mage.tournament.cubes;
import mage.game.draft.DraftCube;
/**
*
* @author fireshoes
*/
public class MTGOLegacyCubeSeptember2015 extends DraftCube {
public MTGOLegacyCubeSeptember2015() {
super("MTGO Legacy Cube September 2015 (600 cards)");
cubeCards.add(new DraftCube.CardIdentity("Abbot of Keral Keep",""));
cubeCards.add(new DraftCube.CardIdentity("Abhorrent Overlord",""));
cubeCards.add(new DraftCube.CardIdentity("Abrupt Decay",""));
cubeCards.add(new DraftCube.CardIdentity("Abyssal Persecutor",""));
cubeCards.add(new DraftCube.CardIdentity("Accorder Paladin",""));
cubeCards.add(new DraftCube.CardIdentity("Acidic Slime",""));
cubeCards.add(new DraftCube.CardIdentity("Act of Aggression",""));
cubeCards.add(new DraftCube.CardIdentity("Adarkar Wastes",""));
cubeCards.add(new DraftCube.CardIdentity("AEther Vial",""));
cubeCards.add(new DraftCube.CardIdentity("Ainok Survivalist",""));
cubeCards.add(new DraftCube.CardIdentity("Ajani Goldmane",""));
cubeCards.add(new DraftCube.CardIdentity("Ajani Vengeant",""));
cubeCards.add(new DraftCube.CardIdentity("Ajani, Caller of the Pride",""));
cubeCards.add(new DraftCube.CardIdentity("Akroma's Vengeance",""));
cubeCards.add(new DraftCube.CardIdentity("Ancestral Vision",""));
cubeCards.add(new DraftCube.CardIdentity("Ancient Tomb",""));
cubeCards.add(new DraftCube.CardIdentity("Angel of Serenity",""));
cubeCards.add(new DraftCube.CardIdentity("Angelic Destiny",""));
cubeCards.add(new DraftCube.CardIdentity("Anger of the Gods",""));
cubeCards.add(new DraftCube.CardIdentity("Animate Dead",""));
cubeCards.add(new DraftCube.CardIdentity("Arbor Elf",""));
cubeCards.add(new DraftCube.CardIdentity("Arc Trail",""));
cubeCards.add(new DraftCube.CardIdentity("Archangel of Thune",""));
cubeCards.add(new DraftCube.CardIdentity("Arid Mesa",""));
cubeCards.add(new DraftCube.CardIdentity("Armageddon",""));
cubeCards.add(new DraftCube.CardIdentity("Ashcloud Phoenix",""));
cubeCards.add(new DraftCube.CardIdentity("Ashen Rider",""));
cubeCards.add(new DraftCube.CardIdentity("Ashenmoor Gouger",""));
cubeCards.add(new DraftCube.CardIdentity("Ashiok, Nightmare Weaver",""));
cubeCards.add(new DraftCube.CardIdentity("Assemble the Legion",""));
cubeCards.add(new DraftCube.CardIdentity("Attrition",""));
cubeCards.add(new DraftCube.CardIdentity("Augur of Bolas",""));
cubeCards.add(new DraftCube.CardIdentity("Avacyn's Pilgrim",""));
cubeCards.add(new DraftCube.CardIdentity("Avalanche Riders",""));
cubeCards.add(new DraftCube.CardIdentity("Avenger of Zendikar",""));
cubeCards.add(new DraftCube.CardIdentity("Badlands",""));
cubeCards.add(new DraftCube.CardIdentity("Baleful Strix",""));
cubeCards.add(new DraftCube.CardIdentity("Banefire",""));
cubeCards.add(new DraftCube.CardIdentity("Baneslayer Angel",""));
cubeCards.add(new DraftCube.CardIdentity("Banisher Priest",""));
cubeCards.add(new DraftCube.CardIdentity("Banishing Light",""));
cubeCards.add(new DraftCube.CardIdentity("Basalt Monolith",""));
cubeCards.add(new DraftCube.CardIdentity("Basilisk Collar",""));
cubeCards.add(new DraftCube.CardIdentity("Batterskull",""));
cubeCards.add(new DraftCube.CardIdentity("Battlefield Forge",""));
cubeCards.add(new DraftCube.CardIdentity("Bayou",""));
cubeCards.add(new DraftCube.CardIdentity("Beast Within",""));
cubeCards.add(new DraftCube.CardIdentity("Beetleback Chief",""));
cubeCards.add(new DraftCube.CardIdentity("Birds of Paradise",""));
cubeCards.add(new DraftCube.CardIdentity("Birthing Pod",""));
cubeCards.add(new DraftCube.CardIdentity("Bitterblossom",""));
cubeCards.add(new DraftCube.CardIdentity("Blade Splicer",""));
cubeCards.add(new DraftCube.CardIdentity("Blood Crypt",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodbraid Elf",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodghast",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodsoaked Champion",""));
cubeCards.add(new DraftCube.CardIdentity("Bloodstained Mire",""));
cubeCards.add(new DraftCube.CardIdentity("Bogardan Hellkite",""));
cubeCards.add(new DraftCube.CardIdentity("Bone Shredder",""));
cubeCards.add(new DraftCube.CardIdentity("Bonesplitter",""));
cubeCards.add(new DraftCube.CardIdentity("Bonfire of the Damned",""));
cubeCards.add(new DraftCube.CardIdentity("Boros Charm",""));
cubeCards.add(new DraftCube.CardIdentity("Boros Reckoner",""));
cubeCards.add(new DraftCube.CardIdentity("Brago, King Eternal",""));
cubeCards.add(new DraftCube.CardIdentity("Brainstorm",""));
cubeCards.add(new DraftCube.CardIdentity("Breeding Pool",""));
cubeCards.add(new DraftCube.CardIdentity("Brimaz, King of Oreskos",""));
cubeCards.add(new DraftCube.CardIdentity("Brimstone Volley",""));
cubeCards.add(new DraftCube.CardIdentity("Brushland",""));
cubeCards.add(new DraftCube.CardIdentity("Buried Alive",""));
cubeCards.add(new DraftCube.CardIdentity("Burst Lightning",""));
cubeCards.add(new DraftCube.CardIdentity("Careful Study",""));
cubeCards.add(new DraftCube.CardIdentity("Carrion Feeder",""));
cubeCards.add(new DraftCube.CardIdentity("Caves of Koilos",""));
cubeCards.add(new DraftCube.CardIdentity("Chain Lightning",""));
cubeCards.add(new DraftCube.CardIdentity("Chainer's Edict",""));
cubeCards.add(new DraftCube.CardIdentity("Chameleon Colossus",""));
cubeCards.add(new DraftCube.CardIdentity("Champion of the Parish",""));
cubeCards.add(new DraftCube.CardIdentity("Chandra Nalaar",""));
cubeCards.add(new DraftCube.CardIdentity("Chandra, Fire of Kaladesh",""));
cubeCards.add(new DraftCube.CardIdentity("Chandra, Pyromaster",""));
cubeCards.add(new DraftCube.CardIdentity("Chandra's Phoenix",""));
cubeCards.add(new DraftCube.CardIdentity("Char",""));
cubeCards.add(new DraftCube.CardIdentity("Chasm Skulker",""));
cubeCards.add(new DraftCube.CardIdentity("Chord of Calling",""));
cubeCards.add(new DraftCube.CardIdentity("Chromatic Lantern",""));
cubeCards.add(new DraftCube.CardIdentity("Chrome Mox",""));
cubeCards.add(new DraftCube.CardIdentity("City of Brass",""));
cubeCards.add(new DraftCube.CardIdentity("Clifftop Retreat",""));
cubeCards.add(new DraftCube.CardIdentity("Cloudgoat Ranger",""));
cubeCards.add(new DraftCube.CardIdentity("Coalition Relic",""));
cubeCards.add(new DraftCube.CardIdentity("Collected Company",""));
cubeCards.add(new DraftCube.CardIdentity("Compulsive Research",""));
cubeCards.add(new DraftCube.CardIdentity("Condemn",""));
cubeCards.add(new DraftCube.CardIdentity("Condescend",""));
cubeCards.add(new DraftCube.CardIdentity("Consecrated Sphinx",""));
cubeCards.add(new DraftCube.CardIdentity("Control Magic",""));
cubeCards.add(new DraftCube.CardIdentity("Corpse Dance",""));
cubeCards.add(new DraftCube.CardIdentity("Council's Judgment",""));
cubeCards.add(new DraftCube.CardIdentity("Counterspell",""));
cubeCards.add(new DraftCube.CardIdentity("Courser of Kruphix",""));
cubeCards.add(new DraftCube.CardIdentity("Crater's Claws",""));
cubeCards.add(new DraftCube.CardIdentity("Craterhoof Behemoth",""));
cubeCards.add(new DraftCube.CardIdentity("Crusade",""));
cubeCards.add(new DraftCube.CardIdentity("Crux of Fate",""));
cubeCards.add(new DraftCube.CardIdentity("Cryptic Command",""));
cubeCards.add(new DraftCube.CardIdentity("Cultivate",""));
cubeCards.add(new DraftCube.CardIdentity("Cunning Sparkmage",""));
cubeCards.add(new DraftCube.CardIdentity("Cursed Scroll",""));
cubeCards.add(new DraftCube.CardIdentity("Cyclonic Rift",""));
cubeCards.add(new DraftCube.CardIdentity("Damnation",""));
cubeCards.add(new DraftCube.CardIdentity("Dance of the Dead",""));
cubeCards.add(new DraftCube.CardIdentity("Dark Confidant",""));
cubeCards.add(new DraftCube.CardIdentity("Dark Depths",""));
cubeCards.add(new DraftCube.CardIdentity("Dark Petition",""));
cubeCards.add(new DraftCube.CardIdentity("Dark Ritual",""));
cubeCards.add(new DraftCube.CardIdentity("Day of Judgment",""));
cubeCards.add(new DraftCube.CardIdentity("Daze",""));
cubeCards.add(new DraftCube.CardIdentity("Deathrite Shaman",""));
cubeCards.add(new DraftCube.CardIdentity("Deceiver Exarch",""));
cubeCards.add(new DraftCube.CardIdentity("Deep Analysis",""));
cubeCards.add(new DraftCube.CardIdentity("Delver of Secrets",""));
cubeCards.add(new DraftCube.CardIdentity("Demonic Pact",""));
cubeCards.add(new DraftCube.CardIdentity("Den Protector",""));
cubeCards.add(new DraftCube.CardIdentity("Deranged Hermit",""));
cubeCards.add(new DraftCube.CardIdentity("Desecration Demon",""));
cubeCards.add(new DraftCube.CardIdentity("Devil's Play",""));
cubeCards.add(new DraftCube.CardIdentity("Diabolic Servitude",""));
cubeCards.add(new DraftCube.CardIdentity("Dictate of Heliod",""));
cubeCards.add(new DraftCube.CardIdentity("Dig Through Time",""));
cubeCards.add(new DraftCube.CardIdentity("Disciple of Bolas",""));
cubeCards.add(new DraftCube.CardIdentity("Disfigure",""));
cubeCards.add(new DraftCube.CardIdentity("Dismember",""));
cubeCards.add(new DraftCube.CardIdentity("Dismiss",""));
cubeCards.add(new DraftCube.CardIdentity("Dissipate",""));
cubeCards.add(new DraftCube.CardIdentity("Dissolve",""));
cubeCards.add(new DraftCube.CardIdentity("Divinity of Pride",""));
cubeCards.add(new DraftCube.CardIdentity("Domri Rade",""));
cubeCards.add(new DraftCube.CardIdentity("Doom Blade",""));
cubeCards.add(new DraftCube.CardIdentity("Doomed Necromancer",""));
cubeCards.add(new DraftCube.CardIdentity("Dragon Fodder",""));
cubeCards.add(new DraftCube.CardIdentity("Dragonlord Atarka",""));
cubeCards.add(new DraftCube.CardIdentity("Dragonlord Dromoka",""));
cubeCards.add(new DraftCube.CardIdentity("Dragonlord Ojutai",""));
cubeCards.add(new DraftCube.CardIdentity("Dragonlord Silumgar",""));
cubeCards.add(new DraftCube.CardIdentity("Dragonskull Summit",""));
cubeCards.add(new DraftCube.CardIdentity("Dread Return",""));
cubeCards.add(new DraftCube.CardIdentity("Dreadbore",""));
cubeCards.add(new DraftCube.CardIdentity("Dromoka's Command",""));
cubeCards.add(new DraftCube.CardIdentity("Drowned Catacomb",""));
cubeCards.add(new DraftCube.CardIdentity("Dualcaster Mage",""));
cubeCards.add(new DraftCube.CardIdentity("Dungeon Geists",""));
cubeCards.add(new DraftCube.CardIdentity("Duplicant",""));
cubeCards.add(new DraftCube.CardIdentity("Duress",""));
cubeCards.add(new DraftCube.CardIdentity("Edric, Spymaster of Trest",""));
cubeCards.add(new DraftCube.CardIdentity("Eight-and-a-Half-Tails",""));
cubeCards.add(new DraftCube.CardIdentity("Electrolyze",""));
cubeCards.add(new DraftCube.CardIdentity("Elesh Norn, Grand Cenobite",""));
cubeCards.add(new DraftCube.CardIdentity("Elite Vanguard",""));
cubeCards.add(new DraftCube.CardIdentity("Elixir of Immortality",""));
cubeCards.add(new DraftCube.CardIdentity("Elspeth Tirel",""));
cubeCards.add(new DraftCube.CardIdentity("Elspeth, Knight-Errant",""));
cubeCards.add(new DraftCube.CardIdentity("Elspeth, Sun's Champion",""));
cubeCards.add(new DraftCube.CardIdentity("Elves of Deep Shadow",""));
cubeCards.add(new DraftCube.CardIdentity("Elvish Mystic",""));
cubeCards.add(new DraftCube.CardIdentity("Emeria Angel",""));
cubeCards.add(new DraftCube.CardIdentity("Emrakul, the Aeons Torn",""));
cubeCards.add(new DraftCube.CardIdentity("Entomb",""));
cubeCards.add(new DraftCube.CardIdentity("Entreat the Angels",""));
cubeCards.add(new DraftCube.CardIdentity("Erebos, God of the Dead",""));
cubeCards.add(new DraftCube.CardIdentity("Erebos's Titan",""));
cubeCards.add(new DraftCube.CardIdentity("Essence Scatter",""));
cubeCards.add(new DraftCube.CardIdentity("Eternal Dragon",""));
cubeCards.add(new DraftCube.CardIdentity("Eternal Witness",""));
cubeCards.add(new DraftCube.CardIdentity("Eureka",""));
cubeCards.add(new DraftCube.CardIdentity("Everflowing Chalice",""));
cubeCards.add(new DraftCube.CardIdentity("Exalted Angel",""));
cubeCards.add(new DraftCube.CardIdentity("Exhume",""));
cubeCards.add(new DraftCube.CardIdentity("Explore",""));
cubeCards.add(new DraftCube.CardIdentity("Exquisite Firecraft",""));
cubeCards.add(new DraftCube.CardIdentity("Fact or Fiction",""));
cubeCards.add(new DraftCube.CardIdentity("Faith's Fetters",""));
cubeCards.add(new DraftCube.CardIdentity("Falkenrath Aristocrat",""));
cubeCards.add(new DraftCube.CardIdentity("Farseek",""));
cubeCards.add(new DraftCube.CardIdentity("Fauna Shaman",""));
cubeCards.add(new DraftCube.CardIdentity("Fertile Ground",""));
cubeCards.add(new DraftCube.CardIdentity("Fiend Hunter",""));
cubeCards.add(new DraftCube.CardIdentity("Fire // Ice",""));
cubeCards.add(new DraftCube.CardIdentity("Firebolt",""));
cubeCards.add(new DraftCube.CardIdentity("Firefist Striker",""));
cubeCards.add(new DraftCube.CardIdentity("Flame Slash",""));
cubeCards.add(new DraftCube.CardIdentity("Flametongue Kavu",""));
cubeCards.add(new DraftCube.CardIdentity("Flamewake Phoenix",""));
cubeCards.add(new DraftCube.CardIdentity("Fleecemane Lion",""));
cubeCards.add(new DraftCube.CardIdentity("Flickerwisp",""));
cubeCards.add(new DraftCube.CardIdentity("Flooded Strand",""));
cubeCards.add(new DraftCube.CardIdentity("Forbid",""));
cubeCards.add(new DraftCube.CardIdentity("Forbidden Alchemy",""));
cubeCards.add(new DraftCube.CardIdentity("Force of Will",""));
cubeCards.add(new DraftCube.CardIdentity("Force Spike",""));
cubeCards.add(new DraftCube.CardIdentity("Forked Bolt",""));
cubeCards.add(new DraftCube.CardIdentity("Frenzied Goblin",""));
cubeCards.add(new DraftCube.CardIdentity("Freyalise, Llanowar's Fury",""));
cubeCards.add(new DraftCube.CardIdentity("Frontline Medic",""));
cubeCards.add(new DraftCube.CardIdentity("Frost Titan",""));
cubeCards.add(new DraftCube.CardIdentity("Future Sight",""));
cubeCards.add(new DraftCube.CardIdentity("Fyndhorn Elves",""));
cubeCards.add(new DraftCube.CardIdentity("Gaea's Cradle",""));
cubeCards.add(new DraftCube.CardIdentity("Garruk Relentless",""));
cubeCards.add(new DraftCube.CardIdentity("Garruk Wildspeaker",""));
cubeCards.add(new DraftCube.CardIdentity("Garruk, Apex Predator",""));
cubeCards.add(new DraftCube.CardIdentity("Garruk, Caller of Beasts",""));
cubeCards.add(new DraftCube.CardIdentity("Garruk, Primal Hunter",""));
cubeCards.add(new DraftCube.CardIdentity("Gatekeeper of Malakir",""));
cubeCards.add(new DraftCube.CardIdentity("Gather the Townsfolk",""));
cubeCards.add(new DraftCube.CardIdentity("Geist of Saint Traft",""));
cubeCards.add(new DraftCube.CardIdentity("Genesis Wave",""));
cubeCards.add(new DraftCube.CardIdentity("Geralf's Messenger",""));
cubeCards.add(new DraftCube.CardIdentity("Ghor-Clan Rampager",""));
cubeCards.add(new DraftCube.CardIdentity("Gideon Jura",""));
cubeCards.add(new DraftCube.CardIdentity("Gifts Ungiven",""));
cubeCards.add(new DraftCube.CardIdentity("Gilded Lotus",""));
cubeCards.add(new DraftCube.CardIdentity("Gilt-Leaf Winnower",""));
cubeCards.add(new DraftCube.CardIdentity("Gitaxian Probe",""));
cubeCards.add(new DraftCube.CardIdentity("Glacial Fortress",""));
cubeCards.add(new DraftCube.CardIdentity("Glen Elendra Archmage",""));
cubeCards.add(new DraftCube.CardIdentity("Glorious Anthem",""));
cubeCards.add(new DraftCube.CardIdentity("Go for the Throat",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Bushwhacker",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Glory Chaser",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Guide",""));
cubeCards.add(new DraftCube.CardIdentity("Goblin Rabblemaster",""));
cubeCards.add(new DraftCube.CardIdentity("Godless Shrine",""));
cubeCards.add(new DraftCube.CardIdentity("Gore-House Chainwalker",""));
cubeCards.add(new DraftCube.CardIdentity("Grafted Wargear",""));
cubeCards.add(new DraftCube.CardIdentity("Grave Titan",""));
cubeCards.add(new DraftCube.CardIdentity("Gravecrawler",""));
cubeCards.add(new DraftCube.CardIdentity("Gray Merchant of Asphodel",""));
cubeCards.add(new DraftCube.CardIdentity("Greater Gargadon",""));
cubeCards.add(new DraftCube.CardIdentity("Green Sun's Zenith",""));
cubeCards.add(new DraftCube.CardIdentity("Grim Lavamancer",""));
cubeCards.add(new DraftCube.CardIdentity("Griselbrand",""));
cubeCards.add(new DraftCube.CardIdentity("Hall of Triumph",""));
cubeCards.add(new DraftCube.CardIdentity("Hallowed Fountain",""));
cubeCards.add(new DraftCube.CardIdentity("Hallowed Spiritkeeper",""));
cubeCards.add(new DraftCube.CardIdentity("Hammer of Purphoros",""));
cubeCards.add(new DraftCube.CardIdentity("Hangarback Walker",""));
cubeCards.add(new DraftCube.CardIdentity("Harbinger of the Tides",""));
cubeCards.add(new DraftCube.CardIdentity("Harmonize",""));
cubeCards.add(new DraftCube.CardIdentity("Hellrider",""));
cubeCards.add(new DraftCube.CardIdentity("Herald of Torment",""));
cubeCards.add(new DraftCube.CardIdentity("Hero of Bladehold",""));
cubeCards.add(new DraftCube.CardIdentity("Hero's Downfall",""));
cubeCards.add(new DraftCube.CardIdentity("Hidden Dragonslayer",""));
cubeCards.add(new DraftCube.CardIdentity("Hinterland Harbor",""));
cubeCards.add(new DraftCube.CardIdentity("Honor of the Pure",""));
cubeCards.add(new DraftCube.CardIdentity("Hordeling Outburst",""));
cubeCards.add(new DraftCube.CardIdentity("Hornet Queen",""));
cubeCards.add(new DraftCube.CardIdentity("Huntmaster of the Fells",""));
cubeCards.add(new DraftCube.CardIdentity("Hymn to Tourach",""));
cubeCards.add(new DraftCube.CardIdentity("Hypnotic Specter",""));
cubeCards.add(new DraftCube.CardIdentity("Imperial Recruiter",""));
cubeCards.add(new DraftCube.CardIdentity("Impulse",""));
cubeCards.add(new DraftCube.CardIdentity("Incinerate",""));
cubeCards.add(new DraftCube.CardIdentity("Indrik Stomphowler",""));
cubeCards.add(new DraftCube.CardIdentity("Inferno Titan",""));
cubeCards.add(new DraftCube.CardIdentity("Inquisition of Kozilek",""));
cubeCards.add(new DraftCube.CardIdentity("Into the Roil",""));
cubeCards.add(new DraftCube.CardIdentity("Ire Shaman",""));
cubeCards.add(new DraftCube.CardIdentity("Isamaru, Hound of Konda",""));
cubeCards.add(new DraftCube.CardIdentity("Isochron Scepter",""));
cubeCards.add(new DraftCube.CardIdentity("Isolated Chapel",""));
cubeCards.add(new DraftCube.CardIdentity("Izzet Charm",""));
cubeCards.add(new DraftCube.CardIdentity("Jace Beleren",""));
cubeCards.add(new DraftCube.CardIdentity("Jace, Architect of Thought",""));
cubeCards.add(new DraftCube.CardIdentity("Jace, the Mind Sculptor",""));
cubeCards.add(new DraftCube.CardIdentity("Jace, Vryn's Prodigy",""));
cubeCards.add(new DraftCube.CardIdentity("Jackal Pup",""));
cubeCards.add(new DraftCube.CardIdentity("Joraga Treespeaker",""));
cubeCards.add(new DraftCube.CardIdentity("Journey to Nowhere",""));
cubeCards.add(new DraftCube.CardIdentity("Kami of Ancient Law",""));
cubeCards.add(new DraftCube.CardIdentity("Karmic Guide",""));
cubeCards.add(new DraftCube.CardIdentity("Karn Liberated",""));
cubeCards.add(new DraftCube.CardIdentity("Karplusan Forest",""));
cubeCards.add(new DraftCube.CardIdentity("Keiga, the Tide Star",""));
cubeCards.add(new DraftCube.CardIdentity("Keranos, God of Storms",""));
cubeCards.add(new DraftCube.CardIdentity("Kiki-Jiki, Mirror Breaker",""));
cubeCards.add(new DraftCube.CardIdentity("Kiln Fiend",""));
cubeCards.add(new DraftCube.CardIdentity("Kiora, the Crashing Wave",""));
cubeCards.add(new DraftCube.CardIdentity("Kiora's Follower",""));
cubeCards.add(new DraftCube.CardIdentity("Kira, Great Glass-Spinner",""));
cubeCards.add(new DraftCube.CardIdentity("Kitchen Finks",""));
cubeCards.add(new DraftCube.CardIdentity("Kodama's Reach",""));
cubeCards.add(new DraftCube.CardIdentity("Kokusho, the Evening Star",""));
cubeCards.add(new DraftCube.CardIdentity("Kor Skyfisher",""));
cubeCards.add(new DraftCube.CardIdentity("Koth of the Hammer",""));
cubeCards.add(new DraftCube.CardIdentity("Kozilek, Butcher of Truth",""));
cubeCards.add(new DraftCube.CardIdentity("Krenko's Command",""));
cubeCards.add(new DraftCube.CardIdentity("Kytheon, Hero of Akros",""));
cubeCards.add(new DraftCube.CardIdentity("Land Tax",""));
cubeCards.add(new DraftCube.CardIdentity("Legacy's Allure",""));
cubeCards.add(new DraftCube.CardIdentity("Leonin Relic-Warder",""));
cubeCards.add(new DraftCube.CardIdentity("Lightning Bolt",""));
cubeCards.add(new DraftCube.CardIdentity("Lightning Greaves",""));
cubeCards.add(new DraftCube.CardIdentity("Lightning Helix",""));
cubeCards.add(new DraftCube.CardIdentity("Lightning Mauler",""));
cubeCards.add(new DraftCube.CardIdentity("Lightning Strike",""));
cubeCards.add(new DraftCube.CardIdentity("Liliana of the Veil",""));
cubeCards.add(new DraftCube.CardIdentity("Liliana Vess",""));
cubeCards.add(new DraftCube.CardIdentity("Liliana, Heretical Healer",""));
cubeCards.add(new DraftCube.CardIdentity("Lingering Souls",""));
cubeCards.add(new DraftCube.CardIdentity("Linvala, Keeper of Silence",""));
cubeCards.add(new DraftCube.CardIdentity("Living Death",""));
cubeCards.add(new DraftCube.CardIdentity("Llanowar Elves",""));
cubeCards.add(new DraftCube.CardIdentity("Llanowar Mentor",""));
cubeCards.add(new DraftCube.CardIdentity("Llanowar Wastes",""));
cubeCards.add(new DraftCube.CardIdentity("Looter il-Kor",""));
cubeCards.add(new DraftCube.CardIdentity("Lotleth Troll",""));
cubeCards.add(new DraftCube.CardIdentity("Lotus Cobra",""));
cubeCards.add(new DraftCube.CardIdentity("Loxodon Warhammer",""));
cubeCards.add(new DraftCube.CardIdentity("Maelstrom Pulse",""));
cubeCards.add(new DraftCube.CardIdentity("Magma Jet",""));
cubeCards.add(new DraftCube.CardIdentity("Makeshift Mannequin",""));
cubeCards.add(new DraftCube.CardIdentity("Malicious Affliction",""));
cubeCards.add(new DraftCube.CardIdentity("Man-o'-War",""));
cubeCards.add(new DraftCube.CardIdentity("Mana Confluence",""));
cubeCards.add(new DraftCube.CardIdentity("Mana Leak",""));
cubeCards.add(new DraftCube.CardIdentity("Mana Tithe",""));
cubeCards.add(new DraftCube.CardIdentity("Managorger Hydra",""));
cubeCards.add(new DraftCube.CardIdentity("Manic Vandal",""));
cubeCards.add(new DraftCube.CardIdentity("Marsh Flats",""));
cubeCards.add(new DraftCube.CardIdentity("Martial Coup",""));
cubeCards.add(new DraftCube.CardIdentity("Massacre Wurm",""));
cubeCards.add(new DraftCube.CardIdentity("Master of the Wild Hunt",""));
cubeCards.add(new DraftCube.CardIdentity("Master of Waves",""));
cubeCards.add(new DraftCube.CardIdentity("Meloku the Clouded Mirror",""));
cubeCards.add(new DraftCube.CardIdentity("Mentor of the Meek",""));
cubeCards.add(new DraftCube.CardIdentity("Merfolk Looter",""));
cubeCards.add(new DraftCube.CardIdentity("Midnight Banshee",""));
cubeCards.add(new DraftCube.CardIdentity("Mind Stone",""));
cubeCards.add(new DraftCube.CardIdentity("Mirari's Wake",""));
cubeCards.add(new DraftCube.CardIdentity("Mirran Crusader",""));
cubeCards.add(new DraftCube.CardIdentity("Miscalculation",""));
cubeCards.add(new DraftCube.CardIdentity("Mishra's Factory",""));
cubeCards.add(new DraftCube.CardIdentity("Misty Rainforest",""));
cubeCards.add(new DraftCube.CardIdentity("Mizzium Mortars",""));
cubeCards.add(new DraftCube.CardIdentity("Mogg Fanatic",""));
cubeCards.add(new DraftCube.CardIdentity("Mogg War Marshal",""));
cubeCards.add(new DraftCube.CardIdentity("Mogis's Marauder",""));
cubeCards.add(new DraftCube.CardIdentity("Monastery Mentor",""));
cubeCards.add(new DraftCube.CardIdentity("Monastery Swiftspear",""));
cubeCards.add(new DraftCube.CardIdentity("Mother of Runes",""));
cubeCards.add(new DraftCube.CardIdentity("Mox Diamond",""));
cubeCards.add(new DraftCube.CardIdentity("Mulldrifter",""));
cubeCards.add(new DraftCube.CardIdentity("Murderous Cut",""));
cubeCards.add(new DraftCube.CardIdentity("Mutavault",""));
cubeCards.add(new DraftCube.CardIdentity("Myr Battlesphere",""));
cubeCards.add(new DraftCube.CardIdentity("Mystic Snake",""));
cubeCards.add(new DraftCube.CardIdentity("Natural Order",""));
cubeCards.add(new DraftCube.CardIdentity("Nature's Lore",""));
cubeCards.add(new DraftCube.CardIdentity("Necromancy",""));
cubeCards.add(new DraftCube.CardIdentity("Negate",""));
cubeCards.add(new DraftCube.CardIdentity("Nekrataal",""));
cubeCards.add(new DraftCube.CardIdentity("Nicol Bolas, Planeswalker",""));
cubeCards.add(new DraftCube.CardIdentity("Nightveil Specter",""));
cubeCards.add(new DraftCube.CardIdentity("Nissa, Vastwood Seer",""));
cubeCards.add(new DraftCube.CardIdentity("Nissa, Worldwaker",""));
cubeCards.add(new DraftCube.CardIdentity("Noble Hierarch",""));
cubeCards.add(new DraftCube.CardIdentity("Nykthos, Shrine to Nyx",""));
cubeCards.add(new DraftCube.CardIdentity("Oblivion Ring",""));
cubeCards.add(new DraftCube.CardIdentity("Obstinate Baloth",""));
cubeCards.add(new DraftCube.CardIdentity("Ohran Viper",""));
cubeCards.add(new DraftCube.CardIdentity("Old Man of the Sea",""));
cubeCards.add(new DraftCube.CardIdentity("Olivia Voldaren",""));
cubeCards.add(new DraftCube.CardIdentity("Oona's Prowler",""));
cubeCards.add(new DraftCube.CardIdentity("Ophiomancer",""));
cubeCards.add(new DraftCube.CardIdentity("Opposition",""));
cubeCards.add(new DraftCube.CardIdentity("Oracle of Mul Daya",""));
cubeCards.add(new DraftCube.CardIdentity("Oust",""));
cubeCards.add(new DraftCube.CardIdentity("Outpost Siege",""));
cubeCards.add(new DraftCube.CardIdentity("Overgrown Battlement",""));
cubeCards.add(new DraftCube.CardIdentity("Overgrown Tomb",""));
cubeCards.add(new DraftCube.CardIdentity("Overrun",""));
cubeCards.add(new DraftCube.CardIdentity("Pack Rat",""));
cubeCards.add(new DraftCube.CardIdentity("Pact of Negation",""));
cubeCards.add(new DraftCube.CardIdentity("Parallax Wave",""));
cubeCards.add(new DraftCube.CardIdentity("Path to Exile",""));
cubeCards.add(new DraftCube.CardIdentity("Pestermite",""));
cubeCards.add(new DraftCube.CardIdentity("Phantasmal Image",""));
cubeCards.add(new DraftCube.CardIdentity("Phyrexian Arena",""));
cubeCards.add(new DraftCube.CardIdentity("Phyrexian Metamorph",""));
cubeCards.add(new DraftCube.CardIdentity("Phyrexian Obliterator",""));
cubeCards.add(new DraftCube.CardIdentity("Phyrexian Revoker",""));
cubeCards.add(new DraftCube.CardIdentity("Pillar of Flame",""));
cubeCards.add(new DraftCube.CardIdentity("Plateau",""));
cubeCards.add(new DraftCube.CardIdentity("Polluted Delta",""));
cubeCards.add(new DraftCube.CardIdentity("Polukranos, World Eater",""));
cubeCards.add(new DraftCube.CardIdentity("Ponder",""));
cubeCards.add(new DraftCube.CardIdentity("Porcelain Legionnaire",""));
cubeCards.add(new DraftCube.CardIdentity("Precinct Captain",""));
cubeCards.add(new DraftCube.CardIdentity("Precursor Golem",""));
cubeCards.add(new DraftCube.CardIdentity("Preordain",""));
cubeCards.add(new DraftCube.CardIdentity("Primal Command",""));
cubeCards.add(new DraftCube.CardIdentity("Primeval Titan",""));
cubeCards.add(new DraftCube.CardIdentity("Profane Command",""));
cubeCards.add(new DraftCube.CardIdentity("Progenitus",""));
cubeCards.add(new DraftCube.CardIdentity("Prophetic Bolt",""));
cubeCards.add(new DraftCube.CardIdentity("Prophetic Flamespeaker",""));
cubeCards.add(new DraftCube.CardIdentity("Psychatog",""));
cubeCards.add(new DraftCube.CardIdentity("Purphoros, God of the Forge",""));
cubeCards.add(new DraftCube.CardIdentity("Qasali Pridemage",""));
cubeCards.add(new DraftCube.CardIdentity("Raise the Alarm",""));
cubeCards.add(new DraftCube.CardIdentity("Rakdos's Return",""));
cubeCards.add(new DraftCube.CardIdentity("Ral Zarek",""));
cubeCards.add(new DraftCube.CardIdentity("Rampaging Baloths",""));
cubeCards.add(new DraftCube.CardIdentity("Rampant Growth",""));
cubeCards.add(new DraftCube.CardIdentity("Ranger of Eos",""));
cubeCards.add(new DraftCube.CardIdentity("Ratchet Bomb",""));
cubeCards.add(new DraftCube.CardIdentity("Ravages of War",""));
cubeCards.add(new DraftCube.CardIdentity("Read the Bones",""));
cubeCards.add(new DraftCube.CardIdentity("Reanimate",""));
cubeCards.add(new DraftCube.CardIdentity("Reclamation Sage",""));
cubeCards.add(new DraftCube.CardIdentity("Recurring Nightmare",""));
cubeCards.add(new DraftCube.CardIdentity("Reflecting Pool",""));
cubeCards.add(new DraftCube.CardIdentity("Regrowth",""));
cubeCards.add(new DraftCube.CardIdentity("Remand",""));
cubeCards.add(new DraftCube.CardIdentity("Remove Soul",""));
cubeCards.add(new DraftCube.CardIdentity("Repeal",""));
cubeCards.add(new DraftCube.CardIdentity("Restoration Angel",""));
cubeCards.add(new DraftCube.CardIdentity("Reveillark",""));
cubeCards.add(new DraftCube.CardIdentity("Rift Bolt",""));
cubeCards.add(new DraftCube.CardIdentity("Riftwing Cloudskate",""));
cubeCards.add(new DraftCube.CardIdentity("Rishadan Port",""));
cubeCards.add(new DraftCube.CardIdentity("Roast",""));
cubeCards.add(new DraftCube.CardIdentity("Rofellos, Llanowar Emissary",""));
cubeCards.add(new DraftCube.CardIdentity("Rootbound Crag",""));
cubeCards.add(new DraftCube.CardIdentity("Rotting Rats",""));
cubeCards.add(new DraftCube.CardIdentity("Rune-Scarred Demon",""));
cubeCards.add(new DraftCube.CardIdentity("Sacred Foundry",""));
cubeCards.add(new DraftCube.CardIdentity("Sakura-Tribe Elder",""));
cubeCards.add(new DraftCube.CardIdentity("Sarkhan, the Dragonspeaker",""));
cubeCards.add(new DraftCube.CardIdentity("Savannah",""));
cubeCards.add(new DraftCube.CardIdentity("Scalding Tarn",""));
cubeCards.add(new DraftCube.CardIdentity("Scavenging Ooze",""));
cubeCards.add(new DraftCube.CardIdentity("Scrubland",""));
cubeCards.add(new DraftCube.CardIdentity("Sea Gate Oracle",""));
cubeCards.add(new DraftCube.CardIdentity("Seal of Fire",""));
cubeCards.add(new DraftCube.CardIdentity("Search for Tomorrow",""));
cubeCards.add(new DraftCube.CardIdentity("Searing Spear",""));
cubeCards.add(new DraftCube.CardIdentity("Secure the Wastes",""));
cubeCards.add(new DraftCube.CardIdentity("Seeker of the Way",""));
cubeCards.add(new DraftCube.CardIdentity("Sensei's Divining Top",""));
cubeCards.add(new DraftCube.CardIdentity("Serendib Efreet",""));
cubeCards.add(new DraftCube.CardIdentity("Serum Visions",""));
cubeCards.add(new DraftCube.CardIdentity("Shadowmage Infiltrator",""));
cubeCards.add(new DraftCube.CardIdentity("Shallow Grave",""));
cubeCards.add(new DraftCube.CardIdentity("Shardless Agent",""));
cubeCards.add(new DraftCube.CardIdentity("Sheoldred, Whispering One",""));
cubeCards.add(new DraftCube.CardIdentity("Shivan Reef",""));
cubeCards.add(new DraftCube.CardIdentity("Show and Tell",""));
cubeCards.add(new DraftCube.CardIdentity("Shriekmaw",""));
cubeCards.add(new DraftCube.CardIdentity("Sidisi, Undead Vizier",""));
cubeCards.add(new DraftCube.CardIdentity("Siege-Gang Commander",""));
cubeCards.add(new DraftCube.CardIdentity("Silverblade Paladin",""));
cubeCards.add(new DraftCube.CardIdentity("Sin Collector",""));
cubeCards.add(new DraftCube.CardIdentity("Skinrender",""));
cubeCards.add(new DraftCube.CardIdentity("Skullcrack",""));
cubeCards.add(new DraftCube.CardIdentity("Slagstorm",""));
cubeCards.add(new DraftCube.CardIdentity("Slaughter Pact",""));
cubeCards.add(new DraftCube.CardIdentity("Snapcaster Mage",""));
cubeCards.add(new DraftCube.CardIdentity("Sneak Attack",""));
cubeCards.add(new DraftCube.CardIdentity("Soldier of the Pantheon",""));
cubeCards.add(new DraftCube.CardIdentity("Solemn Simulacrum",""));
cubeCards.add(new DraftCube.CardIdentity("Song of the Dryads",""));
cubeCards.add(new DraftCube.CardIdentity("Sorin Markov",""));
cubeCards.add(new DraftCube.CardIdentity("Sorin, Solemn Visitor",""));
cubeCards.add(new DraftCube.CardIdentity("Soulfire Grand Master",""));
cubeCards.add(new DraftCube.CardIdentity("Sower of Temptation",""));
cubeCards.add(new DraftCube.CardIdentity("Spear of Heliod",""));
cubeCards.add(new DraftCube.CardIdentity("Spectral Procession",""));
cubeCards.add(new DraftCube.CardIdentity("Spellskite",""));
cubeCards.add(new DraftCube.CardIdentity("Spell Pierce",""));
cubeCards.add(new DraftCube.CardIdentity("Sphere of the Suns",""));
cubeCards.add(new DraftCube.CardIdentity("Sphinx's Revelation",""));
cubeCards.add(new DraftCube.CardIdentity("Spikeshot Elder",""));
cubeCards.add(new DraftCube.CardIdentity("Splinter Twin",""));
cubeCards.add(new DraftCube.CardIdentity("Staggershock",""));
cubeCards.add(new DraftCube.CardIdentity("Steam Vents",""));
cubeCards.add(new DraftCube.CardIdentity("Stoke the Flames",""));
cubeCards.add(new DraftCube.CardIdentity("Stomping Ground",""));
cubeCards.add(new DraftCube.CardIdentity("Stormbreath Dragon",""));
cubeCards.add(new DraftCube.CardIdentity("Stormtide Leviathan",""));
cubeCards.add(new DraftCube.CardIdentity("Stratus Dancer",""));
cubeCards.add(new DraftCube.CardIdentity("Stroke of Genius",""));
cubeCards.add(new DraftCube.CardIdentity("Stromkirk Noble",""));
cubeCards.add(new DraftCube.CardIdentity("Student of Warfare",""));
cubeCards.add(new DraftCube.CardIdentity("Sublime Archangel",""));
cubeCards.add(new DraftCube.CardIdentity("Sulfur Falls",""));
cubeCards.add(new DraftCube.CardIdentity("Sulfurous Springs",""));
cubeCards.add(new DraftCube.CardIdentity("Summoning Trap",""));
cubeCards.add(new DraftCube.CardIdentity("Sun Titan",""));
cubeCards.add(new DraftCube.CardIdentity("Sundering Titan",""));
cubeCards.add(new DraftCube.CardIdentity("Sunpetal Grove",""));
cubeCards.add(new DraftCube.CardIdentity("Supreme Verdict",""));
cubeCards.add(new DraftCube.CardIdentity("Surrak, the Hunt Caller",""));
cubeCards.add(new DraftCube.CardIdentity("Swords to Plowshares",""));
cubeCards.add(new DraftCube.CardIdentity("Sylvan Caryatid",""));
cubeCards.add(new DraftCube.CardIdentity("Sylvan Library",""));
cubeCards.add(new DraftCube.CardIdentity("Taiga",""));
cubeCards.add(new DraftCube.CardIdentity("Talrand, Sky Summoner",""));
cubeCards.add(new DraftCube.CardIdentity("Tamiyo, the Moon Sage",""));
cubeCards.add(new DraftCube.CardIdentity("Tangle Wire",""));
cubeCards.add(new DraftCube.CardIdentity("Tarmogoyf",""));
cubeCards.add(new DraftCube.CardIdentity("Tasigur, the Golden Fang",""));
cubeCards.add(new DraftCube.CardIdentity("Tectonic Edge",""));
cubeCards.add(new DraftCube.CardIdentity("Teferi, Mage of Zhalfir",""));
cubeCards.add(new DraftCube.CardIdentity("Temple Garden",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Abandon",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Deceit",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Enlightenment",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Epiphany",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Malady",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Malice",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Mystery",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Plenty",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Silence",""));
cubeCards.add(new DraftCube.CardIdentity("Temple of Triumph",""));
cubeCards.add(new DraftCube.CardIdentity("Tempt with Vengeance",""));
cubeCards.add(new DraftCube.CardIdentity("Terastodon",""));
cubeCards.add(new DraftCube.CardIdentity("Terminate",""));
cubeCards.add(new DraftCube.CardIdentity("Terminus",""));
cubeCards.add(new DraftCube.CardIdentity("Thalia, Guardian of Thraben",""));
cubeCards.add(new DraftCube.CardIdentity("Thassa, God of the Sea",""));
cubeCards.add(new DraftCube.CardIdentity("Thespian's Stage",""));
cubeCards.add(new DraftCube.CardIdentity("Thoughtseize",""));
cubeCards.add(new DraftCube.CardIdentity("Thragtusk",""));
cubeCards.add(new DraftCube.CardIdentity("Thran Dynamo",""));
cubeCards.add(new DraftCube.CardIdentity("Through the Breach",""));
cubeCards.add(new DraftCube.CardIdentity("Thrun, the Last Troll",""));
cubeCards.add(new DraftCube.CardIdentity("Thunderbreak Regent",""));
cubeCards.add(new DraftCube.CardIdentity("Thundermaw Hellkite",""));
cubeCards.add(new DraftCube.CardIdentity("Tidehollow Sculler",""));
cubeCards.add(new DraftCube.CardIdentity("Time Warp",""));
cubeCards.add(new DraftCube.CardIdentity("Tooth and Nail",""));
cubeCards.add(new DraftCube.CardIdentity("Toxic Deluge",""));
cubeCards.add(new DraftCube.CardIdentity("Treachery",""));
cubeCards.add(new DraftCube.CardIdentity("Tropical Island",""));
cubeCards.add(new DraftCube.CardIdentity("Trygon Predator",""));
cubeCards.add(new DraftCube.CardIdentity("Tundra",""));
cubeCards.add(new DraftCube.CardIdentity("Ugin, the Spirit Dragon",""));
cubeCards.add(new DraftCube.CardIdentity("Ulamog, the Infinite Gyre",""));
cubeCards.add(new DraftCube.CardIdentity("Ultimate Price",""));
cubeCards.add(new DraftCube.CardIdentity("Unburial Rites",""));
cubeCards.add(new DraftCube.CardIdentity("Underground River",""));
cubeCards.add(new DraftCube.CardIdentity("Underground Sea",""));
cubeCards.add(new DraftCube.CardIdentity("Underworld Connections",""));
cubeCards.add(new DraftCube.CardIdentity("Unexpectedly Absent",""));
cubeCards.add(new DraftCube.CardIdentity("Upheaval",""));
cubeCards.add(new DraftCube.CardIdentity("Utopia Sprawl",""));
cubeCards.add(new DraftCube.CardIdentity("Vampire Hexmage",""));
cubeCards.add(new DraftCube.CardIdentity("Vampire Nighthawk",""));
cubeCards.add(new DraftCube.CardIdentity("Vedalken Shackles",""));
cubeCards.add(new DraftCube.CardIdentity("Vendilion Clique",""));
cubeCards.add(new DraftCube.CardIdentity("Vengevine",""));
cubeCards.add(new DraftCube.CardIdentity("Venser, Shaper Savant",""));
cubeCards.add(new DraftCube.CardIdentity("Venser, the Sojourner",""));
cubeCards.add(new DraftCube.CardIdentity("Verdant Catacombs",""));
cubeCards.add(new DraftCube.CardIdentity("Vindicate",""));
cubeCards.add(new DraftCube.CardIdentity("Volcanic Island",""));
cubeCards.add(new DraftCube.CardIdentity("Volrath's Stronghold",""));
cubeCards.add(new DraftCube.CardIdentity("Voyaging Satyr",""));
cubeCards.add(new DraftCube.CardIdentity("Vraska the Unseen",""));
cubeCards.add(new DraftCube.CardIdentity("Wake Thrasher",""));
cubeCards.add(new DraftCube.CardIdentity("Wall of Blossoms",""));
cubeCards.add(new DraftCube.CardIdentity("Wall of Omens",""));
cubeCards.add(new DraftCube.CardIdentity("Wall of Roots",""));
cubeCards.add(new DraftCube.CardIdentity("Warleader's Helix",""));
cubeCards.add(new DraftCube.CardIdentity("Waterfront Bouncer",""));
cubeCards.add(new DraftCube.CardIdentity("Watery Grave",""));
cubeCards.add(new DraftCube.CardIdentity("Whip of Erebos",""));
cubeCards.add(new DraftCube.CardIdentity("Whisperwood Elemental",""));
cubeCards.add(new DraftCube.CardIdentity("Wild Mongrel",""));
cubeCards.add(new DraftCube.CardIdentity("Windbrisk Heights",""));
cubeCards.add(new DraftCube.CardIdentity("Windswept Heath",""));
cubeCards.add(new DraftCube.CardIdentity("Winter Orb",""));
cubeCards.add(new DraftCube.CardIdentity("Wolfir Silverheart",""));
cubeCards.add(new DraftCube.CardIdentity("Wood Elves",""));
cubeCards.add(new DraftCube.CardIdentity("Wooded Foothills",""));
cubeCards.add(new DraftCube.CardIdentity("Woodfall Primus",""));
cubeCards.add(new DraftCube.CardIdentity("Woodland Bellower",""));
cubeCards.add(new DraftCube.CardIdentity("Woodland Cemetery",""));
cubeCards.add(new DraftCube.CardIdentity("Worn Powerstone",""));
cubeCards.add(new DraftCube.CardIdentity("Wrath of God",""));
cubeCards.add(new DraftCube.CardIdentity("Wurmcoil Engine",""));
cubeCards.add(new DraftCube.CardIdentity("Xenagos, the Reveler",""));
cubeCards.add(new DraftCube.CardIdentity("Yavimaya Coast",""));
cubeCards.add(new DraftCube.CardIdentity("Yavimaya Elder",""));
cubeCards.add(new DraftCube.CardIdentity("Yosei, the Morning Star",""));
cubeCards.add(new DraftCube.CardIdentity("Young Pyromancer",""));
cubeCards.add(new DraftCube.CardIdentity("Zealous Conscripts",""));
}
}

View file

@ -63,7 +63,8 @@
<draftCube name="MTGO Holiday Cube 2014" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.HolidayCube2014"/>
<draftCube name="MTGO Holiday Cube 2015" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.HolidayCube2015"/>
<draftCube name="MTGO Legacy Cube (600 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGOLegacyCube"/>
<draftCube name="MTGO Legacy Cube 2015 (600 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGOLegacyCube2015"/>
<draftCube name="MTGO Legacy Cube March 2015 (600 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGOLegacyCubeMarch2015"/>
<draftCube name="MTGO Legacy Cube September 2015 (600 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGOLegacyCubeSeptember2015"/>
<draftCube name="The Peasant's Toolbox (800 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.PeasantsToolboxCube"/>
<draftCube name="www.MTGCube.com (502 cards)" jar="mage-tournament-booster-draft.jar" className="mage.tournament.cubes.MTGCube"/>
</draftCubes>

View file

@ -49,7 +49,8 @@
<draftCube name="MTGO Holiday Cube 2015" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.HolidayCube2015"/>
<draftCube name="MTGO Cube March 2014" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOMarchCube2014"/>
<draftCube name="MTGO Legacy Cube (600 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOLegacyCube"/>
<draftCube name="MTGO Legacy Cube 2015 (600 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOLegacyCube2015"/>
<draftCube name="MTGO Legacy Cube March 2015 (600 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOLegacyCubeMarch2015"/>
<draftCube name="MTGO Legacy Cube September 2015 (600 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGOLegacyCubeSeptember2015"/>
<draftCube name="The Peasant's Toolbox (800 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.PeasantsToolboxCube"/>
<draftCube name="www.MTGCube.com (502 cards)" jar="mage-tournament-booster-draft-${project.version}.jar" className="mage.tournament.cubes.MTGCube"/>
</draftCubes>

View file

@ -36,6 +36,9 @@ import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReentrantLock;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import mage.MageException;
import mage.constants.Constants;
import mage.interfaces.callback.ClientCallback;
import mage.players.net.UserData;
import mage.players.net.UserGroup;
import mage.remote.Connection;
@ -168,15 +171,14 @@ public class Session {
userDataView.isAutoOrderTrigger());
user.setUserData(userData);
} else {
if (userData.getAvatarId() == 51) { // Update special avatar if first avatar is selected
updateAvatar(user.getName(), userData);
}
userData.setAvatarId(userDataView.getAvatarId());
userData.setShowAbilityPickerForced(userDataView.isShowAbilityPickerForced());
userData.setAllowRequestShowHandCards(userDataView.isAllowRequestShowHandCards());
userData.setUserSkipPrioritySteps(userDataView.getUserSkipPrioritySteps());
userData.setConfirmEmptyManaPool(userDataView.confirmEmptyManaPool());
userData.setAskMoveToGraveOrder(userDataView.askMoveToGraveOrder());
user.getUserData().update(userData);
}
if (user.getUserData().getAvatarId() < Constants.MIN_AVATAR_ID
|| user.getUserData().getAvatarId() > Constants.MAX_AVATAR_ID) {
user.getUserData().setAvatarId(Constants.DEFAULT_AVATAR_ID);
}
if (user.getUserData().getAvatarId() == 11) {
user.getUserData().setAvatarId(updateAvatar(user.getName()));
}
return true;
}
@ -187,31 +189,17 @@ public class Session {
//TODO: move to separate class
//TODO: add for checking for private key
switch (userName) {
case "nantuko":
userData.setAvatarId(1000);
break;
case "North":
userData.setAvatarId(1006);
break;
case "BetaSteward":
userData.setAvatarId(1008);
break;
case "loki":
userData.setAvatarId(1012);
break;
case "Ayrat":
userData.setAvatarId(1018);
break;
return 1008;
case "Bandit":
userData.setAvatarId(1020);
break;
default:
userData.setAvatarId(51);
break;
case "Wehk":
userData.setAvatarId(66);
break;
return 1020;
case "fireshoes":
return 1021;
}
return 11;
}
public String getId() {

View file

@ -25,18 +25,21 @@
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package mage.sets;
import java.util.ArrayList;
import java.util.GregorianCalendar;
import java.util.List;
import mage.cards.ExpansionSet;
import mage.cards.repository.CardCriteria;
import mage.cards.repository.CardInfo;
import mage.cards.repository.CardRepository;
import mage.constants.SetType;
/**
*
* @author fireshoes
*/
public class BattleForZendikar extends ExpansionSet {
private static final BattleForZendikar fINSTANCE = new BattleForZendikar();
@ -45,16 +48,33 @@ public class BattleForZendikar extends ExpansionSet {
return fINSTANCE;
}
List<CardInfo> savedSpecialLand = new ArrayList<>();
private BattleForZendikar() {
super("Battle for Zendikar", "BFZ", "mage.sets.battleforzendikar", new GregorianCalendar(2015, 10, 2).getTime(), SetType.EXPANSION);
this.blockName = "Battle for Zendikar";
this.hasBoosters = true;
this.hasBasicLands = true;
this.numBoosterLands = 1;
this.ratioBoosterSpecialLand = 20; // Approximately as rare as opening a foil mythic = 8 * 6 = ~every 48th booster includes one
// I set it to 20 to get it more often
this.numBoosterCommon = 10;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
this.numBoosterSpecial = 0;
}
@Override
public List<CardInfo> getSpecialLand() {
List<CardInfo> specialLand = new ArrayList<>();
if (savedSpecialLand.isEmpty()) {
CardCriteria criteria = new CardCriteria();
criteria.setCodes("EXP");
specialLand.addAll(CardRepository.instance.findCards(criteria));
}
specialLand.addAll(savedSpecialLand);
return specialLand;
}
}

View file

@ -0,0 +1,35 @@
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package mage.sets;
import java.util.GregorianCalendar;
import mage.cards.ExpansionSet;
import mage.constants.SetType;
/**
*
* @author fireshoes
*/
public class OathOfTheGatewatch extends ExpansionSet {
private static final OathOfTheGatewatch fINSTANCE = new OathOfTheGatewatch();
public static OathOfTheGatewatch getInstance() {
return fINSTANCE;
}
private OathOfTheGatewatch() {
super("Oath of the Gatewatch", "OGW", "mage.sets.oathofthegatewatch", new GregorianCalendar(2016, 1, 22).getTime(), SetType.EXPANSION);
this.blockName = "Battle for Zendikar";
this.hasBoosters = true;
this.hasBasicLands = false;
this.numBoosterLands = 1;
this.numBoosterCommon = 10;
this.numBoosterUncommon = 3;
this.numBoosterRare = 1;
this.ratioBoosterMythic = 8;
}
}

View file

@ -0,0 +1,51 @@
/*
* 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 mage.sets;
import java.util.GregorianCalendar;
import mage.cards.ExpansionSet;
import mage.constants.SetType;
/**
*
* @author fireshoes
*/
public class ZendikarExpeditions extends ExpansionSet {
private static final ZendikarExpeditions fINSTANCE = new ZendikarExpeditions();
public static ZendikarExpeditions getInstance() {
return fINSTANCE;
}
private ZendikarExpeditions() {
super("Zendikar Expeditions", "EXP", "mage.sets.zendikarexpeditions", new GregorianCalendar(2015, 10, 2).getTime(), SetType.PROMOTIONAL);
this.hasBoosters = false;
this.hasBasicLands = false;
}
}

View file

@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.BlueManaAbility;
import mage.abilities.mana.WhiteManaAbility;
@ -64,7 +64,7 @@ public class FieldmistBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Fieldmist Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Fieldmist Borderpost enters the battlefield tapped.

View file

@ -32,7 +32,7 @@ import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.GreenManaAbility;
import mage.abilities.mana.RedManaAbility;
@ -64,7 +64,7 @@ public class FirewildBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Firewild Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Veinfire Firewild enters the battlefield tapped.

View file

@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.BlackManaAbility;
import mage.abilities.mana.BlueManaAbility;
@ -64,7 +64,7 @@ public class MistveinBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Mistvein Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Mistvein Borderpost enters the battlefield tapped.

View file

@ -1,38 +1,37 @@
/*
* 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.
*/
* 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 mage.sets.alarareborn;
import java.util.UUID;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.effects.common.DestroyTargetEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.target.common.TargetCreaturePermanent;
/**
@ -44,8 +43,6 @@ public class Terminate extends CardImpl {
public Terminate(UUID ownerId) {
super(ownerId, 46, "Terminate", Rarity.COMMON, new CardType[]{CardType.INSTANT}, "{B}{R}");
this.expansionSetCode = "ARB";
// Destroy target creature. It can't be regenerated.
this.getSpellAbility().addTarget(new TargetCreaturePermanent());

View file

@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.BlackManaAbility;
import mage.abilities.mana.RedManaAbility;
@ -64,7 +64,7 @@ public class VeinfireBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Veinfire Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Veinfire Borderpost enters the battlefield tapped.

View file

@ -34,7 +34,7 @@ import mage.constants.CardType;
import mage.constants.Rarity;
import mage.abilities.common.EntersBattlefieldTappedAbility;
import mage.abilities.costs.AlternativeCostSourceAbility;
import mage.abilities.costs.common.ReturnToHandTargetPermanentCost;
import mage.abilities.costs.common.ReturnToHandChosenControlledPermanentCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.mana.GreenManaAbility;
import mage.abilities.mana.WhiteManaAbility;
@ -64,7 +64,7 @@ public class WildfieldBorderpost extends CardImpl {
// You may pay {1} and return a basic land you control to its owner's hand rather than pay Wildfield Borderpost's mana cost.
Ability ability = new AlternativeCostSourceAbility(new GenericManaCost(1));
ability.addCost(new ReturnToHandTargetPermanentCost(new TargetControlledPermanent(filter)));
ability.addCost(new ReturnToHandChosenControlledPermanentCost(new TargetControlledPermanent(filter)));
this.addAbility(ability);
// Wildfield Borderpost enters the battlefield tapped.

View file

@ -27,22 +27,26 @@
*/
package mage.sets.avacynrestored;
import mage.constants.*;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.mana.AnyColorManaAbility;
import mage.cards.CardImpl;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.target.TargetPermanent;
import mage.target.common.TargetLandPermanent;
import java.util.UUID;
/**
* @author noxx
*/
@ -53,7 +57,6 @@ public class AbundantGrowth extends CardImpl {
this.expansionSetCode = "AVR";
this.subtype.add("Aura");
// Enchant land
TargetPermanent auraTarget = new TargetLandPermanent();
this.getSpellAbility().addTarget(auraTarget);
@ -66,7 +69,9 @@ public class AbundantGrowth extends CardImpl {
// Enchanted land has "{tap}: Add one mana of any color to your mana pool."
Ability gainedAbility = new AnyColorManaAbility(new TapSourceCost());
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA)));
Effect effect = new GainAbilityAttachedEffect(gainedAbility, AttachmentType.AURA);
effect.setText("Enchanted land has \"{tap}: Add one mana of any color to your mana pool.\"");
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, effect));
}
public AbundantGrowth(final AbundantGrowth card) {

View file

@ -28,8 +28,6 @@
package mage.sets.avacynrestored;
import java.util.UUID;
import mage.constants.*;
import mage.abilities.Ability;
import mage.abilities.common.BeginningOfUpkeepTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
@ -38,6 +36,13 @@ import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.cards.CardImpl;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.constants.Zone;
import mage.game.permanent.token.HumanToken;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;

View file

@ -29,7 +29,6 @@ package mage.sets.avacynrestored;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.MageInt;
import mage.ObjectColor;
import mage.abilities.TriggeredAbility;
import mage.abilities.common.BeginningOfYourEndStepTriggeredAbility;
@ -38,7 +37,7 @@ import mage.abilities.decorator.ConditionalTriggeredAbility;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.game.permanent.token.Token;
import mage.game.permanent.token.DemonToken;
import java.util.UUID;
@ -53,7 +52,6 @@ public class DemonicRising extends CardImpl {
super(ownerId, 94, "Demonic Rising", Rarity.RARE, new CardType[]{CardType.ENCHANTMENT}, "{3}{B}{B}");
this.expansionSetCode = "AVR";
// At the beginning of your end step, if you control exactly one creature, put a 5/5 black Demon creature token with flying onto the battlefield.
TriggeredAbility ability = new BeginningOfYourEndStepTriggeredAbility(new CreateTokenEffect(new DemonToken()), false);
this.addAbility(new ConditionalTriggeredAbility(ability, OneControlledCreatureCondition.getInstance(), ruleText));
@ -68,15 +66,3 @@ public class DemonicRising extends CardImpl {
return new DemonicRising(this);
}
}
class DemonToken extends Token {
public DemonToken() {
super("Demon", "a 5/5 black Demon creature token with flying");
cardType.add(CardType.CREATURE);
color.setBlack(true);
subtype.add("Demon");
power = new MageInt(5);
toughness = new MageInt(5);
addAbility(FlyingAbility.getInstance());
}
}

View file

@ -36,7 +36,7 @@ import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.game.permanent.token.Token;
import mage.game.permanent.token.HumanToken;
/**
*
@ -66,15 +66,3 @@ public class VoiceOfTheProvinces extends CardImpl {
return new VoiceOfTheProvinces(this);
}
}
class HumanToken extends Token {
public HumanToken() {
super("Human", "1/1 white Human creature token");
cardType.add(CardType.CREATURE);
color.setWhite(true);
subtype.add("Human");
power = new MageInt(1);
toughness = new MageInt(1);
}
}

View file

@ -0,0 +1,77 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.effects.common.DontUntapInControllersNextUntapStepTargetEffect;
import mage.abilities.effects.common.TapTargetEffect;
import mage.abilities.keyword.DevoidAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.game.permanent.token.EldraziScionToken;
import mage.target.common.TargetCreaturePermanent;
/**
*
* @author LevelX2
*/
public class AdverseConditions extends CardImpl {
public AdverseConditions(UUID ownerId) {
super(ownerId, 54, "Adverse Conditions", Rarity.UNCOMMON, new CardType[]{CardType.INSTANT}, "{3}{U}");
this.expansionSetCode = "BFZ";
// Devoid
Ability ability = new DevoidAbility(this.color);
ability.setRuleAtTheTop(true);
this.addAbility(ability);
// Tap up to two target creatures. Those creatures don't untap during their controller's next untap step.
this.getSpellAbility().addEffect(new TapTargetEffect());
this.getSpellAbility().addTarget(new TargetCreaturePermanent(0, 2));
this.getSpellAbility().addEffect(new DontUntapInControllersNextUntapStepTargetEffect());
// Put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
Effect effect = new CreateTokenEffect(new EldraziScionToken());
effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
this.getSpellAbility().addEffect(effect);
}
public AdverseConditions(final AdverseConditions card) {
super(card);
}
@Override
public AdverseConditions copy() {
return new AdverseConditions(this);
}
}

View file

@ -78,6 +78,7 @@ public class AkoumHellkite extends CardImpl {
return new AkoumHellkite(this);
}
}
class AkoumHellkiteTriggeredAbility extends TriggeredAbilityImpl {
private static final String text = "<i>Landfall</i> - Whenever a land enters the battlefield under your control, {this} deals 1 damage to target creature or player. "

View file

@ -0,0 +1,126 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.DelayedTriggeredAbility;
import mage.abilities.common.LandfallAbility;
import mage.abilities.common.delayed.AtTheBeginOfNextEndStepDelayedTriggeredAbility;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.DoIfCostPaid;
import mage.abilities.effects.common.ExileTargetEffect;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.keyword.TrampleAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.game.Game;
import mage.game.permanent.token.Token;
import mage.target.targetpointer.FixedTarget;
/**
*
* @author LevelX2
*/
public class AkoumStonewaker extends CardImpl {
public AkoumStonewaker(UUID ownerId) {
super(ownerId, 140, "Akoum Stonewaker", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{R}");
this.expansionSetCode = "BFZ";
this.subtype.add("Human");
this.subtype.add("Shaman");
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// <i>Landfall</i> Whenever a land enters the battlefield under your control, you may pay {2}{R}. If you do, put a 3/1 red Elemental creature token with trample and haste onto the battlefield.
// Exile that token at the beginning of the next end step.
this.addAbility(new LandfallAbility(new DoIfCostPaid(new AkoumStonewakerEffect(), new ManaCostsImpl("{2}{R}")), false));
}
public AkoumStonewaker(final AkoumStonewaker card) {
super(card);
}
@Override
public AkoumStonewaker copy() {
return new AkoumStonewaker(this);
}
}
class AkoumStonewakerEffect extends OneShotEffect {
public AkoumStonewakerEffect() {
super(Outcome.PutCreatureInPlay);
this.staticText = "put a 3/1 red Elemental creature token with trample and haste onto the battlefield. Exile that token at the beginning of the next end step";
}
public AkoumStonewakerEffect(final AkoumStonewakerEffect effect) {
super(effect);
}
@Override
public AkoumStonewakerEffect copy() {
return new AkoumStonewakerEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Token token = new AkoumStonewakerElementalToken();
if (token.putOntoBattlefield(1, game, source.getSourceId(), source.getControllerId())) {
ExileTargetEffect exileEffect = new ExileTargetEffect();
exileEffect.setTargetPointer(new FixedTarget(token.getLastAddedToken()));
DelayedTriggeredAbility delayedAbility = new AtTheBeginOfNextEndStepDelayedTriggeredAbility(exileEffect);
delayedAbility.setSourceId(source.getSourceId());
delayedAbility.setControllerId(source.getControllerId());
delayedAbility.setSourceObject(source.getSourceObject(game), game);
game.addDelayedTriggeredAbility(delayedAbility);
return true;
}
return false;
}
}
class AkoumStonewakerElementalToken extends Token {
public AkoumStonewakerElementalToken() {
super("Elemental", "3/1 red Elemental creature token with trample and haste");
cardType.add(CardType.CREATURE);
color.setRed(true);
subtype.add("Elemental");
power = new MageInt(3);
toughness = new MageInt(1);
this.addAbility(TrampleAbility.getInstance());
this.addAbility(HasteAbility.getInstance());
this.setOriginalExpansionSetCode("BFZ");
}
}

View file

@ -0,0 +1,116 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.LinkedHashSet;
import java.util.Set;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.delayed.OnLeaveReturnExiledToBattlefieldAbility;
import mage.abilities.effects.OneShotEffect;
import mage.abilities.effects.common.CreateDelayedTriggeredAbilityEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.filter.Filter;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.PowerPredicate;
import mage.game.Game;
import mage.game.permanent.Permanent;
import mage.players.Player;
import mage.util.CardUtil;
/**
*
* @author LevelX2
*/
public class AlignedHedronNetwork extends CardImpl {
public AlignedHedronNetwork(UUID ownerId) {
super(ownerId, 222, "Aligned Hedron Network", Rarity.RARE, new CardType[]{CardType.ARTIFACT}, "{4}");
this.expansionSetCode = "BFZ";
// When Aligned Hedron Network enters the battlefield, exile all creatures with power 5 or greater until Aligned Hedron Network leaves the battlefield.
this.addAbility(new EntersBattlefieldTriggeredAbility(new AlignedHedronNetworkExileEffect(), false));
}
public AlignedHedronNetwork(final AlignedHedronNetwork card) {
super(card);
}
@Override
public AlignedHedronNetwork copy() {
return new AlignedHedronNetwork(this);
}
}
class AlignedHedronNetworkExileEffect extends OneShotEffect {
private static final FilterCreaturePermanent filter = new FilterCreaturePermanent("creatures with power 5 or greater");
static {
filter.add(new PowerPredicate(Filter.ComparisonType.GreaterThan, 4));
}
public AlignedHedronNetworkExileEffect() {
super(Outcome.Benefit);
this.staticText = "exile all creatures with power 5 or greater until {this} leaves the battlefield";
}
public AlignedHedronNetworkExileEffect(final AlignedHedronNetworkExileEffect effect) {
super(effect);
}
@Override
public AlignedHedronNetworkExileEffect copy() {
return new AlignedHedronNetworkExileEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
Permanent permanent = game.getPermanent(source.getSourceId());
// If Whale leaves the battlefield before its triggered ability resolves,
// the target creature won't be exiled.
if (controller != null && permanent != null) {
Set<Card> toExile = new LinkedHashSet<>();
for (Permanent creature : game.getBattlefield().getActivePermanents(filter, controller.getId(), source.getSourceId(), game)) {
toExile.add(creature);
}
if (!toExile.isEmpty()) {
controller.moveCardsToExile(toExile, source, game, true, CardUtil.getCardExileZoneId(game, source), permanent.getIdName());
new CreateDelayedTriggeredAbilityEffect(new OnLeaveReturnExiledToBattlefieldAbility()).apply(game, source);
}
return true;
}
return false;
}
}

View file

@ -0,0 +1,87 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.GenericManaCost;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.abilities.mana.ConditionalAnyColorManaAbility;
import mage.abilities.mana.conditional.ConditionalSpellManaBuilder;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.FilterSpell;
import mage.filter.common.FilterControlledCreaturePermanent;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.target.common.TargetControlledCreaturePermanent;
/**
*
* @author LevelX2
*/
public class AllyEncampment extends CardImpl {
private static final FilterSpell filter = new FilterSpell("an Ally spell");
static {
filter.add(new SubtypePredicate("Ally"));
}
public AllyEncampment(UUID ownerId) {
super(ownerId, 228, "Ally Encampment", Rarity.RARE, new CardType[]{CardType.LAND}, "");
this.expansionSetCode = "BFZ";
// {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// {T} Add one mana of any color to your mana pool. Spend this mana only to cast an Ally spell.
this.addAbility(new ConditionalAnyColorManaAbility(new TapSourceCost(), 1, new ConditionalSpellManaBuilder(filter), true));
// {1}, {T}, Sacrifice Ally Encampment: Return target Ally you control to its owner's hand.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new ReturnToHandTargetEffect(), new GenericManaCost(1));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetControlledCreaturePermanent(new FilterControlledCreaturePermanent("Ally", "Ally you control")));
this.addAbility(ability);
}
public AllyEncampment(final AllyEncampment card) {
super(card);
}
@Override
public AllyEncampment copy() {
return new AllyEncampment(this);
}
}

View file

@ -0,0 +1,52 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public class AltarsReap extends mage.sets.innistrad.AltarsReap {
public AltarsReap(UUID ownerId) {
super(ownerId);
this.cardNumber = 103;
this.expansionSetCode = "BFZ";
}
public AltarsReap(final AltarsReap card) {
super(card);
}
@Override
public AltarsReap copy() {
return new AltarsReap(this);
}
}

View file

@ -0,0 +1,71 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.filter.common.FilterControlledCreaturePermanent;
/**
*
* @author LevelX2
*/
public class AngelOfRenewal extends CardImpl {
public AngelOfRenewal(UUID ownerId) {
super(ownerId, 18, "Angel of Renewal", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{5}{W}");
this.expansionSetCode = "BFZ";
this.subtype.add("Angel");
this.subtype.add("Ally");
this.power = new MageInt(4);
this.toughness = new MageInt(4);
// Flying
this.addAbility(FlyingAbility.getInstance());
// When Angel of Renewal enters the battlefield, you gain 1 life for each creature you control.
this.addAbility(new EntersBattlefieldTriggeredAbility(new GainLifeEffect(
new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent()))));
}
public AngelOfRenewal(final AngelOfRenewal card) {
super(card);
}
@Override
public AngelOfRenewal copy() {
return new AngelOfRenewal(this);
}
}

View file

@ -0,0 +1,81 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.continuous.BoostSourceEffect;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.filter.common.FilterAttackingCreature;
import mage.filter.predicate.mageobject.SubtypePredicate;
import mage.filter.predicate.permanent.AnotherPredicate;
/**
*
* @author fireshoes
*/
public class AngelicCaptain extends CardImpl {
private static final FilterAttackingCreature filter = new FilterAttackingCreature("other attacking Ally");
static {
filter.add(new SubtypePredicate("Ally"));
filter.add(new AnotherPredicate());
}
public AngelicCaptain(UUID ownerId) {
super(ownerId, 208, "Angelic Captain", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{3}{R}{W}");
this.expansionSetCode = "BFZ";
this.subtype.add("Angel");
this.subtype.add("Ally");
this.power = new MageInt(4);
this.toughness = new MageInt(3);
// Flying
this.addAbility(FlyingAbility.getInstance());
// Whenever Angelic Captain attacks, it gets +1/+1 until end of turn for each other attacking Ally.
PermanentsOnBattlefieldCount value = new PermanentsOnBattlefieldCount(filter);
this.addAbility(new AttacksTriggeredAbility(new BoostSourceEffect(value, value, Duration.EndOfTurn, true), false));
}
public AngelicCaptain(final AngelicCaptain card) {
super(card);
}
@Override
public AngelicCaptain copy() {
return new AngelicCaptain(this);
}
}

View file

@ -0,0 +1,81 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.common.SimpleStaticAbility;
import mage.abilities.effects.common.AttachEffect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.continuous.GainAbilityAttachedEffect;
import mage.abilities.keyword.EnchantAbility;
import mage.abilities.keyword.FlyingAbility;
import mage.cards.CardImpl;
import mage.constants.AttachmentType;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.target.TargetPermanent;
import mage.target.common.TargetCreaturePermanent;
/**
*
* @author LevelX2
*/
public class AngelicGift extends CardImpl {
public AngelicGift(UUID ownerId) {
super(ownerId, 19, "Angelic Gift", Rarity.COMMON, new CardType[]{CardType.ENCHANTMENT}, "{1}{W}");
this.expansionSetCode = "BFZ";
this.subtype.add("Aura");
// Enchant creature
TargetPermanent auraTarget = new TargetCreaturePermanent();
this.getSpellAbility().addTarget(auraTarget);
this.getSpellAbility().addEffect(new AttachEffect(Outcome.AddAbility));
Ability ability = new EnchantAbility(auraTarget.getTargetName());
this.addAbility(ability);
// When Angelic Gift enters the battlefield, draw a card.
this.addAbility(new EntersBattlefieldTriggeredAbility(new DrawCardSourceControllerEffect(1), false));
// Enchanted creature has flying.
this.addAbility(new SimpleStaticAbility(Zone.BATTLEFIELD, new GainAbilityAttachedEffect(FlyingAbility.getInstance(), AttachmentType.AURA)));
}
public AngelicGift(final AngelicGift card) {
super(card);
}
@Override
public AngelicGift copy() {
return new AngelicGift(this);
}
}

View file

@ -0,0 +1,52 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public class Anticipate extends mage.sets.dragonsoftarkir.Anticipate {
public Anticipate(UUID ownerId) {
super(ownerId);
this.cardNumber = 69;
this.expansionSetCode = "BFZ";
}
public Anticipate(final Anticipate card) {
super(card);
}
@Override
public Anticipate copy() {
return new Anticipate(this);
}
}

View file

@ -0,0 +1,101 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.Ability;
import mage.abilities.common.AttacksTriggeredAbility;
import mage.abilities.effects.OneShotEffect;
import mage.cards.CardImpl;
import mage.cards.CardsImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.SetTargetPointer;
import mage.constants.Zone;
import mage.game.Game;
import mage.players.Player;
import mage.target.Target;
import mage.target.common.TargetControlledPermanent;
/**
*
* @author LevelX2
*/
public class BaneOfBalaGed extends CardImpl {
public BaneOfBalaGed(UUID ownerId) {
super(ownerId, 1, "Bane of Bala Ged", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{7}");
this.expansionSetCode = "BFZ";
this.subtype.add("Eldrazi");
this.power = new MageInt(7);
this.toughness = new MageInt(5);
// Whenever Bane of Bala Ged attacks, defending player exiles two permanents he or she controls.
this.addAbility(new AttacksTriggeredAbility(new BaneOfBalaGedEffect(), false, "", SetTargetPointer.PLAYER));
}
public BaneOfBalaGed(final BaneOfBalaGed card) {
super(card);
}
@Override
public BaneOfBalaGed copy() {
return new BaneOfBalaGed(this);
}
}
class BaneOfBalaGedEffect extends OneShotEffect {
public BaneOfBalaGedEffect() {
super(Outcome.Benefit);
this.staticText = "defending player exiles two permanents he or she controls";
}
public BaneOfBalaGedEffect(final BaneOfBalaGedEffect effect) {
super(effect);
}
@Override
public BaneOfBalaGedEffect copy() {
return new BaneOfBalaGedEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player defendingPlayer = game.getPlayer(getTargetPointer().getFirst(game, source));
if (defendingPlayer != null) {
Target target = new TargetControlledPermanent(2);
defendingPlayer.chooseTarget(outcome, target, source, game);
defendingPlayer.moveCards(new CardsImpl(target.getTargets()), null, Zone.EXILED, source, game);
return true;
}
return false;
}
}

View file

@ -0,0 +1,107 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.ConditionalMana;
import mage.MageInt;
import mage.MageObject;
import mage.Mana;
import mage.abilities.Ability;
import mage.abilities.condition.Condition;
import mage.abilities.keyword.HasteAbility;
import mage.abilities.mana.ConditionalAnyColorManaAbility;
import mage.abilities.mana.builder.ConditionalManaBuilder;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.game.Game;
import mage.game.stack.Spell;
/**
*
* @author fireshoes
*/
public class BeastcallerSavant extends CardImpl {
public BeastcallerSavant(UUID ownerId) {
super(ownerId, 170, "Beastcaller Savant", Rarity.RARE, new CardType[]{CardType.CREATURE}, "{1}{G}");
this.expansionSetCode = "BFZ";
this.subtype.add("Elf");
this.subtype.add("Shaman");
this.subtype.add("Ally");
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Haste
this.addAbility(HasteAbility.getInstance());
// {T}: Add one mana of any color to your mana pool. Spend this mana only to cast creature spells.
this.addAbility(new ConditionalAnyColorManaAbility(1, new BeastcallerSavantManaBuilder()));
}
public BeastcallerSavant(final BeastcallerSavant card) {
super(card);
}
@Override
public BeastcallerSavant copy() {
return new BeastcallerSavant(this);
}
}
class BeastcallerSavantManaBuilder extends ConditionalManaBuilder {
@Override
public ConditionalMana build(Object... options) {
return new BeastcallerSavantConditionalMana(this.mana);
}
@Override
public String getRule() {
return "Spend this mana only to cast creature spells";
}
}
class BeastcallerSavantConditionalMana extends ConditionalMana {
public BeastcallerSavantConditionalMana(Mana mana) {
super(mana);
this.staticText = "Spend this mana only to cast creature spells";
addCondition(new BeastcallerSavantManaCondition());
}
}
class BeastcallerSavantManaCondition implements Condition {
@Override
public boolean apply(Game game, Ability source) {
MageObject object = source.getSourceObject(game);
return object != null && (object instanceof Spell) && object.getCardType().contains(CardType.CREATURE);
}
}

View file

@ -0,0 +1,66 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.LandfallAbility;
import mage.abilities.effects.common.continuous.GainAbilitySourceEffect;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
/**
*
* @author LevelX2
*/
public class BelligerentWhiptail extends CardImpl {
public BelligerentWhiptail(UUID ownerId) {
super(ownerId, 141, "Belligerent Whiptail", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{R}");
this.expansionSetCode = "BFZ";
this.subtype.add("Wurm");
this.power = new MageInt(4);
this.toughness = new MageInt(2);
// <i>Landfall</i> Whenever a land enters the battlefield under your control, Belligerent Whiptail gains first strike until end of turn.
this.addAbility(new LandfallAbility(new GainAbilitySourceEffect(FirstStrikeAbility.getInstance(), Duration.EndOfTurn), false));
}
public BelligerentWhiptail(final BelligerentWhiptail card) {
super(card);
}
@Override
public BelligerentWhiptail copy() {
return new BelligerentWhiptail(this);
}
}

View file

@ -0,0 +1,71 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.keyword.CantBeBlockedSourceAbility;
import mage.abilities.keyword.DevoidAbility;
import mage.abilities.keyword.IngestAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
/**
*
* @author fireshoes
*/
public class BenthicInfiltrator extends CardImpl {
public BenthicInfiltrator(UUID ownerId) {
super(ownerId, 55, "Benthic Infiltrator", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{2}{U}");
this.expansionSetCode = "BFZ";
this.subtype.add("Eldrazi");
this.subtype.add("Drone");
this.power = new MageInt(1);
this.toughness = new MageInt(4);
// Devoid
this.addAbility(new DevoidAbility(this.color));
// Ingest
this.addAbility(new IngestAbility());
// Benthic Infiltrator can't be blocked.
this.addAbility(new CantBeBlockedSourceAbility());
}
public BenthicInfiltrator(final BenthicInfiltrator card) {
super(card);
}
@Override
public BenthicInfiltrator copy() {
return new BenthicInfiltrator(this);
}
}

View file

@ -0,0 +1,71 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
/**
*
* @author fireshoes
*/
public class BlightedCataract extends CardImpl {
public BlightedCataract(UUID ownerId) {
super(ownerId, 229, "Blighted Cataract", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
this.expansionSetCode = "BFZ";
// {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// {5}{U}, {T}, Sacrifice Blighted Cataract: Draw two cards.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD, new DrawCardSourceControllerEffect(2), new ManaCostsImpl("{5}{U}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
public BlightedCataract(final BlightedCataract card) {
super(card);
}
@Override
public BlightedCataract copy() {
return new BlightedCataract(this);
}
}

View file

@ -0,0 +1,76 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.SacrificeEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterCreaturePermanent;
import mage.target.common.TargetOpponent;
/**
*
* @author LevelX2
*/
public class BlightedFen extends CardImpl {
public BlightedFen(UUID ownerId) {
super(ownerId, 230, "Blighted Fen", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
this.expansionSetCode = "BFZ";
// {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// {4}{B}, {T}, Sacrifice Blighted Fen: Target opponent sacrifices a creature.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new SacrificeEffect(new FilterCreaturePermanent(), 1, "Target opponent"),
new ManaCostsImpl<>("{4}{B}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetOpponent());
this.addAbility(ability);
}
public BlightedFen(final BlightedFen card) {
super(card);
}
@Override
public BlightedFen copy() {
return new BlightedFen(this);
}
}

View file

@ -0,0 +1,75 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.target.common.TargetCreatureOrPlayer;
/**
*
* @author LevelX2
*/
public class BlightedGorge extends CardImpl {
public BlightedGorge(UUID ownerId) {
super(ownerId, 231, "Blighted Gorge", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
this.expansionSetCode = "BFZ";
// {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// {4}{R}, {T}, Sacrifice Blighted Gorge: Blighted Gorge deals 2 damage to target creature or player.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new DamageTargetEffect(2),
new ManaCostsImpl<>("{4}{R}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
ability.addTarget(new TargetCreatureOrPlayer());
this.addAbility(ability);
}
public BlightedGorge(final BlightedGorge card) {
super(card);
}
@Override
public BlightedGorge copy() {
return new BlightedGorge(this);
}
}

View file

@ -0,0 +1,75 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.dynamicvalue.common.PermanentsOnBattlefieldCount;
import mage.abilities.effects.common.GainLifeEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterControlledCreaturePermanent;
/**
*
* @author LevelX2
*/
public class BlightedSteppe extends CardImpl {
public BlightedSteppe(UUID ownerId) {
super(ownerId, 232, "Blighted Steppe", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
this.expansionSetCode = "BFZ";
// {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// {3}{W}, {T}, Sacrifice Blighted Steppe: You gain 2 life for each creature you control.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new GainLifeEffect(new PermanentsOnBattlefieldCount(new FilterControlledCreaturePermanent("creature you control"), 2)),
new ManaCostsImpl<>("{3}{W}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
public BlightedSteppe(final BlightedSteppe card) {
super(card);
}
@Override
public BlightedSteppe copy() {
return new BlightedSteppe(this);
}
}

View file

@ -0,0 +1,75 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.common.SimpleActivatedAbility;
import mage.abilities.costs.common.SacrificeSourceCost;
import mage.abilities.costs.common.TapSourceCost;
import mage.abilities.costs.mana.ManaCostsImpl;
import mage.abilities.effects.common.search.SearchLibraryPutInPlayEffect;
import mage.abilities.mana.ColorlessManaAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.common.FilterBasicLandCard;
import mage.target.common.TargetCardInLibrary;
/**
*
* @author LevelX2
*/
public class BlightedWoodland extends CardImpl {
public BlightedWoodland(UUID ownerId) {
super(ownerId, 233, "Blighted Woodland", Rarity.UNCOMMON, new CardType[]{CardType.LAND}, "");
this.expansionSetCode = "BFZ";
// {T}: Add {1} to your mana pool.
this.addAbility(new ColorlessManaAbility());
// {3}{G}, {T}, Sacrifice Blighted Woodland: Search your library for up to two basic land cards and put them onto the battlefield tapped. Then shuffle your library.
Ability ability = new SimpleActivatedAbility(Zone.BATTLEFIELD,
new SearchLibraryPutInPlayEffect(new TargetCardInLibrary(0, 2, new FilterBasicLandCard()), true, true),
new ManaCostsImpl<>("{3}{G}"));
ability.addCost(new TapSourceCost());
ability.addCost(new SacrificeSourceCost());
this.addAbility(ability);
}
public BlightedWoodland(final BlightedWoodland card) {
super(card);
}
@Override
public BlightedWoodland copy() {
return new BlightedWoodland(this);
}
}

View file

@ -0,0 +1,71 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.DevoidAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.game.permanent.token.EldraziScionToken;
/**
*
* @author LevelX2
*/
public class Blisterpod extends CardImpl {
public Blisterpod(UUID ownerId) {
super(ownerId, 163, "Blisterpod", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{G}");
this.expansionSetCode = "BFZ";
this.subtype.add("Eldrazi");
this.subtype.add("Drone");
this.power = new MageInt(1);
this.toughness = new MageInt(1);
// Devoid
this.addAbility(new DevoidAbility(this.color));
// When Blisterpod dies, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature: Add {1} to your mana pool."
Effect effect = new CreateTokenEffect(new EldraziScionToken());
effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
this.addAbility(new DiesTriggeredAbility(effect, false));
}
public Blisterpod(final Blisterpod card) {
super(card);
}
@Override
public Blisterpod copy() {
return new Blisterpod(this);
}
}

View file

@ -0,0 +1,66 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.GainLifeControllerTriggeredAbility;
import mage.abilities.effects.common.counter.AddCountersSourceEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.counters.CounterType;
/**
*
* @author LevelX2
*/
public class BloodbondVampire extends CardImpl {
public BloodbondVampire(UUID ownerId) {
super(ownerId, 104, "Bloodbond Vampire", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{2}{B}{B}");
this.expansionSetCode = "BFZ";
this.subtype.add("Vampire");
this.subtype.add("Shaman");
this.subtype.add("Ally");
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Whenever you gain life, put a +1/+1 counter on Bloodbond Vampire.
this.addAbility(new GainLifeControllerTriggeredAbility(new AddCountersSourceEffect(CounterType.P1P1.createInstance()), false));
}
public BloodbondVampire(final BloodbondVampire card) {
super(card);
}
@Override
public BloodbondVampire copy() {
return new BloodbondVampire(this);
}
}

View file

@ -0,0 +1,71 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.effects.common.DamageAllEffect;
import mage.abilities.keyword.AwakenAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.constants.TargetController;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.permanent.ControllerPredicate;
/**
*
* @author LevelX2
*/
public class BoilingEarth extends CardImpl {
private final static FilterCreaturePermanent filter = new FilterCreaturePermanent("creature your opponents control");
static {
filter.add(new ControllerPredicate(TargetController.OPPONENT));
}
public BoilingEarth(UUID ownerId) {
super(ownerId, 142, "Boiling Earth", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{1}{R}");
this.expansionSetCode = "BFZ";
// Boiling Earth deals 1 damage to each creature your opponents control.
this.getSpellAbility().addEffect(new DamageAllEffect(1, filter));
// Awaken 4{6}{R}
this.addAbility(new AwakenAbility(this, 4, "{6}{R}"));
}
public BoilingEarth(final BoilingEarth card) {
super(card);
}
@Override
public BoilingEarth copy() {
return new BoilingEarth(this);
}
}

View file

@ -0,0 +1,52 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
/**
*
* @author LevelX2
*/
public class BoneSplinters extends mage.sets.shardsofalara.BoneSplinters {
public BoneSplinters(UUID ownerId) {
super(ownerId);
this.cardNumber = 105;
this.expansionSetCode = "BFZ";
}
public BoneSplinters(final BoneSplinters card) {
super(card);
}
@Override
public BoneSplinters copy() {
return new BoneSplinters(this);
}
}

View file

@ -0,0 +1,66 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DrawCardSourceControllerEffect;
import mage.abilities.effects.common.discard.DiscardControllerEffect;
import mage.cards.CardImpl;
import mage.constants.AbilityWord;
import mage.constants.CardType;
import mage.constants.Rarity;
/**
*
* @author LevelX2
*/
public class BrilliantSpectrum extends CardImpl {
public BrilliantSpectrum(UUID ownerId) {
super(ownerId, 70, "Brilliant Spectrum", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{3}{U}");
this.expansionSetCode = "BFZ";
// <i>Converge</i> Draw X cards, where X is the number of colors of mana spent to cast Brilliant Spectrum. Then discard two cards.
this.getSpellAbility().setAbilityWord(AbilityWord.CONVERGE);
Effect effect = new DrawCardSourceControllerEffect(ColorsOfManaSpentToCastCount.getInstance());
effect.setText("Draw X cards, where X is the number of colors of mana spent to cast {this}");
this.getSpellAbility().addEffect(effect);
this.getSpellAbility().addEffect(new DiscardControllerEffect(2));
}
public BrilliantSpectrum(final BrilliantSpectrum card) {
super(card);
}
@Override
public BrilliantSpectrum copy() {
return new BrilliantSpectrum(this);
}
}

View file

@ -0,0 +1,117 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.dynamicvalue.common.ColorsOfManaSpentToCastCount;
import mage.abilities.effects.OneShotEffect;
import mage.cards.Card;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Outcome;
import mage.constants.Rarity;
import mage.constants.Zone;
import mage.filter.Filter;
import mage.filter.FilterCard;
import mage.filter.predicate.Predicates;
import mage.filter.predicate.mageobject.CardTypePredicate;
import mage.filter.predicate.mageobject.ConvertedManaCostPredicate;
import mage.game.Game;
import mage.players.Player;
import mage.target.common.TargetCardInLibrary;
/**
*
* @author LevelX2
*/
public class BringToLight extends CardImpl {
public BringToLight(UUID ownerId) {
super(ownerId, 209, "Bring to Light", Rarity.RARE, new CardType[]{CardType.SORCERY}, "{3}{G}{U}");
this.expansionSetCode = "BFZ";
// <i>Converge</i>-Search your library for a creature, instant, or sorcery card with converted mana
// cost less than or equal to the number of colors of mana spent to cast Bring to Light, exile that card,
// then shuffle your library. You may cast that card without paying its mana cost.
this.getSpellAbility().addEffect(new BringToLightEffect());
}
public BringToLight(final BringToLight card) {
super(card);
}
@Override
public BringToLight copy() {
return new BringToLight(this);
}
}
class BringToLightEffect extends OneShotEffect {
public BringToLightEffect() {
super(Outcome.PlayForFree);
this.staticText = "<i>Converge</i> &mdash; Search your library for a creature, instant, or sorcery card with converted mana "
+ "cost less than or equal to the number of colors of mana spent to cast Bring to Light, exile that card, "
+ "then shuffle your library. You may cast that card without paying its mana cost";
}
public BringToLightEffect(final BringToLightEffect effect) {
super(effect);
}
@Override
public BringToLightEffect copy() {
return new BringToLightEffect(this);
}
@Override
public boolean apply(Game game, Ability source) {
Player controller = game.getPlayer(source.getControllerId());
if (controller != null) {
int numberColors = ColorsOfManaSpentToCastCount.getInstance().calculate(game, source, this);
FilterCard filter = new FilterCard();
filter.add(Predicates.or(new CardTypePredicate(CardType.CREATURE), new CardTypePredicate(CardType.INSTANT), new CardTypePredicate(CardType.SORCERY)));
filter.add(new ConvertedManaCostPredicate(Filter.ComparisonType.LessThan, numberColors + 1));
TargetCardInLibrary target = new TargetCardInLibrary(filter);
controller.searchLibrary(target, game);
Card card = controller.getLibrary().getCard(target.getFirstTarget(), game);
if (card != null) {
controller.moveCards(card, null, Zone.EXILED, source, game);
}
controller.shuffleLibrary(game);
if (card != null) {
if (controller.chooseUse(outcome, "Cast " + card.getName() + " without paying its mana cost?", source, game)) {
controller.cast(card.getSpellAbility(), game, true);
}
}
return true;
}
return false;
}
}

View file

@ -0,0 +1,72 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.EntersBattlefieldTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.DevoidAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.game.permanent.token.EldraziScionToken;
/**
*
* @author LevelX2
*/
public class BroodMonitor extends CardImpl {
public BroodMonitor(UUID ownerId) {
super(ownerId, 164, "Brood Monitor", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{4}{G}{G}");
this.expansionSetCode = "BFZ";
this.subtype.add("Eldrazi");
this.subtype.add("Drone");
this.power = new MageInt(3);
this.toughness = new MageInt(3);
// Devoid
this.addAbility(new DevoidAbility(this.color));
// When Brood Monitor enters the battlefield, put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {1} to your mana pool."
Effect effect = new CreateTokenEffect(new EldraziScionToken(), 3);
effect.setText("put three 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool.\"");
this.addAbility(new EntersBattlefieldTriggeredAbility(effect, false));
}
public BroodMonitor(final BroodMonitor card) {
super(card);
}
@Override
public BroodMonitor copy() {
return new BroodMonitor(this);
}
}

View file

@ -0,0 +1,58 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
/**
*
* @author LevelX2
*/
public class BroodhunterWurm extends CardImpl {
public BroodhunterWurm(UUID ownerId) {
super(ownerId, 171, "Broodhunter Wurm", Rarity.COMMON, new CardType[]{CardType.CREATURE}, "{3}{G}");
this.expansionSetCode = "BFZ";
this.subtype.add("Wurm");
this.power = new MageInt(4);
this.toughness = new MageInt(3);
}
public BroodhunterWurm(final BroodhunterWurm card) {
super(card);
}
@Override
public BroodhunterWurm copy() {
return new BroodhunterWurm(this);
}
}

View file

@ -0,0 +1,93 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.Mode;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.DamageTargetEffect;
import mage.abilities.effects.common.ReturnToHandTargetEffect;
import mage.abilities.effects.common.replacement.DealtDamageToCreatureBySourceDies;
import mage.abilities.keyword.DevoidAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Duration;
import mage.constants.Rarity;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.common.FilterSpellOrPermanent;
import mage.target.common.TargetCreatureOrPlaneswalker;
import mage.target.common.TargetSpellOrPermanent;
import mage.watchers.common.DamagedByWatcher;
/**
*
* @author LevelX2
*/
public class BrutalExpulsion extends CardImpl {
private static final FilterSpellOrPermanent filter = new FilterSpellOrPermanent("spell or creature");
static {
filter.setPermanentFilter(new FilterCreaturePermanent());
}
public BrutalExpulsion(UUID ownerId) {
super(ownerId, 200, "Brutal Expulsion", Rarity.RARE, new CardType[]{CardType.INSTANT}, "{2}{U}{R}");
this.expansionSetCode = "BFZ";
// Devoid
Ability ability = new DevoidAbility(this.color);
ability.setRuleAtTheTop(true);
this.addAbility(ability);
// Choose one or both
this.getSpellAbility().getModes().setMinModes(1);
this.getSpellAbility().getModes().setMaxModes(2);
// - Return target spell or creature to its owner's hand;
this.getSpellAbility().addTarget(new TargetSpellOrPermanent(1, 1, filter, false));
this.getSpellAbility().addEffect(new ReturnToHandTargetEffect());
// or Brutal Expulsion deals 2 damage to target creature or planeswalker. If that permanent would be put into a graveyard this turn, exile it instead.
Mode mode = new Mode();
mode.getEffects().add(new DamageTargetEffect(2));
mode.getTargets().add(new TargetCreatureOrPlaneswalker());
Effect effect = new DealtDamageToCreatureBySourceDies(this, Duration.EndOfTurn);
effect.setText("If that permanent would be put into a graveyard this turn, exile it instead");
mode.getEffects().add(effect);
this.getSpellAbility().addMode(mode);
this.getSpellAbility().addWatcher(new DamagedByWatcher());
}
public BrutalExpulsion(final BrutalExpulsion card) {
super(card);
}
@Override
public BrutalExpulsion copy() {
return new BrutalExpulsion(this);
}
}

View file

@ -0,0 +1,69 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.abilities.Ability;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.abilities.keyword.DevoidAbility;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.game.permanent.token.EldraziScionToken;
/**
*
* @author LevelX2
*/
public class CallTheScions extends CardImpl {
public CallTheScions(UUID ownerId) {
super(ownerId, 165, "Call the Scions", Rarity.COMMON, new CardType[]{CardType.SORCERY}, "{2}{G}");
this.expansionSetCode = "BFZ";
// Devoid
Ability ability = new DevoidAbility(this.color);
ability.setRuleAtTheTop(true);
this.addAbility(ability);
// Put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: add {1} to your mana pool."
Effect effect = new CreateTokenEffect(new EldraziScionToken(), 2);
effect.setText("put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have \"Sacrifice this creature: Add {1} to your mana pool.\"");
this.getSpellAbility().addEffect(effect);
}
public CallTheScions(final CallTheScions card) {
super(card);
}
@Override
public CallTheScions copy() {
return new CallTheScions(this);
}
}

View file

@ -0,0 +1,68 @@
/*
* 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 mage.sets.battleforzendikar;
import java.util.UUID;
import mage.MageInt;
import mage.abilities.common.DiesTriggeredAbility;
import mage.abilities.effects.Effect;
import mage.abilities.effects.common.CreateTokenEffect;
import mage.cards.CardImpl;
import mage.constants.CardType;
import mage.constants.Rarity;
import mage.game.permanent.token.EldraziScionToken;
/**
*
* @author LevelX2
*/
public class CarrierThrall extends CardImpl {
public CarrierThrall(UUID ownerId) {
super(ownerId, 106, "Carrier Thrall", Rarity.UNCOMMON, new CardType[]{CardType.CREATURE}, "{1}{B}");
this.expansionSetCode = "BFZ";
this.subtype.add("Vampire");
this.power = new MageInt(2);
this.toughness = new MageInt(1);
// When Carrier Thrall dies, put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has "Sacrifice this creature. Add {1} to your mana pool."
Effect effect = new CreateTokenEffect(new EldraziScionToken());
effect.setText("put a 1/1 colorless Eldrazi Scion creature token onto the battlefield. It has \"Sacrifice this creature: Add {1} to your mana pool.\"");
this.addAbility(new DiesTriggeredAbility(effect, false));
}
public CarrierThrall(final CarrierThrall card) {
super(card);
}
@Override
public CarrierThrall copy() {
return new CarrierThrall(this);
}
}

Some files were not shown because too many files have changed in this diff Show more