

var EXPDB=new Array;
{
	var i=0;
	EXPDB[i++]=0;EXPDB[i++]=50;EXPDB[i++]=150;EXPDB[i++]=300;EXPDB[i++]=500;EXPDB[i++]=750;EXPDB[i++]=1050;EXPDB[i++]=1400;EXPDB[i++]=1800;EXPDB[i++]=2250;EXPDB[i++]=2750;EXPDB[i++]=3300;EXPDB[i++]=3900;
	EXPDB[i++]=4550;EXPDB[i++]=5250;EXPDB[i++]=6000;EXPDB[i++]=6800;EXPDB[i++]=7939;EXPDB[i++]=9163;EXPDB[i++]=10474;EXPDB[i++]=11874;EXPDB[i++]=13365;EXPDB[i++]=14949;EXPDB[i++]=16628;EXPDB[i++]=18404;EXPDB[i++]=20279;EXPDB[i++]=22255;EXPDB[i++]=24334;EXPDB[i++]=26518;EXPDB[i++]=28809;EXPDB[i++]=31209;
	EXPDB[i++]=33720;EXPDB[i++]=36344;EXPDB[i++]=39083;EXPDB[i++]=45407;EXPDB[i++]=52057;EXPDB[i++]=59041;EXPDB[i++]=66367;EXPDB[i++]=74043;EXPDB[i++]=82077;EXPDB[i++]=90477;EXPDB[i++]=99251;EXPDB[i++]=108407;EXPDB[i++]=117953;EXPDB[i++]=127897;
	EXPDB[i++]=138247;EXPDB[i++]=149011;EXPDB[i++]=160197;EXPDB[i++]=171813;EXPDB[i++]=183867;EXPDB[i++]=196367;EXPDB[i++]=222326;EXPDB[i++]=249262;EXPDB[i++]=277193;EXPDB[i++]=306137;EXPDB[i++]=336112;EXPDB[i++]=367136;EXPDB[i++]=399227;EXPDB[i++]=432403;
	EXPDB[i++]=466682;EXPDB[i++]=502082;EXPDB[i++]=538621;EXPDB[i++]=576317;EXPDB[i++]=615188;EXPDB[i++]=655252;EXPDB[i++]=696527;EXPDB[i++]=739031;EXPDB[i++]=782782;EXPDB[i++]=860166;EXPDB[i++]=939792;EXPDB[i++]=1021692;EXPDB[i++]=1105898;EXPDB[i++]=1192442;
	EXPDB[i++]=1281356;EXPDB[i++]=1372672;EXPDB[i++]=1466422;EXPDB[i++]=1562638;EXPDB[i++]=1661352;EXPDB[i++]=1762596;EXPDB[i++]=1866402;EXPDB[i++]=1972802;EXPDB[i++]=2081828;EXPDB[i++]=2193512;EXPDB[i++]=2307886;EXPDB[i++]=2424982;EXPDB[i++]=2609857;EXPDB[i++]=2799057;
	EXPDB[i++]=2992632;EXPDB[i++]=3190632;EXPDB[i++]=3393107;EXPDB[i++]=3600107;EXPDB[i++]=3811682;EXPDB[i++]=4027882;EXPDB[i++]=4248757;EXPDB[i++]=4474357;EXPDB[i++]=4704732;EXPDB[i++]=4939932;EXPDB[i++]=5180007;EXPDB[i++]=5425007;EXPDB[i++]=5674982;EXPDB[i++]=5929982;
	EXPDB[i++]=6190057;EXPDB[i++]=6569701;EXPDB[i++]=6956775;EXPDB[i++]=7351351;EXPDB[i++]=7753501;EXPDB[i++]=8163297;EXPDB[i++]=8580811;EXPDB[i++]=9006115;EXPDB[i++]=9439281;EXPDB[i++]=9880381;EXPDB[i++]=10329487;EXPDB[i++]=10786671;EXPDB[i++]=11252005;EXPDB[i++]=11725561;
	EXPDB[i++]=12207411;EXPDB[i++]=12697627;EXPDB[i++]=13196281;EXPDB[i++]=13703445;EXPDB[i++]=14403284;EXPDB[i++]=15114884;EXPDB[i++]=15838343;EXPDB[i++]=16573759;EXPDB[i++]=17321230;EXPDB[i++]=18080854;EXPDB[i++]=18852729;EXPDB[i++]=19636953;EXPDB[i++]=20433624;EXPDB[i++]=21242840;EXPDB[i++]=22064699;EXPDB[i++]=22899299;
	EXPDB[i++]=23746738;EXPDB[i++]=24607114;EXPDB[i++]=25480525;EXPDB[i++]=26367069;EXPDB[i++]=27266844;EXPDB[i++]=28457388;EXPDB[i++]=29665454;EXPDB[i++]=30891170;EXPDB[i++]=32134664;EXPDB[i++]=33396064;EXPDB[i++]=34675498;EXPDB[i++]=35973094;EXPDB[i++]=37288980;EXPDB[i++]=38623284;EXPDB[i++]=39976134;EXPDB[i++]=41347658;
	EXPDB[i++]=42737984;EXPDB[i++]=44147240;EXPDB[i++]=45575554;EXPDB[i++]=47023054;EXPDB[i++]=48489868;EXPDB[i++]=49976124;EXPDB[i++]=51879903;EXPDB[i++]=53808599;EXPDB[i++]=55762374;EXPDB[i++]=57741390;EXPDB[i++]=59745809;EXPDB[i++]=61775793;EXPDB[i++]=63831504;EXPDB[i++]=65913104;EXPDB[i++]=68020755;EXPDB[i++]=70154619;
	EXPDB[i++]=72314858;EXPDB[i++]=74501634;EXPDB[i++]=76715109;EXPDB[i++]=78955445;EXPDB[i++]=81222804;EXPDB[i++]=83517348;EXPDB[i++]=85839239;EXPDB[i++]=88737739;EXPDB[i++]=91670389;EXPDB[i++]=94637389;EXPDB[i++]=97638939;EXPDB[i++]=100675239;EXPDB[i++]=103746489;EXPDB[i++]=106852889;EXPDB[i++]=109994639;EXPDB[i++]=113171939;EXPDB[i++]=116384989;EXPDB[i++]=119633989;
}

