diff --git a/src/Stances/Stance.java b/src/Stances/Stance.java index 04aa5d69..055514fd 100644 --- a/src/Stances/Stance.java +++ b/src/Stances/Stance.java @@ -14,35 +14,48 @@ public Stance(String stanceStr) { // stance for (int i = 2; i < split.length; i++) { // combos String[] comboSplit = split[i].split(":"); String comboName = comboSplit[0]; - Vector hits = new Vector(); + Vector hits = new Vector(); for (int j = 1; j < comboSplit.length; j++) { // hits String[] hitSplit = comboSplit[j].split(","); double delay = Double.parseDouble(hitSplit[0]); double multiplier = Double.parseDouble(hitSplit[1]); String[] procs = hitSplit[2].split(""); double combs = Double.parseDouble(hitSplit[3]); - hits.add(new Hit(delay, multiplier, procs, combs)); - } + double impact = 0; + double puncture = 0; + double slash = 0; + try { + impact = Double.parseDouble(hitSplit[4]); + puncture = Double.parseDouble(hitSplit[5]); + slash = Double.parseDouble(hitSplit[6]); + } catch (Exception ex) { + // Do nothing + } + hits.add(new Hit(delay, multiplier, procs, combs, impact, puncture, slash)); + } combos.add(new Combo(comboName, hits)); } } - + public String writeOut() { String stanceString = stanceName + ";"; stanceString += weaponType + ";"; - for(Combo combo : combos) { + for (Combo combo : combos) { stanceString += combo.comboName + ":"; - for(Hit hit : combo.hits) { + for (Hit hit : combo.hits) { stanceString += hit.delay + ","; stanceString += hit.multiplier + ","; - for(String proc : hit.procs) { + for (String proc : hit.procs) { stanceString += proc; } stanceString += "," + hit.comboIncrease; + stanceString += "," + hit.iBonus; + stanceString += "," + hit.pBonus; + stanceString += "," + hit.sBonus; stanceString += ":"; } stanceString += ";"; - } + } return stanceString; } @@ -61,12 +74,18 @@ public static class Hit { public double multiplier; public String[] procs; public double comboIncrease; + public double iBonus; + public double pBonus; + public double sBonus; - public Hit(double delay, double muliplier, String[] procs, double comboIncrease) { + public Hit(double delay, double muliplier, String[] procs, double comboIncrease, double i, double p, double s) { this.delay = delay; this.multiplier = muliplier; this.procs = procs; this.comboIncrease = comboIncrease; + this.iBonus = i; + this.pBonus = p; + this.sBonus = s; } } } \ No newline at end of file diff --git a/src/Stances/StanceManagerPanel.java b/src/Stances/StanceManagerPanel.java index c9ea8967..eddd1f6e 100644 --- a/src/Stances/StanceManagerPanel.java +++ b/src/Stances/StanceManagerPanel.java @@ -1,5 +1,6 @@ package Stances; +import java.awt.Container; import java.awt.Dimension; import java.awt.GridLayout; import java.awt.event.ActionEvent; @@ -34,9 +35,6 @@ public class StanceManagerPanel extends JPanel implements ActionListener, ListSelectionListener { - // slash, fire, electric, toxin, gas, magnetic, viral, corrosive, impact, - // puncture, ice, blast, knockdown, radiation - protected JPanel leftPanel = new JPanel(); protected JPanel rightPanel = new JPanel(); protected JPanel namePanel = new JPanel(); @@ -56,6 +54,7 @@ public class StanceManagerPanel extends JPanel implements ActionListener, ListSe protected JLabel multiLabel = new JLabel("Multiplier"); protected JLabel combLabel = new JLabel("Combo Increase"); protected JLabel procLabel = new JLabel("Status Procs"); + protected JLabel bonusLabel = new JLabel("IPS Bonus"); protected JComboBox typeBox = new JComboBox(); protected JComboBox comboBox = new JComboBox(); @@ -102,6 +101,7 @@ public void buildUI() { UIBuilder.labelInit(multiLabel); UIBuilder.labelInit(combLabel); UIBuilder.labelInit(procLabel); + UIBuilder.labelInit(bonusLabel); UIBuilder.listInit(stanceList); UIBuilder.scrollPaneInit(listScroll); @@ -153,6 +153,7 @@ public void buildUI() { hitLabelsPanel.add(multiLabel); hitLabelsPanel.add(combLabel); hitLabelsPanel.add(procLabel); + hitLabelsPanel.add(bonusLabel); hitButtonsPanel.add(addHitButton); hitButtonsPanel.add(delHitButton); @@ -209,6 +210,9 @@ public void updateCombo() { double delay = checkNumber(((JTextField) p.getComponent(0)).getText()); double multi = checkNumber(((JTextField) p.getComponent(1)).getText()); double comb = checkNumber(((JTextField) p.getComponent(2)).getText()); + double impact = checkNumber(((JTextField) ((Container) p.getComponent(4)).getComponent(0)).getText()); + double puncture = checkNumber(((JTextField) ((Container) p.getComponent(4)).getComponent(1)).getText()); + double slash = checkNumber(((JTextField) ((Container) p.getComponent(4)).getComponent(2)).getText()); // slash, fire, electric, toxin, gas, magnetic, viral, corrosive, impact, puncture, ice, blast, knockdown, radiation String[] procs = { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" }; int[] selectedProcs = ((JList) p.getComponent(3)).getSelectedIndices(); @@ -223,7 +227,7 @@ public void updateCombo() { procs[12] = "1"; } } - hits.add(new Hit(delay, multi, procs, (int) comb)); + hits.add(new Hit(delay, multi, procs, (int) comb, impact, puncture, slash)); } Combo c = new Combo((String) comboBox.getSelectedItem(), hits); @@ -247,12 +251,27 @@ public JPanel hitPanel(Hit h) { JTextField combs = new JTextField(); DefaultListModel procsModel = new DefaultListModel(); JList procs = new JList(procsModel); + + JPanel bonusPanel = new JPanel(); + JTextField iBonus = new JTextField(); + JTextField pBonus = new JTextField(); + JTextField sBonus = new JTextField(); UIBuilder.panelInit(hitPanel); UIBuilder.numberFieldInit(delay); UIBuilder.numberFieldInit(multi); UIBuilder.numberFieldInit(combs); UIBuilder.listInit(procs); + + UIBuilder.panelInit(bonusPanel); + UIBuilder.numberFieldInit(iBonus); + UIBuilder.numberFieldInit(pBonus); + UIBuilder.numberFieldInit(sBonus); + bonusPanel.setLayout(new GridLayout(1, 3, 0, 0)); + + iBonus.setToolTipText("Impact bonus on hit"); + pBonus.setToolTipText("Puncture bonus on hit"); + sBonus.setToolTipText("Slash bonus on hit"); procs.setSelectionModel(new DefaultListSelectionModel() { @Override @@ -278,10 +297,19 @@ public void setSelectionInterval(int index0, int index1) { hitPanel.add(multi); hitPanel.add(combs); hitPanel.add(procs); + + bonusPanel.add(iBonus); + bonusPanel.add(pBonus); + bonusPanel.add(sBonus); + hitPanel.add(bonusPanel); delay.setText(Double.toString(h.delay)); multi.setText(Double.toString(h.multiplier)); combs.setText(Double.toString(h.comboIncrease)); + + iBonus.setText(Double.toString(h.iBonus)); + pBonus.setText(Double.toString(h.pBonus)); + sBonus.setText(Double.toString(h.sBonus)); int size = 0; for (int i = 0; i < 14; i++) { @@ -291,8 +319,7 @@ public void setSelectionInterval(int index0, int index1) { } int[] procy = new int[size]; - // slash, fire, electric, toxin, gas, magnetic, viral, corrosive, impact, - // puncture, ice, blast, knockdown, radiation + // slash, fire, electric, toxin, gas, magnetic, viral, corrosive, impact, puncture, ice, blast, knockdown, radiation int k = 0; for (int i = 0; i < 14; i++) { @@ -402,7 +429,7 @@ public void actionPerformed(ActionEvent e) { } } else if (e.getSource().equals(addHitButton)) { String[] s = { "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0", "0" }; - Hit h = new Stance.Hit(0, 0, s, 0); + Hit h = new Stance.Hit(0, 0, s, 0, 0, 0 ,0); JPanel p = hitPanel(h); UIBuilder.createSepparationBorder(p); hitsPanels.add(p); diff --git a/src/main/Main.java b/src/main/Main.java index 6bd35bb6..92ea9407 100644 --- a/src/main/Main.java +++ b/src/main/Main.java @@ -1845,6 +1845,8 @@ protected static void calculateFinals() { double tempCombo = startingCombo; if (startingCombo < 2) { tempCombo = 0; + } else { + tempCombo-=1; } startingCombo = 1; // Melee no long multiplies damage by combo averageStatusChance += (tempCombo * comboStatus * statusChance); @@ -1970,20 +1972,35 @@ protected static void calculateMiscValues() { // Condition overload if (conditionOverload > 0) { - COMult += replaceNaN(1 - Math.pow((1 - slashProcRate * averageStatusChance) * (1 - forcedSlashProcs), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - fireProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - toxinProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - gasProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - electricProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - impactProcRate * averageStatusChance) * (1 - forcedImpactProcs), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - punctureProcRate * averageStatusChance) * (1 - forcedPunctureProcs), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - iceProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); + double statusLength = 6 * finalStatusDuration; + + /* Technically more accurate calculation, but not neccessary + double comboLength = (avgDelay * stanceCombo.hits.size()) / finalFireRate; + COMult += forcedSlashProcs > 0 ? replaceNaN(Math.min(1, statusLength / comboLength)) : 0; + COMult += (forcedSlashProcs > 0 ? 1 - Math.min(1, statusLength / comboLength) : 1) * replaceNaN(1 - Math.pow((1 - slashProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += forcedImpactProcs > 0 ? replaceNaN(Math.min(1, statusLength / comboLength)) : 0; + COMult += (forcedImpactProcs > 0 ? 1 - Math.min(1, statusLength / comboLength) : 1) * replaceNaN(1 - Math.pow((1 - impactProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += forcedPunctureProcs > 0 ? replaceNaN(Math.min(1, statusLength / comboLength)) : 0; + COMult += (forcedPunctureProcs > 0 ? 1 - Math.min(1, statusLength / comboLength) : 1) * replaceNaN(1 - Math.pow((1 - punctureProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += forcedKnockdownProcs > 0 ? replaceNaN(Math.min(1, statusLength / comboLength)) : 0; + COMult += (forcedKnockdownProcs > 0 ? 1 - Math.min(1, statusLength / comboLength) : 1) * replaceNaN(1 - Math.pow((1 - blastProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + */ + + // Assuming that forced procs are always active for the sake of CO. It would only be innacruate for builds with very low attack speed. + COMult += forcedSlashProcs > 0 ? 1 : replaceNaN(1 - Math.pow((1 - slashProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += forcedImpactProcs > 0 ? 1 : replaceNaN(1 - Math.pow((1 - impactProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += forcedPunctureProcs > 0 ? 1 : replaceNaN(1 - Math.pow((1 - punctureProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += forcedKnockdownProcs > 0 ? 1 : replaceNaN(1 - Math.pow((1 - blastProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += replaceNaN(1 - Math.pow((1 - fireProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += replaceNaN(1 - Math.pow((1 - toxinProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += replaceNaN(1 - Math.pow((1 - gasProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += replaceNaN(1 - Math.pow((1 - electricProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += replaceNaN(1 - Math.pow((1 - iceProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); COMult += replaceNaN(1 - Math.pow((1 - corrosiveProcRate * averageStatusChance), (finalFireRate / avgDelay) * 8 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - viralProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - blastProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - blastProcRate * averageStatusChance) * (1 - forcedKnockdownProcs), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); // Knockdown + COMult += replaceNaN(1 - Math.pow((1 - viralProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); + COMult += replaceNaN(1 - Math.pow((1 - blastProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); COMult += replaceNaN(1 - Math.pow((1 - radiationProcRate * averageStatusChance), (finalFireRate / avgDelay) * 12 * finalStatusDuration)); - COMult += replaceNaN(1 - Math.pow((1 - magneticProcRate * averageStatusChance), (finalFireRate / avgDelay) * 6 * finalStatusDuration)); + COMult += replaceNaN(1 - Math.pow((1 - magneticProcRate * averageStatusChance), (finalFireRate / avgDelay) * statusLength)); COMult *= conditionOverload; } // adjust COMult for base damage mods diff --git a/src/ttk/TTKTarget.java b/src/ttk/TTKTarget.java index 94de0cdc..85e89690 100644 --- a/src/ttk/TTKTarget.java +++ b/src/ttk/TTKTarget.java @@ -855,13 +855,10 @@ public double calculateRandomizedTimeToKill() { comboCount = Math.min(comboCount += Main.stanceCombo.hits.get(iterations).comboIncrease, 220); int meleeComboMult = (int) (comboCount / 20); - if (meleeComboMult >= 2) { - localStatus = Main.statusChance; - comboCritMult = Main.comboCrit * (meleeComboMult); - comboStatusMult = (Main.comboStatus * (meleeComboMult)) + (Main.finalStatusChance / Main.statusChance); - } - - localCritChance = (1 + comboCritMult + ((Main.finalCritChance / Main.critChance) - 1)) * Main.critChance; + localStatus = Main.statusChance; + comboCritMult = Main.comboCrit * meleeComboMult; + comboStatusMult = (Main.comboStatus * meleeComboMult) + (Main.finalStatusChance / Main.statusChance); + localCritChance = (comboCritMult + (Main.finalCritChance / Main.critChance)) * Main.critChance; } // Condition Overload