Skip to content

Commit

Permalink
Melee math changes
Browse files Browse the repository at this point in the history
  • Loading branch information
spmuladoo committed Apr 19, 2021
1 parent 9729bb6 commit 17284f7
Show file tree
Hide file tree
Showing 4 changed files with 95 additions and 35 deletions.
37 changes: 28 additions & 9 deletions src/Stances/Stance.java
Expand Up @@ -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<Hit> hits = new Vector<Hit>();
Vector<Hit> hits = new Vector<Hit>();
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;
}

Expand All @@ -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;
}
}
}
41 changes: 34 additions & 7 deletions 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;
Expand Down Expand Up @@ -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();
Expand All @@ -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<String> typeBox = new JComboBox<String>();
protected JComboBox<String> comboBox = new JComboBox<String>();
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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);
Expand Down Expand Up @@ -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();
Expand All @@ -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);

Expand All @@ -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
Expand All @@ -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++) {
Expand All @@ -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++) {
Expand Down Expand Up @@ -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);
Expand Down
41 changes: 29 additions & 12 deletions src/main/Main.java
Expand Up @@ -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);
Expand Down Expand Up @@ -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
Expand Down
11 changes: 4 additions & 7 deletions src/ttk/TTKTarget.java
Expand Up @@ -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
Expand Down

0 comments on commit 17284f7

Please sign in to comment.