﻿/************************************************************

	levelup.js

	レベルアップ必要経験値・時間シミュレータ

	(C) 2004 - 2006 Raginfo : www.raginfo.net

************************************************************/

var job = 0;
var base_level_now = 1;
var job_level_now = 1;
var base_level_target = 1;
var job_level_target = 1;
var need_time = 60;
var day_time = 2;
var m_base_exp = 1;
var m_job_exp = 1;
var base_total = 0;
var job_total = 0;

//Base 経験値
var base_need = new Array(0,
9,16,25,36,77,112,153,200,253,320,385,490,585,700,830,970,1120,1260,1420,1620,1860,1990,2240,2504,2950,3426,3934,4474,6889,7995,9174,10425,11748,13967,15775,17678,19677,21773,30543,34212,38065,42102,46323,53026,58419,64041,69892,75973,102468,115254,128962,142784,157528,178184,196300,215198,234879,255341,330188,365914,403224,442116,482590,536948,585191,635278,687211,740988,925400,1473746,1594058,1718928,1848355,1982340,2230113,2386162,2547417,2713878,3206160,3681024,4022472,4377024,4744680,5125440,5765272,6204000,6655464,7121664,7602600,9738720,11649960,13643520,18339300,23836800,35658000,48687000,58135000,99999999);

//Base 経験値 転生後
var base_need2 = new Array(0,10,18,28,40,85,123,168,220,278,400,481,613,731,875,1038,1213,1400,1575,1775,2268,2604,2786,3136,3506,4130,4796,5508,6264,9645,12392,14220,16159,18209,21649,24451,27401,30499,33748,47342,58160,64711,71573,78749,90144,99312,108870,118816,129154,174196,213220,238080,264150,291427,329640,363155,398116,434526,472381,610848,731828,806448,884232,965180,1073896,1170382,1270556,1374422,1481976,1850800,3389616,3666333,3953534,4251217,4559382,5129260,5488173,5859059,6241919,7374168,9570662,10458427,11380262,12336168,13326144,14994907,16130400,17304200,18516326,19766760,29216160,34949880,40930560,55017900,71510400,106974000,146061000,174405000,299999997);

//Job 経験値 Novice
var job0_need = new Array(0,10,18,28,40,91,151,205,268,340);

//Job 経験値 転生後
var job02_need = new Array(0,11,20,31,44,100,166,226,295,374);

//Job 経験値 Super Novice
var job1_need = new Array(0,10,18,28,40,91,151,205,268,340,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,386371,409795,482092,509596,982092,992092,1002092,1012092,1022092,1032092,1042092,1052092,1062092,1072092,1082092,1092092,1102092,1112092,1122092,1132092,1142092,1152092,1162092,1172092,1182092,1192092,1202092,1212092,1222092,1232092,1242092,1252092,1262092,1272092,1282092,1292092,1302092,1312092,1322092,1332092,1342092,1352092,1362092,1372092,1382092,1392092,1402092,1412092,1422092,1432092,1442092,1452092,1462092);

//Job 経験値 1次職
var job10_need = new Array(0,30,43,58,76,116,180,220,272,336,520,604,699,802,948,1125,1668,1937,2226,3040,3988,5564,6272,7021,9114,11473,15290,16891,18570,23229,28359,36478,39716,43088,52417,62495,78160,84175,90404,107611,125915,153941,191781,204351,248352,286212,386371,409795,482092,509596);

//Job 経験値 上位1次職
var job12_need = new Array(0,60,86,116,152,232,360,440,544,672,1040,1208,1398,1604,1896,2250,3336,3874,4452,6080,7976,11128,12544,14042,18228,28683,38225,42228,46425,58073,70898,91195,99290,107720,131043,156238,195408,210430,226010,269028,314788,384853,479453,510878,620880,715530,965928,1024488,1205230,1273990);

//Job 経験値 2次職
var job20_need = new Array(0,144,184,284,348,603,887,1096,1598,2540,3676,4290,4946,6679,9492,12770,14344,16005,20642,27434,35108,38577,42206,52708,66971,82688,89544,96669,117821,144921,174201,186677,199584,238617,286366,337147,358435,380376,447685,526989,610246,644736,793535,921810,1106758,1260955,1487304,1557657,1990632,2083386);

