//////////////////////////////////////////////////
/////         Netmarble Laghaim              /////
/////                      provided by hayun /////
//////////////////////////////////////////////////

// aBulkan:Bulkan(Axe), wBulkan:Bulkan(Sword), Kairipton, Human, Aidia
theRace = parent.getRace.theRace;   // choose the race

//////////////////////////////////////////////////
/////1. Choose race and input the init value /////
//////////////////////////////////////////////////

function theChar() {
    this.engRace='';this.korRace='';
    // initializing stat
    this.initStr=0;this.initWis=0;this.initSpd=0;this.initCon=0;this.initLeader=0;
    this.initLife=0;this.initMana=0;this.initElec=0;this.initStam=0;

    // present stat
    this.nowStr=0;this.nowWis=0;this.nowSpd=0;this.nowCon=0;this.nowLeader=0;
    this.nowLife=0;this.nowMana=0;this.nowElec=0;this.nowStam=0;
    this.nowLevel=1;this.nowRemainPoint=0;

    // アクセサリ数値
    this.spStr=0;this.spWis=0;this.spSpd=0;this.spCon=0;this.spLeader=0;
    this.spRingLife=0;this.spRingMana=0;this.spRingElec=0;this.spRingStam=0;
    this.spNeckLife=0;this.spNeckMana=0;this.spNeckElec=0;this.spNeckStam=0;

    // 小型装備数値
    this.coldDef=0;this.stoneDef=0;this.boltDef=0;this.volcanicDef=0;
    this.reflectDam=0;this.elecUp=0;

    // 古代指輪数値

    // テキスト用
    this.text='';

    this.STR4LIFE=0;this.CON4LIFE=0;this.WIS4MANA=0;this.STR4STAM=0;this.SPD4ELEC=0;

    this.bareDam=0;this.magicDam=0;
    // 1st                  2nd             3rd             masuk : sum()=magicDam
    this.magicDamA=0;this.magicDamB=0;this.magicDamC=0;this.magicDamM=0;
    // lvl up exp, total exp ｹﾗ reinit price ｹﾝｿｵ
    this.lvlExp=0;this.totExp=0;this.reInitPrice=0;

    // learned skill point,min/max value, required level, skill value for each skill
    this.nowSkill0=0;this.nowSkill0Min=0;this.nowSkill0Max=0;this.nowSkill0Lvl=0;this.nowSkill0Value=0;
    this.nowSkill1=0;this.nowSkill1Min=0;this.nowSkill1Max=0;this.nowSkill1Lvl=0;this.nowSkill1Value=0;
    this.nowSkill2=0;this.nowSkill2Min=0;this.nowSkill2Max=0;this.nowSkill2Lvl=0;this.nowSkill2Value=0;
    this.nowSkill3=0;this.nowSkill3Min=0;this.nowSkill3Max=0;this.nowSkill3Lvl=0;this.nowSkill3Value=0;
    this.nowSkill4=0;this.nowSkill4Min=0;this.nowSkill4Max=0;this.nowSkill4Lvl=0;this.nowSkill4Value=0;
    this.nowSkill5=0;this.nowSkill5Min=0;this.nowSkill5Max=0;this.nowSkill5Lvl=0;this.nowSkill5Value=0;
}

// update stat
theChar.prototype.updateStat = function () {
    this.initLife=this.initStr+this.initCon*2;
    this.initMana=this.initWis*2+this.initSpd;
    this.initElec=this.initWis+this.initSpd*2;
    this.initStam=this.initStr*2+this.initCon;
}

// update 'idRaceName','idStrLimit','idWisLimit','idSpdLimit','idConLimit','idLeaderLimit'
function updateStat1() {
    // call genWriteIt in myPopUp.js
    genWriteIt('idRaceName',myChar.korRace);    // update 'idRaceName'
}

// update 'idNowLife','idNowMana','idNowElec','idNowStam'
function updateStat2() {
    // call genWriteIt in myPopUp.js
    //                         0       1       2       3
    var statArrId=new Array('idNowLife','idNowMana','idNowElec','idNowStam');
    var statArr=new Array(myChar.nowLife,myChar.nowMana,myChar.nowElec,myChar.nowStam);
    for (var i=0;i<statArr.length;i++) genWriteIt(statArrId[i],statArr[i]);
}

// update 'idNowRemainPoint','idLvlExp','idTotExp','idReInitPrice'
function updateStat3() {
    // call genWriteIt in myPopUp.js
    //                         0       1         2
    var statArrId=new Array('idNowRemainPoint','idLvlExp','idTotExp','idReInitPrice');
    var statArr=new Array(myChar.nowRemainPoint,myChar.lvlExp,myChar.totExp,myChar.reInitPrice);
    for (var i=0;i<statArr.length;i++) genWriteIt(statArrId[i],statArr[i]);
}

// calculate bare hand damage
theChar.prototype.getBareDam = function () {
    var temp=0;var raceSkill=0;var race=this.engRace;
    switch(race) {
        case 'Bulkan'   : raceSkill1=this.nowStr+parseInt(genReadIt("idSubStr"));
                          raceSkill2=this.nowCon+parseInt(genReadIt("idSubCon"));
                          raceSkill3=this.nowSpd+parseInt(genReadIt("idSubSpd"));
                          temp=this.nowLevel/6+raceSkill1/4+raceSkill2/5+raceSkill3/4;
                          break;
        case 'Hybrid'   : raceSkill1=this.nowStr+parseInt(genReadIt("idSubStr"));
                          raceSkill2=this.nowWis+parseInt(genReadIt("idSubWis"));
                          raceSkill3=this.nowSpd+parseInt(genReadIt("idSubSpd"));
                          temp=this.nowLevel/6+raceSkill1/5+raceSkill2/4+raceSkill3/3;
                          break;
        case 'Kairipton': raceSkill=this.nowWis+parseInt(genReadIt("idSubWis"));
                          temp=this.nowLevel/5+raceSkill/4;
                          break;
        case 'Human'    : raceSkill1=this.nowSpd+parseInt(genReadIt("idSubSpd"));
                          raceSkill2=this.nowStr+parseInt(genReadIt("idSubStr"));
                          temp=this.nowLevel/6+raceSkill1/2+raceSkill2/3;
                          break;
        case 'Aidia'    : raceSkill1=this.nowWis+parseInt(genReadIt("idSubWis"));
                          raceSkill2=this.nowLeader+parseInt(genReadIt("idSubLeader"));
                          temp=this.nowLevel/4+raceSkill1/2+raceSkill2/3;
                          break;
        default         : raceSkill=0;
    }
    this.bareDam=temp;
    // in case of magic, calculate the final stage for shocksphere
    this.magicDam=Math.floor(this.nowSkill0Value*0.7)+Math.floor(this.nowSkill1Value*0.5)+Math.floor(this.nowSkill2Value);
    return true;
}

