diff --git a/.gitignore b/.gitignore index f68d109..1db8689 100644 --- a/.gitignore +++ b/.gitignore @@ -26,4 +26,7 @@ bin/ .vscode/ ### Mac OS ### -.DS_Store \ No newline at end of file +.DS_Store + +### this program ### +data/ \ No newline at end of file diff --git a/.idea/artifacts/Clicker_jar.xml b/.idea/artifacts/Clicker_jar.xml new file mode 100644 index 0000000..bc42e67 --- /dev/null +++ b/.idea/artifacts/Clicker_jar.xml @@ -0,0 +1,8 @@ + + + $PROJECT_DIR$/out/artifacts/Clicker_jar + + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 15cec4b..be55cdd 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,4 +1,3 @@ - diff --git a/src/Building.java b/src/Building.java new file mode 100644 index 0000000..1418c94 --- /dev/null +++ b/src/Building.java @@ -0,0 +1,424 @@ +import java.text.DecimalFormat; +import java.util.ArrayList; + +public class Building { + private String name; + private String[] groups; + private String group; + private int level; + private double defaultProduction; + private double unitProduction; + private double defaultPrice; + private Building previousBuilding; + private boolean jobUpgrade; //unknown; + private boolean doubleUpgrade; //100% + private boolean tripleUpgrade; //200% + private boolean sameBuildingUpgrade; //1% per level + private boolean previousBuildingUpgrade; //1% per previous level + private boolean groupUpgrade; // 10% group + private String groupUpgrade10; + private ArrayList groupUpgrade50; // 50% groups upgrades + + public Building(String name, String group, String[] groups, double defaultProduction, double defaultPrice, Building previousBuilding) { // constructor with all upgrades + this.name = name; + this.group = group; + this.groups = groups; + this.defaultProduction = defaultProduction; + this.defaultPrice = defaultPrice; + this.previousBuilding = previousBuilding; + this.unitProduction = defaultProduction; + this.level = 0; + } + public Building(String name, String group, double defaultProduction, double defaultPrice, Building previousBuilding) { // constructor with all upgrades + this.name = name; + this.group = group; + this.defaultProduction = defaultProduction; + this.defaultPrice = defaultPrice; + this.previousBuilding = previousBuilding; + this.unitProduction = defaultProduction; + this.level = 0; + } + + public Building(String name, String group, String groups[], double defaultProduction, double defaultPrice) { // constructor without previous upgrade + this.name = name; + this.group = group; + this.groups = groups; + this.defaultProduction = defaultProduction; + this.defaultPrice = defaultPrice; + this.unitProduction = defaultProduction; + this.level = 0; + } + + public Building(String name, String group, double defaultProduction, double defaultPrice) { // constructor without previous upgrade + this.name = name; + this.group = group; + this.defaultProduction = defaultProduction; + this.defaultPrice = defaultPrice; + this.unitProduction = defaultProduction; + this.level = 0; + } + + public Building(Building building){ + this.name = building.getName(); + this.groups = building.getGroups(); + this.level = building.getLevel(); + this.defaultProduction = building.getDefaultProduction(); + this.defaultPrice = building.getDefaultPrice(); + this.previousBuilding = building.getPreviousBuilding(); + this.jobUpgrade = building.isJobUpgrade(); + this.doubleUpgrade = building.isDoubleUpgrade(); + this.tripleUpgrade = building.isTripleUpgrade(); + this.sameBuildingUpgrade = building.isSameBuildingUpgrade(); + this.previousBuildingUpgrade = building.isPreviousBuildingUpgrade(); + this.groupUpgrade = building.isGroupUpgrade(); + this.groupUpgrade50 = building.groupUpgrade50; + this.groupUpgrade10 = building.groupUpgrade10; + calculateUnitProduction(); + } + + public String getName() { + return name; + } + + public String[] getGroups() { + return groups; + } + + public String getGroup() { + return group; + } + + public void addGroupUpgrade50(String group){ + groupUpgrade50.add(group); + } + + public ArrayList getGroupUpgrade50() { + return groupUpgrade50; + } + + public void setGroupUpgrade50(ArrayList groupUpgrade50) { + this.groupUpgrade50 = groupUpgrade50; + } + + public boolean isJobUpgrade() { + return jobUpgrade; + } + + public void setJobUpgrade(boolean jobUpgrade) { + this.jobUpgrade = jobUpgrade; + } + + public int getLevel() { + return level; + } + + public void setLevel(int level) { + this.level = level; + } + + public double getDefaultProduction() { + return defaultProduction; + } + + public void setDefaultProduction(double defaultProduction) { + this.defaultProduction = defaultProduction; + } + + public String getFormattedUnitProduction() { + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,###,#00"); + if (this.unitProduction < 10) + return smallProd.format(this.unitProduction); + else + return bigProd.format(this.unitProduction); + } + + public double getUnitProduction() { + return this.unitProduction; + } + + public double getDefaultPrice() { + return defaultPrice; + } + + public void setDefaultPrice(double defaultPrice) { + this.defaultPrice = defaultPrice; + } + + public Building getPreviousBuilding() { + return previousBuilding; + } + + public void setPreviousBuilding(Building previousBuilding) { + this.previousBuilding = previousBuilding; + } + + public boolean isDoubleUpgrade() { + return doubleUpgrade; + } + + public void setDoubleUpgrade(boolean doubleUpgrade) { + this.doubleUpgrade = doubleUpgrade; + } + + public boolean isTripleUpgrade() { + return tripleUpgrade; + } + + public void setTripleUpgrade(boolean tripleUpgrade) { + this.tripleUpgrade = tripleUpgrade; + } + + public boolean isSameBuildingUpgrade() { + return sameBuildingUpgrade; + } + + public void setSameBuildingUpgrade(boolean sameBuildingUpgrade) { + this.sameBuildingUpgrade = sameBuildingUpgrade; + } + + public boolean isPreviousBuildingUpgrade() { + return previousBuildingUpgrade; + } + + public void setPreviousBuildingUpgrade(boolean previousBuildingUpgrade) { + this.previousBuildingUpgrade = previousBuildingUpgrade; + } + + public boolean isGroupUpgrade() { + return groupUpgrade; + } + + public void setGroupUpgrade(boolean groupUpgrade) { + this.groupUpgrade = groupUpgrade; + } + + public void addLevel(){ + this.level += 1; + } + + public void delLevel(){ + if(this.level > 0) + this.level -= 1; + } + + public double getUpgradePrice(){ + return this.defaultPrice*Math.pow(1.1, (this.getLevel())); + } + + public String getFormattedUpgradePrice(){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,#00"); + if (this.defaultPrice*Math.pow(1.1, (this.getLevel() + 1)) < 10) + return smallProd.format(this.defaultPrice*Math.pow(1.1, (this.getLevel()))); + else + return bigProd.format(this.defaultPrice*Math.pow(1.1, (this.getLevel()))); + } + + public String getFormattedProduction(){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,#00"); + if (this.unitProduction*this.level < 10) + return smallProd.format(this.unitProduction*this.level); + else + return bigProd.format(this.unitProduction*this.level); + } + + public double getProduction(){ + return this.unitProduction*this.level; + } + + public void calculateUnitProduction(){ + double production = this.defaultProduction; + if (this.doubleUpgrade) { + production += this.defaultProduction; + } + if (this.tripleUpgrade) { + production += this.defaultProduction; + } + if (this.previousBuildingUpgrade && this.previousBuilding != null) { + production += this.defaultProduction * 0.01 * this.previousBuilding.getLevel(); + } + if (this.sameBuildingUpgrade) { + production += this.defaultProduction * 0.01 * this.level; + } + if (this.groupUpgrade) { + production += this.defaultProduction * 0.1; + } + if (this.groupUpgrade50 != null){ + for(int i = 0; i < this.groupUpgrade50.size(); i++) { + production += this.defaultProduction * 0.5; + } + } + this.unitProduction = production; + } + + public static String getFormattedTotalProd(Building[] buildings){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,###,###,###,#00"); + double total = 0; + for (int i = 0; i < buildings.length; i++){ + total += buildings[i].getProduction(); + } + if (total < 10) + return smallProd.format(total); + else + return bigProd.format(total); + } + + public static double getTotalProd(Building[] buildings){ + double total = 0; + for (int i = 0; i < buildings.length; i++){ + total += buildings[i].getProduction(); + } + return total; + } + + public double getUpgradeValue(){ + return this.unitProduction/getUpgradePrice(); + } + + public static bestValue getBestPurchase(Building[] buildings){ + int index = 0; + double value = 0; + for (int i = 0; i < buildings.length; i++){ + if (buildings[i].getUpgradeValue() > value && (buildings[i].getPreviousBuilding() == null || buildings[i].getPreviousBuilding().getLevel() > 0)){ + value = buildings[i].getUpgradeValue(); + index = i; + } + } + return new bestValue(value, index); + } + + public static String getFormattedUpgradeBoost(Building building){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,#00"); + Building newBuilding = new Building(building); + newBuilding.addLevel(); + newBuilding.calculateUnitProduction(); + if (newBuilding.getUnitProduction() < 10) + return smallProd.format(newBuilding.getUnitProduction()); + else + return bigProd.format(newBuilding.getUnitProduction()); + } + + public static double getUpgradeBoost(Building building){ + Building newBuilding = new Building(building); + newBuilding.addLevel(); + newBuilding.calculateUnitProduction(); + return newBuilding.getUnitProduction(); + } + + public static String getFormattedNewProd(Building[] buildings, Building building){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,#00"); + double New = getTotalProd(buildings) + getUpgradeBoost(building); + if (New < 10) + return smallProd.format(New); + else + return bigProd.format(New); + } + + public static betterBuilding getBuildingByName(Building[] buildings, String name){ + Building building = null; + int index = 0; + for (int i = 0; i < buildings.length; i++){ + if(buildings[i].getName().equals(name)) { + building = buildings[i]; + index = i; + } + } + return new betterBuilding(building, index); + } + + public static Building[] getGroup(Building[] buildings, String group, boolean group50){ + ArrayList groupBuildings = new ArrayList<>(); + if(group50) + for (int i = 0; i < buildings.length; i++){ + if(buildings[i].getGroups() != null) + for (int j = 0; j < buildings[i].getGroups().length; j++){ + if(buildings[i].getGroups()[j].equals(group)){ + groupBuildings.add(buildings[i]); + } + } + } + else + for (int i = 0; i < buildings.length; i++){ + if(buildings[i].getGroup() != null) + if(buildings[i].getGroup().equals(group)) + groupBuildings.add(buildings[i]); + } + return groupBuildings.toArray(new Building[0]); + } + + public boolean hasUpgrade(String upgrade){ + switch(upgrade){ + case "Job": + return this.jobUpgrade; + case "100%": + return this.doubleUpgrade; + case "200%": + return this.tripleUpgrade; + case "1% per same building": + return this.sameBuildingUpgrade; + case "1% per previous building": + if (this.previousBuilding != null) + return this.previousBuildingUpgrade; + else + return true; + } + return true; + } + + public boolean hasUpgrade(String upgrade, String group){ + switch(upgrade){ + case "10% group": + return this.groupUpgrade; + case "50% group": + if(this.groupUpgrade50 != null){ + for (int i = 0; i < this.groupUpgrade50.size(); i++){ + if (this.groupUpgrade50.get(i).equals(group)) + return true; + } + } + return false; + } + return true; + } + + public static class bestValue { + private double value; + private int index; + + public bestValue(double value, int index){ + this.value = value; + this.index = index; + } + + public double getValue() { + return value; + } + + public int getIndex() { + return index; + } + } + + public static class betterBuilding { + private Building building; + private int index; + + public betterBuilding(Building building, int index){ + this.building = building; + this.index = index; + } + + public Building getBuilding() { + return building; + } + + public int getIndex() { + return index; + } + } +} diff --git a/src/GUI.java b/src/GUI.java new file mode 100644 index 0000000..8f52c1c --- /dev/null +++ b/src/GUI.java @@ -0,0 +1,700 @@ +import javax.swing.*; +import javax.swing.event.DocumentEvent; +import javax.swing.event.DocumentListener; +import java.awt.*; +import java.awt.event.*; +import java.io.*; +import java.text.DecimalFormat; +import java.text.ParseException; +import java.util.ArrayList; +import java.util.Scanner; + +public class GUI extends JFrame{ + private final Building[] buildings; + private final String[] groups10 = new String[]{"mineur", "fermier", "alchimiste"}; + private final String[] groups50 = new String[]{"humanoide", "gelé", "eau"}; + private ArrayList upgrades; + private JTextField[] levels; + private JTextField[] prod; + private JTextField[] unitprod; + private JLabel[] statsValue; + private static AddUpgradeGUI addUpgradeGUI; + + public GUI(Building[] buildings, ArrayList upgrades){ + this.buildings = buildings; + this.upgrades = upgrades; + setGUI(); + } + + public GUI(Building[] buildings) throws HeadlessException { + this.buildings = buildings; + setGUI(); + } + + public void setGUI(){ + setTitle("Clicker"); + setVisible(true); + setLayout(new GridBagLayout()); + setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);; + addClosingListener(); + + //layouts + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(2, 5, 2, 5); + + //header + JLabel[] header = new JLabel[4]; + header[0] = new JLabel("Buildings"); + header[1] = new JLabel("Levels"); + header[2] = new JLabel("Unit Prod/s"); + header[3] = new JLabel("Building Prod/s"); + header[1].setHorizontalAlignment(JTextField.CENTER); + for (int j = 0; j < header.length; j++){ + header[j].setFont(new Font(header[j].getFont().getName(), Font.PLAIN, 20)); + gbc.gridy = 0; + if (j > 2) + gbc.gridx = (j+2); + if (j == 1) + gbc.gridwidth = 3; + else gbc.gridwidth = 1; + add(header[j], gbc); + } + gbc.gridwidth = 1; + + //body + buildingAdd addListener = new buildingAdd(); + buildingDel delListener = new buildingDel(); + BetterButton[] addButtons = new BetterButton[35]; + BetterButton[] delButtons = new BetterButton[35]; + levels = new JTextField[35]; + prod = new JTextField[35]; + unitprod = new JTextField[35]; + JLabel[] buildingNames = new JLabel[35]; + for (int i = 0; i < addButtons.length; i++){ + //prod + prod[i] = new JTextField(this.buildings[i].getFormattedProduction()); + prod[i].setEditable(false); + prod[i].setPreferredSize(new Dimension(40,20)); + prod[i].setHorizontalAlignment(JTextField.CENTER); + + //unit prod + unitprod[i] = new JTextField(this.buildings[i].getFormattedUnitProduction()); + unitprod[i].setEditable(false); + unitprod[i].setPreferredSize(new Dimension(40,20)); + unitprod[i].setHorizontalAlignment(JTextField.CENTER); + + //levels + levels[i] = new JTextField(this.buildings[i].getLevel() + ""); + levels[i].setEditable(false); + levels[i].setPreferredSize(new Dimension(40,20)); + levels[i].setHorizontalAlignment(JTextField.CENTER); + + //button + addButtons[i] = new BetterButton("+1", i); + delButtons[i] = new BetterButton("-1", i); + addButtons[i].setMargin(new Insets(0, 0, 0, 0)); + delButtons[i].setMargin(new Insets(0, 0, 0, 0)); + addButtons[i].setPreferredSize(new Dimension(20, 20)); + delButtons[i].setPreferredSize(new Dimension(20, 20)); + + //buildings + buildingNames[i] = new JLabel(this.buildings[i].getName()); + gbc.gridy = (i+1); + Object[] body = new Object[]{buildingNames, levels, addButtons, delButtons, unitprod, prod}; + + //add + for (int j = 0; j < body.length; j++){ + if (j == 1) + gbc.insets = new Insets(2, 5, 2, 0); + else if (j == 2) + gbc.insets = new Insets(2, 0, 2, 0); + else if (j == 3) + gbc.insets = new Insets(2, 0, 2, 5); + else + gbc.insets = new Insets(2, 5, 2, 5); + gbc.gridx = j; + add(((Component[]) body[j])[i], gbc); + } + addButtons[i].addActionListener(addListener); + delButtons[i].addActionListener(delListener); + } + + //stats + JLabel stats = new JLabel("Stats"); + stats.setFont(new Font(stats.getFont().getName(), Font.PLAIN, 20)); + gbc.insets = new Insets(2, 30, 2, 5); + gbc.gridx = 6; + gbc.gridy = 0; + add(stats, gbc); + JLabel[] statsName = new JLabel[5]; + statsName[0] = new JLabel("Current Total Production:"); + statsName[1] = new JLabel("Best Purchase:"); + statsName[2] = new JLabel("Purchase Price:"); + statsName[3] = new JLabel("Production Boost:"); + statsName[4] = new JLabel("New Total Production:"); + for (int i = 0; i < statsName.length; i++){ + gbc.gridy = (i+1); + add(statsName[i], gbc); + } + gbc.insets = new Insets(2, 5, 2, 5); + gbc.gridx = 7; + statsValue = new JLabel[5]; + statsValue[0] = new JLabel(Building.getFormattedTotalProd(buildings)); + statsValue[1] = new JLabel(getBestPurchase()[0]); + statsValue[2] = new JLabel(getBestPurchase()[4]); + statsValue[3] = new JLabel(getBestPurchase()[2]); + statsValue[4] = new JLabel(getBestPurchase()[3]); + for (int i = 0; i < statsValue.length; i++){ + gbc.gridy = (i+1); + add(statsValue[i], gbc); + } + + //options + gbc.insets = new Insets(2, 30, 2, 5); + gbc.gridx = 6; + gbc.gridy = 6; + JLabel options = new JLabel("Options"); + options.setFont(new Font(options.getFont().getName(), Font.PLAIN, 20)); + add(options, gbc); + + gbc.gridy++; + purchaseRecommended purchaseListener = new purchaseRecommended(); + BetterButton purchaseRecommended = new BetterButton("Purchase Recommended"); + purchaseRecommended.setMargin(new Insets(0, 0, 0, 0)); + purchaseRecommended.addActionListener(purchaseListener); + add(purchaseRecommended, gbc); + + gbc.gridy++; + addUpgrade addUpgradeListener = new addUpgrade(); + JButton addUpgrade = new JButton("Add Upgrade"); + addUpgrade.setMargin(new Insets(0, 0, 0, 0)); + addUpgrade.addActionListener(addUpgradeListener); + add(addUpgrade, gbc); + + gbc.gridy++; + JButton upgradeList = new JButton("Upgrade List"); + upgradeList.setMargin(new Insets(0, 0, 0, 0)); + add(upgradeList, gbc); + + gbc.gridy++; + JButton showbuildingUpgrades = new JButton("See Buildings's Upgrades"); + showbuildingUpgrades.setMargin(new Insets(0, 0, 0, 0)); + add(showbuildingUpgrades, gbc); + + gbc.gridy++; + JButton reset = new JButton("Reset Data"); + reset.setMargin(new Insets(0, 0, 0, 0)); + add(reset, gbc); + + //pack + pack(); + } + + private class BetterButton extends JButton{ + private int id; + + public BetterButton(String label, int id) throws HeadlessException { + super(label); + this.id = id; + } + public BetterButton(String label) throws HeadlessException { + super(label); + } + + public int getId() { + return id; + } + + public void setId(int id){ + this.id = id; + } + } + + private void updateBuildings(ActionEvent evt){ + + //updates target building + GUI.this.levels[((BetterButton) evt.getSource()).getId()].setText(GUI.this.buildings[((BetterButton) evt.getSource()).getId()].getLevel() + ""); + GUI.this.buildings[((BetterButton) evt.getSource()).getId()].calculateUnitProduction(); + GUI.this.unitprod[((BetterButton) evt.getSource()).getId()].setText(GUI.this.buildings[((BetterButton) evt.getSource()).getId()].getFormattedUnitProduction()); + GUI.this.prod[((BetterButton) evt.getSource()).getId()].setText(GUI.this.buildings[((BetterButton) evt.getSource()).getId()].getFormattedProduction()); + + //updates next building + GUI.this.buildings[((BetterButton) evt.getSource()).getId()+1].calculateUnitProduction(); + GUI.this.unitprod[((BetterButton) evt.getSource()).getId()+1].setText(GUI.this.buildings[((BetterButton) evt.getSource()).getId()+1].getFormattedUnitProduction()); + GUI.this.prod[((BetterButton) evt.getSource()).getId()+1].setText(GUI.this.buildings[((BetterButton) evt.getSource()).getId()+1].getFormattedProduction()); + + updateStats(); + GUI.this.pack(); + } + + private void updateStats(){ + GUI.this.statsValue[0].setText(Building.getFormattedTotalProd(buildings)); + GUI.this.statsValue[1].setText(getBestPurchase()[0]); + GUI.this.statsValue[2].setText(getBestPurchase()[4]); + GUI.this.statsValue[3].setText(getBestPurchase()[2]); + GUI.this.statsValue[4].setText(getBestPurchase()[3]); + GUI.this.pack(); + } + + private String[] getBestPurchase(){ + String[] bestPurchase = new String[5]; + if (Building.getBestPurchase(buildings).getValue() > Upgrade.getBestPurchase(upgrades).getValue()){ + bestPurchase[0] = GUI.this.buildings[Building.getBestPurchase(buildings).getIndex()].getName(); + bestPurchase[1] = "Building"; + bestPurchase[2] = Building.getFormattedUpgradeBoost(buildings[Building.getBestPurchase(buildings).getIndex()]); + bestPurchase[3] = Building.getFormattedNewProd(buildings, GUI.this.buildings[Building.getBestPurchase(buildings).getIndex()]); + bestPurchase[4] = GUI.this.buildings[Building.getBestPurchase(buildings).getIndex()].getFormattedUpgradePrice(); + }else { + bestPurchase[0] = GUI.this.upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getName(); + bestPurchase[1] = "Upgrade"; + bestPurchase[2] = GUI.this.upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getFormattedUpgradeBoost(); + bestPurchase[3] = GUI.this.upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getFormattedNewProd(buildings); + bestPurchase[4] = GUI.this.upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getFormattedPrice(); + } + return bestPurchase; + } + + private class buildingDel implements ActionListener { + @Override + public void actionPerformed(ActionEvent evt) { + GUI.this.buildings[((BetterButton) evt.getSource()).getId()].delLevel(); + updateBuildings(evt); + updateStats(); + } + } + private class buildingAdd implements ActionListener { + @Override + public void actionPerformed(ActionEvent evt) { + GUI.this.buildings[((BetterButton) evt.getSource()).getId()].addLevel(); + updateBuildings(evt); + updateStats(); + } + } + + private class purchaseRecommended implements ActionListener { + @Override + public void actionPerformed(ActionEvent evt) { + if (getBestPurchase()[1].equals("Building")){ + ((BetterButton) evt.getSource()).setId(Building.getBestPurchase(GUI.this.buildings).getIndex()); + GUI.this.buildings[Building.getBestPurchase(GUI.this.buildings).getIndex()].addLevel(); + updateBuildings(evt); + } + else{ + try { + File iFile = new File("./data/upgrades.txt"); + Scanner inputFile = new Scanner(iFile); + File OFile = new File("temp.txt"); + PrintWriter outputFile = new PrintWriter(OFile); + int UpgradeIndex = Upgrade.getBestPurchase(upgrades).getIndex(); + + while (inputFile.hasNextLine()) { + String upgrade = inputFile.nextLine(); + if(!upgrade.equals(upgrades.get(UpgradeIndex).getName()+ "|" + upgrades.get(UpgradeIndex).getType() + "|" + upgrades.get(UpgradeIndex).getTargetName() + "|" + upgrades.get(UpgradeIndex).getPrice())){ + outputFile.println(upgrade); + } + } + + inputFile.close(); + outputFile.close(); + iFile.delete(); + OFile.renameTo(new File("./data/upgrades.txt")); + } catch (FileNotFoundException e) { + throw new RuntimeException(e); + } + upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).applyUpgrade(); + if(upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getGroup() != null){ + for (int i = 0; i < upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getGroup().length; i++){ + ((BetterButton) evt.getSource()).setId(Building.getBuildingByName(buildings, upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getGroup()[i].getName()).getIndex()); + updateBuildings(evt); + } + } + else{ + ((BetterButton) evt.getSource()).setId(Building.getBuildingByName(buildings, upgrades.get(Upgrade.getBestPurchase(upgrades).getIndex()).getBuilding().getName()).getIndex()); + updateBuildings(evt); + } + } + updateStats(); + } + } + + private class addUpgrade implements ActionListener { + public void actionPerformed(ActionEvent evt) { + if (addUpgradeGUI == null) { + addUpgradeGUI = new AddUpgradeGUI(); + } else { + addUpgradeGUI.toFront(); + } + } + } + private void addClosingListener(){ + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + try { + PrintWriter outputFile = new PrintWriter("./data/buildings.txt"); + for (int i = 0; i < GUI.this.buildings.length; i++){ + outputFile.print(GUI.this.buildings[i].getLevel() + "|"); + outputFile.print(GUI.this.buildings[i].isJobUpgrade() + "|"); + outputFile.print(GUI.this.buildings[i].isDoubleUpgrade() + "|"); + outputFile.print(GUI.this.buildings[i].isTripleUpgrade() + "|"); + outputFile.print(GUI.this.buildings[i].isSameBuildingUpgrade() + "|"); + outputFile.print(GUI.this.buildings[i].isPreviousBuildingUpgrade() + "|"); + outputFile.print(GUI.this.buildings[i].isGroupUpgrade() + "|"); + if(GUI.this.buildings[i].getGroupUpgrade50() != null){ + for (int j = 0; j < GUI.this.buildings[i].getGroupUpgrade50().size(); j++) + outputFile.print(GUI.this.buildings[i].getGroupUpgrade50().get(j) + " "); + } + outputFile.println(); + } + outputFile.close(); + } catch (FileNotFoundException ex) { + throw new RuntimeException(ex); + } + + } + }); + } + + private class AddUpgradeGUI extends JFrame{ + + JTextField enterName; + JComboBox selectType; + JComboBox selectTarget; + NumericTextField enterPrice; + JLabel prodBoostValue = new JLabel(); + JLabel newTotalProd = new JLabel(); + JLabel isBestPurchase = new JLabel(); + public AddUpgradeGUI() throws HeadlessException { + //layout + setTitle("Add Upgrade"); + setVisible(true); + setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); + addClosingListener(); + setLayout(new GridBagLayout()); + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(5, 5, 5, 5); + + //page body + gbc.gridx = 0; + gbc.gridy = 0; + gbc.gridwidth = 2; + JLabel addUpgrade = new JLabel("New Upgrade"); + addUpgrade.setFont(new Font(addUpgrade.getFont().getName(), Font.PLAIN, 20)); + add(addUpgrade, gbc); + gbc.gridwidth = 1; + + gbc.gridy++; + JLabel name = new JLabel("Name:"); + add(name, gbc); + + gbc.gridy++; + JLabel type = new JLabel("Type:"); + add(type, gbc); + + gbc.gridy++; + JLabel target = new JLabel("Target:"); + add(target, gbc); + + gbc.gridy++; + JLabel price = new JLabel("Price:"); + add(price, gbc); + + gbc.gridx = 1; + gbc.gridy = 1; + enterName = new JTextField(); + add(enterName, gbc); + + gbc.gridy++; + selectType = new JComboBox<>(); + selectType.addItem("Job"); + selectType.addItem("100%"); + selectType.addItem("200%"); + selectType.addItem("1% per same building"); + selectType.addItem("1% per previous building"); + selectType.addItem("10% group"); + selectType.addItem("50% group"); + selectType.setSelectedItem(null); + add(selectType, gbc); + + + gbc.gridy++; + selectTarget = new JComboBox<>(); + add(selectTarget, gbc); + + gbc.gridy++; + enterPrice = new NumericTextField(); + add(enterPrice, gbc); + + gbc.gridy++; + gbc.gridx = 0; + gbc.gridwidth = 2; + JButton createUpgrade = new JButton("add Upgrade"); + createUpgrade.setHorizontalAlignment(JTextField.CENTER); + add(createUpgrade, gbc); + + //stats + gbc.insets = new Insets(5, 30, 5, 5); + gbc.gridy = 0; + gbc.gridx = 2; + JLabel stats = new JLabel("Stats"); + stats.setFont(new Font(addUpgrade.getFont().getName(), Font.PLAIN, 20)); + add(stats, gbc); + gbc.gridwidth = 1; + + gbc.gridy++; + JLabel totalProd = new JLabel("Current Total Production:"); + add(totalProd, gbc); + + gbc.gridy++; + JLabel prodBoost = new JLabel("Production Boost:"); + add(prodBoost, gbc); + + gbc.gridy++; + JLabel prodTotal = new JLabel("New Total Production:"); + add(prodTotal, gbc); + + gbc.gridy++; + JLabel isBestPurchase = new JLabel("Best Purchase?"); + add(isBestPurchase, gbc); + + + gbc.insets = new Insets(5, 5, 5, 5); + gbc.gridy = 1; + gbc.gridx = 3; + JLabel totalProdValue = new JLabel(Building.getFormattedTotalProd(GUI.this.buildings)); + add(totalProdValue, gbc); + + gbc.insets = new Insets(2, 30, 2, 5); + gbc.gridx = 4; + gbc.gridy = 0; + JLabel options = new JLabel("Options"); + options.setFont(new Font(options.getFont().getName(), Font.PLAIN, 20)); + add(options, gbc); + + gbc.gridy++; + JButton upgradeList = new JButton("Upgrade List"); + upgradeList.setMargin(new Insets(0, 0, 0, 0)); + add(upgradeList, gbc); + + gbc.gridy++; + JButton showbuildingUpgrades = new JButton("See Buildings's Upgrades"); + showbuildingUpgrades.setMargin(new Insets(0, 0, 0, 0)); + add(showbuildingUpgrades, gbc); + + //listeners + + class updateUpgrade implements ActionListener { + @Override + public void actionPerformed(ActionEvent evt) { + updateStats(); + } + } + + DocumentListener textFieldListener = new DocumentListener() { + @Override + public void insertUpdate(DocumentEvent e) { + updateStats(); + } + + @Override + public void removeUpdate(DocumentEvent e) { + updateStats(); + } + + @Override + public void changedUpdate(DocumentEvent e) {} + }; + + updateUpgrade updateUpgradeListener = new updateUpgrade(); + enterName.getDocument().addDocumentListener(textFieldListener); + selectType.addActionListener(updateUpgradeListener); + selectTarget.addActionListener(updateUpgradeListener); + + + selectType.addActionListener(new ActionListener() { // need to remove the possibility to select an a target that already has that upgrade + public void actionPerformed(ActionEvent e) { + if (selectType.getSelectedItem() != null && selectType.getSelectedItem().toString().equals("10% group")){ + selectTarget.removeAllItems(); + for (int i = 0; i < GUI.this.groups10.length; i++){ + if(!Building.getGroup(buildings, GUI.this.groups10[i], false)[0].hasUpgrade("10% group", GUI.this.groups10[i]) && !Upgrade.upgradeExist(GUI.this.upgrades, GUI.this.groups10[i], selectType.getSelectedItem().toString())) + selectTarget.addItem(GUI.this.groups10[i]); + } + selectTarget.setSelectedItem(null); + } + else if (selectType.getSelectedItem() != null && selectType.getSelectedItem().toString().equals("50% group")){ + selectTarget.removeAllItems(); + for (int i = 0; i < GUI.this.groups50.length; i++){ + if(!Building.getGroup(buildings, GUI.this.groups50[i], true)[0].hasUpgrade("50% group", GUI.this.groups50[i]) && !Upgrade.upgradeExist(GUI.this.upgrades, GUI.this.groups50[i], selectType.getSelectedItem().toString())) + selectTarget.addItem(GUI.this.groups50[i]); + } + selectTarget.setSelectedItem(null); + } + if (selectType.getSelectedItem() != null && selectType.getSelectedItem().toString().equals("200%")){ + selectTarget.removeAllItems(); + for (int i = 0; i < GUI.this.buildings.length; i++){ + if(GUI.this.buildings[i].getLevel() > 0 && !GUI.this.buildings[i].hasUpgrade("200%") && GUI.this.buildings[i].hasUpgrade("100%") && !Upgrade.upgradeExist(GUI.this.upgrades, buildings[i].getName(), selectType.getSelectedItem().toString())) + selectTarget.addItem(GUI.this.buildings[i].getName()); + } + selectTarget.setSelectedItem(null); + } + else if (selectType.getSelectedItem() != null) { + selectTarget.removeAllItems(); + for (int i = 0; i < GUI.this.buildings.length; i++){ + if(GUI.this.buildings[i].getLevel() > 0 && !GUI.this.buildings[i].hasUpgrade(selectType.getSelectedItem().toString()) && !Upgrade.upgradeExist(GUI.this.upgrades, buildings[i].getName(), selectType.getSelectedItem().toString())) + selectTarget.addItem(GUI.this.buildings[i].getName()); + } + selectTarget.setSelectedItem(null); + } + else { + selectTarget.removeAllItems(); + } + } + }); + + createUpgrade.addActionListener(new ActionListener() { + public void actionPerformed(ActionEvent e) { + if(!enterName.getText().trim().isEmpty() && selectType.getSelectedItem() != null && selectTarget.getSelectedItem() != null && !enterPrice.getText().trim().isEmpty()){ + try { + PrintWriter outputFile = new PrintWriter(new FileWriter("./data/upgrades.txt", true)); + Scanner inputFile = new Scanner(new File("./data/upgrades.txt")); + if(inputFile.hasNext()) + outputFile.println(); + outputFile.print(enterName.getText() + "|"); + outputFile.print(selectType.getSelectedItem().toString() + "|"); + if(selectType.getSelectedItem().toString().equals("50% group")){ + GUI.this.upgrades.add(new Upgrade(enterName.getText(), selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), true), Integer.parseInt(enterPrice.getText().replaceAll("[^0-9]", "")))); + outputFile.print(selectTarget.getSelectedItem().toString() + "|"); + } + else if(selectType.getSelectedItem().toString().equals("10% group")){ + GUI.this.upgrades.add(new Upgrade(enterName.getText(), selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), false), Integer.parseInt(enterPrice.getText().replaceAll("[^0-9]", "")))); + outputFile.print(selectTarget.getSelectedItem().toString() + "|"); + } + else { + GUI.this.upgrades.add(new Upgrade(enterName.getText(), selectType.getSelectedItem().toString(), Building.getBuildingByName(GUI.this.buildings, selectTarget.getSelectedItem().toString()).getBuilding(), Integer.parseInt(enterPrice.getText().replaceAll("[^0-9]", "")))); + outputFile.print(selectTarget.getSelectedItem().toString() + "|"); + } + outputFile.print(Integer.parseInt(enterPrice.getText().replaceAll("[^0-9]", ""))); + inputFile.close(); + outputFile.close(); + } catch (IOException ex) { + throw new RuntimeException(ex); + } + enterName.setText(""); + enterPrice.setText(""); + selectType.setSelectedItem(null); + GUI.this.updateStats(); + } + } + }); + + //pack + pack(); + } + + public void updateStats(){ + GridBagConstraints gbc = new GridBagConstraints(); + gbc.fill = GridBagConstraints.HORIZONTAL; + gbc.insets = new Insets(5, 5, 5, 5); + gbc.gridy = 2; + gbc.gridx = 3; + // upgrade boost & New prod + if(selectType.getSelectedItem() != null && selectTarget.getSelectedItem() != null){ + if(selectType.getSelectedItem().toString().equals("50% group")){ + AddUpgradeGUI.this.prodBoostValue.setText((new Upgrade("", selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), true), 0)).getFormattedUpgradeBoost()); + AddUpgradeGUI.this.newTotalProd.setText((new Upgrade("", selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), true), 0)).getFormattedNewProd(GUI.this.buildings)); + } + else if(selectType.getSelectedItem().toString().equals("10% group")){ + AddUpgradeGUI.this.prodBoostValue.setText((new Upgrade("", selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), false), 0)).getFormattedUpgradeBoost()); + AddUpgradeGUI.this.newTotalProd.setText((new Upgrade("", selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), false), 0)).getFormattedNewProd(GUI.this.buildings)); + } + else { + AddUpgradeGUI.this.prodBoostValue.setText(new Upgrade("", selectType.getSelectedItem().toString(), Building.getBuildingByName(GUI.this.buildings, selectTarget.getSelectedItem().toString()).getBuilding(), 0).getFormattedUpgradeBoost()); + AddUpgradeGUI.this.newTotalProd.setText(new Upgrade("", selectType.getSelectedItem().toString(), Building.getBuildingByName(GUI.this.buildings, selectTarget.getSelectedItem().toString()).getBuilding(), 0).getFormattedNewProd(GUI.this.buildings)); + } + AddUpgradeGUI.this.add(AddUpgradeGUI.this.prodBoostValue, gbc); + gbc.gridy++; + AddUpgradeGUI.this.add(AddUpgradeGUI.this.newTotalProd, gbc); + } + else { + if(AddUpgradeGUI.this.prodBoostValue != null && AddUpgradeGUI.this.newTotalProd != null) { + AddUpgradeGUI.this.prodBoostValue.setText(""); + AddUpgradeGUI.this.newTotalProd.setText(""); + } + } + // is best purchase + if(selectType.getSelectedItem() != null && selectTarget.getSelectedItem() != null && !enterPrice.getText().trim().isEmpty()){ + // upgrade boost + if(selectType.getSelectedItem().toString().equals("50% group")){ + AddUpgradeGUI.this.isBestPurchase.setText(Boolean.toString((new Upgrade("", selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), true), Integer.parseInt(enterPrice.getText().replaceAll("[^0-9]", "")))).isBestPurchase(GUI.this.upgrades, GUI.this.buildings))); + } + else if(selectType.getSelectedItem().toString().equals("10% group")){ + AddUpgradeGUI.this.isBestPurchase.setText(Boolean.toString((new Upgrade("", selectType.getSelectedItem().toString(), selectTarget.getSelectedItem().toString(), Building.getGroup(GUI.this.buildings, selectTarget.getSelectedItem().toString(), false), Integer.parseInt(enterPrice.getText().replaceAll("[^0-9]", "")))).isBestPurchase(GUI.this.upgrades, GUI.this.buildings))); + } + else { + AddUpgradeGUI.this.isBestPurchase.setText(Boolean.toString(new Upgrade("", selectType.getSelectedItem().toString(), Building.getBuildingByName(GUI.this.buildings, selectTarget.getSelectedItem().toString()).getBuilding(), Integer.parseInt(enterPrice.getText().replaceAll("[^0-9]", ""))).isBestPurchase(GUI.this.upgrades, GUI.this.buildings))); + } + gbc.gridy++; + AddUpgradeGUI.this.add(AddUpgradeGUI.this.isBestPurchase, gbc); + } + else { + if(AddUpgradeGUI.this.isBestPurchase != null) { + AddUpgradeGUI.this.isBestPurchase.setText(""); + } + } + AddUpgradeGUI.this.pack(); + } + + public class NumericTextField extends JTextField { + private DecimalFormat formatter; + + public NumericTextField() { + super(); + + formatter = new DecimalFormat("#,###"); + formatter.setGroupingSize(3); + formatter.setParseIntegerOnly(true); + + addKeyListener(new KeyListener() { + @Override + public void keyTyped(KeyEvent e) { + char c = e.getKeyChar(); + if (!(Character.isDigit(c) || c == KeyEvent.VK_BACK_SPACE || c == KeyEvent.VK_DELETE)) { + e.consume(); + } + } + + @Override + public void keyPressed(KeyEvent e) { + } + + @Override + public void keyReleased(KeyEvent e) { + formatText(); + AddUpgradeGUI.this.updateStats(); + } + }); + } + + private void formatText() { + try { + String text = getText().replaceAll("\\s", ""); + long value = formatter.parse(text).longValue(); + String formattedText = formatter.format(value); + setText(formattedText); + AddUpgradeGUI.this.updateStats(); + } catch (ParseException e) {} + } + } + + private void addClosingListener() { + addWindowListener(new WindowAdapter() { + @Override + public void windowClosing(WindowEvent e) { + addUpgradeGUI = null; + } + }); + } + } +} diff --git a/src/META-INF/MANIFEST.MF b/src/META-INF/MANIFEST.MF new file mode 100644 index 0000000..5ee19cb --- /dev/null +++ b/src/META-INF/MANIFEST.MF @@ -0,0 +1,3 @@ +Manifest-Version: 1.0 +Main-Class: Main + diff --git a/src/Main.java b/src/Main.java index 3e59c38..f5ab5f9 100644 --- a/src/Main.java +++ b/src/Main.java @@ -1,5 +1,103 @@ +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.Scanner; + public class Main { - public static void main(String[] args) { - System.out.println("Hello world!"); + public static void main(String[] args) throws IOException { + + // add all buildings + Building[] Buildings = new Building[35]; + Buildings[0] = new Building("Mine abandonnée", "mineur", 0.1, 1250); + Buildings[1] = new Building("Caverne aux gros cailloux", "mineur", 0.18, 3500, Buildings[0]); + Buildings[2] = new Building("Mine des nains", "mineur", new String[]{"humanoide"}, 0.324, 6000, Buildings[1]); + Buildings[3] = new Building("Jardin de mamie", "fermier", 0.584, 12500); + Buildings[4] = new Building("Cabane de sorcière", "alchimiste", new String[]{}, 1.06, 27500, Buildings[3]); + Buildings[5] = new Building("Ruche Bourdonnate", "alchimiste", new String[]{}, 1.89, 67500, Buildings[4]); + Buildings[6] = new Building("Foret enneigé", "alchimiste", new String[]{"gelé"}, 3.4, 125000, Buildings[5]); + Buildings[7] = new Building("Banquise gelée", "", new String[]{"gelé", "eau"}, 6.12, 315000, Buildings[6]); + Buildings[8] = new Building("Port de pirate", "", new String[]{"humanoide", "eau"}, 11, 650000, Buildings[7]); + Buildings[9] = new Building("Ile volcanique", "fermier", new String[]{}, 20, 1574000, Buildings[8]); + Buildings[10] = new Building("Dune caniculaire", "", new String[]{}, 36, 3150000, Buildings[9]); + Buildings[11] = new Building("Forêt mystique", "", new String[]{}, 64, 6000000, Buildings[10]); + Buildings[12] = new Building("Jungle luxuriante", "", new String[]{}, 115, 11500000, Buildings[11]); + Buildings[13] = new Building("", "", new String[]{}, 0, 0); + Buildings[14] = new Building("", "", new String[]{}, 0, 0); + Buildings[15] = new Building("", "", new String[]{}, 0, 0); + Buildings[16] = new Building("", "", new String[]{}, 0, 0); + Buildings[17] = new Building("", "", new String[]{}, 0, 0); + Buildings[18] = new Building("", "", new String[]{}, 0, 0); + Buildings[19] = new Building("", "", new String[]{}, 0, 0); + Buildings[20] = new Building("", "", new String[]{}, 0, 0); + Buildings[21] = new Building("", "", new String[]{}, 0, 0); + Buildings[22] = new Building("", "", new String[]{}, 0, 0); + Buildings[23] = new Building("", "", new String[]{}, 0, 0); + Buildings[24] = new Building("", "", new String[]{}, 0, 0); + Buildings[25] = new Building("", "", new String[]{}, 0, 0); + Buildings[26] = new Building("", "", new String[]{}, 0, 0); + Buildings[27] = new Building("", "", new String[]{}, 0, 0); + Buildings[28] = new Building("", "", new String[]{}, 0, 0); + Buildings[29] = new Building("", "", new String[]{}, 0, 0); + Buildings[30] = new Building("", "", new String[]{}, 0, 0); + Buildings[31] = new Building("", "", new String[]{}, 0, 0); + Buildings[32] = new Building("", "", new String[]{}, 0, 0); + Buildings[33] = new Building("", "", new String[]{}, 0, 0); + Buildings[34] = new Building("", "", new String[]{}, 0, 0); + + + //makes the dir to store the data txt files + Path path = Paths.get("./data"); + if (Files.exists(path) && Files.isDirectory(path)) { + System.out.println("Directory already exists at: " + path); + } else { + try { + Files.createDirectories(path); + } catch (IOException ignored) {} + } + + // check in the file for the values + File file = new File("./data/buildings.txt"); + if (file.exists()){ + Scanner inputFile = new Scanner(file); + for (int i = 0; i < 35; i++){ + String[] line = inputFile.nextLine().split("\\|"); + Buildings[i].setLevel(Integer.parseInt(line[0])); + Buildings[i].setJobUpgrade(Boolean.parseBoolean(line[1])); + Buildings[i].setDoubleUpgrade(Boolean.parseBoolean(line[2])); + Buildings[i].setTripleUpgrade(Boolean.parseBoolean(line[3])); + Buildings[i].setSameBuildingUpgrade(Boolean.parseBoolean(line[4])); + Buildings[i].setPreviousBuildingUpgrade(Boolean.parseBoolean(line[5])); + Buildings[i].setGroupUpgrade(Boolean.parseBoolean(line[6])); + + if (line.length == 8){ + String[] group = line[7].split(" "); + ArrayList groups = new ArrayList<>(Arrays.asList(group)); + Buildings[i].setGroupUpgrade50(groups); + } + Buildings[i].calculateUnitProduction(); + } + } + + File file2 = new File("./data/upgrades.txt"); + ArrayList upgrades = new ArrayList<>(); + if (file2.exists()){ + Scanner inputFile = new Scanner(file2); + while (inputFile.hasNextLine()){ + String[] line; + line = inputFile.nextLine().split("\\|"); + if (line[1].equals("50% group")){ + upgrades.add(new Upgrade(line[0], line[1], line[2], Building.getGroup(Buildings, line[2], true), Integer.parseInt(line[3]))); + }else + upgrades.add(new Upgrade(line[0], line[1], Building.getBuildingByName(Buildings, line[2]).getBuilding(), Integer.parseInt(line[3]))); + } + inputFile.close(); + } + System.out.println(); + GUI clicker = new GUI(Buildings, upgrades); } -} \ No newline at end of file +} + diff --git a/src/Upgrade.java b/src/Upgrade.java new file mode 100644 index 0000000..738fe24 --- /dev/null +++ b/src/Upgrade.java @@ -0,0 +1,207 @@ +import java.text.DecimalFormat; +import java.util.ArrayList; + +public class Upgrade { + private final String name; + private final String type; + private Building building; + private Building[] group; + private String groupName; + + private boolean multiple; + private final int price; + + public Upgrade(String name, String type, Building building, int price) { + this.name = name; + this.type = type; + this.building = building; + this.price = price; + this.multiple = false; + } + + public Upgrade(String name, String type, String groupName, Building[] group, int price) { + this.name = name; + this.type = type; + this.groupName = groupName; + this.group = group; + this.price = price; + this.multiple = true; + } + + public String getName() { + return name; + } + + public String getType() { + return type; + } + + public int getPrice() { + return price; + } + + public String getFormattedPrice(){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,#00"); + if (this.price < 10) + return smallProd.format(this.price); + else + return bigProd.format(this.price); + } + + public Building getBuilding() { + return building; + } + + public String getTargetName() { + if(this.multiple){ + return this.groupName; + }else + return this.building.getName(); + } + + + public Building[] getGroup() { + return group; + } + + public void applyUpgrade(){ + switch (type){ + case "Job": + this.building.setJobUpgrade(true); + break; + case "100%": + this.building.setDoubleUpgrade(true); + break; + case "200%": + this.building.setTripleUpgrade(true); + break; + case "1% per same building": + this.building.setSameBuildingUpgrade(true); + break; + case "1% per previous building": + this.building.setPreviousBuildingUpgrade(true); + break; + case "10% group": + for (int i = 0; i < this.group.length; i++){ + this.group[i].setGroupUpgrade(true); + } + break; + case "50% group": + for (int i = 0; i < this.group.length; i++){ + this.group[i].addGroupUpgrade50(this.groupName); + } + break; + } + } + + public String getFormattedNewProd(Building[] buildings){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,#00"); + double newProd = Building.getTotalProd(buildings) + getUpgradeBoost(); + if (newProd < 10) + return smallProd.format(newProd); + else + return bigProd.format(newProd); + } + + public String getFormattedUpgradeBoost(){ + DecimalFormat smallProd = new DecimalFormat("#0.00"); + DecimalFormat bigProd = new DecimalFormat("#,#00"); + double boost = getUpgradeBoost(); + if (boost < 10) + return smallProd.format(boost); + else + return bigProd.format(boost); + } + + public double getUpgradeBoost(){ + double total = 0; + if(this.multiple){ + Building[] group = new Building[this.group.length]; + for (int i = 0; i < this.group.length; i++){ + group[i] = new Building(this.group[i]); + } + switch (type){ + case "10% group": + for (int i = 0; i < this.group.length; i++){ + group[i].setGroupUpgrade(true); + } + break; + case "50% group 1": + for (int i = 0; i < this.group.length; i++){ + group[i].addGroupUpgrade50(this.groupName); + } + break; + } + for (int i = 0; i < group.length; i++){ + group[i].calculateUnitProduction(); + total += group[i].getProduction() - this.group[i].getProduction(); + } + }else { + Building building = new Building(this.building); + switch (type){ + case "Job": + building.setJobUpgrade(true); + break; + case "100%": + building.setDoubleUpgrade(true); + break; + case "200%": + building.setTripleUpgrade(true); + break; + case "1% per same building": + building.setSameBuildingUpgrade(true); + break; + case "1% per previous building": + building.setPreviousBuildingUpgrade(true); + break; + } + building.calculateUnitProduction(); + total += building.getProduction() - this.building.getProduction(); + } + return total; + } + + public double getUpgradeValue(){ + return getUpgradeBoost()/this.price; + } + + public static Building.bestValue getBestPurchase(ArrayList upgrades){ + int index = 0; + double value = 0; + for (int i = 0; i < upgrades.size(); i++){ + if (upgrades.get(i).getUpgradeValue() > value){ + value = upgrades.get(i).getUpgradeValue(); + index = i; + } + } + return new Building.bestValue(value, index); + } + + public static Boolean upgradeExist(ArrayList upgrades, String target, String type){ + for (int i = 0; i < upgrades.size(); i++){ + if(target.equals(upgrades.get(i).getTargetName()) && type.equals(upgrades.get(i).getType())) + return true; + } + return false; + } + + public boolean isBestPurchase(ArrayList upgrades, Building[] buildings){ + double value = 0; + for (int i = 0; i < upgrades.size(); i++){ + if (upgrades.get(i).getUpgradeValue() > value){ + value = upgrades.get(i).getUpgradeValue(); + } + } + for (int i = 0; i < buildings.length; i++){ + if (buildings[i].getUpgradeValue() > value){ + value = buildings[i].getUpgradeValue(); + } + } + if (this.getUpgradeValue() > value) + return true; + else + return false; + } +}