//Job 経験値 上位2次職
var job22_need = new Array(0,288,368,568,696,1206,1774,2192,3196,5080,7352,8580,9892,13358,18984,31925,35860,40013,51605,68585,87770,96443,105515,131770,167428,206720,223860,241673,284553,362303,479053,513362,548856,656197,787507,927154,985696,1046034,1231134,1449220,1678177,1773024,2182221,2534978,3043585,3782865,4461912,4672971,5971896,6250158,6875174,7565691,8318960,9150856,10065942,11877812,14015818,16538655,19515624,23028437,28094693,34275525,41816141,51015692,62239144,79666104,101972614,130524946,167071930,213852071);

//function changejob : 職業変更時に再計算する
function changejob(){
	job = parseInt(document.selectnow.jclass.value);
	correct();
}

//function keydown : Enter キー押下時に計算する
function keydown(){
	if((event.keyCode == 13) || (event.keyCode == 108)){
		correct();
	}
}

//function correct : 入力された値の検証
function correct(){
	base_level_now = parseInt(document.selectnow.base_level.selectedIndex) +1;
	base_level_target = parseInt(document.selecttarget.base_level.selectedIndex) + 1;

	if((isNaN(base_level_now)) || ((base_level_now < 1) || (base_level_now > 99))){
		base_level_now = 1;
		document.selectnow.base_level.selectedIndex = 0;
	}

	if((isNaN(base_level_target)) || ((base_level_target < 1) || (base_level_target > 99))){
		base_level_target = 99;
		document.selecttarget.base_level.selectedIndex = 98;
	}

	job_level_now = parseInt(document.selectnow.job_level.selectedIndex) +1;
	job_level_target = parseInt(document.selecttarget.job_level.selectedIndex) +1;

	if(job == 0){
		if((isNaN(job_level_now)) || ((job_level_now < 1) || (job_level_now > 10))){
			job_level_now = 1;
			document.selectnow.job_level.selectedIndex = 0;
		}
		if((isNaN(job_level_target)) || ((job_level_target < 1) || (job_level_target > 10))){
			job_level_target = 10;
			document.selecttarget.job_level.selectedIndex = 9;
		}
	}
	else if(job == 1){
		if((isNaN(job_level_now)) || ((job_level_now < 1) || (job_level_now > 99))){
			job_level_now = 1;
			document.selectnow.job_level.selectedIndex = 0;
		}
		if((isNaN(job_level_target)) || ((job_level_target < 1) || (job_level_target > 99))){
			job_level_target = 99;
			document.selecttarget.job_level.selectedIndex = 98;
		}
	}
	else if(job == 10){
		if((isNaN(job_level_now)) || ((job_level_now < 1) || (job_level_now > 50))){
			job_level_now = 1;
			document.selectnow.job_level.selectedIndex = 0;
		}
		if((isNaN(job_level_target)) || ((job_level_target < 1) || (job_level_target > 50))){
			job_level_target = 50;
			document.selecttarget.job_level.selectedIndex = 49;
		}
	}
	else if(job == 20){
		if((isNaN(job_level_now)) || ((job_level_now < 1) || (job_level_now > 50))){
			job_level_now = 1;
			document.selectnow.job_level.selectedIndex = 0;
		}
		if((isNaN(job_level_target)) || ((job_level_target < 1) || (job_level_target > 50))){
			job_level_target = 50;
			document.selecttarget.job_level.selectedIndex = 49;
		}
	}
	else if(job == 2){
		if((isNaN(job_level_now)) || ((job_level_now < 1) || (job_level_now > 10))){
			job_level_now = 1;
			document.selectnow.job_level.selectedIndex = 0;
		}
		if((isNaN(job_level_target)) || ((job_level_target < 1) || (job_level_target > 10))){
			job_level_target = 10;
			document.selecttarget.job_level.selectedIndex = 9;
		}
	}
	else if(job == 12){
		if((isNaN(job_level_now)) || ((job_level_now < 1) || (job_level_now > 50))){
			job_level_now = 1;
			document.selectnow.job_level.selectedIndex = 0;
		}
		if((isNaN(job_level_target)) || ((job_level_target < 1) || (job_level_target > 50))){
			job_level_target = 50;
			document.selecttarget.job_level.selectedIndex = 49;
		}
	}
	else if(job == 22){
		if((isNaN(job_level_now)) || ((job_level_now < 1) || (job_level_now > 70))){
			job_level_now = 1;
			document.selectnow.job_level.selectedIndex = 0;
		}
		if((isNaN(job_level_target)) || ((job_level_target < 1) || (job_level_target > 70))){
			job_level_target = 70;
			document.selecttarget.job_level.selectedIndex = 69;
		}
	}

	m_base_exp = parseInt(document.condition.m_base_exp.value);

	if((isNaN(m_base_exp)) || ((m_base_exp < 1) || (m_base_exp > 9999999))){
		m_base_exp = 9999999;
		document.condition.m_base_exp.value = 9999999;
	}

	m_job_exp = parseInt(document.condition.m_job_exp.value);

	if((isNaN(m_job_exp)) || ((m_job_exp < 1) || (m_job_exp > 9999999))){
		m_job_exp = 9999999;
		document.condition.m_job_exp.value = 9999999;
	}

	need_time = parseInt(document.condition.need_time.value);

	if((isNaN(need_time)) || ((need_time < 1) || (need_time > 9999))){
		need_time = 9999;
		document.condition.need_time.value = 9999;
	}

	day_time = parseInt(document.condition.day_time.value);

	if((isNaN(day_time)) || ((day_time < 1) || (day_time > 24))){
		day_time = 24;
		document.condition.day_time.value = 24;
	}

	calculate();
}

