diff --git a/script-universal_function.js b/script-universal_function.js index a3336f17..06224523 100644 --- a/script-universal_function.js +++ b/script-universal_function.js @@ -778,4 +778,56 @@ function countMoveTime(team, leader1id, leader2id, teamIdx) return moveTime; } return moveTime; +} +//获取盾减伤比例 +function getReduceScale(ls, allAttr = false, noHPneed = false) +{ + const sk = ls.params; + let scale = 0; + switch (ls.type) + { + case 16: //无条件盾 + scale = sk[0]/100; + break; + case 17: //单属性盾 + scale = allAttr ? 0 : sk[1]/100; + break; + case 36: //2个属性盾 + scale = allAttr ? 0 : sk[2]/100; + break; + case 38: //血线下 + 几率 + case 43: //血线上 + 几率 + scale = (noHPneed || allAttr) ? 0 : sk[2]/100; + break; + case 129: //无条件盾,属性个数不固定 + case 163: //无条件盾,属性个数不固定 + scale = (allAttr && (sk[5] & 31) != 31) ? 0 : sk[6]/100; + break; + case 130: //血线下 + 属性个数不固定 + case 131: //血线上 + 属性个数不固定 + scale = (noHPneed || allAttr && (sk[5] & 31) != 31) ? 0 : sk[6]/100; + break; + case 151: //十字心触发 + case 169: //C触发 + case 198: //回血触发 + scale = sk[2]/100; + break; + case 170: //多色触发 + case 182: //长串触发 + case 193: //L触发 + scale = sk[3]/100; + break; + case 171: //多串触发 + scale = sk[6]/100; + break; + case 183: //又是个有两段血线的队长技 + scale = noHPneed ? 0 : sk[4]/100; + break; + + case 138: //调用其他队长技 + scale = sk.reduce((pmul,skid)=> 1 - (1-pmul) * (1-getReduceScale(Skills[skid], allAttr, noHPneed)),0); + break; + default: + } + return scale || 0; } \ No newline at end of file diff --git a/script.js b/script.js index e384d0b5..3d833e61 100644 --- a/script.js +++ b/script.js @@ -2924,12 +2924,17 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) { const leader2id = teamsCount===2 ? (teamIdx === 1 ? teams[0][0][0].id : teams[1][0][0].id) : team[0][5].id; if (tHpDom) { + const reduceScale1 = getReduceScale(Skills[Cards[leader1id].leaderSkillId],true); + const reduceScale2 = getReduceScale(Skills[Cards[leader2id].leaderSkillId],true); + const totalReduce = 1 - (1 - reduceScale1) * (1 - reduceScale2); const teamHPArr = countTeamHp(team[0], leader1id, leader2id, solo); const teamHPNoAwokenArr = countTeamHp(team[0], leader1id, leader2id, solo, true); - const tHP = teamHPArr.reduce((pv, v) => pv + v); //队伍计算的总HP - const tHPNoAwoken = teamHPNoAwokenArr.reduce((pv, v) => pv + v); //队伍计算的总HP无觉醒 + + let tHP = teamHPArr.reduce((pv, v) => pv + v); //队伍计算的总HP + let tHPNoAwoken = teamHPNoAwokenArr.reduce((pv, v) => pv + v); //队伍计算的总HP无觉醒 + const teamHPAwoken = awokenCountInTeam(team, 46, solo, teamsCount); //全队大血包个数 @@ -2940,8 +2945,13 @@ function refreshTeamTotalHP(totalDom, team, teamIdx) { badgeHPScale = 1.15; } - tHpDom.textContent = Math.round(Math.round(tHP * (1 + 0.05 * teamHPAwoken)) * badgeHPScale) + - ` (${Math.round(Math.round(tHPNoAwoken) * badgeHPScale)})`; + tHP = Math.round(Math.round(tHP * (1 + 0.05 * teamHPAwoken)) * badgeHPScale); + tHPNoAwoken = Math.round(Math.round(tHPNoAwoken) * badgeHPScale); + + const tReduceHP = tHP / (1 - reduceScale1) / (1 - reduceScale2); //队伍正常满血加上盾能承受的最大伤害 + + tHpDom.textContent = tHP + + ` (${tHPNoAwoken}) >> Max ${Math.round(tReduceHP)}(-${(totalReduce * 100).toFixed(2)}%)`; } if (tMoveDom) { @@ -2964,9 +2974,15 @@ function refreshFormationTotalHP(totalDom, teams) { //因为目前仅用于2P,所以直接在外面固定写了 const leader1id = teams[0][0][0].id; const leader2id = teams[1][0][0].id; + + const reduceScale1 = getReduceScale(Skills[Cards[leader1id].leaderSkillId],true); + const reduceScale2 = getReduceScale(Skills[Cards[leader2id].leaderSkillId],true); + const totalReduce = 1 - (1 - reduceScale1) * (1 - reduceScale2); + const tHPArr = teams.map(function(team) { const teamHPArr = countTeamHp(team[0], leader1id, leader2id, solo); + const teamTHP = teamHPArr.reduce((pv, v) => pv + v); //队伍计算的总HP const teamHPAwoken = awokenCountInTeam(team, 46, solo, teamsCount); //全队大血包个数 @@ -2981,8 +2997,10 @@ function refreshFormationTotalHP(totalDom, teams) { const tHP = tHPArr.reduce((pv, v) => pv + v); const tHPNoAwoken = tHPNoAwokenArr.reduce((pv, v) => pv + v); + const tReduceHP = tHP / (1 - reduceScale1) / (1 - reduceScale2); //队伍正常满血加上盾能承受的最大伤害 + tHpDom.textContent = tHP.toString() + - ` (${tHPNoAwoken})`; + ` (${tHPNoAwoken}) >> Max ${Math.round(tReduceHP)}(-${(totalReduce * 100).toFixed(2)}%)`; } } //刷新单人技能CD