Added option to select a random deck for new duel.

master
ubeefx 2011-04-10 19:47:08 +00:00
parent 395b64a77a
commit 46e63b43c4
11 changed files with 106 additions and 23 deletions

View File

@ -27,7 +27,7 @@ Thanks to Salasnet for the felt theme.
Thanks to singularita for creating the scripts to add over 300 additional creature cards to Magarena.
You can play with these cards by selecting the all cube in the "New duel" dialog.
Thanks to Melvin Zhang for implementing the new Monte Carlo Tree Search or MCTS AI.
Thanks to Melvin Zhang for implementing the Monte Carlo Tree Search or MCTS AI.
The AI you want to play against can be selected in the preferences.
Recommended MiniMax AI difficulty level for the best balance of speed and strength is the default 6.
@ -43,9 +43,11 @@ Release 1.11 (April 11, 2011)
- improved displaying of messages with scroll bar and toggle button + F1 shortcut to show or hide messages
- improved mana cost images (if already installed, delete symbols folder in Magarena data folder and load images)
- improved card definition files, they now also contain the image url and cube information
- improved scoring for unnecessary equips
- improved scoring for unnecessary equiping
- three new AI implementations are available next to the default MiniMax AI : Monte Carlo, Vegas and Random
- preferred AI can be selected in preferences
- the preferred AI can be selected in preferences, the deck strength calculator always uses MiniMax AI
- added New and Load Duel buttons on startup screen
- added option to a select random deck from decks folder in New Duel dialog (folder icon)
- fixed Lightning Helix, it can now target your own permanents with filter legal targets enabled

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.6 KiB

View File