//function calculate : 結果の計算
function calculate(){
	base_total = 0;
	job_total = 0;

	if((job == 2) || (job == 12) || (job == 22)){
		for(var i = base_level_now; i < base_level_target; i ++){
			base_total += base_need2[i];
		}
	}
	else{
		for(var i = base_level_now; i < base_level_target; i ++){
			base_total += base_need[i];
		}
	}

	if(job == 0){
		for(var j = job_level_now; j < job_level_target; j ++){
			job_total += job0_need[j];
		}
	}
	else if(job == 1){
		for(var j = job_level_now; j < job_level_target; j ++){
			job_total += job1_need[j];
		}
	}
	else if(job == 10){
		for(var j = job_level_now; j < job_level_target; j ++){
			job_total += job10_need[j];
		}
	}
	else if(job == 20){
		for(var j = job_level_now; j < job_level_target; j ++){
			job_total += job20_need[j];
		}
	}
	else if(job == 2){
		for(var j = job_level_now; j < job_level_target; j ++){
			job_total += job02_need[j];
		}
	}
	else if(job == 12){
		for(var j = job_level_now; j < job_level_target; j ++){
			job_total += job12_need[j];
		}
	}
	else if(job == 22){
		for(var j = job_level_now; j < job_level_target; j ++){
			job_total += job22_need[j];
		}
	}

	showresult();
}

//function showresult : 結果の表示
function showresult(){
	document.result1.exptotal_base.value = Math.floor(base_total);
	document.result1.exptotal_job.value = Math.floor(job_total);

	document.result2.monster_base.value = Math.floor(base_total / m_base_exp);
	document.result2.monster_job.value = Math.floor(job_total / m_job_exp);
	document.result2.time_base.value = Math.floor((base_total / m_base_exp) * need_time / 3600);
	document.result2.time_job.value = Math.floor((job_total / m_job_exp) * need_time / 3600);
	document.result2.day_base.value = Math.floor((base_total / m_base_exp) * need_time / 3600 / day_time);
	document.result2.day_job.value = Math.floor((job_total / m_job_exp) * need_time / 3600 / day_time);
	
	document.result3.time_exp.value = Math.floor((3600 / need_time) * m_base_exp) + " / " + Math.floor((3600 / need_time) * m_job_exp);
}
