Quote:
|
Originally Posted by Yanman.be
The 60 al target doesn't like elemental damage?
+1 spear mastery?
Can you post your calculation works/programs?
|
Firstly, thanks for the response, I wasn't sure I'd get one for something like this
Regarding my spear, the only mods on it are a +15^50, +20% customization bonus, +30 health and +33% longer deep wound duration. All of that I factored into my calculations and all of that has proven to be correct in all attacks I've made involving armour penetration save for this one against a 60 armour target with Spear of Lightning.
Regarding my code, it's all included below. You'll have to excuse its presentation, it wasn't exactly intended for public consumption.
Code:
//The following is used in the calculation of critical hits
var root_two = Math.sqrt(2);
function begin()
{
//Collect all form data and set variables to their starting values
var base_min_damage = parseInt(document.getElementById('min_dmg').value);
var base_max_damage = parseInt(document.getElementById('max_dmg').value);
var attack_speed = parseFloat(document.getElementById('attack_speed').value);
var attribute_level = parseInt(document.getElementById('attribute_level').value);
var armour_level = parseInt(document.getElementById('armour_level').value);
var armour_penetration = parseInt(document.getElementById('armour_penetration').value);
var customised = document.getElementById('customised').checked;
var plus_damage_mod = document.getElementById('plus_damage_mod').checked;
var damage_mod = 1;
//Determines if any additional mods are on the weapon such as being customised or 15^50 mod
if (customised)
{
damage_mod = 1.20;
}
if (plus_damage_mod)
{
damage_mod *= 1.15;
}
//Adjusts the characters armour level for armour penetration
armour_level = armour_level * (1 - armour_penetration / 100);
var actual_min_damage = calculate_damage(base_min_damage, attribute_level, damage_mod, armour_level);
var actual_max_damage = calculate_damage(base_max_damage, attribute_level, damage_mod, armour_level);
var critical_damage = calculate_critical(base_max_damage, attribute_level, damage_mod, armour_level);
var average_damage_per_hit = calculate_average_damage(actual_min_damage, actual_max_damage, critical_damage, attribute_level);
var damage_per_second = calculate_damage_per_second(average_damage_per_hit, attack_speed);
display_results(actual_min_damage, actual_max_damage, critical_damage, average_damage_per_hit, damage_per_second);
}
function calculate_damage(weapon_damage, attribute_level, damage_mod, armour_level)
{
var damage = 0;
//Determine damage against 60 armour target
if (attribute_level < 13)
{
damage = weapon_damage * damage_mod * Math.pow(2, ((5 * attribute_level - 60) / 40));
}
else
{
damage = weapon_damage * damage_mod * Math.pow(2, ((2 * attribute_level - 24) / 40));
}
//adjust for armour
damage = damage * Math.pow(2,(60 - armour_level)/40);
return damage;
}
//Calculates the damage for a critical hit with the given weapon
function calculate_critical(base_max_damage, attribute_level, damage_mod, armour_level)
{
return calculate_damage(base_max_damage, attribute_level, damage_mod, armour_level) * root_two;
}
//Calcualates the damage per second with the given weapon
function calculate_damage_per_second(average_damage_per_hit, attack_rate)
{
return average_damage_per_hit / attack_rate;
}
//Calculates the average daamge the weapon will deal, factoring in critical hits
function calculate_average_damage(actual_min_damage, actual_max_damage, critical_damage, attribute_level)
{
var average_damage = ((actual_min_damage + actual_max_damage) / 2);
average_damage = (critical_damage - average_damage) * crit_chance(attribute_level) + average_damage;
return average_damage;
}
//Determines the characters chance of getting a critical hit
function crit_chance(attribute_level)
{
return 0.01 + (0.0144 * attribute_level);
}
//Displays the results of the test
function display_results(min_damage, max_damage, crit_damage, average_damage_per_hit, damage_per_second)
{
var display = document.getElementById('output');
display.innerHTML = "Minimum Damage: " + round_damage(min_damage) + "<br />\n";
display.innerHTML += "Maximum Damage: " + round_damage(max_damage) + "<br />\n";
display.innerHTML += "Critical Damage: " + round_damage(crit_damage) + "<br />\n";
display.innerHTML += "Average Damage Per Hit: " + round_damage(average_damage_per_hit) + "<br />\n";
display.innerHTML += "Damage Per Second: " + round_damage(damage_per_second) + "<br />\n";
display.innerHTML += "Critical Hit Chance: " + crit_chance(parseInt(document.getElementById('attribute_level').value)) + "<br />\n";
}
//This function rounds the damage for the attack down to something easier to read. Current implementations
//simply chop off all but two numbers after the decimal place and there have been some precision concerns, as such
//no rounding is presently done. This function will be fixed at a later date.
function round_damage(damage)
{
//damage = damage.toString();
//return parseFloat(damage.substr(0, damage.indexOf('.') + 3));
return damage;
}
The following is the html that accompanies it:
Code:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Untitled Document</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
<script type="text/javascript" src="javascript/script.js">
</script>
</head>
<body>
<form>
<table>
<tr>
<td>Minimum Damage:</td>
<td><input type="text" id="min_dmg" /></td>
</tr>
<tr>
<td>Maximum Damage:</td>
<td><input type="text" id="max_dmg" /></td>
</tr>
<tr>
<td>Attack Speed:</td>
<td><input type="text" id="attack_speed" /></td>
</tr>
<tr>
<td>Attribute Level:</td>
<td><input type="text" id="attribute_level" /></td>
</tr>
<tr>
<td>Armour Level:</td>
<td><input type="text" id="armour_level" value="60" /></td>
</tr>
<tr>
<td>Armour Penetration:</td>
<td><input type="text" id="armour_penetration" value="0" /></td>
</tr>
<tr>
<td>Customised:</td><td><input type="checkbox" id="customised" /></td>
</tr>
<tr>
<td>+15^50:</td><td><input type="checkbox" id="plus_damage_mod" /></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="Begin Analysis" onclick="begin(); return false;" /></td>
</tr>
</table>
</form>
<div id="output">
</div>
</body>
</html>