<!-- 标题和公式说明 -->
<h1>1999伤害计算器 v3.2</h1>
<span style="color: #FFECB3; font-size: 1.2em;">[[点击进入高级计算器(Beta)->高级计算器]]</span>
<p> ''技能伤害期望''= (text-colour:#dee2e6)[''技能倍率''] x (text-colour:#0d6b52)[''(攻击 - 防御 x (1 - 穿透) x (1 - 减防))''] x (text-colour:#ff1c8d)[''(1 + (暴击率 - 抗暴率) x (暴击伤害 - 暴击防御 - 1))''] x (text-colour:#228be6)[''(1 + 创伤加成 - 目标创伤减免 + 增伤率 + 易伤率)''] x (text-colour:#bf6a15)[''(1 + 术法威力 or 仪式威力)''] x (text-colour:#7a5073)[''目标数量'']
1.开发此计算器的主要目的是利用伤害期望来评估面板伤害, 帮助选择心相和共鸣块, 因此大多数情况下技能倍率和抗性数据不影响结果
2.请根据技能描述区分创伤类倍率, 本源伤害类倍率, 和其他加成类倍率(目前不支持计算非攻击力加成倍率)</p>
<div class="flex-container">
<div class="panel-section">
技能倍率 (%): <input type="number" id="skill_rate_temp" value="100"><br>
攻击力: <input type="number" id="attack" value="100"><br>
目标防御力: <input type="number" id="target_defense" value="0"><br>
穿透率 (%): <input type="number" id="penetration_rate" value="0"><br>
减防 (%): <input type="number" id="defense_reduction_rate" value="0"><br>
暴击率 (%): <input type="number" id="crit_rate" value="0"><br>
暴击伤害 (%): <input type="number" id="crit_damage" value="130"><br>
目标抗暴率 (%): <input type="number" id="crit_resistance" value="0"><br>
目标暴击防御 (%): <input type="number" id="target_crit_defense" value="0"><br>
</div>
<div class="panel-section">
创伤加成 (%): <input type="number" id="trauma_bonus" value="0"><br>
目标受创减免 (%): <input type="number" id="trauma_reduction" value="0"><br>
增伤 (%): <input type="number" id="damage_increase" value="0"><br>
易伤 (%): <input type="number" id="vulnerability" value="0"><br>
技能类型:<input type="radio" name="power_type" value="spell" checked> 术法<input type="radio" name="power_type" value="ritual"> 仪式 <br>
术法威力 (%): <input type="number" id="spell_power" value="0"><br>
仪式威力 (%): <input type="number" id="ritual_power" value="0"><br>
技能作用目标数: <input type="number" id="target_count" value="1"><br>
克制:<input type="radio" name="kezhi" value="yes" checked> 是<input type="radio" name="kezhi" value="no"> 否
</div>
</div>
<div class="button-container">
<button onclick="calculateDamage()">计算伤害</button>
<button onclick="saveData()">保留记录</button>
<button onclick="clearData()">清空记录</button>
</div>
<h2>伤害期望: <span id="result">0</span></h2>
<h2>(text-colour:#ff6b6b)[暴击造成伤害: <span id="result2">0</span>]</h2>
<div id="savedData"></div>
<div class="author">作者: xyz</div>
<script>
window.calculateDamage = function() {
// 获取参数值
let skill_rate = parseFloat(document.getElementById("skill_rate_temp").value/100);
let attack = parseFloat(document.getElementById("attack").value);
let target_defense = parseFloat(document.getElementById("target_defense").value);
let penetration_rate = parseFloat(document.getElementById("penetration_rate").value/100);
let defense_reduction_rate = parseFloat(document.getElementById("defense_reduction_rate").value/100);
let crit_rate = parseFloat(document.getElementById("crit_rate").value/100);
let crit_resistance = parseFloat(document.getElementById("crit_resistance").value/100);
let crit_damage = parseFloat(document.getElementById("crit_damage").value/100);
let target_crit_defense = parseFloat(document.getElementById("target_crit_defense").value/100);
let trauma_bonus = parseFloat(document.getElementById("trauma_bonus").value/100);
let trauma_reduction = parseFloat(document.getElementById("trauma_reduction").value/100);
let damage_increase = parseFloat(document.getElementById("damage_increase").value/100);
let vulnerability = parseFloat(document.getElementById("vulnerability").value/100);
let powerType = document.querySelector('input[name="power_type"]:checked').value;
let powerValue;
if (powerType === "spell") {
powerValue = parseFloat(document.getElementById("spell_power").value/100);
} else {
powerValue = parseFloat(document.getElementById("ritual_power").value/100);
}
let kezhi = document.querySelector('input[name="kezhi"]:checked').value;
let kezhixishu;
if (kezhi === "yes") {
kezhixishu = 1.3;
} else {
kezhixishu = 1;
}
let target_count = parseFloat(document.getElementById("target_count").value);
// 使用伤害计算公式
let attack_defense_diff = attack - target_defense * (1 - penetration_rate) * (1 - defense_reduction_rate);
let effective_attack = Math.max(attack_defense_diff, attack * 0.1);
let effective_crit = Math.min(crit_rate - crit_resistance, 1) * (crit_damage - target_crit_defense-1);
let damage = skill_rate * effective_attack * (1+effective_crit) *
(1 + trauma_bonus - trauma_reduction + damage_increase + vulnerability) *
(1 + powerValue) * target_count *kezhixishu;
let crit_result = skill_rate * effective_attack * Math.max(1, (crit_damage - target_crit_defense))*
(1 + trauma_bonus - trauma_reduction + damage_increase + vulnerability) *
(1 + powerValue) * target_count * kezhixishu;
// 显示结果
document.getElementById("result").innerText = damage.toFixed(1);
document.getElementById("result2").innerText = crit_result.toFixed(1);
}
</script>
<style>
.author {
position: fixed; /* 使其固定在页面上 */
bottom: 10px; /* 距离底部10像素 */
right: 10px; /* 距离右边10像素 */
font-size: 14px; /* 字体大小 */
color: #b2c1db; /* 字体颜色 */
}
</style>
<script>
function saveData() {
// 获取当前的数据
let singledmg = document.getElementById("result").innerText;
let crdmg= document.getElementById("result2").innerText;
// 保存到数组中
savedRecords.push({
singledmg: singledmg,
crdmg: crdmg
});
// 更新显示的数据
updateSavedDataDisplay();
}
function clearData() {
savedRecords = [];
updateSavedDataDisplay();
}
function updateSavedDataDisplay() {
let displayDiv = document.getElementById("savedData");
displayDiv.innerHTML = ""; // 清空显示区域
// 遍历保存的数据,并将其添加到显示区域
for (let record of savedRecords) {
displayDiv.innerHTML += `
<div>
伤害期望: ${record.singledmg}
暴击造成伤害: ${record.crdmg}
</div>
`;
}
}
</script>
<span style="color: #FFECB3; font-size: 1.8em;">[[点击返回简易版->calculator]]</span>
<p> ''单技能伤害期望''= (text-colour:#dee2e6)[''技能倍率''] x (text-colour:#0d6b52)[''(攻击 - 防御 x (1 - 穿透) x (1 - 减防))''] x (text-colour:#ff1c8d)[''(1 + (暴击率 - 抗暴率) x (暴击伤害 - 暴击防御 - 1))''] x (text-colour:#228be6)[''(1 + 创伤加成 - 目标创伤减免 + 增伤率 + 易伤率)''] x (text-colour:#bf6a15)[''(1 + 术法威力 or 仪式威力)''] x (text-colour:#7a5073)[''目标数量'']
''总伤害''= (术法1伤害期望 x 使用次数) + (术法2伤害期望 x 使用次数) + (仪式伤害期望 x 使用次数)</p>
<!-- 技能区 -->
<div class="container">
<div class="panel-section full-width">
<h3>技能倍率</h3>
术法1倍率: <input type="number" id="skill1_rate" value="100"> 附加穿透 (%): <input type="number" id="skill1_penetration_rate" value="0" style="width: 80px;"> 附加暴击 (%): <input type="number" id="skill1_crit_rate" value="0" style="width: 80px;"> 作用目标数: <input type="number" id="skill1_target_count" style="width: 50px;" value="1"> 使用次数: <input type="number" id="skill1_num_count" style="width: 50px;" value="1"> <br>
术法2倍率: <input type="number" id="skill2_rate" value="100"> 附加穿透 (%): <input type="number" id="skill2_penetration_rate" value="0" style="width: 80px;"> 附加暴击 (%): <input type="number" id="skill2_crit_rate" value="0" style="width: 80px;"> 作用目标数: <input type="number" id="skill2_target_count" style="width: 50px;" value="1"> 使用次数:<input type="number" id="skill2_num_count" style="width: 50px;"value="1"><br>
仪式倍率: <input type="number" id="ritual_rate" value="100"> 附加穿透 (%): <input type="number" id="ritual_penetration_rate" value="0" style="width: 80px;"> 附加暴击 (%): <input type="number" id="ritual_crit_rate" value="0" style="width: 80px;"> 作用目标数: <input type="number" id="ritual_target_count" style="width: 50px;" value="1"> 使用次数:<input type="number" id="ritual_num_count" style="width: 50px;" value="1"><br>
</div>
</div>
<div class="flex-container">
<!-- 角色面板区(裸装) -->
<div class="panel-section">
<h3>角色裸装面板(包含洞悉增幅)</h3>
攻击: <input type="number" id="base_attack" value="100"><br>
暴击率 (%): <input type="number" id="base_crit_rate" value="0"><br>
暴击伤害 (%): <input type="number" id="base_crit_damage" value="130"><br>
创伤加成 (%): <input type="number" id="base_trauma_bonus" value="0"><br>
增伤 (%): <input type="number" id="base_damage_increase" value="0"><br>
术法威力 (%): <input type="number" id="base_spell_power" value="0"><br>
仪式威力 (%): <input type="number" id="base_ritual_power" value="0"><br>
穿透率 (%): <input type="number" id="base_penetration_rate" value="0"><br>
减防 (%): <input type="number" id="base_defense_reduction_rate" value="0"><br>
</div>
<!-- 心相属性区 -->
<div class="panel-section">
<h3>心相属性</h3>
攻击: <input type="number" id="weap_attack" value="0"><br>
暴击率 (%): <input type="number" id="weap_crit_rate" value="0"><br>
暴击伤害 (%): <input type="number" id="weap_crit_damage" value="0"><br>
创伤加成 (%): <input type="number" id="weap_trauma_bonus" value="0"><br>
增伤 (%): <input type="number" id="weap_damage_increase" value="0"><br>
术法威力 (%): <input type="number" id="weap_spell_power" value="0"><br>
仪式威力 (%): <input type="number" id="weap_ritual_power" value="0"><br>
穿透率 (%): <input type="number" id="weap_penetration_rate" value="0"><br>
减防 (%): <input type="number" id="weap_defense_reduction_rate" value="0"><br>
</div>
</div>
<div class="flex-container">
<!-- 共鸣属性区 -->
<div class="panel-section">
<h3>共鸣属性</h3>
攻击: <input type="number" id="resonance_attack" value="0"><br>
暴击率 (%): <input type="number" id="resonance_crit_rate" value="0"><br>
暴击伤害 (%): <input type="number" id="resonance_crit_damage" value="0"><br>
创伤加成 (%): <input type="number" id="resonance_trauma_bonus" value="0"><br>
<!-- 目标区 -->
<h3>目标区(敌方)</h3>
目标防御力: <input type="number" id="target_defense" value="0"><br>
目标受创减免 (%): <input type="number" id="target_trauma_reduction" value="0"><br>
目标抗暴率 (%): <input type="number" id="target_crit_resistance" value="0"><br>
目标暴击防御 (%): <input type="number" id="target_crit_defense" value="0"><br>
是否被我方克制:<input type="radio" name="kezhi" value="yes" checked> 是<input type="radio" name="kezhi" value="no"> 否
</div>
<!-- 辅助块 -->
<div class="panel-section">
<h3>辅助加成(buff/队友/其他)</h3>
攻击: <input type="number" id="ally_attack" value="0"><br>
暴击率 (%): <input type="number" id="ally_crit_rate" value="0"><br>
暴击伤害 (%): <input type="number" id="ally_crit_damage" value="0"><br>
创伤加成 (%): <input type="number" id="ally_trauma_bonus" value="0"><br>
增伤 (%): <input type="number" id="ally_damage_increase" value="0"><br>
易伤 (%): <input type="number" id="ally_vulnerability" value="0"><br>
术法威力 (%): <input type="number" id="ally_spell_power" value="0"><br>
仪式威力 (%): <input type="number" id="ally_ritual_power" value="0"><br>
穿透率 (%): <input type="number" id="ally_penetration_rate" value="0"><br>
减防 (%): <input type="number" id="ally_defense_reduction_rate" value="0"><br>
</div>
</div>
<div class="button-container">
<button onclick="calculateAdvancedDamage()">计算伤害</button>
<button onclick="saveData()">保留记录</button>
<button onclick="clearData()">清空记录</button>
</div>
<h2>伤害期望(单次行动平均): <span id="advanced_result">0</span></h2>
<h2>总伤害: <span id="total_dmgres">0</span></h2>
<div id="savedData"></div>
<div class="author">作者: xyz</div>
<style>
.author {
position: fixed; /* 使其固定在页面上 */
bottom: 10px; /* 距离底部10像素 */
right: 10px; /* 距离右边10像素 */
font-size: 14px; /* 字体大小 */
color: #b2c1db; /* 字体颜色 */
}
</style>
<script>
window.calculateAdvancedDamage = function() {
let skill1_rate = parseFloat(document.getElementById("skill1_rate").value/100);
let skill1_penetration_rate = parseFloat(document.getElementById("skill1_penetration_rate").value/100);
let skill1_crit_rate = parseFloat(document.getElementById("skill1_crit_rate").value/100);
let skill1_target_count = parseFloat(document.getElementById("skill1_target_count").value);
let skill1_num_count = parseFloat(document.getElementById("skill1_num_count").value);
let skill2_rate = parseFloat(document.getElementById("skill2_rate").value/100);
let skill2_penetration_rate = parseFloat(document.getElementById("skill2_penetration_rate").value/100);
let skill2_crit_rate = parseFloat(document.getElementById("skill2_crit_rate").value/100);
let skill2_target_count = parseFloat(document.getElementById("skill2_target_count").value);
let skill2_num_count = parseFloat(document.getElementById("skill2_num_count").value);
let ritual_rate = parseFloat(document.getElementById("ritual_rate").value/100);
let ritual_penetration_rate = parseFloat(document.getElementById("ritual_penetration_rate").value/100);
let ritual_crit_rate = parseFloat(document.getElementById("ritual_crit_rate").value/100);
let ritual_target_count = parseFloat(document.getElementById("ritual_target_count").value);
let ritual_num_count = parseFloat(document.getElementById("ritual_num_count").value);
//裸面板
let base_attack = parseFloat(document.getElementById("base_attack").value);
let base_crit_rate = parseFloat(document.getElementById("base_crit_rate").value/100);
let base_crit_damage = parseFloat(document.getElementById("base_crit_damage").value/100);
let base_trauma_bonus = parseFloat(document.getElementById("base_trauma_bonus").value/100);
let base_damage_increase = parseFloat(document.getElementById("base_damage_increase").value/100);
let base_spell_power = parseFloat(document.getElementById("base_spell_power").value/100);
let base_ritual_power = parseFloat(document.getElementById("base_ritual_power").value/100);
let base_penetration_rate = parseFloat(document.getElementById("base_penetration_rate").value/100);
let base_defense_reduction_rate = parseFloat(document.getElementById("base_defense_reduction_rate").value/100);
//心相
let weap_attack = parseFloat(document.getElementById("weap_attack").value);
let weap_crit_rate = parseFloat(document.getElementById("weap_crit_rate").value/100);
let weap_crit_damage = parseFloat(document.getElementById("weap_crit_damage").value/100);
let weap_trauma_bonus = parseFloat(document.getElementById("weap_trauma_bonus").value/100);
let weap_damage_increase = parseFloat(document.getElementById("weap_damage_increase").value/100);
let weap_spell_power = parseFloat(document.getElementById("weap_spell_power").value/100);
let weap_ritual_power = parseFloat(document.getElementById("weap_ritual_power").value/100);
let weap_penetration_rate = parseFloat(document.getElementById("weap_penetration_rate").value/100);
let weap_defense_reduction_rate = parseFloat(document.getElementById("weap_defense_reduction_rate").value/100);
//共鸣
let resonance_attack = parseFloat(document.getElementById("resonance_attack").value);
let resonance_crit_rate = parseFloat(document.getElementById("resonance_crit_rate").value/100);
let resonance_crit_damage = parseFloat(document.getElementById("resonance_crit_damage").value/100);
let resonance_trauma_bonus = parseFloat(document.getElementById("resonance_trauma_bonus").value/100);
//辅助
let ally_attack = parseFloat(document.getElementById("ally_attack").value);
let ally_crit_rate = parseFloat(document.getElementById("ally_crit_rate").value/100);
let ally_crit_damage = parseFloat(document.getElementById("ally_crit_damage").value/100);
let ally_trauma_bonus = parseFloat(document.getElementById("ally_trauma_bonus").value/100);
let ally_damage_increase = parseFloat(document.getElementById("ally_damage_increase").value/100);
let ally_vulnerability = parseFloat(document.getElementById("ally_vulnerability").value/100);
let ally_spell_power = parseFloat(document.getElementById("ally_spell_power").value/100);
let ally_ritual_power = parseFloat(document.getElementById("ally_ritual_power").value/100);
let ally_penetration_rate = parseFloat(document.getElementById("ally_penetration_rate").value/100);
let ally_defense_reduction_rate = parseFloat(document.getElementById("ally_defense_reduction_rate").value/100);
//目标
let target_defense_tmp = parseFloat(document.getElementById("target_defense").value);
let target_trauma_reduction_tmp = parseFloat(document.getElementById("target_trauma_reduction").value/100);
let target_crit_resistance_tmp = parseFloat(document.getElementById("target_crit_resistance").value/100);
let target_crit_defense_tmp = parseFloat(document.getElementById("target_crit_defense").value/100);
// 计算
let attack=base_attack+weap_attack+resonance_attack+ally_attack;
let penetration_rate= base_penetration_rate+weap_penetration_rate+ally_penetration_rate;
let defense_reduction_rate=base_defense_reduction_rate+weap_defense_reduction_rate+ally_defense_reduction_rate;
let crit_rate=base_crit_rate+weap_crit_rate+resonance_crit_rate+ally_crit_rate;
let crit_rate1= skill1_crit_rate+crit_rate;
let crit_rate2= skill2_crit_rate+crit_rate;
let crit_rate3= ritual_crit_rate+crit_rate;
let target_crit_resistance_adv= target_crit_resistance_tmp;
let crit_damage =base_crit_damage+weap_crit_damage+resonance_crit_damage+ally_crit_damage;
let target_crit_defense_adv=target_crit_defense_tmp;
let vulnerability= ally_vulnerability;
let trauma_bonus=base_trauma_bonus+weap_trauma_bonus+resonance_trauma_bonus+ally_trauma_bonus;
let trauma_reduction=target_trauma_reduction_tmp;
let total_spell=base_spell_power+weap_spell_power+ally_spell_power;
let total_ritual=base_ritual_power+weap_ritual_power+ally_ritual_power;
let target_defense= target_defense_tmp;
let damage_increase=base_damage_increase+weap_damage_increase+ally_damage_increase;
let kezhi = document.querySelector('input[name="kezhi"]:checked').value;
let kezhixishu;
if (kezhi === "yes") {
kezhixishu = 1.3;
} else {
kezhixishu = 1;
}
//公式
let attack_defense_diff1 = attack - target_defense* (1 - penetration_rate-skill1_penetration_rate) * (1 - defense_reduction_rate);
let effective_attack1 = Math.max(attack_defense_diff1, attack * 0.1);
let attack_defense_diff2 = attack - target_defense* (1 - penetration_rate-skill2_penetration_rate) * (1 - defense_reduction_rate);
let effective_attack2 = Math.max(attack_defense_diff2, attack * 0.1);
let attack_defense_diff3 = attack - target_defense* (1 - penetration_rate-ritual_penetration_rate) * (1 - defense_reduction_rate);
let effective_attack3 = Math.max(attack_defense_diff3, attack * 0.1);
let effective_crit1 = Math.min(crit_rate1 - target_crit_resistance_adv, 1) * (crit_damage - target_crit_defense_adv-1);
let effective_crit2 = Math.min(crit_rate2 - target_crit_resistance_adv, 1) * (crit_damage - target_crit_defense_adv-1);
let effective_crit3 = Math.min(crit_rate3 - target_crit_resistance_adv, 1) * (crit_damage - target_crit_defense_adv-1);
let damage1 = skill1_rate* effective_attack1* (1+effective_crit1) *
(1 + trauma_bonus - trauma_reduction + damage_increase + vulnerability) *
(1 + total_spell) * skill1_target_count;
let damage2 = skill2_rate* effective_attack2* (1+effective_crit2) *
(1 + trauma_bonus - trauma_reduction + damage_increase + vulnerability) *
(1 + total_spell) * skill2_target_count;
let damage3 = ritual_rate* effective_attack3* (1+effective_crit3) *
(1 + trauma_bonus - trauma_reduction + damage_increase + vulnerability) *
(1 + total_ritual) * ritual_target_count;
//单卡期望
let total_dmg=(skill1_num_count*damage1+skill2_num_count*damage2+ritual_num_count*damage3)*kezhixishu;
let total_avg=total_dmg/(skill1_num_count+skill2_num_count+ritual_num_count);
//结果显示
document.getElementById("total_dmgres").innerText = total_dmg.toFixed(1);
document.getElementById("advanced_result").innerText = total_avg.toFixed(1);
}
</script>
<script>
if (typeof savedRecords === "undefined") {
savedRecords = [];
}
function saveData() {
// 获取当前的数据
let advancedResult = document.getElementById("advanced_result").innerText;
let totalDmgRes = document.getElementById("total_dmgres").innerText;
// 保存到数组中
savedRecords.push({
advancedResult: advancedResult,
totalDmgRes: totalDmgRes
});
// 更新显示的数据
updateSavedDataDisplay();
}
function clearData() {
savedRecords = [];
updateSavedDataDisplay();
}
function updateSavedDataDisplay() {
let displayDiv = document.getElementById("savedData");
displayDiv.innerHTML = ""; // 清空显示区域
// 遍历保存的数据,并将其添加到显示区域
for (let record of savedRecords) {
displayDiv.innerHTML += `
<div>
伤害期望(单次行动平均): ${record.advancedResult}
总伤害: ${record.totalDmgRes}
</div>
`;
}
}
</script>