// calculate the level-up experience
theChar.prototype.getLvlExp = function () {
    var n=this.nowLevel;
    this.lvlExp=this.getLvlExp2(n);
    return true;
}

<!--Exp parts made by BuCCi-->
theChar.prototype.getLvlExp2 = function (lvl) {
    var n=parseInt(lvl); var exp=0;
    // lvl 250~259 : exp 100000000, 260~269: exp 200000000, 270~279: exp 400000000, 280-:unknown
    if (n<=7) exp=iExp[n];
    else {
        if (n<250) {
            var dx = new Array(7,10,7);
            var totalExp = 8030;
            var nextExp = 3092;
            var diff1 = 639;
            var diff2 = 66;
            var i;
            for ( i = 9; i <= n; i++ ) {
                totalExp += nextExp;
                nextExp  += diff1;
                diff1    += diff2;
                diff2    += dx[i%3];
            }
            exp=nextExp;
        }
        else if (n<=259) {
            exp=100000000;
        }
        else {
            var m=0;
            m=1+parseInt((n-260)/10);
            exp=200000000*m;
        }
    }
    return exp;
}

// calculte the total exp' prior to given level
theChar.prototype.getTotExp = function () {
    var n=this.nowLevel;var sum=0;
    if (n<=7) sum = iExpSum[n-1];
    else {
        // at first, get the sum for level 1~7
        sum = iExpSum[7];
        // get the sum prior to given level from level 8
        for (var x=8;x<n;x++) sum += this.getLvlExp2(x);
    }
    this.totExp=sum;
    return true;
}

// get the re-init price for given level
theChar.prototype.getReInitPrice = function () {
    var n=this.nowLevel; var price=0;
    if (n<=99) {price = n*n*n*0.4;}
    else if (n>=100 && n<=119) {price = n*n*n*0.7;}
    else {price = n*n*n*1.0;}
    this.reInitPrice=Math.floor(price);
    return true;
}

// copy the basic arrays when choosing the race
function setRace() {
    myChar = new theChar();
    switch(theRace) {
        case 'aBulkan':    iRACE=iBulkan;iSTAT=iStatBulkan;myChar.engRace='Bulkan';myChar.korRace='ブルカン（斧）';lagSkillKor=aBulSkillKor;lagSkillEng=aBulSkillEng;break;
        case 'wBulkan':    iRACE=iBulkan;iSTAT=iStatBulkan;myChar.engRace='Bulkan';myChar.korRace='ブルカン（剣）';lagSkillKor=wBulSkillKor;lagSkillEng=wBulSkillEng;break;
        case 'hHybrid':    iRACE=iHybrid;iSTAT=iStatHybrid;myChar.engRace='Hybrid';myChar.korRace='ハイブリ（槌）';lagSkillKor=hHybSkillKor;lagSkillEng=hHybSkillEng;break;
        case 'tHybrid':    iRACE=iHybrid;iSTAT=iStatHybrid;myChar.engRace='Hybrid';myChar.korRace='ハイブリ（双）';lagSkillKor=tHybSkillKor;lagSkillEng=tHybSkillEng;break;
        case 'Kairipton':  iRACE=iKairipton;iSTAT=iStatKairipton;myChar.engRace='Kairipton';myChar.korRace='カイリプトン';lagSkillKor=sKaiSkillKor;lagSkillEng=sKaiSkillEng;break;
        case 'Human':      iRACE=iHuman;iSTAT=iStatHuman;myChar.engRace='Human';myChar.korRace='ヒューマン';lagSkillKor=gHumSkillKor;lagSkillEng=gHumSkillEng;break;
        case 'Aidia':      iRACE=iAidia;iSTAT=iStatAidia;myChar.engRace='Aidia';myChar.korRace='エイディア';lagSkillKor=rAidSkillKor;lagSkillEng=rAidSkillEng;break;
        default: alert("不正なデータです。");
    }
    myChar.initStr=iRACE[3];myChar.initWis=iRACE[6];myChar.initSpd=iRACE[9];
    myChar.initCon=iRACE[12];myChar.initLeader=iRACE[15];
    myChar.STR4LIFE=iSTAT[1];myChar.CON4LIFE=iSTAT[2];myChar.WIS4MANA=iSTAT[3];
    myChar.STR4STAM=iSTAT[4];myChar.SPD4ELEC=iSTAT[5];myChar.CON4STAM=iSTAT[6];

    updateStat1();  // update 'idRaceName'
    setInitStat();  // get the stat value (life/mana/elec/stam) when initialzing
    // move the focus
    myStatForm.idNowLvl.focus();myStatForm.idNowLvl.select();
}

