Added option to select a random deck for new duel.
parent
395b64a77a
commit
46e63b43c4
|
@ -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 |
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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");
|
||||
|
|
|
@ -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));
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue