mirror of
https://github.com/correl/mage.git
synced 2024-12-26 19:16:54 +00:00
Merge pull request #5123 from spjspj/master
Add in new bar chart distribution for the 'M' mana analyse button.
This commit is contained in:
commit
d10e5b720b
2 changed files with 162 additions and 3 deletions
|
@ -1083,10 +1083,10 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
|
||||||
}
|
}
|
||||||
repaint();
|
repaint();
|
||||||
}
|
}
|
||||||
|
|
||||||
private void chooseMatching() {
|
private void chooseMatching() {
|
||||||
Collection<CardView> toMatch = dragCardList();
|
Collection<CardView> toMatch = dragCardList();
|
||||||
|
|
||||||
for (DragCardGridListener l : listeners) {
|
for (DragCardGridListener l : listeners) {
|
||||||
for (CardView card : allCards) {
|
for (CardView card : allCards) {
|
||||||
for (CardView aMatch : toMatch) {
|
for (CardView aMatch : toMatch) {
|
||||||
|
@ -1337,6 +1337,7 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
|
||||||
public void analyseDeck() {
|
public void analyseDeck() {
|
||||||
HashMap<String, Integer> qtys = new HashMap<>();
|
HashMap<String, Integer> qtys = new HashMap<>();
|
||||||
HashMap<String, Integer> pips = new HashMap<>();
|
HashMap<String, Integer> pips = new HashMap<>();
|
||||||
|
HashMap<String, Integer> pips_at_cmcs = new HashMap<>();
|
||||||
HashMap<String, Integer> sourcePips = new HashMap<>();
|
HashMap<String, Integer> sourcePips = new HashMap<>();
|
||||||
HashMap<String, Integer> manaCounts = new HashMap<>();
|
HashMap<String, Integer> manaCounts = new HashMap<>();
|
||||||
pips.put("#w}", 0);
|
pips.put("#w}", 0);
|
||||||
|
@ -1397,10 +1398,31 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
|
||||||
mc = mc.replaceAll("\\{([WUBRG]).([WUBRG])\\}", "{$1}{$2}");
|
mc = mc.replaceAll("\\{([WUBRG]).([WUBRG])\\}", "{$1}{$2}");
|
||||||
mc = mc.replaceAll("\\{", "#");
|
mc = mc.replaceAll("\\{", "#");
|
||||||
mc = mc.toLowerCase(Locale.ENGLISH);
|
mc = mc.toLowerCase(Locale.ENGLISH);
|
||||||
|
int cmc = card.getConvertedManaCost();
|
||||||
|
|
||||||
|
// Do colorless mana pips
|
||||||
|
Pattern regex = Pattern.compile("#([0-9]+)}");
|
||||||
|
Matcher regexMatcher = regex.matcher(mc);
|
||||||
|
while (regexMatcher.find()) {
|
||||||
|
String val = regexMatcher.group(1);
|
||||||
|
int colorless_val = Integer.parseInt(val);
|
||||||
|
int pip_value = 0;
|
||||||
|
if (pips_at_cmcs.get(cmc + "##c}") != null) {
|
||||||
|
pip_value = pips.get("#c}");
|
||||||
|
}
|
||||||
|
pips_at_cmcs.put(cmc + "##c}", colorless_val + pip_value);
|
||||||
|
pips.put("#c}", colorless_val + pip_value);
|
||||||
|
}
|
||||||
|
|
||||||
for (String pip : pips.keySet()) {
|
for (String pip : pips.keySet()) {
|
||||||
int value = pips.get(pip);
|
int value = pips.get(pip);
|
||||||
while (mc.toLowerCase(Locale.ENGLISH).contains(pip)) {
|
while (mc.toLowerCase(Locale.ENGLISH).contains(pip)) {
|
||||||
pips.put(pip, ++value);
|
pips.put(pip, ++value);
|
||||||
|
int pip_value = 0;
|
||||||
|
if (pips_at_cmcs.get(cmc + "#" + pip) != null) {
|
||||||
|
pip_value = pips_at_cmcs.get(cmc + "#" + pip);
|
||||||
|
}
|
||||||
|
pips_at_cmcs.put(cmc + "#" + pip, ++pip_value);
|
||||||
mc = mc.replaceFirst(pip, "");
|
mc = mc.replaceFirst(pip, "");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1448,9 +1470,17 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
|
||||||
panel4.add(new JLabel("Mana sources found:"));
|
panel4.add(new JLabel("Mana sources found:"));
|
||||||
panel4.add(chart3);
|
panel4.add(chart3);
|
||||||
|
|
||||||
|
JPanel panel5 = new JPanel();
|
||||||
|
panel5.setLayout(new BoxLayout(panel5, BoxLayout.Y_AXIS));
|
||||||
|
ManaBarChart chart4 = new ManaBarChart(pips_at_cmcs);
|
||||||
|
chart4.setMinimumSize(new Dimension(200, 200));
|
||||||
|
panel5.add(new JLabel("Mana distribution:"));
|
||||||
|
panel5.add(chart4);
|
||||||
|
|
||||||
panel.add(panel2);
|
panel.add(panel2);
|
||||||
panel.add(panel3);
|
panel.add(panel3);
|
||||||
panel.add(panel4);
|
panel.add(panel4);
|
||||||
|
panel.add(panel5);
|
||||||
|
|
||||||
JFrame frame = new JFrame("JOptionPane showMessageDialog component example");
|
JFrame frame = new JFrame("JOptionPane showMessageDialog component example");
|
||||||
JOptionPane.showMessageDialog(frame, panel, "This is the distribution of colors found", JOptionPane.INFORMATION_MESSAGE);
|
JOptionPane.showMessageDialog(frame, panel, "This is the distribution of colors found", JOptionPane.INFORMATION_MESSAGE);
|
||||||
|
@ -1719,7 +1749,7 @@ public class DragCardGrid extends JPanel implements DragCardSource, DragCardTarg
|
||||||
JMenuItem invertSelection = new JMenuItem("Invert Selection");
|
JMenuItem invertSelection = new JMenuItem("Invert Selection");
|
||||||
invertSelection.addActionListener(e2 -> invertSelection());
|
invertSelection.addActionListener(e2 -> invertSelection());
|
||||||
menu.add(invertSelection);
|
menu.add(invertSelection);
|
||||||
|
|
||||||
JMenuItem chooseMatching = new JMenuItem("Choose Matching");
|
JMenuItem chooseMatching = new JMenuItem("Choose Matching");
|
||||||
chooseMatching.addActionListener(e2 -> chooseMatching());
|
chooseMatching.addActionListener(e2 -> chooseMatching());
|
||||||
menu.add(chooseMatching);
|
menu.add(chooseMatching);
|
||||||
|
|
129
Mage.Client/src/main/java/mage/client/cards/ManaBarChart.java
Normal file
129
Mage.Client/src/main/java/mage/client/cards/ManaBarChart.java
Normal file
|
@ -0,0 +1,129 @@
|
||||||
|
package mage.client.cards;
|
||||||
|
|
||||||
|
import java.awt.BasicStroke;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.awt.Dimension;
|
||||||
|
import java.awt.Graphics;
|
||||||
|
import java.awt.Graphics2D;
|
||||||
|
import java.awt.Rectangle;
|
||||||
|
import java.awt.Stroke;
|
||||||
|
import java.awt.geom.Rectangle2D;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.regex.Matcher;
|
||||||
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
|
import javax.swing.JComponent;
|
||||||
|
|
||||||
|
public class ManaBarChart extends JComponent {
|
||||||
|
|
||||||
|
HashMap<String, Integer> pips_at_cmcs = new HashMap<String, Integer>();
|
||||||
|
|
||||||
|
ManaBarChart() {
|
||||||
|
}
|
||||||
|
|
||||||
|
ManaBarChart(HashMap<String, Integer> pips_at_cmcs) {
|
||||||
|
this.pips_at_cmcs = pips_at_cmcs;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Dimension getPreferredSize() {
|
||||||
|
Dimension preferred = super.getPreferredSize();
|
||||||
|
Dimension minimum = getMinimumSize();
|
||||||
|
Dimension maximum = getMaximumSize();
|
||||||
|
preferred.width = Math.min(Math.max(preferred.width, minimum.width), maximum.width);
|
||||||
|
preferred.height = Math.min(Math.max(preferred.height, minimum.height), maximum.height);
|
||||||
|
return preferred;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void paint(Graphics g) {
|
||||||
|
drawBar((Graphics2D) g, getBounds());
|
||||||
|
}
|
||||||
|
|
||||||
|
void drawBar(Graphics2D g, Rectangle area) {
|
||||||
|
Pattern regex = Pattern.compile("^([0-9]+)##(.)}");
|
||||||
|
HashMap<Integer, Integer> totals_at_cmcs = new HashMap<Integer, Integer>();
|
||||||
|
int max_num_pips = 0;
|
||||||
|
int max_cmc = 0;
|
||||||
|
|
||||||
|
for (String key : pips_at_cmcs.keySet()) {
|
||||||
|
Matcher regexMatcher = regex.matcher(key);
|
||||||
|
int num_pips = pips_at_cmcs.get(key);
|
||||||
|
while (regexMatcher.find()) {
|
||||||
|
String cmc = regexMatcher.group(1);
|
||||||
|
int cmc_num = Integer.parseInt(cmc);
|
||||||
|
if (max_cmc < cmc_num) {
|
||||||
|
max_cmc = cmc_num;
|
||||||
|
}
|
||||||
|
|
||||||
|
int total_at_cmc = 0;
|
||||||
|
if (totals_at_cmcs.get(cmc_num) != null) {
|
||||||
|
total_at_cmc = totals_at_cmcs.get(cmc_num);
|
||||||
|
}
|
||||||
|
totals_at_cmcs.put(cmc_num, total_at_cmc + num_pips);
|
||||||
|
if (max_num_pips < total_at_cmc + num_pips) {
|
||||||
|
max_num_pips = total_at_cmc + num_pips;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
int height_factor = 200 / max_num_pips;
|
||||||
|
int width_factor = 200 / (max_cmc + 2);
|
||||||
|
if (width_factor > 20) {
|
||||||
|
width_factor = 20;
|
||||||
|
}
|
||||||
|
if (width_factor < 11) {
|
||||||
|
width_factor = 11;
|
||||||
|
}
|
||||||
|
|
||||||
|
g.setColor(Color.LIGHT_GRAY);
|
||||||
|
for (int i = 0; i < max_num_pips; i++) {
|
||||||
|
if (i % 10 == 0) {
|
||||||
|
g.drawLine(0, 200 - 1 - i * height_factor, 400, 200 - 1 - i * height_factor);
|
||||||
|
} else if (i % 10 == 5) {
|
||||||
|
Stroke dashed = new BasicStroke(1, BasicStroke.CAP_BUTT, BasicStroke.JOIN_BEVEL, 0, new float[]{5}, 0);
|
||||||
|
Stroke oldstroke = g.getStroke();
|
||||||
|
g.setStroke(dashed);
|
||||||
|
g.drawLine(0, 200 - 1 - i * height_factor, 400, 200 - 1 - i * height_factor);
|
||||||
|
g.setStroke(oldstroke);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
HashMap<Integer, Integer> running_totals_at_cmcs = new HashMap<Integer, Integer>();
|
||||||
|
for (String key : pips_at_cmcs.keySet()) {
|
||||||
|
Matcher regexMatcher = regex.matcher(key);
|
||||||
|
int num_pips = pips_at_cmcs.get(key);
|
||||||
|
while (regexMatcher.find()) {
|
||||||
|
String cmc = regexMatcher.group(1);
|
||||||
|
int cmc_num = Integer.parseInt(cmc);
|
||||||
|
String color = regexMatcher.group(2);
|
||||||
|
|
||||||
|
int total_at_cmc = 0;
|
||||||
|
if (running_totals_at_cmcs.get(cmc_num) != null) {
|
||||||
|
total_at_cmc = running_totals_at_cmcs.get(cmc_num);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (color.equalsIgnoreCase("w")) {
|
||||||
|
g.setColor(Color.WHITE);
|
||||||
|
}
|
||||||
|
if (color.equalsIgnoreCase("u")) {
|
||||||
|
g.setColor(Color.BLUE);
|
||||||
|
}
|
||||||
|
if (color.equalsIgnoreCase("b")) {
|
||||||
|
g.setColor(Color.BLACK);
|
||||||
|
}
|
||||||
|
if (color.equalsIgnoreCase("r")) {
|
||||||
|
g.setColor(Color.RED);
|
||||||
|
}
|
||||||
|
if (color.equalsIgnoreCase("g")) {
|
||||||
|
g.setColor(Color.GREEN);
|
||||||
|
}
|
||||||
|
if (color.equalsIgnoreCase("c")) {
|
||||||
|
g.setColor(Color.DARK_GRAY);
|
||||||
|
}
|
||||||
|
g.fill(new Rectangle2D.Double(cmc_num * width_factor, 200 - 1 - total_at_cmc - num_pips * height_factor, 10, num_pips * height_factor));
|
||||||
|
running_totals_at_cmcs.put(cmc_num, total_at_cmc + num_pips * height_factor);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in a new issue