// get the stat value (life/mana/elec/stam) when initialzing
function setInitStat() {
    myChar.nowStr=myChar.initStr;myChar.nowWis=myChar.initWis;myChar.nowSpd=myChar.initSpd;
    myChar.nowCon=myChar.initCon;myChar.nowLeader=myChar.initLeader;
    myChar.updateStat();    // update initial life/mana/elec/stam
    myChar.nowLife=myChar.initLife;myChar.nowMana=myChar.initMana;
    myChar.nowElec=myChar.initElec;myChar.nowStam=myChar.initStam;
    myChar.nowRemainPoint=0;myChar.nowLevel=1;
    myChar.acceAC=0;

    // アクセサリ数値
    //myChar.spStr=0;myChar.spWis=0;myChar.spSpd=0;myChar.spCon=0;myChar.spLeader=0;
    //myChar.spRingLife=0;myChar.spRingMana=0;myChar.spRingElec=0;myChar.spRingStam=0;
    //myChar.spNeckLife=0;myChar.spNeckMana=0;myChar.spNeckElec=0;myChar.spNeckStam=0;

    // page update
    myStatForm.idNowStr.value=myChar.nowStr; myStatForm.idNowWis.value=myChar.nowWis;
    myStatForm.idNowSpd.value=myChar.nowSpd; myStatForm.idNowCon.value=myChar.nowCon;
    myStatForm.idNowLeader.value = myChar.nowLeader;
    myStatForm.idNowLvl.value=myChar.nowLevel; //myStatForm.idNowSkillPoint.value = myChar.nowSkillPoint;
    updateStat2(); // update 'idNowLife','idNowMana','idNowElec','idNowStam'
    // lvl up exp, total exp, reinit price update
    myChar.getLvlExp();myChar.getTotExp();myChar.getReInitPrice();
    updateStat3(); // update 'idNowRemainPoint','idLvlExp','idTotExp','idReInitPrice'
    // update bare hand damage & update damage point in getAttack.js
    initSkillTree();    // skill tree initialize
    // update bare hand damage & update damage point in getAttack.js
    myChar.getBareDam();updateDamage();
    return true;
}

// layer for ReInit
function canvasReInit() {
    if (myToolTip.isTipOn) return false;
    var zzTrTd = '<tr><td>';
    var zzTd = '</td><td>';
    var ReInitHead = '<FORM NAME="ReInitForm">'
                   + '<TABLE width="250" height="150" align="center" class="font9" style="background-color:#E0E7E7;">';
    var ReInitTail = '</td></tr><tr>'
                   + '<td height="20" colspan="2">'
                   + '<BUTTON onClick="getInitialStat()">初期化</BUTTON>'
                   + '&nbsp;&nbsp;&nbsp;&nbsp;'
                   + '<BUTTON onClick="popOutFixed()">キャンセル</BUTTON>'
                   + '</td></tr></table></form>';
    var whatIsReInit = '';
    whatIsReInit += '<tr height="25"><td colspan="2" class="black9">初期化</td></tr>'
                  + '<tr><td width="100">'
                  + '体力'+zzTd+'<INPUT TYPE="text" NAME="idInitStr" SIZE="2" MAXLENGTH="2" class="tdtext" onBlur="checkInit(this,1)">'
                  + '&nbsp;&nbsp;<SPAN id=idStrLimit class=black8p>aa</SPAN></td></tr>'+zzTrTd
                  + '知力'+zzTd+'<INPUT TYPE="text" NAME="idInitWis" SIZE="2" MAXLENGTH="2" class="tdtext" onBlur="checkInit(this,2)">'
                  + '&nbsp;&nbsp;<SPAN id=idWisLimit class=black8p></SPAN></td></tr>'+zzTrTd
                  + '素早さ'+zzTd+'<INPUT TYPE="text" NAME="idInitSpd" SIZE="2" MAXLENGTH="2" class="tdtext" onBlur="checkInit(this,3)">'
                  + '&nbsp;&nbsp;<SPAN id=idSpdLimit class=black8p></SPAN></td></tr>'+zzTrTd
                  + '体質'+zzTd+'<INPUT TYPE="text" NAME="idInitCon" SIZE="2" MAXLENGTH="2" class="tdtext" onBlur="checkInit(this,4)">'
                  + '&nbsp;&nbsp;<SPAN id=idConLimit class=black8p></SPAN></td></tr>'+zzTrTd
                  + '統率力'+zzTd+'<INPUT TYPE="text" NAME="idInitLeader" SIZE="2" MAXLENGTH="2" class="tdtext" onBlur="checkInit(this,5)">'
                  + '&nbsp;&nbsp;<SPAN id=idLeaderLimit class=black8p></SPAN>';

    idReInitFormMsg[0]=ReInitHead+whatIsReInit+ReInitTail;
    popUpMsg(idReInitFormMsg);
    //if (!popUpFixed(2)) return false;   // if there is other window, do not show
    // read and display myChar init value & its limit
    var myReInitForm=browser.ie?document.all["ReInitForm"]:browser.nav?document.layers["ReInitForm"].document:0;
    var statArrId1=new Array('idInitStr','idInitWis','idInitSpd','idInitCon','idInitLeader');
    var statArr1=new Array(myChar.initStr,myChar.initWis,myChar.initSpd,myChar.initCon,myChar.initLeader);
    var statArrId2=new Array('idStrLimit','idWisLimit','idSpdLimit','idConLimit','idLeaderLimit');
    var statArr2=new Array("("+iRACE[1]+"〜"+iRACE[2]+")","("+iRACE[4]+"〜"+iRACE[5]+")","("+iRACE[7]+"〜"+iRACE[8]+")","("+iRACE[10]+"〜"+iRACE[11]+")","("+iRACE[13]+"〜"+iRACE[14]+")");
    for (var i=0;i<statArr1.length;i++) {
        var zzz='myReInitForm.'+statArrId1[i]+'.value='+statArr1[i];eval(zzz);
        genWriteIt(statArrId2[i],statArr2[i]);
    }
}

