Martial Weapon Damage Calculator

Chthon

Grotto Attendant

Join Date: Apr 2007

[latest version: 1.1 released 9/23/2011]

This is a damage calculator for martial weapons.

It includes support for
  • All martial weapon types.
  • All sane, max, damage-related weapon mod combinations.
  • All sane mastery levels.
  • Input monster armor level -OR- guess monster armor level from level, class, race, and damage type.
  • Critical hits are taken into account. Complete calculation of critical hits.
  • Armor penetration from sundering mods and/or Strength.
  • Double Strikes for auto attacks.
  • IAS.
  • Overall DPS calculation for auto attacks.

Usage:
Put the appropriate inputs into the fields and hit the "Calculate" button.
Advanced Usage:
Find a "sundering vs vamp" thread and post a link to the calculator.

Please report errors/bugs in this thread. (There's sure to be a few.)

I'd greatly appreciate it if someone with actual html-writing rights on a wiki or PvX or something would stick this on a page somewhere. (Or, better yet, you endow me with rights to go stick it on a page somewhere.)

In the meantime, anyone can use it by copy/pasting the contents of the HMTL Code box into Notepad and saving the result as a html file.

Changelog:
1.1 - fixed double strikes
1.0 - original release

Sreenshot:


HTML Code:
<html>
	<head>
		<title>Chthon's Guild Wars Martial Weapon Base Damage Calculator - V1.0</title>
	
		<script type="text/javascript">
		<!--
			
			function roundNumber(num, dec) {
				var result = Math.round(num*Math.pow(10,dec))/Math.pow(10,dec);
				return result;
			}
			
			function isInt(value){
				if((parseFloat(value) == parseInt(value)) && !isNaN(value)){
					return true;
				} else {
					return false;
				}
			}
			
			function calccriteye(input){
				if (input == 0)
					return 0.03;
				if (input == 1)
					return 0.04;
				if (input == 2)
					return 0.05;
				if (input == 3)
					return 0.05;
				if (input == 4)
					return 0.06;
				if (input == 5)
					return 0.07;
				if (input == 6)
					return 0.08;
				if (input == 7)
					return 0.09;
				if (input == 8)
					return 0.09;
				if (input == 9)
					return 0.10;
				if (input == 10)
					return 0.11;
				if (input == 11)
					return 0.12;
				if (input == 12)
					return 0.13;
				if (input == 13)
					return 0.13;
				if (input == 14)
					return 0.14;
				if (input == 15)
					return 0.15;
				if (input == 16)
					return 0.16;
				if (input == 17)
					return 0.17;
				if (input == 18)
					return 0.17;
				if (input == 19)
					return 0.18;
				if (input == 20)
					return 0.19;
			}
			
			function calcfearme(input){
				if (input == 0)
					return 0.05;
				if (input == 1)
					return 0.07;
				if (input == 2)
					return 0.08;
				if (input == 3)
					return 0.10;
				if (input == 4)
					return 0.12;
				if (input == 5)
					return 0.13;
				if (input == 6)
					return 0.15;
				if (input == 7)
					return 0.17;
				if (input == 8)
					return 0.18;
				if (input == 9)
					return 0.20;
				if (input == 10)
					return 0.22;
				if (input == 11)
					return 0.23;
				if (input == 12)
					return 0.25;
				if (input == 13)
					return 0.27;
				if (input == 14)
					return 0.28;
				if (input == 15)
					return 0.30;
				if (input == 16)
					return 0.32;
				if (input == 17)
					return 0.33;
				if (input == 18)
					return 0.35;
				if (input == 19)
					return 0.37;
				if (input == 20)
					return 0.38;
			}
			
			function calcgfte(input){
				if (input == 0)
					return 0.30;
				if (input == 1)
					return 0.35;
				if (input == 2)
					return 0.39;
				if (input == 3)
					return 0.44;
				if (input == 4)
					return 0.49;
				if (input == 5)
					return 0.53;
				if (input == 6)
					return 0.58;
				if (input == 7)
					return 0.63;
				if (input == 8)
					return 0.67;
				if (input == 9)
					return 0.72;
				if (input == 10)
					return 0.77;
				if (input == 11)
					return 0.81;
				if (input == 12)
					return 0.86;
				if (input == 13)
					return 0.91;
				if (input == 14)
					return 0.95;
				if (input >= 15)
					return 1;
			}
			
			function dostuff(){
				var weapontype = document.getElementById("weapontype").value;
				var mastery = Number(document.getElementById("weaponmastery").value);
				var critstrikes = Number(document.getElementById("critstrikes").value);
				var strength = Number(document.getElementById("strength").value);
				var tactics = Number(document.getElementById("tactics").value);
				var command = Number(document.getElementById("command").value);
				var mlvl = Number(document.getElementById("mlvl").value);
				var mclass = document.getElementById("mclass").value;
				
				var basemindmg;
				var nocritmindmg;
				var snocritmindmg;
				var basemaxdmg;
				var nocritmaxdmg;
				var snocritmaxdmg;
				var nocritaveragedmg;
				var snocritaveragedmg;
				var finalaveragedmg;
				var custombonus;
				var inherentbonus;
				var slayingbonus;
				var baseline;
				var armor;
				var earmor;
				var racebonus;
				var vampbonus;
				var sunderflag;
				var elementalflag;
				var physicalflag;
				var classbonus;
				var critbonus;
				var critdmg;
				var scritdmg;
				var basecrit;
				var anticrit;
				var finalcrit;
				var nsncweight;
				var nsycweight;
				var ysncweight;
				var ysycweight;
				var criteyebonus;
				var wotabonus;
				var wotmbonus;
				var siphonbonus;
				var fearmebonus;
				var gftebonus;
				var attackperiod;
				var attackperiodmultiplier;
				var doublestrikechance;
				var finalanswer;
				var msg = "";
				
				
				critbonus = 20;
				if (weapontype == "sword"){
					basemindmg = 15;
					basemaxdmg = 22;
					attackperiod = 1.33;
					vampbonus = 3;
				}
				else if (weapontype == "axe"){
					basemindmg = 6;
					basemaxdmg = 28;
					attackperiod = 1.33;
					vampbonus = 3;
				}
				else if (weapontype == "hammer"){
					basemindmg = 19;
					basemaxdmg = 35;
					attackperiod = 1.75;
					vampbonus = 5;
				}
				else if (weapontype == "flatbow"){
					basemindmg = 15;
					basemaxdmg = 28;
					attackperiod = 2.0;
					vampbonus = 5;
				}
				else if (weapontype == "longbow"){
					basemindmg = 15;
					basemaxdmg = 28;
					attackperiod = 2.4;
					vampbonus = 5;
				}
				else if (weapontype == "hornbow"){
					basemindmg = 15;
					basemaxdmg = 28;
					attackperiod = 2.7;
					vampbonus = 5;
				}
				else if (weapontype == "dagger"){
					basemindmg = 7;
					basemaxdmg = 17;
					attackperiod = 1.33;
					vampbonus = 3;
				}
				else if (weapontype == "scythe"){
					basemindmg = 9;
					basemaxdmg = 41;
					attackperiod = 1.5;
					critbonus= 5;
					vampbonus = 5;
				}
				else if (weapontype == "spear"){
					basemindmg = 14;
					basemaxdmg = 27;
					attackperiod = 1.5;
					vampbonus = 3;
				}
				else{
					alert("Error: Unknown weapon type.");
				}
				
				if (document.getElementById("customized").checked == true)
					custombonus = 1.2;
				else
					custombonus = 1.0;
					
				if (document.getElementById("15over50").checked == true)
					inherentbonus = 1.15;
				else
					inherentbonus = 1.0;
				
				if (document.getElementById("slaying").checked == true)
					slayingbonus = 1.2;
				else
					slayingbonus = 1.0;
				
				if (document.getElementById("prefix").value != "vampiric")
					vampbonus = 0;
				
				if (document.getElementById("prefix").value == "sundering")
					sunderflag = true;
				else
					sunderflag = false;
				
				if (	(document.getElementById("convert").value == "elemental") ||
						((document.getElementById("prefix").value == "elemental") && (document.getElementById("convert").value != "holyetc"))
					)
					elementalflag = true;
				else
					elementalflag = false;
				
				if (	(document.getElementById("prefix").value != "elemental") &&
						(document.getElementById("convert").value == "none")
					)
					physicalflag = true;
				else
					physicalflag = false;
				
				if (mastery < 13)
					baseline = 5 * mastery;
				else
					baseline = 60 + (2 * (mastery - 12));
				
				if (document.getElementById("criteye").checked == true)
					criteyebonus = calccriteye(critstrikes);
				else
					criteyebonus = 0;
				
				if ((document.getElementById("wota").checked == true) && (weapontype == "dagger") )
					wotabonus = (5 + (2 * critstrikes))/100;
				else
					wotabonus = 0;
				
				if ((document.getElementById("wotm").checked == true) && (weapontype != "dagger") )
					wotmbonus = (3 + (2 * critstrikes))/100;
				else
					wotmbonus = 0;
				
				if (document.getElementById("siphon").checked == true)
					siphonbonus = 0.33;
				else
					siphonbonus = 0;
								
				if (	((strength > 0) && (!sunderflag)) ||
						((strength < 1) && (sunderflag))
					){
					msg = msg + "Note:\nArmor penetration is known to have rounding errors.\nThe results may be off by one damage per hit.\n\n";
				}
				if ((strength > 0) && (sunderflag))
					msg = msg + "Note:\nArmor penertration stacking is known to be buggy.\nThe results may be a little off.\n\n";
				
				if ((document.getElementById("fearme").checked == true) && (weapontype != "flatbow") && (weapontype != "longbow") && (weapontype != "hornbow") && (weapontype != "spear")){
					fearmebonus = calcfearme(tactics);
					msg = msg + "Note:\n\"Fear Me!\" only affects stationary foes.\nThese results assume every foe is stationary.\n\n";
				} else
					fearmebonus = 0;
				
				if (strength > 0)
					msg = msg + "Note:\nStrength only affects attack skills.\nThe DPS results will not be accurate.\nSet Strength to 0 for accurate DPS results.\n\n"
				
				if (document.getElementById("gfte").checked == true){
					gftebonus = calcgfte(command);
					msg = msg + "Note:\n\"Go for the Eyes!\" only affects one attack.\nThe DPS results will not be accurate.\nUncheck \"Go for the Eyes!\" for accurate DPS results.\n\n";
				} else
					gftebonus = 0;
				
				if (document.getElementById("attacktimemultiplier").value != "other")
					attackperiodmultiplier = Number(document.getElementById("attacktimemultiplier").value);
				else {
					if (isNaN(document.getElementById("otherias").value)){
						alert("You are a RED ENGINE GORED ENGINE GORED ENGINE GORED ENGINE GOtard who cannot follow directions.\nResults will assume 0% IAS.");
						attackperiodmultiplier = 0;
					} else		
						attackperiodmultiplier = roundNumber(1.0 - (Number(document.getElementById("otherias").value)), 2);
						if (attackperiodmultiplier < 0){
							alert("You are a RED ENGINE GORED ENGINE GORED ENGINE GORED ENGINE GOtard who cannot follow directions.\nResults will assume 0% IAS.");
							attackperiodmultiplier = 0;
						}
				}
					
				if (!isInt(document.getElementById("racebonus").value)){
					alert("You are a RED ENGINE GORED ENGINE GORED ENGINE GORED ENGINE GOtard who cannot follow directions.\nResults will assume 0 race bonus/penalty.");
					racebonus = 0;
				} else {
					racebonus = Number(document.getElementById("racebonus").value);
					if (document.getElementById("racepolarityminus").checked == true)
						racebonus = racebonus * -1;
				}
				
				
				if (document.getElementById("armorinput").checked == true){
					if (!isInt(document.getElementById("useral").value)){
						alert("You are a RED ENGINE GORED ENGINE GORED ENGINE GORED ENGINE GOtard who cannot follow directions.\nResults will assume 60 armor.");
						armor = 60;
					} else {
						armor = Number(document.getElementById("useral").value);
					}
				} else {
					if (mclass == "caster")
						classbonus = 0;
					if (mclass == "warrior"){
						if (physicalflag)
							classbonus = 40;
						else
							classbonus = 20;
					}
					if (mclass == "ranger"){
						if (elementalflag)
							classbonus = 40;
						else
							classbonus = 10;
					}
					if (mclass == "assassin")
						classbonus = 10;
					if (mclass == "dervish")
						classbonus = 10;
					if (mclass == "paragon")
						classbonus = 20;
					
					armor = (3*mlvl) + classbonus + racebonus;
					if (armor < 0)
						armor = 0;
				}
				
				if (strength > 0)
					earmor = Math.round(armor * (1 - (strength/100)));
				else
					earmor = armor;
				
				nocritmindmg = Math.round((basemindmg * custombonus * inherentbonus * slayingbonus * Math.pow(2, ((baseline - earmor)/40))) + vampbonus);
				document.getElementById("nsncmin").innerHTML = nocritmindmg;
				nocritmaxdmg = Math.round((basemaxdmg * custombonus * inherentbonus * slayingbonus * Math.pow(2, ((baseline - earmor)/40))) + vampbonus);
				document.getElementById("nsncmax").innerHTML = nocritmaxdmg;
				nocritaveragedmg = roundNumber(((nocritmindmg + nocritmaxdmg)/2), 3);
				document.getElementById("nsncave").innerHTML = nocritaveragedmg;
				critdmg = Math.round((basemaxdmg * custombonus * inherentbonus * slayingbonus * Math.pow(2, (((baseline + critbonus) - earmor)/40))) + vampbonus);
				document.getElementById("nsycave").innerHTML = critdmg;
				
				if (sunderflag){
					document.getElementById("nsnclabel").style.display = "inline";
					document.getElementById("nsyclabel").style.display = "inline";
					document.getElementById("ysncrow").style.display = "table-row";
					document.getElementById("ysycrow").style.display = "table-row";
					if (strength > 0)
						earmor = Math.round(armor * (1 - ((strength/100) + 0.20)));
					else
						earmor = Math.round(armor * (1 - 0.20));
					snocritmindmg = Math.round((basemindmg * custombonus * inherentbonus * slayingbonus * Math.pow(2, ((baseline - earmor)/40))) + vampbonus);
					document.getElementById("ysncmin").innerHTML = snocritmindmg;
					snocritmaxdmg = Math.round((basemaxdmg * custombonus * inherentbonus * slayingbonus * Math.pow(2, ((baseline - earmor)/40))) + vampbonus);
					document.getElementById("ysncmax").innerHTML = snocritmaxdmg;
					snocritaveragedmg = roundNumber(((snocritmindmg + snocritmaxdmg)/2), 3);
					document.getElementById("ysncave").innerHTML = snocritaveragedmg;
					scritdmg = Math.round((basemaxdmg * custombonus * inherentbonus * slayingbonus * Math.pow(2, (((baseline + critbonus) - earmor)/40))) + vampbonus);
					document.getElementById("ysycave").innerHTML = scritdmg;
				
				} else {
					document.getElementById("nsnclabel").style.display = "none";
					document.getElementById("nsyclabel").style.display = "none";
					document.getElementById("ysncrow").style.display = "none";
					document.getElementById("ysycrow").style.display = "none";
				}
				
				// basecrit formula: (0.01*Mastery) + ((1 - (0.01*Mastery)) * 0.5 * 2^(((8*AttackerLvl) + (4*Mastery) + (6 * Min{Mastery, ((AttackerLvl + 4)/2)}) - (15* DefenderLvl) - 100) / 40))    minus a flat penalty for non-martial weapons
				
				misterd = mastery;
				if (misterd > 12)
					misterd = 12;
				basecrit = (0.01*mastery) + ((1 - (0.01*mastery)) * 0.5 * Math.pow(2, (((8*20) + (4*mastery) + (6 * misterd) - (15* mlvl) - 100) / 40)));
				anticrit = (1 - basecrit) * (1 - (critstrikes/100)) * ( 1 - criteyebonus) * (1 - wotabonus) * ( 1 - wotmbonus) * (1 - siphonbonus) * (1 - fearmebonus) * (1 - gftebonus);
				finalcrit = roundNumber((1 - anticrit), 4);
				if (finalcrit > 1)
					finalcrit = 1;
				if (finalcrit > 0.66)
					msg = msg + "Note:\nCritical hit chances greater than 66% are subject to an unknown (presumably) asymptotic limiting function that prevents them from ever reaching 100%.\nYour actual chance to critical hit is slightly lower than the results displayed.\n\n";
				
				if (sunderflag){
					nsncweight = (1 - finalcrit) * 0.8;
					nsycweight = finalcrit * 0.8;
					ysncweight = (1 - finalcrit) * 0.2;
					ysycweight = finalcrit * 0.2;
					document.getElementById("nsncchance").innerHTML = roundNumber(nsncweight * 100, 4) + "%";
					document.getElementById("nsycchance").innerHTML = roundNumber(nsycweight * 100, 4) + "%";
					document.getElementById("ysncchance").innerHTML = roundNumber(ysncweight * 100, 4) + "%";
					document.getElementById("ysycchance").innerHTML = roundNumber(ysycweight * 100, 4) + "%";
					finalaveragedmg = (nsncweight * nocritaveragedmg) + (nsycweight * critdmg) + (ysncweight * snocritaveragedmg) + (ysycweight * scritdmg);
				} else {
					document.getElementById("nsncchance").innerHTML = roundNumber((1 - finalcrit) * 100, 4) + "%";
					document.getElementById("nsycchance").innerHTML = roundNumber(finalcrit * 100, 4) + "%";
					finalaveragedmg = ((1 - finalcrit) * nocritaveragedmg) + (finalcrit * critdmg)
				}
				document.getElementById("finalaverage").innerHTML = roundNumber(finalaveragedmg, 3);
				
				if (weapontype == "dagger"){
					doublestrikechance = 0.02 + (0.02 * mastery);
					if (document.getElementById("locust").checked == true)
						doublestrikechance += 0.5;
					if (strength > 0){
						msg = msg + "Note:\nStrength only applies to attack skills, while double strikes only apply to auto attacks.\nDouble strikes will be set to 0%.\nSet Strength to 0 to see the effect of double strikes.\n\n";
						doublestrikechance = 0;
					}
					finalaveragedmg = finalaveragedmg * (1 + doublestrikechance);
					document.getElementById("doublestrike").style.display = "table-row";
					document.getElementById("doublestrikechance").innerHTML = roundNumber(doublestrikechance * 100, 4) + "%";
				} else {
					document.getElementById("doublestrike").style.display = "none";
				}
				
				finalanswer = finalaveragedmg / (attackperiod * attackperiodmultiplier);
				document.getElementById("finaldps").innerHTML = roundNumber(finalanswer, 3);
				
				if (msg.length > 1)
					alert(msg);
			}
		//-->
		</script>
	
	</head>
	<body>
	
		<div style="width: 800px; margin-left: auto; margin-right: auto; margin-top: 20px;">
			<div style="float: left; width: 388px; height: 700px; padding: 5px; border: black solid 1px;">
				<h2 style="text-align: center;">Player</h2>
				Player is assumed to be level 20.<BR>&nbsp;<BR>
				<span style="font-weight: bold;">Weapon</span>
				<form>
					Type:&nbsp;
					<select id="weapontype">
						<option value="sword" selected="selected">Sword</option>
						<option value="axe">Axe</option>
						<option value="hammer">Hammer</option>
						<option value="flatbow">Flatbow/Shortbow</option>
						<option value="longbow">Longbow/ Recurve Bow</option>
						<option value="hornbow">Hornbow</option>
						<option value="dagger">Dagger</option>
						<option value="scythe">Scythe</option>
						<option value="spear">Spear</option>
					</select>
					<BR>
					<input type="checkbox" id="customized" value="customized" checked="checked"/>&nbsp;Customized
					&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
					<input type="checkbox" id="15over50" value="15over50" checked="checked"/>&nbsp;15^50
					<BR>
					Prefix:&nbsp;
					<select id="prefix">
						<option value="vampiric" selected="selected">Vampiric</option>
						<option value="sundering">Sundering</option>
						<option value="elemental">Elemental</option>
						<option value="other">Other</option>
					</select>
					&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
					<input type="checkbox" id="slaying" value="slaying"/>&nbsp;Slaying Suffix<BR>
					Weapon is assumed to be max for its type.<BR>
					Attribute requirment is assumed to met.
				</form>
				<span style="font-weight: bold;">Attributes</span>
				<form>
					<select id="weaponmastery">
						<option value="7.0">7</option>
						<option value="8.0">8</option>
						<option value="9.0">9</option>
						<option value="10.0">10</option>
						<option value="11.0">11</option>
						<option value="12.0">12</option>
						<option value="13.0">13</option>
						<option value="14.0" selected="selected">14</option>
						<option value="15.0">15</option>
						<option value="16.0">16</option>
						<option value="17.0">17</option>
						<option value="18.0">18</option>
						<option value="19.0">19</option>
						<option value="20.0">20</option>
					</select>
					&nbsp;Applicable Weapon Mastery<BR>
					<select id="critstrikes">
						<option value="0.0" selected="selected">0</option>
						<option value="1.0">1</option>
						<option value="2.0">2</option>
						<option value="3.0">3</option>
						<option value="4.0">4</option>
						<option value="5.0">5</option>
						<option value="6.0">6</option>
						<option value="7.0">7</option>
						<option value="8.0">8</option>
						<option value="9.0">9</option>
						<option value="10.0">10</option>
						<option value="11.0">11</option>
						<option value="12.0">12</option>
						<option value="13.0">13</option>
						<option value="14.0">14</option>
						<option value="15.0">15</option>
						<option value="16.0">16</option>
						<option value="17.0">17</option>
						<option value="18.0">18</option>
						<option value="19.0">19</option>
						<option value="20.0">20</option>
					</select>
					&nbsp;Critical Strikes<BR>
					<select id="strength">
						<option value="0.0" selected="selected">0</option>
						<option value="1.0">1</option>
						<option value="2.0">2</option>
						<option value="3.0">3</option>
						<option value="4.0">4</option>
						<option value="5.0">5</option>
						<option value="6.0">6</option>
						<option value="7.0">7</option>
						<option value="8.0">8</option>
						<option value="9.0">9</option>
						<option value="10.0">10</option>
						<option value="11.0">11</option>
						<option value="12.0">12</option>
						<option value="13.0">13</option>
						<option value="14.0">14</option>
						<option value="15.0">15</option>
						<option value="16.0">16</option>
						<option value="17.0">17</option>
						<option value="18.0">18</option>
						<option value="19.0">19</option>
						<option value="20.0">20</option>
					</select>
					&nbsp;Strength<BR>
					<select id="tactics">
						<option value="0.0" selected="selected">0</option>
						<option value="1.0">1</option>
						<option value="2.0">2</option>
						<option value="3.0">3</option>
						<option value="4.0">4</option>
						<option value="5.0">5</option>
						<option value="6.0">6</option>
						<option value="7.0">7</option>
						<option value="8.0">8</option>
						<option value="9.0">9</option>
						<option value="10.0">10</option>
						<option value="11.0">11</option>
						<option value="12.0">12</option>
						<option value="13.0">13</option>
						<option value="14.0">14</option>
						<option value="15.0">15</option>
						<option value="16.0">16</option>
						<option value="17.0">17</option>
						<option value="18.0">18</option>
						<option value="19.0">19</option>
						<option value="20.0">20</option>
					</select>
					&nbsp;Tactics<BR>
				</form>
				<span style="font-weight: bold;">Crit-Boosting Skills</span>
				<form>
					<input type="checkbox" id="criteye" value="criteye"/>&nbsp;Critical Eye<Br>
					<input type="checkbox" id="wota" value="wota"/>&nbsp;Way of the Assassin<Br>
					<input type="checkbox" id="wotm" value="wotm"/>&nbsp;Way of the Master<Br>
					<input type="checkbox" id="siphon" value="siphon"/>&nbsp;Siphon Strength<Br>
					<input type="checkbox" id="fearme" value="fearme"/>&nbsp;"Fear Me!"<Br>
					<input type="checkbox" id="gfte" value="gfte"/>&nbsp;"Go for the Eyes!" @&nbsp;
					<select id="command">
						<option value="0.0" selected="selected">0</option>
						<option value="1.0">1</option>
						<option value="2.0">2</option>
						<option value="3.0">3</option>
						<option value="4.0">4</option>
						<option value="5.0">5</option>
						<option value="6.0">6</option>
						<option value="7.0">7</option>
						<option value="8.0">8</option>
						<option value="9.0">9</option>
						<option value="10.0">10</option>
						<option value="11.0">11</option>
						<option value="12.0">12</option>
						<option value="13.0">13</option>
						<option value="14.0">14</option>
						<option value="15.0">15</option>
						<option value="16.0">16</option>
						<option value="17.0">17</option>
						<option value="18.0">18</option>
						<option value="19.0">19</option>
						<option value="20.0">20</option>
					</select>
					&nbsp;Command<BR>
				</form>
				<form>
					<span style="font-weight: bold;">Damage Type Conversion from Skills</span>
					<BR>
					<select id="convert">
						<option value="none" selected="selected">None</option>
						<option value="elemental">Elemental</option>
						<option value="holyetc">Holy/Dark/Chaos</option>
					</select>
				</form>
				<form>
					<span style="font-weight: bold;">Increased Attack Speed:</span>
					&nbsp;
					<select id="attacktimemultiplier">
						<option value="1.0">None</option>
						<option value="0.85">15%</option>
						<option value="0.8">20%</option>
						<option value="0.75">25%</option>
						<option value="0.67" selected="selected">33%</option>
						<option value="other">Other</option>
					</select>
					<BR>
					Value for "other":&nbsp;<input type="text" id="otherias" value="0.0"/>
					<BR>
					(Enter a decimal value; example: 0.25 for 25%IAS)
				</form>
				<form>
					<span style="font-weight: bold;">Double Strikes</span><BR>
					<input type="checkbox" id="locust" value="locust"/>&nbsp;Locust's Fury<Br>
				</form>
			</div>
			<div style="float: right; width: 388px; height: 700px; padding: 5px; border: black solid 1px;">
				<h2 style="text-align: center;">Monster</h2>
				<form>
					<span style="font-weight: bold;">Level:</span>&nbsp;
					<select id="mlvl">
						<option value="20.0" selected="selected">20</option>
						<option value="21.0">21</option>
						<option value="22.0">22</option>
						<option value="23.0">23</option>
						<option value="24.0">24</option>
						<option value="25.0">25</option>
						<option value="26.0">26</option>
						<option value="27.0">27</option>
						<option value="28.0">28</option>
						<option value="29.0">29</option>
						<option value="30.0">30</option>
						<option value="31.0">31</option>
						<option value="32.0">32</option>
						<option value="33.0">33</option>
						<option value="34.0">34</option>
						<option value="35.0">35</option>
						<option value="36.0">36</option>
						<option value="37.0">37</option>
						<option value="38.0">38</option>
						<option value="39.0">39</option>
						<option value="40.0">40</option>
					</select>
					<BR>
				</form>
				<form>
					<span style="font-weight: bold;">Class:</span>&nbsp;
					<select id="mclass">
						<option value="caster" selected="selected">Caster</option>
						<option value="warrior">Warrior</option>
						<option value="ranger">Ranger</option>
						<option value="assassin">Assassin</option>
						<option value="dervish">Dervish</option>
						<option value="paragon">Paragon</option>
					</select>
					<BR>
				</form>
				<form>
					<span style="font-weight: bold;">Racial Bonus/Penalty</span><BR>
					<input type="radio" name="racepolarity" id="racepolarityplus" value="plus" checked />
					&nbsp;+
					&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
					<input type="radio" name="racepolarity" id="racepolarityminus" value="minus"/>
					&nbsp;-
					&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
					Value:&nbsp;
					<input type="text" id="racebonus" value="0"/>
					<BR>
					&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Enter an integer.)
					<BR>
				</form>
				<form>
					<span style="font-weight: bold;">Armor Level</span><BR>
					<input type="radio" name="armorchoice" id="armorguess" value="guess" checked />&nbsp;
					Guess AL based on level, class, race, & damage type.<BR>
					<input type="radio" name="armorchoice" id="armorinput" value="give" />&nbsp;
					Use this AL value:&nbsp;
					<input type="text" id="useral" value="60"/><BR>
					&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;(Enter an integer.)
					<BR>
				</form>
			</div>
			<div style="clear:both; width: 788px; padding: 5px; border: black solid 1px;">
				<input type="submit" value="Calculate" style="width: 100px; margin-left: 344px;" onclick="dostuff()"/>
			</div>
			<div style="clear:both; width: 788px; padding: 5px; border: black solid 1px;">
				<h2 style="text-align: center;">Results</h2>
				<table cellpadding="5" border="1" width="100%">
					<tr>
						<th>&nbsp;</th>
						<th>Chance to Occur</th>
						<th>Min Damage</th>
						<th>Max Damage</th>
						<th>Average Damage</th>
					</tr>
					<tr>
						<th><span style="display: none;" id="nsnclabel">No Sundering, </span>No Critical Hit</th>
						<td align="right" id="nsncchance">&nbsp;</td>
						<td align="right" id="nsncmin">&nbsp;</td>
						<td align="right" id="nsncmax">&nbsp;</td>
						<td align="right" id="nsncave">&nbsp;</td>
					</tr>
					<tr>
						<th><span style="display: none;"  id="nsyclabel">No Sundering, </span>Critical Hit</th>
						<td align="right" id="nsycchance">&nbsp;</td>
						<td align="right" id="nsycmin">&nbsp;</td>
						<td align="right" id="nsycmax">&nbsp;</td>
						<td align="right" id="nsycave">&nbsp;</td>
					</tr>
					<tr id="ysncrow" style="display: none;">
						<th>Sundering, No Critical Hit</th>
						<td align="right" id="ysncchance">&nbsp;</td>
						<td align="right" id="ysncmin">&nbsp;</td>
						<td align="right" id="ysncmax">&nbsp;</td>
						<td align="right" id="ysncave">&nbsp;</td>
					</tr>
					<tr id="ysycrow" style="display: none;">
						<th>Sundering, Critical Hit</th>
						<td align="right" id="ysycchance">&nbsp;</td>
						<td align="right" id="ysycmin">&nbsp;</td>
						<td align="right" id="ysycmax">&nbsp;</td>
						<td align="right" id="ysycave">&nbsp;</td>
					</tr>
				</table>
				<table cellpadding="5" border="1">
					<tr>
						<th>Overall Average Damage per Hit</th>
						<td align="right" id="finalaverage">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
					</tr>
					<tr id="doublestrike" style="display:none;">
						<th>Chance to Double Strike</th>
						<td align="right" id="doublestrikechance">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
					</tr>
					<tr>
						<th>Overall Average Damage per Second</th>
						<td align="right" id="finaldps">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</td>
					</tr>
				</table>
			</div>
		</div>
	
	</body>
