「javascript/サーヴァント経験値計算」の編集履歴(バックアップ)一覧に戻る

javascript/サーヴァント経験値計算 - (2021/08/04 (水) 17:16:53) のソース

#javascript(){{{{{
<style>
#svExp tbody tr td:nth-of-type(1){text-align: center;}
#svExp input[type=text]{text-align: right;}
</style>
<script type="text/javascript" src="http://cdnjs.cloudflare.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script type="text/javascript">

function calcqp(sr, lv){
  switch (sr) {
    case 11: return 70+30*lv;
    case 21: return 105+45*lv;
    case 31: return 140+60*lv;
    case 41: return 280+120*lv;
    case 51: return 420+180*lv;
    case 10: return 42+18*lv;
    case 20: return 63+27*lv;
    case 30: return 84+36*lv;
    case 40: return 168+72*lv;
    case 50: return 252+108*lv;
    default: return 0;
  }
}

function toComma(num)
{
  return parseInt(num / 1000) == 0 ? num % 1000 : toComma(parseInt(num / 1000)) + ',' + ('000' + (num % 1000)).slice(-3);
}

function func(){
	// 数値を取得
	var now  = parseFloat($('#svExp [name="nowLv"]').val());
	var goal = parseFloat($('#svExp [name="goaLv"]').val());
	
	// 現在レベルが目標レベルより高い場合は、1Lv分だけ計算
	if(now >= goal){goal = now + 1.0;}
	
	// 目標レベルがMAX超の場合、Lv.MAXまでに修正
	var sr = parseInt($('#svExp [name="sv_ce"]').val());
	var sv = sr & 1;
	if (sv == 1 && goal > 120) { goal = 120; }
	else if(sv == 0 && goal > 100){goal = 100;}
	
	// 現在レベルから目標レベルまでに必要な経験値を計算
	var Tn = exp_total(now);
	var Tg = exp_total(goal);
	exp = Tg - Tn;
	
	// 現在レベルがMAX超の場合
	if((sv == 1 && now >= 120) || (sv == 0 && now >= 100)){exp = 0;}
	
	// テーブルに入力
	$('#svExp [name="totalEXP"]').val(toComma(exp));
	
	//必要になる強化素材数を計算してテーブルに入力
	$('#svExp input.num').each(function(i, out){
		if(out.name.match(/(\d+?)(.+?)/)){
			var n = RegExp.$1;
			var x = RegExp.$2;
			if		(x == 'A'){var mag = 1.2;}
			else if	(x == 'B'){var mag = 1.0;}
			var one = (1000 * Math.pow(3, n-1) * mag);
			$(out).val(toComma(Math.ceil(exp / one)));
			var Tc = Tn;
			var lc = now;
			var qpt = 0;
			while (Tc < Tg){
			  var en = 20;
			  if ((Tg - Tc) < (one * 20)){en = Math.ceil((Tg - Tc) / one);}
        Tc += one * en;
			  qpt += calcqp(sr,lc) * en;
			  while (Tc >= exp_total(lc+1)){lc++;}
			}
			$(out).parent().next().find('input.qp').val(toComma(qpt));
		}
	});
}
function exp_total(Lv){
	// Lv.91以上の場合は、別な経験値テーブルを参照
	// ただし、対象がサーヴァントの場合のみ
	var over90 = [
		12567000, 13021900, 13532000, 14116500, 14795000, 
		15587500, 16514400, 17596500, 18855000, 20311500,
		40623000, 60934500, 81246000, 101557500, 121869000,
		142180500, 162492000, 182803500, 203115000, 223426500,
		243738000, 264049500, 284361000, 304672500, 324984000,
		345295500, 365607000, 385918500, 406230000, 426541500
	];
	var sv = $('#svExp [name="sv_ce"]').val() & 1;
	if(sv == 1 && Lv > 90){return over90[Lv - 91];}
	
	// Lv.90以下
	400 * 3 * 5 / 6
	return 100.0 * Lv * (Lv - 1.0) * (Lv + 1.0) / 6.0;
}
</script>
}}}}}
#html2(){{
<table id="svExp">
	<tbody>
		<tr>
			<td>現在のレベル</td>
			<td colspan="4"><input type="number" maxlength="6" style="width:6em;" name="nowLv" value="1"></td>
		</tr>
		<tr>
			<td>目標のレベル</td>
			<td colspan="4"><input type="number" maxlength="6" style="width:6em;" name="goaLv" value="0"></td>
		</tr>
		<tr>
			<td>対象</td>
			<td colspan="4"><select name="sv_ce" style="width:10em;">
				<option value="51" selected>サーヴァント☆5</option>
				<option value="41" selected>サーヴァント☆4</option>
				<option value="31" selected>サーヴァント☆3</option>
				<option value="21" selected>サーヴァント☆2(☆0)</option>
				<option value="11" selected>サーヴァント☆1</option>
				<option value="50">概念礼装☆5</option>
				<option value="40">概念礼装☆4</option>
				<option value="30">概念礼装☆3</option>
				<option value="20">概念礼装☆2</option>
				<option value="10">概念礼装☆1</option>
			</select></td>
		</tr>
		<tr>
			<td colspan="5"><form name="calc" id="calc"><input type="button" value="計算" onclick="func()"></form></td>
		</tr>
		<tr>
			<td><b>必要経験値</b></td>
			<td colspan="4"><input readonly type="text" style="width:8em;" name="totalEXP"></td>
		</tr>
		<tr align=center>
			<td>強化素材</td>
			<td colspan="2">クラス一致</td>
			<td colspan="2">クラス不一致</td>
		</tr>
		<tr>
			<td>★1 叡智の種火</td>
			<td><input readonly type="text" style="width:5em;" name="1A" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP1A" class="qp">QP</td>
			<td><input readonly type="text" style="width:5em;" name="1B" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QPBA" class="qp">QP</td>
		</tr>
		<tr>
			<td>★2 叡智の灯火</td>
			<td><input readonly type="text" style="width:5em;" name="2A" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP2A" class="qp">QP</td>
			<td><input readonly type="text" style="width:5em;" name="2B" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP2B" class="qp">QP</td>
		</tr>
		<tr>
			<td>★3 叡智の大火</td>
			<td><input readonly type="text" style="width:5em;" name="3A" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP3A" class="qp">QP</td>
			<td><input readonly type="text" style="width:5em;" name="3B" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP3B" class="qp">QP</td>
		</tr>
		<tr>
			<td>★4 叡智の猛火</td>
			<td><input readonly type="text" style="width:5em;" name="4A" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP4A" class="qp">QP</td>
			<td><input readonly type="text" style="width:5em;" name="4B" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP4B" class="qp">QP</td>
		</tr>
		<tr>
			<td>★5 叡智の業火</td>
			<td><input readonly type="text" style="width:5em;" name="5A" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP5A" class="qp">QP</td>
			<td><input readonly type="text" style="width:5em;" name="5B" class="num"> 個</td><td><input readonly type="text" style="width:7em;" name="QP5B" class="qp">QP</td>
		</tr>
	</tbody>
</table>
}}