// do this when Re-Init
function getInitialStat() {
    var sum=0;
    var myReInitForm=browser.ie?document.all["ReInitForm"]:browser.nav?document.layers["ReInitForm"].document:0;
    var statArrId1=new Array('idInitStr','idInitWis','idInitSpd','idInitCon','idInitLeader');
    var statArr1=new Array(myChar.initStr,myChar.initWis,myChar.initSpd,myChar.initCon,myChar.initLeader);
    // check the initial value is right
    for (var i=0;i<statArrId1.length;i++) {
        var zzz='var '+statArrId1[i].substring(2)+'=parseInt(myReInitForm.'+statArrId1[i]+'.value)';eval(zzz);
        var zzz='sum+='+statArrId1[i].substring(2);eval(zzz);
    }
    if (sum!=80) {
        alert("能力値は80までです。\n現在の状態:"+sum);
        return false;
    }
    // initStr,initWis,initSpd,initCon,initLeader : update the input value when re-ini
    for (var i=0;i<statArrId1.length;i++) {
        var zzz='myChar.i'+statArrId1[i].substring(3)+'='+statArrId1[i].substring(2);eval(zzz);
    }
    updateStat1();  // update 'idRaceName'
    setInitStat();  // get the stat value (life/mana/elec/stam) when initialzing
    myStatForm.idNowLvl.focus();myStatForm.idNowLvl.select(); // move focus
    popOutFixed()   // if all is ok, close the window
    return true;
}

// check the each init value is right
function checkInit(obj,num) {
    if (obj.value >= iRACE[3*num-2] && obj.value<=iRACE[3*num-1]) {
        return true;
    }
    alert("不正な値です。");
    obj.focus(); obj.select();
    return false;
}

//////////////////////////////////////////////////
/////    2. ﾇﾀ・ﾆｯｼｺﾄ｡ ﾀﾔｷﾂｽﾃ ｻ鄙・         /////
//////////////////////////////////////////////////

// remain point ｺｯｰ・: level ｹﾗ ｰ｢ﾁｾ ﾆｯｼｺﾄ｡ ｺｯｰ貎ﾃ
function updatePoint(diff) {
    myChar.nowRemainPoint -= diff;
    // call genWriteIt in myPopUp.js
    genWriteIt('idNowRemainPoint',myChar.nowRemainPoint);
    return true;
}

// onBlur ｽﾃ ｷｹｺｧｰｪ ｰﾋｻ・
function checkLevel(obj) {
    var original = myChar.nowLevel;     // ﾃﾊｱ箍ｪ ﾀﾏｴﾜ ﾀﾀ衂ﾘｳｱｸ,ｺｯｼｿ｡ ﾀﾀ蠏ﾇﾀﾖｾﾛ・
    if (obj.value==original) {return true;} // ｸｸｾ・ｰｪﾀﾌ ｺｯﾇﾏﾁ・ｾﾊｾﾒﾀｸｸ・ ｰﾀ・return
    var result = parseInt(isNumber(obj.value)); // ｼﾀﾚﾀﾎﾁ・ﾈｮﾀﾎﾇﾏｰ・
    // ｼﾀﾚｰ｡ ｾﾆｴﾏｸ・
    if (!result) {obj.value = original;obj.focus();obj.select();return false;}
    // ｼﾀﾚｸ・
    if (!(result>=1 && result<=999)) {
        alert("レベルは999までです。\n入力値:"+result)
        obj.value = original;obj.focus();obj.select();
        return false;
    }
    // ｸｵ邁ﾍﾀﾌ ﾁ､ｻﾀﾏ ｰ豼・ ﾀﾏｴﾜ ｰｪｵ・ﾃﾊｱ篳ｭﾇﾏｰ・ﾀﾔｷﾂﾇﾑ ｰｪ ｹﾝｿｵ
    setInitStat();
    // 1~250 ｱﾝｴﾂ 3point ﾁｰ｡, 251 ｺﾎﾅﾍｴﾂ 10 point ﾁｰ｡
    myChar.nowRemainPoint=result<=250?(result-1)*3:((250-1)*3+(result-250)*10);
    myChar.nowLevel=result;
    obj.value = result;
    // update bare hand damage & update damage point in getAttack.js
    myChar.getBareDam();updateDamage();
    // lvl up exp, total exp ｹﾗ reinit price ｹﾝｿｵ
    myChar.getLvlExp();myChar.getTotExp();myChar.getReInitPrice();
    updateStat3(); // update 'idNowRemainPoint','idLvlExp','idTotExp','idReInitPrice'
    // setInitStat() ｿ｡ｼｭ skillpoint ｰｪﾀﾌ ﾃﾊｱ篳ｭｵﾇｱ・ｶｧｹｮｿ｡
    // ﾀﾚｵｿﾀｸｷﾎ focus ｰ｡ ﾀﾌｵｿﾇﾏﾁ・ｾﾊﾀｽ. ｰｭﾁｦｷﾎ ﾀﾌｵｿﾇﾒ ｰﾍ
    myStatForm.idNowStr.focus();myStatForm.idNowStr.select();
    return true;
}

