// Math functions for D&D calculators

//Computes the average damage resulting from rolling aDb + c
function DiceToAvg (a, b, c) {
	return a * (b + 1) / 2 + c
}

//Computes average damage resulting from rolling aDb + c damage, needing to roll a d on a d20 to hit
//Assumes auto-miss on a 1 and auto-hit on a 20.
function AvgDamWithAC (a, b, c, d) {
	avg = (1 - 0.05 * (Math.min(Math.max(d, 2), 20) - 1)) * DiceToAvg (a, b, c)
	return Math.round(avg*Math.pow(10,3))/Math.pow(10,3)
}

function powerattack (form) {
	a = parseInt(form.damagedicenum.value)
	b = parseInt(form.damagedicesize.value)
	var PA_ADs = document.getElementsByName("PA_AD")
	var optimalPA = 0
	var baseavg = 0
	var bestavg = 0
	var curravg = 0
	var PAbonus = parseInt(form.PA_bonus.value)
	var PAcost = parseInt(form.PA_cost.value)
	var PA_max = parseInt(form.powmax.value)
	if (isNaN(a) || (parseInt(form.damagedicenum.value) < 1)) {
		clearoutput(form)
		return
	}
	if (isNaN(b) || (parseInt(form.damagedicesize.value) < 1)) {
		clearoutput(form)
		return
	}
	if(PAcost == 0) {
		PAcostdiv = 1
	} else {
		PAcostdiv = PAcost
	}
	elementID = document.getElementById('Avg_with_PA')
	for (i = 0; i <= Math.ceil(PA_max / PAcostdiv); i++) {
		curravg = 0
		for (j = 0; j < PA_ADs.length; j++) {
			if (!isNaN(parseInt(PA_ADs[j].value))) {
				c = parseInt(form.damagebonus.value) + PAbonus * i
				d = parseInt(PA_ADs[j].value) + PAcost * i
				curravg = curravg + AvgDamWithAC (a, b, c, d)
			}
		}
		if (i == 0) {baseavg = curravg} //save base damage w/o PA
		if (curravg > bestavg) {
			optimalPA = i * PAcostdiv
			bestavg = curravg
		}
	}
	optimalPA = Math.round(optimalPA*Math.pow(10,3))/Math.pow(10,3)
	baseavg = Math.round(baseavg*Math.pow(10,3))/Math.pow(10,3)
	bestavg = Math.round(bestavg*Math.pow(10,3))/Math.pow(10,3)

	elementID = document.getElementById('PA_amt')
	elementID.innerHTML = optimalPA
	elementID = document.getElementById('Avg_no_PA')
	elementID.innerHTML = baseavg
	elementID = document.getElementById('Avg_with_PA')
	elementID.innerHTML = bestavg
}

function clearoutput(form) {
	elementID = document.getElementById('PA_amt')
	elementID.innerHTML = ""
	elementID = document.getElementById('Avg_no_PA')
	elementID.innerHTML = ""
	elementID = document.getElementById('Avg_with_PA')
	elementID.innerHTML = ""
}

//Finds the best power attack for a weapon doing aDb + c damage, needing a d on a d20 to hit (both before power attack is applied), with a maximum power attack of e
//DEPRECATED.  powerattack(form) subsumes this function's duties.
function bestPA (a, b, c, d, e, mult) {
	var optimalPA = 0
	var bestavg = 0
	var curravg = 0
	var i
	for (i = 0; i <= e; i++) {
		curravg = AvgDamWithAC(a, b, c + i * mult, d + i)
		if (curravg > bestavg) {
			optimalPA = i
			bestavg = curravg
		}
	}
	//round to 3 places
	return Math.round(optimalPA*Math.pow(10,3))/Math.pow(10,3)
}

