// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// power/average.js
//
// copyright (c) 2006-2010 drow <drow@bin.sh>
// all rights reserved.

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// calculate optimum power attack

function repower_calc () {
  var form_elem = $('power_form').elements;
  var bab = parseInt(selv(form_elem['bab']));
  var N   = n_attacks(bab);
    if (selv(form_elem['act']) == 'single') N = 1;
  var X   = parseInt(form_elem['ext'].value);
  var att = parseInt(selv(form_elem['att']));
  var D   = parseFloat(form_elem['dmg_avg'].value);
  var thr = parseInt(selv(form_elem['threat']));
  var crx = parseInt(selv(form_elem['crit']));
    if (form_elem['nocr'].checked) crx = 1;
  var add = parseFloat(form_elem['add_avg'].value);
  var thw = form_elem['thw'].checked;
  var tac = parseFloat(form_elem['ac'].value);
  var pl  = $R(0,bab);
  var acl = $R((tac - 5),(tac + 5));
  var td  = $A($R(0,bab).map(function (n) { return $A(); }));

  acl.each(function (ac) {
    var base_dmg = calc_dmg(ac,bab,N,X,att,D,thr,crx,add,thw,0);
      var opt_p = 0; var opt_dmg = 0;
    pl.each(function (p) {
      var p_dmg = calc_dmg(ac,bab,N,X,att,D,thr,crx,add,thw,p);
        if (p_dmg > opt_dmg) { opt_p = p; opt_dmg = p_dmg; }
      td[p][ac] = eval_fmt('cell',{ 'dmg': fmt_dmg(p_dmg) });
    });
    td[opt_p][ac] = eval_fmt('cell_opt',{ 'dmg': fmt_dmg(opt_dmg) });
  });
  return fmt_table(pl,acl,td);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
// calculate average damage

function calc_dmg (ac,bab,N,X,att,D,thr,crx,add,thw,p) {
  var p_add = p;
    if (thw) p_add *= 2;
  var crD = ((D + p_add) * crx) + add;
  var atD = D + p_add + add;
  var iter;
  var dmg = 0;

  for (iter = 0; iter < N; iter++) {
    dmg += iter_dmg(ac,bab,iter,att,crD,atD,thr,p);
  }
  for (ext = 0; ext < X; ext++) {
    dmg += iter_dmg(ac,bab,0,att,crD,atD,thr,p);
  }
  return dmg;
}
function iter_dmg (ac,bab,iter,att,crD,atD,thr,p) {
  var atb = bab - (iter * 5) + att - p;
  var crt = 21 - (ac - atb);
    if (crt <  1) crt =  1;
    if (crt > 19) crt = 19;
  var ctD = ((crt * crD) + ((20 - crt) * atD)) / 20.0;
  var d20;
  var iter_dmg = 0;

  for (d20 = 2; d20 <= 20; d20++) {
    var res = d20 + atb;

    if (d20 == 20) {
      iter_dmg += ctD;
    } else if (res >= ac) {
      if (d20 >= thr) {
        iter_dmg += ctD;
      } else {
        iter_dmg += atD;
      }
    }
  }
  return (iter_dmg / 20.0);
}

// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