// point ｰ・ﾃｵﾈ ｰｪ (idNowStr,idNowWis,idNowSpd,idNowCon,idNowLeader) ｺｯｰ貎ﾃ ｰﾋｻ・
function checkStat(obj) {
    // ﾃﾊｱ箍ｪ ﾀﾏｴﾜ ﾀﾀ衂ﾘｳｱｸ,ｺｯｼｿ｡ ﾀﾀ蠏ﾇﾀﾖｾﾛ・
    var oriValue=0;var min=0;var max=0;var diff=0;
    // ﾇﾘｴ・ﾆｯｼｺﾄ｡ｿ｡ ｴ・ﾑ ﾃﾖｼﾒ/ﾃﾖｴ・ｪ ｼｳﾁ､ﾇﾏｰ・
    if      (obj.name=="idNowStr") {oriValue=myChar.nowStr;min=myChar.initStr;}
    else if (obj.name=="idNowWis") {oriValue=myChar.nowWis;min=myChar.initWis;}
    else if (obj.name=="idNowSpd") {oriValue=myChar.nowSpd;min=myChar.initSpd;}
    else if (obj.name=="idNowCon") {oriValue=myChar.nowCon;min=myChar.initCon;}
    else if (obj.name=="idNowLeader") {oriValue=myChar.nowLeader;min=myChar.initLeader;}
    else {alert("予期せぬエラーが発生しました。: "+obj.name);return false;}
    max=myChar.nowRemainPoint+oriValue;
    // ｸｸｾ・ｰｪﾀﾌ ｺｯﾇﾏﾁ・ｾﾊｾﾒﾀｸｸ・ ｰﾀ・return
    if (obj.value==oriValue) return true;
    var result = parseInt(isNumber(obj.value)); // ﾀﾔｷﾂｰｪﾀﾌ ﾁ､ｼｰｪﾀﾎﾁ・ﾈｮﾀﾎﾇﾏｰ・
    // ｼﾀﾚｰ｡ ｾﾆｴﾏｸ・
    if (!result) {obj.value = oriValue; obj.focus();obj.select();return false;}
    // ｼﾀﾚ ｹ・ｧｸｦ ｳﾑﾀｸｸ・
    if (result<min) {
        alert("初期値以下にはできません。");
        obj.value = oriValue; obj.focus(); obj.select();
        return false;
    } else if (result>max) {
        alert("能力値が足りません。");
        obj.value = oriValue; obj.focus(); obj.select();
        return false;
    } else if(result>900) { // 能力値の最大は900まで
        alert("能力値は900までです。\n入力値:"+result);
        obj.value = oriValue; obj.focus(); obj.select();
        return false;
    }
    diff=result-oriValue;   // ｺｯｰ豬ﾈ ﾂｴﾂ
    changeStat(obj,result,oriValue,diff);   // ﾁ､ｻﾀﾀﾎ ﾀﾔｷﾂｰｪﾀﾌｸ・ ｺｯｰ貘ｻ ﾇﾏﾀﾚ
    // update bare hand damage & update damage point in getAttack.js, myArmor.gatherArmor() in getArmorClass.js ｹ貔ﾓﾂ update
    myChar.getBareDam();updateDamage();myArmor.gatherArmor();myAcce.gatherAcce();
    return true
}

// result=oriValue(初期値)+diff(増加値)
function changeStat(obj,result,oriValue,diff) {
    var temp = 0;   // 加算値の初期化
    if (obj.name == "idNowStr") {
        // 指輪の数値を加算
        myChar.nowStr=result;//+parseInt(genReadIt("idSubStr"));
        // life update
        temp = calStat(myChar.initStr,result,myChar.STR4LIFE)-calStat(myChar.initStr,oriValue,myChar.STR4LIFE);
        myChar.nowLife += temp;
        // stam update
        temp = calStat(myChar.initStr,result,myChar.STR4STAM)-calStat(myChar.initStr,oriValue,myChar.STR4STAM);
        myChar.nowStam += temp;
    }
    else if (obj.name == "idNowWis") {
        // 指輪の数値を加算
        myChar.nowWis=result;//+parseInt(genReadIt("idSubWis"));
        temp = calStat(myChar.initWis,result,myChar.WIS4MANA)-calStat(myChar.initWis,oriValue,myChar.WIS4MANA);
        myChar.nowMana += temp;
    }
    else if (obj.name == "idNowSpd") {
        // 指輪の数値を加算
        myChar.nowSpd=result;//+parseInt(genReadIt("idSubSpd"));
        temp = calStat(myChar.initSpd,result,myChar.SPD4ELEC)-calStat(myChar.initSpd,oriValue,myChar.SPD4ELEC);
        myChar.nowElec += temp;
    }
    else if (obj.name == "idNowCon") {
        // 指輪の数値を加算
        myChar.nowCon=result;//+parseInt(genReadIt("idSubCon"));
        // life update
        temp = calStat(myChar.initCon,result,myChar.CON4LIFE)-calStat(myChar.initCon,oriValue,myChar.CON4LIFE);
        myChar.nowLife += temp;
        // stam update
        temp = calStat(myChar.initCon,result,myChar.CON4STAM)-calStat(myChar.initCon,oriValue,myChar.CON4STAM);
        myChar.nowStam += temp;
    }
    else if (obj.name == "idNowLeader") {
        // 指輪の数値を加算
        myChar.nowLeader=result;//+parseInt(genReadIt("idSubLeader"));
        var mok1 = 0;var mok2 = 0;
        switch(theRace) {
            case 'aBulkan':
                mok1 = parseInt(oriValue/2);
                mok2 = parseInt(result/2);
                temp = mok2-mok1;
                myChar.nowLife += temp; myChar.nowMana += temp;
                myChar.nowElec += temp; myChar.nowStam += temp;
                break;
            case 'wBulkan':
                mok1 = parseInt(oriValue/2);
                mok2 = parseInt(result/2);
                temp = mok2-mok1;
                myChar.nowLife += temp; myChar.nowMana += temp;
                myChar.nowElec += temp; myChar.nowStam += temp;
                break;
            case 'hHybrid':
                mok1 = parseInt(oriValue/2);
                mok2 = parseInt(result/2);
                temp = mok2-mok1;
                myChar.nowLife += temp; myChar.nowMana += temp;
                myChar.nowElec += temp; myChar.nowStam += temp;
                break;
            case 'tHybrid':
                mok1 = parseInt(oriValue/2);
                mok2 = parseInt(result/2);
                temp = mok2-mok1;
                myChar.nowLife += temp; myChar.nowMana += temp;
                myChar.nowElec += temp; myChar.nowStam += temp;
                break;
            case 'Kairipton':
                mok1 = parseInt(oriValue/2);
                mok2 = parseInt(result/2);
                temp = mok2-mok1;
                myChar.nowLife += temp; myChar.nowMana += temp;
                myChar.nowElec += temp; myChar.nowStam += temp;
                break;
            case 'Human':
                mok1 = parseInt(oriValue/2);
                mok2 = parseInt(result/2);
                temp = mok2-mok1;
                myChar.nowLife += temp; myChar.nowMana += temp;
                myChar.nowElec += temp; myChar.nowStam += temp;
                break;
            case 'Aidia':
                mok1 = parseInt(oriValue/0.4);
                mok2 = parseInt(result/0.4);
                mok3 = parseInt(oriValue/2);
                mok4 = parseInt(result/2);
                temp1 = mok2-mok1;
                temp2 = mok4-mok3;
                myChar.nowLife += temp1; myChar.nowMana += temp1;
                myChar.nowElec += temp2; myChar.nowStam += temp2;
                break;
            default: alert("不正なデータです。");
        }
    }
    else {alert("不正なデータです。: "+obj.name);return false;}
    updateStat2(); // update 'idNowLife','idNowMana','idNowElec','idNowStam'
    //ハイブリ（ライフ増幅）
    if(theRace=="tHybrid" || theRace=="hHybrid") {
        genWriteIt("idNowLife",myChar.nowLife + myChar.nowSkill3*50);
    }
    updatePoint(diff);  // point ｰｪ ｺｯｰ貮ﾏｱｸ
    obj.value = result; // ｸｵ邁ﾍﾀﾌ ﾁ､ｻﾀﾏ ｰ豼・ ﾀﾔｷﾂﾇﾑ ｰｪ ｹﾝｿｵ
    return true;
}

