11:19 am, January 12, 2016
929
DDO Damage Simulator
Information:
This is a tool designed to calculate the damage done over time by almost any non-caster build. Once you enter in all the information for your build, the tool should be able to calculate the damage you will do with a reasonable degree of accuracy. The tool is still a WIP project, but it should be functional. Damage formulas are also a WIP, and I have no way to determine if my math is correct or not. I will update/fix the tool when I can, but once school starts, I may not get much time to work on it.
Download and Installation:
Download Link (using google drive)
The download is a .zip file containing a .jar file, a .exe file, and the presets folder. Either the .jar file or the .exe file can be used to run the tool. If any of the files are moved, my presets will not load, but the tool should run normally (untested).
Naming:
The download file will be named DDODamageSimulatorX.Y.Z. X is the major version, Y is the DDO update it works for, and Z is the minor version. For now, the tool should work with any version of ddo, but that will change once I get a few features working.
Changelog:
1.29.0: Basic version working.
Usage:
Should be fairly self-explanatory. Working on a feature to load builds from Character Planner saves, but that might take a while.
Tips and Tricks:
To add a custom effect/weapon/buff/attack to the presets list, simply save it inside the appropriate preset folder:
Weapons --> presets/weapons
Mainhand only weapons (greatswords, etc.) --> presets/mainhand only weapons
Effects --> presets/effects
You get the idea.
Bugs, things that don't work properly, and things to watch out for
Selecting a Fighting Style assumes that all of the fighting style feats for that fighting style are take. E.g. the Fighting Style TWF assumes the user has TWF, iTWF, and gTWF. Also, none of the fighting styles grant melee power.
There is no way to add a Enhancement bonus from the player side. To get around this, add Ability Modifier instead (it's calculated the same).
Everything stacks.
Things I need help with:
Feedback of all kinds.
Weapon attack speed formulas. This is the biggest part of the tool where I have no idea what I am doing. Attack speeds for TWF and THF are taken from this post, but I don't know if it is still accurate.
Attack speeds I need:
Presets. If someone has a particular weapon/effect/buff/attack they would like added to the preset folder (for everyone), PM me with the save file and I'll put it in next update.
Someone (or multiple someones) to check my Damage Formula.
Damage Formula (there are 3 relevant methods, written in Java):
This is a tool designed to calculate the damage done over time by almost any non-caster build. Once you enter in all the information for your build, the tool should be able to calculate the damage you will do with a reasonable degree of accuracy. The tool is still a WIP project, but it should be functional. Damage formulas are also a WIP, and I have no way to determine if my math is correct or not. I will update/fix the tool when I can, but once school starts, I may not get much time to work on it.
Download and Installation:
Download Link (using google drive)
The download is a .zip file containing a .jar file, a .exe file, and the presets folder. Either the .jar file or the .exe file can be used to run the tool. If any of the files are moved, my presets will not load, but the tool should run normally (untested).
Naming:
The download file will be named DDODamageSimulatorX.Y.Z. X is the major version, Y is the DDO update it works for, and Z is the minor version. For now, the tool should work with any version of ddo, but that will change once I get a few features working.
Changelog:
1.29.0: Basic version working.
Usage:
Should be fairly self-explanatory. Working on a feature to load builds from Character Planner saves, but that might take a while.
Tips and Tricks:
To add a custom effect/weapon/buff/attack to the presets list, simply save it inside the appropriate preset folder:
Weapons --> presets/weapons
Mainhand only weapons (greatswords, etc.) --> presets/mainhand only weapons
Effects --> presets/effects
You get the idea.
Bugs, things that don't work properly, and things to watch out for
Selecting a Fighting Style assumes that all of the fighting style feats for that fighting style are take. E.g. the Fighting Style TWF assumes the user has TWF, iTWF, and gTWF. Also, none of the fighting styles grant melee power.
There is no way to add a Enhancement bonus from the player side. To get around this, add Ability Modifier instead (it's calculated the same).
Everything stacks.
Things I need help with:
Feedback of all kinds.
Weapon attack speed formulas. This is the biggest part of the tool where I have no idea what I am doing. Attack speeds for TWF and THF are taken from this post, but I don't know if it is still accurate.
Attack speeds I need:
- SWF
- All other weapons (crossbows, bows, quarterstaves, etc.)
Presets. If someone has a particular weapon/effect/buff/attack they would like added to the preset folder (for everyone), PM me with the save file and I'll put it in next update.
Someone (or multiple someones) to check my Damage Formula.
Damage Formula (there are 3 relevant methods, written in Java):
Code:
public double getAverageDmgForFS(int mins){
System.out.println("Starting Sim with FS " + f);
double damage = 0;
int totalAttacks = 0;
switch(f){
case SWF:totalAttacks = (int) ( 86.50 * ( 100d + 1*(getStat(null, Atribute.AttackSpeed) + 30) )/100d );
break;
case THF: totalAttacks = (int) ( 86.50 * ( 100d + 1.0327 * getStat(null, Atribute.AttackSpeed) )/100d );
break;
case TWF: totalAttacks = (int)( 86.66 * ( 100d + 1.1965 * getStat(null, Atribute.AttackSpeed) )/100d );
break;
case None: totalAttacks = (int) ( 86.50 * (100d + 1*(getStat(null, Atribute.AttackSpeed)) ) /100d );
default:
break;
}
totalAttacks *= mins;
totalAttacks *= ( (100+getStat(null, Atribute.Doublestrike))/100 );
int basicAttacks = totalAttacks;
// find how many basic attacks are used
for(Attack a : player.attacks){
basicAttacks -= a.getUsesInMins(mins);
}
System.out.println("BasicAttacks: " + basicAttacks);
// adds the damage for that many basic attacks
damage += basicAttacks*getDamageForAttackInFS(Attack.BasicAttack, f);
System.out.println("Damage for 1 Basic Attack: " + getDamageForAttackInFS(Attack.BasicAttack, f));
for(Attack a : player.attacks){
damage += a.getUsesInMins(mins)*getDamageForAttackInFS(a, f);
}
damage *= 1+Math.max(getStat(mh, Atribute.Vulnerable), getStat(oh, Atribute.Vulnerable));
return damage;
}
public double getDamageForAttackInFS(Attack a, FightingStyle f){
double damage = 0;
if(f == FightingStyle.TWF){
damage += getDamageForAttack(mh, a, AttackStyle.TWFMH);
damage += getDamageForAttack(oh, a, AttackStyle.TWFOH)*( 0.80 + getStat(a, null, Atribute.AddedOffhandAttackRate) )*( (100+getStat(null, Atribute.OffhandDoublestrike))/100d );
} else if (f == FightingStyle.THF){
damage += getDamageForAttack(mh, a, AttackStyle.THF);
} else if (f == FightingStyle.SWF){
damage += getDamageForAttack(mh, a, AttackStyle.SWF);
} else{
damage += getDamageForAttack(mh, a, AttackStyle.None);
}
return damage;
}
public double getDamageForAttack(Weapon w, Attack a, AttackStyle f){
double abilityMult = 1;
switch(f){
case SWF: abilityMult = 1.5;
break;
case THF: abilityMult = 1.5;
break;
case TWFMH: abilityMult = 1;
break;
case TWFOH: abilityMult = 0.5 + getStat(null, Atribute.OffhandAbilityMultiplier);
break;
case None:
break;
default:
break;
}
double dmgNoCrit =
getStat(a, w, Atribute.Dice)
*getStat(a, w, Atribute.Multiplier)
+ getStat(a, w, Atribute.Enhancement)
+ getStat(a, w, Atribute.AbilityModifier)*abilityMult;
double critChance = ((getStat(a, w, Atribute.CritRange))/20d)
*(getStat(a, w, Atribute.Seeker)/20d);
double critMult = getStat(a, w, Atribute.CritMult);
double vorpalChance = (getStat(a, w, Atribute.AddedVorpalRange) + 1)/20;
System.out.println("CritChance: " + critChance + ", CritMult: " + critMult + ", VorpalChance: " + vorpalChance);
double dmg;
dmg = (1d-critChance)*dmgNoCrit +
(critChance-0.1)*critMult*( dmgNoCrit + getStat(a, w, Atribute.DamageBeforeCrit) ) +
(0.1)*(critMult + getStat(a, w, Atribute.CritMult1920))*(dmgNoCrit + getStat(a, w, Atribute.DamageBeforeCrit));
// dmg now equals your base weapon damage, multiplying by Melee Power
double MPMod = (100d + getStat(a, w, Atribute.MeleePower))/100d;
dmg *= MPMod;
dmg += getStat(a, w, Atribute.DamageOnHit);
dmg += critChance*(getStat(a, w, Atribute.DamageOnCrit));
dmg += vorpalChance*(getStat(a, w, Atribute.DamageOnVorpal));
dmg += MPMod*getStat(a, w, Atribute.DamageOnHitMP);
dmg += MPMod*critChance*getStat(a, w, Atribute.DamageOnCritMP);
dmg += MPMod*vorpalChance*getStat(a, w, Atribute.DamageOnVorpalMP);
double SAMod = (100 + 1.5*getStat(a, w, Atribute.MeleePower))/100;
dmg += SAMod*getStat(a, w, Atribute.SneakAttack);
//dmg now includes misc damage effects on weapon and player, and sneak attack
return dmg;
}