var CRDB=new Array;
{
	var i=1;
	CRDB[i++]=300;CRDB[i++]=250;CRDB[i++]=200;CRDB[i++]=150;
	CRDB[i++]=100;CRDB[i++]=80;	CRDB[i++]=70;CRDB[i++]=60;
	CRDB[i++]=50;CRDB[i++]=40;
}

var CPDB = new Array;
{
	var i=1;
	CPDB[i++]=5;CPDB[i++]=5;CPDB[i++]=8;CPDB[i++]=8;CPDB[i++]=10;
	CPDB[i++]=14;CPDB[i++]=28;CPDB[i++]=32;CPDB[i++]=36;CPDB[i++]=40;
}
var RAINDB=new Array;
{
	var i=0;
	RAINDB[i++]=0.92;RAINDB[i++]=0.78;RAINDB[i++]=0.67;
}

/*****************************************************************
	FUNCTIONS
******************************************************************/
function getINTBonus(char_) { return ((char_.STS[3]>52)?Math.floor((char_.STS[3]-50)/2):0);}

function getCPBonus(char_) {
  var db=RarePfSfDB[char_.EQP[EQP_RI].p];
  return (db.name=='CP'?
          db.min+db.unit*char_.EQP[EQP_RI].pl:0)
}

function calcCastRate(char_) {
  var ret=new Array;
  
  var i;
  var ycl;
  
  var mf=Math.floor;
  var lvl=char_.LVL;
  
  var ib=(char_.STS[STS_IN]>=52) ? mf((char_.STS[STS_IN]-50)/2) : 0;
  var pv; // penalty value
  var pb; // penalty bonus
  var cpb=getCPBonus(char_); // CP bonus
  
  for(i=1;i<11;++i){
    ycl=mf(lvl/10);
    if (i - ycl > 0) {
      pv = (i - ycl) * CPDB[i];
      pb = mf((lvl % 10)
              / (i * 10 - ycl * 10) * pv);
    }else if (i - ycl < 0){
      pv = (i - ycl) * 5;
      pb = 0;
    }else{
      pv = 0;
      pb = 0;
    }
    
    ret[i]=mf((CRDB[i]*char_.SKL[8]/100)+ib-pv+pb);
    if(ret[i]<=0)ret[i]=1;
    else ret[i]+=cpb;
  }
  return ret;
}

function calcHPRec(char_) {
  function sub(char_, part_) {
    var ret=0;
    var sdb = RarePfSfDB[char_.EQP[part_].s];
    if (sdb.name=='HP Rec') ret=sdb.min+char_.EQP[part_].sl*sdb.unit;
    return ret;
  }
  var ret={min:0, max:0}, i, bonus=0, mf=Math.floor;
  for (i=EQP_LE; i<EQP_CNT; ++i) bonus+=sub(char_, i);

  ret.min=mf(char_.STS[STS_VI]/2 * ((100+bonus)/100));
  ret.max=mf(char_.STS[STS_VI] * ((100+bonus)/100));

  return ret;
}

function calcMPRec(char_) {
  function sub(char_, part_) {
    var ret=0;
    var sdb = RarePfSfDB[char_.EQP[part_].s];
    if (sdb.name=='MP Rec') ret=sdb.min+char_.EQP[part_].sl*sdb.unit;
    return ret;
  }
  var ret={min:0, max:0}, i, bonus=0, mf=Math.floor;
  for (i=EQP_LE; i<EQP_CNT; ++i) bonus+=sub(char_, i);

  ret.min=mf(1 * ((100+bonus)/100));
  ret.max=mf(char_.STS[STS_MA] * ((100+bonus)/100));

  return ret;
}

function calcSPRec(char_) {
  function sub(char_, part_) {
    var ret=0;
    var sdb = RarePfSfDB[char_.EQP[part_].s];
    if (sdb.name=='SP Rec') ret=sdb.min+char_.EQP[part_].sl*sdb.unit;
    return ret;
  }
  var ret={min:0, max:0}, i, bonus=0, mf=Math.floor;
  for (i=EQP_LE; i<EQP_CNT; ++i) bonus+=sub(char_, i);

  ret.min=mf(char_.STS[STS_VI]/10 * ((100+bonus)/100));
  ret.max=mf(char_.STS[STS_VI]/3  * ((100+bonus)/100));

  return ret;
}

function calcHitRate(hit, dodge) {
  var h;
  if (hit==0) h=10;
  else if(dodge==0) h=90;
  else h=Math.round((hit+50)/dodge*50);
  return (h<10?10:(h>95?95:h))
}