// ﾁﾖｾﾝ・ﾆｯｼｺﾄ｡ｿ｡ ｴ・ﾑ stat ｱｸﾇﾏｱ・calStat => calStatAft
function calStat(Initial,Present,Step) {
    var temp = calStatAft(Present,Step) - calStatAft(Initial,Step);
    return temp
}

function calStatAft(Value,Step) {
    var mok, nam, result;
    mok = parseInt(Value/Step);
    nam = Value % Step;
    if (Value < Step) {result = Value;}
    else {
        result = getSum(1,mok)*Step;
        result -= 1;
        result += (mok+1)*(nam+1);
    }
    return result;
}


//////////////////////////////////////////////////
/////    3. ｽｺﾅｳ ﾆｮｸｮ ﾀﾔｷﾂｽﾃ ｻ鄙・           /////
//////////////////////////////////////////////////

// show skill tree initially
function initSkillTree() {
    var msg="";
    msg ='<TABLE width="380" class="font9">'
        +'<TR>'
        +'<TD height="24" class="black9b" colspan="3" bgcolor="#E0E7E7">スキル情報</TD>'
        +'<TD align="right" class="black9b" colspan="3" bgcolor="#E0E7E7">'
        +'<BUTTON class="BUTTON2" onClick="maxSkill()">MAX</BUTTON>&nbsp;'
        +'<BUTTON class="BUTTON2" onClick="autoSkill()">AUTO</BUTTON>&nbsp;'
        +'<BUTTON class="BUTTON2" onClick="minSkill()">MIN</BUTTON>&nbsp;'
        +'</TD></TR>';
    for (var x=0;x<lagSkillEng.length;x++) {
        var z1=eval(lagSkillEng[x]+'Z[1]');var z2=eval(lagSkillEng[x]+'Z[2]')
        if (x%2==0) msg+='<TR>';
        msg+='<TD height="20" width="33%" id="id'+lagSkillEng[x]+'">'+lagSkillKor[x]+'</TD>'
            +'<TD width="7%" class="NoRight"><INPUT TYPE="text" NAME="'+lagSkillEng[x]
            +'" SIZE="2" MAXLENGTH="2" onBlur="checkSkill(this,'+x+')" class="tdtext"></TD>'
            +'<TD width="10%" class="NoLeft" style="font-size:8pt;color:black;">'+z1+'〜'+z2+'</TD>';
        if (x%2==1) msg+='</TR>';
    }
    msg+='</TABLE>';
    genWriteIt('idSkillTree',msg);

    // read and display lagSkill initial value
    for (var i=0;i<lagSkillEng.length;i++) {
        // update myChar.nowSkill@,myChar.nowSkill@Lvl,myChar.nowSkill@Min,myChar.nowSkill@Max
        var tmp='myChar.nowSkill'+i;
        var zzz='myChar.nowSkill'+i+'Lvl='+lagSkillEng[i]+'Z[0]';eval(zzz);
        var zzz='myChar.nowSkill'+i+'='+lagSkillEng[i]+'Z[1]';eval(zzz);
        var zzz='myChar.nowSkill'+i+'Min='+lagSkillEng[i]+'Z[1]';eval(zzz);
        var zzz='myChar.nowSkill'+i+'Max='+lagSkillEng[i]+'Z[2]';eval(zzz);
        var zzz='myChar.nowSkill'+i+'Value='+lagSkillEng[i]+'['+tmp+']';eval(zzz);
        var zzz='myStatForm.'+lagSkillEng[i]+'.value=myChar.nowSkill'+i;eval(zzz);
    }
}

