-
Notifications
You must be signed in to change notification settings - Fork 238
/
index.js
41 lines (38 loc) · 1.38 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
'use strict';
/**
* 攻撃力が防御力や防御力貫通によってどのようなダメージになるのかを計算する関数
*
* 負の入力値があった場合には0として扱い、2000以上の入力値は2000として扱う。
* 実効防御力は、防御力 - 防御力貫通 で定義され、
* この実行防御力は、0未満にはならない。
* ダメージ減少率は、実効防御力 / (100 + 実効防御力) で定義され、
* ダメージは、攻撃力 * (1 - ダメージ減少率) を小数点以下で四捨五入した値となる。
*
* @param {Number} power 攻撃力
* @param {Number} armor 防御力
* @param {Number} armorPenetration 防御力貫通
* @return {Number} ダメージ
*/
function effectiveDamage(power, armor, armorPenetration) {
let effectiveArmor = normalize(armor) - normalize(armorPenetration);
effectiveArmor = effectiveArmor <= 0 ? 0 : effectiveArmor;
const damageDecrease = effectiveArmor / (100 + effectiveArmor);
return Math.round(normalize(power) * (1 - damageDecrease));
}
/**
* 異常な可能性のある入力値を正常値にする
* @param {Number} n 異常な可能性のある入力値
* @return {Number} 正常値
*/
function normalize(n) {
if (n < 0) {
return 0;
} else if (n >= 2000) {
return 2000;
} else {
return n;
}
}
module.exports = {
effectiveDamage: effectiveDamage
};