parent
9472b078d5
commit
85504af5c4
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,86 +0,0 @@
|
||||||
package magic.data;
|
|
||||||
|
|
||||||
import java.awt.Image;
|
|
||||||
import java.awt.image.BufferedImage;
|
|
||||||
import java.io.File;
|
|
||||||
import java.io.FileInputStream;
|
|
||||||
import java.io.InputStream;
|
|
||||||
import java.util.ArrayList;
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
import javax.swing.ImageIcon;
|
|
||||||
|
|
||||||
import magic.MagicMain;
|
|
||||||
|
|
||||||
public class PlayerImages {
|
|
||||||
|
|
||||||
private static final PlayerImages INSTANCE=new PlayerImages();
|
|
||||||
|
|
||||||
private final File files[];
|
|
||||||
private final int nrOfImages;
|
|
||||||
private final boolean[] loaded;
|
|
||||||
private final ImageIcon[] largeImages;
|
|
||||||
private final ImageIcon[] mediumImages;
|
|
||||||
private final ImageIcon[] smallImages;
|
|
||||||
|
|
||||||
private PlayerImages() {
|
|
||||||
|
|
||||||
files=new File(MagicMain.getGamePath()+File.separator+"avatars").listFiles();
|
|
||||||
nrOfImages=files==null?2:Math.max(2,files.length);
|
|
||||||
loaded=new boolean[nrOfImages];
|
|
||||||
largeImages=new ImageIcon[nrOfImages];
|
|
||||||
mediumImages=new ImageIcon[nrOfImages];
|
|
||||||
smallImages=new ImageIcon[nrOfImages];
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getNrOfImages() {
|
|
||||||
|
|
||||||
return nrOfImages;
|
|
||||||
}
|
|
||||||
|
|
||||||
public List<Integer> getImageIndices() {
|
|
||||||
|
|
||||||
final List<Integer> indices=new ArrayList<Integer>();
|
|
||||||
for (int index=0;index<nrOfImages;index++) {
|
|
||||||
|
|
||||||
indices.add(index);
|
|
||||||
}
|
|
||||||
return indices;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void loadIcon(final int index) {
|
|
||||||
|
|
||||||
loaded[index]=true;
|
|
||||||
BufferedImage image;
|
|
||||||
try {
|
|
||||||
final InputStream stream=new FileInputStream(files[index]);
|
|
||||||
image=ImageIO.read(stream);
|
|
||||||
stream.close();
|
|
||||||
} catch (final Exception ex) {
|
|
||||||
image=IconImages.MISSING;
|
|
||||||
}
|
|
||||||
largeImages[index]=new ImageIcon(image);
|
|
||||||
final Image mediumImage=image.getScaledInstance(image.getWidth()/2,image.getHeight()/2,Image.SCALE_SMOOTH);
|
|
||||||
mediumImages[index]=new ImageIcon(mediumImage);
|
|
||||||
final Image smallImage=image.getScaledInstance(image.getWidth()/4,image.getHeight()/4,Image.SCALE_SMOOTH);
|
|
||||||
smallImages[index]=new ImageIcon(smallImage);
|
|
||||||
}
|
|
||||||
|
|
||||||
public synchronized ImageIcon getIcon(final int index,final int size) {
|
|
||||||
|
|
||||||
if (!loaded[index]) {
|
|
||||||
loadIcon(index);
|
|
||||||
}
|
|
||||||
switch (size) {
|
|
||||||
case 2: return mediumImages[index];
|
|
||||||
case 3: return largeImages[index];
|
|
||||||
default: return smallImages[index];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PlayerImages getInstance() {
|
|
||||||
|
|
||||||
return INSTANCE;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -4,6 +4,7 @@ import java.io.File;
|
||||||
import java.io.FileInputStream;
|
import java.io.FileInputStream;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Properties;
|
import java.util.Properties;
|
||||||
|
|
||||||
|
@ -11,9 +12,10 @@ import magic.MagicMain;
|
||||||
import magic.data.BoosterPackGenerator;
|
import magic.data.BoosterPackGenerator;
|
||||||
import magic.data.CubeDefinitions;
|
import magic.data.CubeDefinitions;
|
||||||
import magic.data.GeneralConfig;
|
import magic.data.GeneralConfig;
|
||||||
import magic.data.PlayerImages;
|
|
||||||
import magic.data.TournamentConfig;
|
import magic.data.TournamentConfig;
|
||||||
import magic.model.phase.MagicDefaultGameplay;
|
import magic.model.phase.MagicDefaultGameplay;
|
||||||
|
import magic.ui.theme.Theme;
|
||||||
|
import magic.ui.theme.ThemeFactory;
|
||||||
|
|
||||||
public class MagicTournament {
|
public class MagicTournament {
|
||||||
|
|
||||||
|
@ -137,18 +139,29 @@ public class MagicTournament {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private List<Integer> getAvatarIndices(final int avatars) {
|
||||||
|
|
||||||
|
final List<Integer> indices=new ArrayList<Integer>();
|
||||||
|
for (int index=0;index<avatars;index++) {
|
||||||
|
|
||||||
|
indices.add(index);
|
||||||
|
}
|
||||||
|
return indices;
|
||||||
|
}
|
||||||
|
|
||||||
private MagicPlayerDefinition[] createPlayers() {
|
private MagicPlayerDefinition[] createPlayers() {
|
||||||
|
|
||||||
final List<Integer> faces=PlayerImages.getInstance().getImageIndices();
|
final Theme theme=ThemeFactory.getInstance().getCurrentTheme();
|
||||||
|
final List<Integer> avatars=getAvatarIndices(theme.getNumberOfAvatars());
|
||||||
|
|
||||||
final MagicPlayerDefinition players[]=new MagicPlayerDefinition[2];
|
final MagicPlayerDefinition players[]=new MagicPlayerDefinition[2];
|
||||||
|
|
||||||
final MagicPlayerDefinition player=new MagicPlayerDefinition(configuration.getName(),false,configuration.getPlayerProfile(),configuration.getAvatar());
|
final MagicPlayerDefinition player=new MagicPlayerDefinition(configuration.getName(),false,configuration.getPlayerProfile(),configuration.getAvatar());
|
||||||
players[0]=player;
|
players[0]=player;
|
||||||
faces.remove(player.getFace());
|
avatars.remove(player.getFace());
|
||||||
|
|
||||||
final int findex=MagicRandom.nextInt(faces.size());
|
final int findex=MagicRandom.nextInt(avatars.size());
|
||||||
final Integer face=faces.get(findex);
|
final Integer face=avatars.get(findex);
|
||||||
players[1]=new MagicPlayerDefinition(COMPUTER,true,configuration.getOpponentProfile(),face);
|
players[1]=new MagicPlayerDefinition(COMPUTER,true,configuration.getOpponentProfile(),face);
|
||||||
|
|
||||||
return players;
|
return players;
|
||||||
|
|
|
@ -24,7 +24,6 @@ import javax.swing.ListCellRenderer;
|
||||||
|
|
||||||
import magic.data.CubeDefinitions;
|
import magic.data.CubeDefinitions;
|
||||||
import magic.data.IconImages;
|
import magic.data.IconImages;
|
||||||
import magic.data.PlayerImages;
|
|
||||||
import magic.data.TournamentConfig;
|
import magic.data.TournamentConfig;
|
||||||
import magic.model.MagicColor;
|
import magic.model.MagicColor;
|
||||||
import magic.ui.theme.Theme;
|
import magic.ui.theme.Theme;
|
||||||
|
@ -47,6 +46,7 @@ public class TournamentDialog extends JDialog implements ActionListener {
|
||||||
private final JComboBox cubeComboBox;
|
private final JComboBox cubeComboBox;
|
||||||
private final JButton okButton;
|
private final JButton okButton;
|
||||||
private final JButton cancelButton;
|
private final JButton cancelButton;
|
||||||
|
private final Theme theme;
|
||||||
|
|
||||||
public TournamentDialog(final MagicFrame frame) {
|
public TournamentDialog(final MagicFrame frame) {
|
||||||
|
|
||||||
|
@ -58,7 +58,7 @@ public class TournamentDialog extends JDialog implements ActionListener {
|
||||||
this.setResizable(false);
|
this.setResizable(false);
|
||||||
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
|
||||||
|
|
||||||
final Theme theme=ThemeFactory.getInstance().getCurrentTheme();
|
theme=ThemeFactory.getInstance().getCurrentTheme();
|
||||||
|
|
||||||
final TournamentConfig config=TournamentConfig.getInstance();
|
final TournamentConfig config=TournamentConfig.getInstance();
|
||||||
config.load();
|
config.load();
|
||||||
|
@ -157,7 +157,7 @@ public class TournamentDialog extends JDialog implements ActionListener {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class AvatarPanel extends JPanel implements ActionListener {
|
private class AvatarPanel extends JPanel implements ActionListener {
|
||||||
|
|
||||||
private static final long serialVersionUID = 1L;
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
@ -173,7 +173,7 @@ public class TournamentDialog extends JDialog implements ActionListener {
|
||||||
setLayout(new BorderLayout(0,5));
|
setLayout(new BorderLayout(0,5));
|
||||||
|
|
||||||
avatarLabel=new JLabel();
|
avatarLabel=new JLabel();
|
||||||
avatarLabel.setIcon(PlayerImages.getInstance().getIcon(avatar,3));
|
avatarLabel.setIcon(theme.getAvatarIcon(avatar,3));
|
||||||
add(avatarLabel,BorderLayout.CENTER);
|
add(avatarLabel,BorderLayout.CENTER);
|
||||||
|
|
||||||
final JPanel buttonPanel=new JPanel();
|
final JPanel buttonPanel=new JPanel();
|
||||||
|
@ -202,15 +202,15 @@ public class TournamentDialog extends JDialog implements ActionListener {
|
||||||
if (source==leftButton) {
|
if (source==leftButton) {
|
||||||
avatar--;
|
avatar--;
|
||||||
if (avatar<0) {
|
if (avatar<0) {
|
||||||
avatar=PlayerImages.getInstance().getNrOfImages()-1;
|
avatar=theme.getNumberOfAvatars()-1;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
avatar++;
|
avatar++;
|
||||||
if (avatar==PlayerImages.getInstance().getNrOfImages()) {
|
if (avatar==theme.getNumberOfAvatars()) {
|
||||||
avatar=0;
|
avatar=0;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
avatarLabel.setIcon(PlayerImages.getInstance().getIcon(avatar,3));
|
avatarLabel.setIcon(theme.getAvatarIcon(avatar,3));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2,11 +2,20 @@ package magic.ui.theme;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
import java.io.File;
|
||||||
|
import java.io.FileInputStream;
|
||||||
|
import java.io.InputStream;
|
||||||
|
import java.util.ArrayList;
|
||||||
|
import java.util.Arrays;
|
||||||
|
import java.util.Collections;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
import javax.swing.ImageIcon;
|
import javax.swing.ImageIcon;
|
||||||
|
|
||||||
|
import magic.MagicMain;
|
||||||
import magic.data.IconImages;
|
import magic.data.IconImages;
|
||||||
import magic.ui.widget.FontsAndBorders;
|
import magic.ui.widget.FontsAndBorders;
|
||||||
|
|
||||||
|
@ -14,11 +23,15 @@ public abstract class AbstractTheme implements Theme {
|
||||||
|
|
||||||
private final String name;
|
private final String name;
|
||||||
private final Map<String,Object> themeMap;
|
private final Map<String,Object> themeMap;
|
||||||
|
private final List<File> avatarFiles;
|
||||||
|
private final PlayerAvatar avatars[];
|
||||||
|
|
||||||
public AbstractTheme(final String name) {
|
public AbstractTheme(final String name) {
|
||||||
|
|
||||||
this.name=name;
|
this.name=name;
|
||||||
themeMap=new HashMap<String,Object>();
|
themeMap=new HashMap<String,Object>();
|
||||||
|
avatarFiles=new ArrayList<File>();
|
||||||
|
avatars=loadAvatars(avatarFiles);
|
||||||
|
|
||||||
addToTheme(TEXTURE_LOGO,null);
|
addToTheme(TEXTURE_LOGO,null);
|
||||||
|
|
||||||
|
@ -120,4 +133,45 @@ public abstract class AbstractTheme implements Theme {
|
||||||
final Object value=themeMap.get(name);
|
final Object value=themeMap.get(name);
|
||||||
return value==null?0:(Integer)value;
|
return value==null?0:(Integer)value;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private PlayerAvatar[] loadAvatars(final List<File> avatarFiles) {
|
||||||
|
|
||||||
|
final File files[]=new File(MagicMain.getGamePath()+File.separator+"avatars").listFiles();
|
||||||
|
if (files==null||files.length<2) {
|
||||||
|
avatarFiles.add(new File("unknown"));
|
||||||
|
avatarFiles.add(new File("unknown"));
|
||||||
|
} else {
|
||||||
|
avatarFiles.addAll(Arrays.asList(files));
|
||||||
|
}
|
||||||
|
Collections.sort(avatarFiles);
|
||||||
|
return new PlayerAvatar[avatarFiles.size()];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNumberOfAvatars() {
|
||||||
|
|
||||||
|
return avatars.length;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public synchronized ImageIcon getAvatarIcon(int index,final int size) {
|
||||||
|
|
||||||
|
if (index<0||index>=avatars.length) {
|
||||||
|
index=0;
|
||||||
|
}
|
||||||
|
PlayerAvatar avatar=avatars[index];
|
||||||
|
if (avatar==null) {
|
||||||
|
BufferedImage image;
|
||||||
|
try {
|
||||||
|
final InputStream stream=new FileInputStream(avatarFiles.get(index));
|
||||||
|
image=ImageIO.read(stream);
|
||||||
|
stream.close();
|
||||||
|
} catch (final Exception ex) {
|
||||||
|
image=IconImages.MISSING;
|
||||||
|
}
|
||||||
|
avatar=new PlayerAvatar(image);
|
||||||
|
avatars[index]=avatar;
|
||||||
|
}
|
||||||
|
return avatar.getIcon(index,size);
|
||||||
|
}
|
||||||
}
|
}
|
|
@ -20,14 +20,37 @@ public class CustomTheme extends AbstractTheme {
|
||||||
|
|
||||||
private static final String THEME_PROPERTIES_FILE="theme.properties";
|
private static final String THEME_PROPERTIES_FILE="theme.properties";
|
||||||
|
|
||||||
|
private static final int MAX_AVATARS=100;
|
||||||
|
|
||||||
private final File file;
|
private final File file;
|
||||||
private ZipFile zipFile=null;
|
private ZipFile zipFile=null;
|
||||||
private boolean loaded=false;
|
private boolean loaded=false;
|
||||||
|
private PlayerAvatar playerAvatars[];
|
||||||
|
private int nrOfAvatars=0;
|
||||||
|
|
||||||
public CustomTheme(final File file,final String name) {
|
public CustomTheme(final File file,final String name) {
|
||||||
|
|
||||||
super(name);
|
super(name);
|
||||||
this.file=file;
|
this.file=file;
|
||||||
|
playerAvatars=new PlayerAvatar[MAX_AVATARS];
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public int getNumberOfAvatars() {
|
||||||
|
|
||||||
|
if (nrOfAvatars==0) {
|
||||||
|
return super.getNumberOfAvatars();
|
||||||
|
}
|
||||||
|
return nrOfAvatars;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public ImageIcon getAvatarIcon(final int index,final int size) {
|
||||||
|
|
||||||
|
if (index>=nrOfAvatars) {
|
||||||
|
return super.getAvatarIcon(index, size);
|
||||||
|
}
|
||||||
|
return playerAvatars[index].getIcon(index,size);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void parseEntry(final String key,final String value) {
|
private void parseEntry(final String key,final String value) {
|
||||||
|
@ -41,6 +64,15 @@ public class CustomTheme extends AbstractTheme {
|
||||||
}
|
}
|
||||||
Object typeValue=null;
|
Object typeValue=null;
|
||||||
final String type=key.substring(0,index);
|
final String type=key.substring(0,index);
|
||||||
|
if ("avatar".equals(type)) {
|
||||||
|
final int avatarIndex=Integer.parseInt(key.substring(index+1));
|
||||||
|
if (avatarIndex>0&&avatarIndex<=MAX_AVATARS) {
|
||||||
|
final BufferedImage image=loadImage("avatars/"+value);
|
||||||
|
playerAvatars[avatarIndex-1]=new PlayerAvatar(image);
|
||||||
|
nrOfAvatars=Math.max(avatarIndex,nrOfAvatars);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
if ("value".equals(type)) {
|
if ("value".equals(type)) {
|
||||||
typeValue=Integer.parseInt(value);
|
typeValue=Integer.parseInt(value);
|
||||||
} else if ("color".equals(type)) {
|
} else if ("color".equals(type)) {
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
package magic.ui.theme;
|
||||||
|
|
||||||
|
import java.awt.Image;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
|
|
||||||
|
import javax.swing.ImageIcon;
|
||||||
|
|
||||||
|
public class PlayerAvatar {
|
||||||
|
|
||||||
|
private static final int LARGE_SIZE=120;
|
||||||
|
private static final int MEDIUM_SIZE=LARGE_SIZE/2;
|
||||||
|
private static final int SMALL_SIZE=LARGE_SIZE/4;
|
||||||
|
|
||||||
|
private final ImageIcon largeIcon;
|
||||||
|
private final ImageIcon mediumIcon;
|
||||||
|
private final ImageIcon smallIcon;
|
||||||
|
|
||||||
|
public PlayerAvatar(final BufferedImage image) {
|
||||||
|
|
||||||
|
final Image largeImage=image.getScaledInstance(LARGE_SIZE,LARGE_SIZE,Image.SCALE_SMOOTH);
|
||||||
|
largeIcon=new ImageIcon(largeImage);
|
||||||
|
final Image mediumImage=image.getScaledInstance(MEDIUM_SIZE,MEDIUM_SIZE,Image.SCALE_SMOOTH);
|
||||||
|
mediumIcon=new ImageIcon(mediumImage);
|
||||||
|
final Image smallImage=image.getScaledInstance(SMALL_SIZE,SMALL_SIZE,Image.SCALE_SMOOTH);
|
||||||
|
smallIcon=new ImageIcon(smallImage);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ImageIcon getIcon(final int index,final int size) {
|
||||||
|
|
||||||
|
switch (size) {
|
||||||
|
case 2: return mediumIcon;
|
||||||
|
case 3: return largeIcon;
|
||||||
|
default: return smallIcon;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
|
@ -65,4 +65,8 @@ public interface Theme {
|
||||||
public Color getChoiceColor();
|
public Color getChoiceColor();
|
||||||
|
|
||||||
public int getValue(final String name);
|
public int getValue(final String name);
|
||||||
|
|
||||||
|
public int getNumberOfAvatars();
|
||||||
|
|
||||||
|
public ImageIcon getAvatarIcon(final int index,final int size);
|
||||||
}
|
}
|
|
@ -8,8 +8,9 @@ import javax.swing.JLabel;
|
||||||
import javax.swing.JPanel;
|
import javax.swing.JPanel;
|
||||||
|
|
||||||
import magic.data.IconImages;
|
import magic.data.IconImages;
|
||||||
import magic.data.PlayerImages;
|
|
||||||
import magic.model.MagicMessage;
|
import magic.model.MagicMessage;
|
||||||
|
import magic.ui.theme.Theme;
|
||||||
|
import magic.ui.theme.ThemeFactory;
|
||||||
|
|
||||||
public class MessagePanel extends JPanel {
|
public class MessagePanel extends JPanel {
|
||||||
|
|
||||||
|
@ -28,8 +29,9 @@ public class MessagePanel extends JPanel {
|
||||||
leftPanel.setOpaque(false);
|
leftPanel.setOpaque(false);
|
||||||
add(leftPanel,BorderLayout.WEST);
|
add(leftPanel,BorderLayout.WEST);
|
||||||
|
|
||||||
|
final Theme theme=ThemeFactory.getInstance().getCurrentTheme();
|
||||||
final int face=message.getPlayer().getPlayerDefinition().getFace();
|
final int face=message.getPlayer().getPlayerDefinition().getFace();
|
||||||
final JLabel playerLabel=new JLabel(PlayerImages.getInstance().getIcon(face,1));
|
final JLabel playerLabel=new JLabel(theme.getAvatarIcon(face,1));
|
||||||
leftPanel.add(playerLabel,BorderLayout.WEST);
|
leftPanel.add(playerLabel,BorderLayout.WEST);
|
||||||
|
|
||||||
final int life=message.getLife();
|
final int life=message.getLife();
|
||||||
|
|
|
@ -8,7 +8,6 @@ import javax.swing.ImageIcon;
|
||||||
import javax.swing.JLabel;
|
import javax.swing.JLabel;
|
||||||
import javax.swing.border.Border;
|
import javax.swing.border.Border;
|
||||||
|
|
||||||
import magic.data.PlayerImages;
|
|
||||||
import magic.model.MagicPlayerDefinition;
|
import magic.model.MagicPlayerDefinition;
|
||||||
import magic.ui.theme.Theme;
|
import magic.ui.theme.Theme;
|
||||||
import magic.ui.theme.ThemeFactory;
|
import magic.ui.theme.ThemeFactory;
|
||||||
|
@ -79,7 +78,8 @@ public class PlayerAvatarPanel extends TexturedPanel {
|
||||||
|
|
||||||
public void update() {
|
public void update() {
|
||||||
|
|
||||||
final ImageIcon faceIcon=PlayerImages.getInstance().getIcon(playerDefinition.getFace(),small?2:3);
|
final Theme theme=ThemeFactory.getInstance().getCurrentTheme();
|
||||||
|
final ImageIcon faceIcon=theme.getAvatarIcon(playerDefinition.getFace(),small?2:3);
|
||||||
faceLabel.setIcon(faceIcon);
|
faceLabel.setIcon(faceIcon);
|
||||||
titleBar.setText(playerDefinition.getName());
|
titleBar.setText(playerDefinition.getName());
|
||||||
if (small) {
|
if (small) {
|
||||||
|
|
Loading…
Reference in New Issue