// skill point ｰｪ ｺｯｰ貎ﾃ ｰﾋｻ・
function checkSkill(obj,num) {
    var oriSkill=eval('myChar.nowSkill'+num);   // ﾃﾊｱ箍ｪ ﾀﾏｴﾜ ﾀﾀ衂ﾘｳｱｸ,ｺｯｼｿ｡ ﾀﾀ蠏ﾇﾀﾖｾﾛ・
    if (obj.value==oriSkill) {     // ｸｸｾ・ｰｪﾀﾌ ｺｯﾇﾏﾁ・ｾﾊｾﾒﾀｸｸ・ ｰﾀ・return
        if (obj.name==lagSkillEng[lagSkillEng.length-1]) {myStatForm.idNowLvl.focus();myStatForm.idNowLvl.select();}
        return true;
    }
    //ハイブリ（ライフアップ）用ライフ更新
    if(obj.name=="hLifeUP" || obj.name=="tLifeUP"){
          var temp = obj.value*50;
          genWriteIt("idNowLife",myChar.nowLife + temp);
    }
    var result = parseInt(isNumber(obj.value)); // ﾀﾔｷﾂｰｪﾀﾌ ﾁ､ｼｰｪﾀﾎﾁ・ﾈｮﾀﾎﾇﾏｰ・
    // ｼﾀﾚｰ｡ ｾﾆｴﾏｸ・
    if (!result && result!=0) {
        obj.value = oriSkill; obj.focus(); obj.select(); return false;
    }
    var min=eval('myChar.nowSkill'+num+'Min'); var max=eval('myChar.nowSkill'+num+'Max');
    var diff=result-oriSkill;
    // ｼﾀﾚ ｹ・ｧｰ｡ ﾀﾟｸｵﾇｾﾀｸｸ・
    if (result<min) {
        alert("初期値以下にはできません。");
        obj.value = oriSkill; obj.focus(); obj.select();
        return false;
    } else if (result>max || diff>myChar.nowRemainPoint) {
        alert("不正な値です。");
        obj.value = oriSkill; obj.focus(); obj.select();
        return false;
    }
    updatePoint(diff);  // point ｰｪ ｺｯｰ貮ﾏｱｸ
    var tmp='myChar.nowSkill'+num;
    // ｸｵ邁ﾍﾀﾌ ﾁ､ｻﾀﾏ ｰ豼・ ﾀﾔｷﾂﾇﾑ ｰｪ ｹﾝｿｵ
    eval('myChar.nowSkill'+num+'=result');
    eval('myChar.nowSkill'+num+'Value='+lagSkillEng[num]+'['+tmp+']');
    obj.value=result;
    // update bare hand damage & update damage point in getAttack.js
    myChar.getBareDam();updateDamage();
    updateSkillTip();   // ｽｺﾅｳｺｰ tool tip ｰｻｽﾅﾇﾏｱ・
    // last skill ｴﾙﾀｽｿ｡ tab ﾇﾏｸ・ ﾃｹｹﾂｰ ﾇﾊｵ蟾ﾎ focus ｸｦ ｿﾅｱ簑ﾚ
    if (obj.name==lagSkillEng[lagSkillEng.length-1]) {myStatForm.idNowLvl.focus();myStatForm.idNowLvl.select();}
    return true;
}

// ｾﾆｷ｡ function ﾀｺ, ﾇﾀ邏ﾂ ｻ鄙・ﾈﾇﾔ.
// update 'idNowRemainPoint','idLvlExp','idTotExp','idReInitPrice'
function updateSkill() {
    // call genWriteIt in myPopUp.js
    //                         0       1         2
    var statArrId=new Array('idNowRemainPoint','idLvlExp','idTotExp','idReInitPrice');
    var statArr=new Array(myChar.nowRemainPoint,myChar.lvlExp,myChar.totExp,myChar.reInitPrice);
    for (var i=0;i<statArr.length;i++) genWriteIt(statArrId[i],statArr[i]);
}

// ｽｺﾅｳｺｰ tool tip ｰｻｽﾅﾇﾏｱ・
function updateSkillTip() {
    switch(theRace) {
        case 'aBulkan':
            iWhatIsThis[2]='斧の達人+'+Math.floor(myChar.nowSkill0Value*100)+'%';
            iWhatIsThis[3]='飛び斬り+'+Math.floor(myChar.nowSkill1Value*100)+'%';break;
        case 'wBulkan':
            iWhatIsThis[2]='剣の達人+'+Math.floor(myChar.nowSkill0Value*100)+'%';
            iWhatIsThis[3]='回転斬り+'+Math.floor(myChar.nowSkill1Value*100)+'%';break;
        case 'hHybrid':
            iWhatIsThis[2]='ハンママスタリ+'+Math.floor(myChar.nowSkill0Value*100)+'%';
            iWhatIsThis[3]='ヘビーマスタリ+'+Math.floor(myChar.nowSkill2Value*100)+'%';break;
        case 'tHybrid':
            iWhatIsThis[2]='二刀流マスタリ+'+Math.floor(myChar.nowSkill0Value*100)+'%';
            iWhatIsThis[3]='ヘイスト+'+Math.floor(myChar.nowSkill2Value*100)+'%';break;
        case 'Kairipton':
            //iWhatIsThis[2]='杖によるダメージ +'+Math.floor(myWeapon.staffDam*100)+'% ﾀｿ・ﾃ';
            iWhatIsThis[3]='マジックマスター+'+Math.floor(myChar.nowSkill3Value*100)+'%';break;
        case 'Human':
            iWhatIsThis[2]='射撃術+'+Math.floor(myChar.nowSkill0Value*100)+'%';
            iWhatIsThis[3]='連射'+Math.floor(myChar.nowSkill1Value*100)+'%<br>(2連射 50%+3連射 50%)';break;
        case 'Aidia':
            iWhatIsThis[2]='昆虫召還+'+Math.floor(myChar.nowSkill0Value*100)+'%<br>'+'動物召還+'+Math.floor(myChar.nowSkill1Value*100)+'%';
            iWhatIsThis[3]='フェノメノン+'+Math.floor(myChar.nowSkill2Value*100)+'%';break;
        default: alert("不正なデータです。");
    }
}

// スキル情報を全て０にする
function minSkill() {
  for (var x=0;x<lagSkillEng.length;x++) {
    var zstr = "";
    zstr = 'document.statForm.'+lagSkillEng[x]+'.value = myChar.nowSkill'+x+'Min;';eval(zstr);
    zstr = 'checkSkill(document.statForm.'+lagSkillEng[x]+','+x+');';eval(zstr);
  }
}