@ -18,6 +18,7 @@ import magic.model.MagicColor;
import magic.model.MagicDeck;
import magic.model.MagicPlayerDefinition;
import magic.model.MagicPlayerProfile;
import magic.model.MagicRandom;
public class DeckUtils {
@ -101,6 +102,7 @@ public class DeckUtils {
try {
final MagicDeck deck=new MagicDeck();
deck.setName(new File(filename).getName());
final int colorCount[]=new int[MagicColor.NR_COLORS];
final BufferedReader reader=new BufferedReader(new FileReader(filename));
@ -160,4 +162,44 @@ public class DeckUtils {
player.setDeck(deck);
} catch (final Exception ex) {}
}
private static void retrieveDeckFiles(final File folder,final List<File> deckFiles) {
final File files[]=folder.listFiles();
for (final File file : files) {
if (file.isDirectory()) {
retrieveDeckFiles(file,deckFiles);
} else if (file.getName().endsWith(DECK_EXTENSION)) {
deckFiles.add(file);
}
}
}
public static void loadRandomDeck(final MagicPlayerDefinition player) {
final File deckFile=new File(getDeckFolder());
final List<File> deckFiles=new ArrayList<File>();
retrieveDeckFiles(deckFile,deckFiles);
final int size=deckFiles.size();
if (size==0) {
// Creates a simple default deck.
final MagicDeck deck=new MagicDeck();
deck.setName("Default.dec");
final MagicCardDefinition creature=CardDefinitions.getInstance().getCard("Elite Vanguard");
final MagicCardDefinition land=CardDefinitions.getInstance().getCard("Plains");
for (int count=24;count>0;count--) {
deck.add(creature);
}
for (int count=16;count>0;count--) {
deck.add(land);
}
player.setProfile(new MagicPlayerProfile("w"));
player.setDeck(deck);
} else {
loadDeck(deckFiles.get(MagicRandom.nextInt(size)).toString(),player);
}
}
}

View File

@ -26,6 +26,7 @@ public class IconImages {
public static final ImageIcon ARENA=loadIcon("arena.png");
public static final ImageIcon CUBE=loadIcon("cube.png");
public static final ImageIcon ANY=loadIcon("any.png");
public static final ImageIcon FOLDER=loadIcon("folder.png");
public static final ImageIcon LOG=loadIcon("log.png");
public static final ImageIcon TEXT=loadIcon("text.png");
public static final ImageIcon OK=loadIcon("ok.gif");

View File

@ -14,6 +14,7 @@ public class TournamentConfig {
private static TournamentConfig INSTANCE=new TournamentConfig();
private static final String ANY_DECK="@";
private static final String ANY_THREE="***";
private static final String ANY_TWO="**";
private static final String ANY_ONE="*";
@ -103,7 +104,9 @@ public class TournamentConfig {
private static MagicPlayerProfile getProfile(final String colorText) {
if (ANY_THREE.equals(colorText)) {
if (ANY_DECK.equals(colorText)) {
return new MagicPlayerProfile("");
} else if (ANY_THREE.equals(colorText)) {
return new MagicPlayerProfile(MagicColor.getRandomColors(3));
} else if (ANY_TWO.equals(colorText)) {
return new MagicPlayerProfile(MagicColor.getRandomColors(2));

View File

@ -5,4 +5,16 @@ import java.util.ArrayList;
public class MagicDeck extends ArrayList<MagicCardDefinition> {
private static final long serialVersionUID = 1L;
private String name="Deck";
public void setName(final String name) {
this.name=name;
}
public String getName() {
return name;
}
}

View File

@ -12,6 +12,7 @@ import magic.MagicMain;
import magic.ai.MagicAI;
import magic.data.CubeDefinitions;
import magic.data.DeckGenerator;
import magic.data.DeckUtils;
import magic.data.GeneralConfig;
import magic.data.TournamentConfig;
import magic.model.phase.MagicDefaultGameplay;
@ -215,7 +216,11 @@ public class MagicTournament {
final DeckGenerator generator=new DeckGenerator(cubeDefinition);
for (final MagicPlayerDefinition player : playerDefinitions) {
player.generateDeck(generator);
if (player.getProfile().getNrOfColors()==0) {
DeckUtils.loadRandomDeck(player);
} else {
player.generateDeck(generator);
}
}
}

View File

@ -251,6 +251,7 @@ public class TournamentDialog extends JDialog implements ActionListener {
model.addElement("r");
model.addElement("w");
model.addElement("*");
model.addElement("@");
setModel(model);
setSelectedItem(colors);
this.setFocusable(false);
@ -265,7 +266,12 @@ public class TournamentDialog extends JDialog implements ActionListener {
for (int i=0;i<colors.length();i++) {
final char ch=colors.charAt(i);
final ImageIcon icon=ch=='*'?IconImages.ANY:MagicColor.getColor(ch).getIcon();
final ImageIcon icon;
switch (ch) {
case '*': icon=IconImages.ANY; break;
case '@': icon=IconImages.FOLDER; break;
default: icon=MagicColor.getColor(ch).getIcon(); break;
}
panel.add(new JLabel(icon));
}
panel.setBorder(FontsAndBorders.EMPTY_BORDER);

View File

@ -63,8 +63,7 @@ public class TournamentPanel extends JPanel implements ActionListener {
add(strengthViewer);
playersViewer=new PlayersViewer(tournament);
playersViewer.addChangeListener(deckViewers.getSpellViewer());
playersViewer.addChangeListener(deckViewers.getLandViewer());
playersViewer.addChangeListener(deckViewers);
playersViewer.addChangeListener(statsViewer);
playersViewer.changePlayer(0);
add(playersViewer);

View File

@ -18,8 +18,6 @@ import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
import magic.data.IconImages;
import magic.model.MagicCardDefinition;
@ -32,7 +30,7 @@ import magic.ui.MagicFrame;
import magic.ui.widget.CostPanel;
import magic.ui.widget.FontsAndBorders;
public class DeckViewer extends JPanel implements ChangeListener {
public class DeckViewer extends JPanel {
private static final long serialVersionUID = 1L;
@ -89,10 +87,11 @@ public class DeckViewer extends JPanel implements ChangeListener {
this.nameFont=nameFont;
}
public void setPlayer(final MagicPlayerDefinition player) {
public void changePlayer(final MagicPlayerDefinition player) {
this.player=player;
update();
}
public MagicPlayerDefinition getPlayer() {
@ -100,6 +99,11 @@ public class DeckViewer extends JPanel implements ChangeListener {
return player;
}
public String getDeckName() {
return player==null?"Deck":player.getDeck().getName();
}
public void update() {
final Map<MagicCardDefinition,DeckEntry> entriesMap=new HashMap<MagicCardDefinition,DeckEntry>();
@ -148,13 +152,6 @@ public class DeckViewer extends JPanel implements ChangeListener {
update();
}
@Override
public void stateChanged(ChangeEvent event) {
setPlayer((MagicPlayerDefinition)event.getSource());
update();
}
private static class ColorPanel extends JPanel {
private static final long serialVersionUID = 1L;

View File

@ -9,6 +9,7 @@ import javax.swing.event.ChangeListener;
import magic.data.IconImages;
import magic.model.MagicCubeDefinition;
import magic.model.MagicPlayerDefinition;
import magic.ui.MagicFrame;
import magic.ui.widget.TabSelector;
import magic.ui.widget.TitleBar;
@ -59,23 +60,38 @@ public class DeckViewers extends JPanel implements ChangeListener {
return landViewer;
}
private void updateTitle() {
final String deckName=spellViewer.getDeckName();
titleBar.setText(tabSelector.getSelectedTab()==0?deckName+" : Spells":deckName+" : Lands");
}
public void update() {
spellViewer.update();
landViewer.update();
updateTitle();
}
public void updateAfterEdit() {
spellViewer.updateAfterEdit();
landViewer.update();
updateTitle();
}
@Override
public void stateChanged(final ChangeEvent event) {
final int selectedTab=tabSelector.getSelectedTab();
titleBar.setText(selectedTab==0?"Deck : Spells":"Deck : Lands");
cardLayout.show(cardPanel,""+selectedTab);
final Object source=event.getSource();
if (source instanceof MagicPlayerDefinition) {
final MagicPlayerDefinition player=(MagicPlayerDefinition)source;
spellViewer.changePlayer(player);
landViewer.changePlayer(player);
} else {
final int selectedTab=tabSelector.getSelectedTab();
cardLayout.show(cardPanel,""+selectedTab);
}
updateTitle();
}
}