</html>

Toraen

Ascalonian Squire

Join Date: Jun 2010

R/

Well, double strike chance is dependent upon Dagger Mastery, but the calculator seems to be drawing the chance from the spec in Critical Strikes.

Chthon

Grotto Attendant

Join Date: Apr 2007

Quote:
Originally Posted by Toraen View Post
Well, double strike chance is dependent upon Dagger Mastery, but the calculator seems to be drawing the chance from the spec in Critical Strikes.
absolutely right.

thanks for catching it.

I'll post a fixed version as soon as I have a chance.

[edit: fixed version is up. thanks again.]

Toraen

Ascalonian Squire

Join Date: Jun 2010

R/

You're welcome . I'd like to include this on PvX (because it would help just as many arguments over there), but it'd probably need to be added as a special page, which I don't even have privileges to do. I'm not sure if there's any alterations that would need to be made for that to work either. I could talk to Phenaxkian to see if he knows more about it.

As for some more minor things, do you think it would be possible to add a generic +damage box, where someone could put the total bonus from conjure/SoH/Orders? I don't think a separate box would be needed for each, since adding them up in your head is pretty trivial. Also, the Tactics spec should probably go next to "Fear Me!", since tactics has no direct effect on weapon damage.

Chthon

Grotto Attendant

Join Date: Apr 2007

Quote:
Originally Posted by Toraen View Post
You're welcome . I'd like to include this on PvX (because it would help just as many arguments over there), but it'd probably need to be added as a special page, which I don't even have privileges to do. I'm not sure if there's any alterations that would need to be made for that to work either. I could talk to Phenaxkian to see if he knows more about it.

As for some more minor things, do you think it would be possible to add a generic +damage box, where someone could put the total bonus from conjure/SoH/Orders? I don't think a separate box would be needed for each, since adding them up in your head is pretty trivial. Also, the Tactics spec should probably go next to "Fear Me!", since tactics has no direct effect on weapon damage.
I'll see about adding support for +dmg for the next version. There's only a half-dozen commonly used ones, so I'll probably just hardcode them to prevent people from doing things like stacking conjure with Orders.

Tactics is grouped with attributes because it's always the player's tactics attribute; command is grouped with GftE because it could be someone else's command attribute.

drkn

drkn

Forge Runner

Join Date: Jan 2009

Wroc??aw, Poland

Midnight Mayhem

Me/

I've hosted it here, hope you don't mind. Feel free to link it on the wikis, or wherever you want. The server is stable and reliable.
If you make any alterations, please send me the new code via PM over Guru.