// スキル情報を可能な限り割り振る
function maxSkill(){
  minSkill();
  if(myChar.nowRemainPoint == 0) return;
  for (var x=0;x<lagSkillEng.length;x++) {
    var zstr = "";
    if(myChar.nowRemainPoint > eval('myChar.nowSkill'+x+'Max')) {
      zstr = 'document.statForm.'+lagSkillEng[x]+'.value = myChar.nowSkill'+x+'Max;';eval(zstr);
      zstr = 'checkSkill(document.statForm.'+lagSkillEng[x]+','+x+');';eval(zstr);
    } else {
      zstr = 'document.statForm.'+lagSkillEng[x]+'.value = myChar.nowRemainPoint;';eval(zstr);
      zstr = 'checkSkill(document.statForm.'+lagSkillEng[x]+','+x+');';eval(zstr);
      break;
    }
  }
}

// スキル情報を自動的に割り振る
function autoSkill(){
  minSkill();
  if(myChar.nowRemainPoint == 0) return;
  if(theRace == 'wBulkan') {
    var autoSkillValue = new Array(25,25,5,10,5,10,10,5,25,20,10,0,0);
  } else if(theRace == 'aBulkan') {
    var autoSkillValue = new Array(25,25,5,10,5,10,10,5,25,20,10,0,0);
  } else if(theRace == 'hHybrid') {
    var autoSkillValue = new Array(30,0,30,20,0,20,20,30,20,20,30,10);
  } else if(theRace == 'tHybrid') {
    var autoSkillValue = new Array(30,5,30,20,20,30,30,30,30,20,10,10);
  } else if(theRace == 'Kairipton') {
    var autoSkillValue = new Array(25,25,25,25,25,0,5,10,5,4,10,5,20,10,0,0,0);
  } else if(theRace == 'Human') {
    var autoSkillValue = new Array(25,25,25,0,1,1,10,5,0,10,10,20,10,0,0);
  } else if(theRace == 'Aidia') {
    var autoSkillValue = new Array(25,25,25,25,1,10,10,12,10,0,5,10,20,10,0,0,0,0);
  }
  for (var x=0;x<lagSkillEng.length;x++) {
    var zstr = "";
    if(myChar.nowRemainPoint > autoSkillValue[x]) {
      zstr = 'document.statForm.'+lagSkillEng[x]+'.value = '+autoSkillValue[x]+';';eval(zstr);
      zstr = 'checkSkill(document.statForm.'+lagSkillEng[x]+','+x+');';eval(zstr);
    } else {
      zstr = 'document.statForm.'+lagSkillEng[x]+'.value = myChar.nowRemainPoint;';eval(zstr);
      zstr = 'checkSkill(document.statForm.'+lagSkillEng[x]+','+x+');';eval(zstr);
      break;
    }
  }
}


//////////////////////////////////////////////////
/////    4. ｱ簀ｸ Utility Funciton            /////
//////////////////////////////////////////////////

// ｵﾎ ｼﾀﾚｳｻﾀﾇ ｰｪ ﾇﾕ ｱｸﾇﾏｱ・
function getSum(num1,num2) {
    var sum = 0;
    if (num1>num2) {alert("能力値が足りません。 "+num1+":"+num2);return false;}
    for (var x=num1;x<=num2;x++) {
        sum += x;
    }
    return sum;
}

// ﾁ､ｻﾀﾀｸｷﾎ ｼﾀﾚｸｦ ﾀﾔｷﾂﾇﾟｴﾂﾁ・ﾈｮﾀﾎ
// ｼﾒｼﾁ｡ﾀｻ ﾀﾔｷﾂﾇﾒ ｰ豼・ ﾁ､ｼｺﾎｸｸ ｹﾝﾈｯｵﾊ.
function isNumber(value) {
    if (isNaN(value)) {
        alert("不正なデータです。");
        return false;
    }
    else {
        return parseInt(value);
    }
}

// ﾁ､ｻﾀﾀｸｷﾎ ｼﾀﾚｸｦ ﾀﾔｷﾂﾇﾟｴﾂﾁ・ﾈｮﾀﾎ
// ｼﾒｼﾁ｡ﾀｻ ﾀﾔｷﾂﾇﾒ ｰ豼・ ﾁ､ｼｺﾎｸｸ ｹﾝﾈｯｵﾊ.
function isNumber2(value) {
    if (isNaN(value)) {
        alert("不正なデータです。");
        return -1;
    }
    else {
        return parseInt(value);
    }
}

/*
// for page positioning
function findPosX(obj) {
    var curleft=0;
    if (document.getElementById || document.all) {
        while (obj.offsetParent) {curleft+=obj.offsetLeft;obj=obj.offsetParent;}
    }
    else if (document.layers) curleft += obj.x;
    return curleft;
}
function findPosY(obj) {
    var curtop = 0;
    if (document.getElementById || document.all) {
        while (obj.offsetParent) {curtop+=obj.offsetTop;obj=obj.offsetParent;}
    }
    else if (document.layers) curtop += obj.y;
    return curtop;
}
*/
// onLoad ｽﾃ ﾀ・ｼ ﾃﾊｱ篳ｭ
function setInit() {
    myStatForm=browser.ie?document.all["statForm"]:browser.nav?document.layers["statForm"].document:0;
    myWeapon = new theWeapon(noWeap,"なし",0,0,0);
    myArmor = new theArmor("initArmor","なし",0,0,0);
    myAcce = new theAcce("initAcce","なし",0,0,0);
    setRace();  // race ｼｱﾅﾃﾇﾏｸ・ ﾃﾊｱ篳ｭ, setRace ｿ｡ｼｭ myChar ｻｼｺ
    popUpInit();    // myPopUp.js ﾀﾇ popUpInit ﾈ｣ﾃ・
    myStatForm.idNowLvl.focus();  // focus ﾁｦﾀﾏ ﾀｧｷﾎ ｿﾅｱ箜・
    return true;
}
