diff --git a/languages/zh-CN.js b/languages/zh-CN.js index 9452a474..fb2401f7 100644 --- a/languages/zh-CN.js +++ b/languages/zh-CN.js @@ -385,13 +385,13 @@ function parseSkillDescription(skill) str = "全画面的宝珠变成" + strArr.map(o=>attrN(o)).join("、"); break; case 73: - str = `${getAttrTypeString(flags(sk[0]),flags(sk[1]))}宠物的${getFixedHpAtkRcvString({hp:sk[2],atk:sk[2]})}`; + str = `${getAttrTypeString([sk[0]],[sk[1]])}宠物的${getFixedHpAtkRcvString({hp:sk[2],atk:sk[2]})}`; break; case 75: - str = `${getAttrTypeString(flags(sk[0]),flags(sk[1]))}宠物的${getFixedHpAtkRcvString({atk:sk[2],rcv:sk[2]})}`; + str = `${getAttrTypeString([sk[0]],[sk[1]])}宠物的${getFixedHpAtkRcvString({atk:sk[2],rcv:sk[2]})}`; break; case 76: - str = `${getAttrTypeString(flags(sk[0]),flags(sk[1]))}宠物`; + str = `${getAttrTypeString([sk[0]],[sk[1]])}宠物`; if (sk[2] || sk[3] || sk[4]) str += `的${getFixedHpAtkRcvString({hp:sk[2],atk:sk[2],rcv:sk[2]})}`; break; case 84: @@ -481,6 +481,7 @@ function parseSkillDescription(skill) str = `根据余下 HP 对敌方${sk[0] || "全"}体造成${attrN(sk[1])}属性伤害(100% HP 时为自身攻击力×${sk[2]/100}倍,1 HP 时为自身攻击力×${sk[3]/100}倍)`; break; //case 111: 在45 + //case 114: 在29 case 115: str = `对敌方1体造成自身攻击力×${sk[1]/100}倍的${attrN(sk[0])}属性伤害,并回复伤害${sk[2]}%的 HP `; break; diff --git a/languages/zh.css b/languages/zh.css index c418506b..21ad7046 100644 --- a/languages/zh.css +++ b/languages/zh.css @@ -259,6 +259,9 @@ .formation-total-info .tIf-total-rcv::before{ content: "总回复(队伍觉醒和徽章):"; } +.formation-box::before { + content: "▼HP计算队长技倍率能功能测试中,请反馈"; +} .setting-box .row-mon-id .open-search::before{ content: "简易搜索"; diff --git a/script-universal_function.js b/script-universal_function.js index af31d4cb..cf088250 100644 --- a/script-universal_function.js +++ b/script-universal_function.js @@ -504,4 +504,112 @@ function parseSkillDescription(skill) function parseBigNumber(number) { return number.toLocaleString(); +} +//计算队伍中有多少血量 +function countTeamHp(memberArr, leader1id, leader2id, solo) +{ + const ls1 = Skills[Cards[leader1id].leaderSkillId]; + const ls2 = Skills[Cards[leader2id].leaderSkillId]; + const mHpArr = memberArr.map(m=>{ + let hp = m.ability ? m.ability[0] : 0; + if (!hp) return 0; + const card = Cards[m.id]; + hp *= memberHpMul(card,ls1,memberArr,solo); + hp *= memberHpMul(card,ls2,memberArr,solo); + return hp; + }); + + console.log(mHpArr); + + function memberHpMul(card,ls,memberArr,solo) + { + function flags(num){ + const arr = []; + for (let i = 0; i<32;i++) + { + if (num & (1< parm.attrs.includes(a))) + { + return scale / 100; + } + if (parm.types && card.types.some(t => parm.types.includes(t))) + { + return scale / 100; + } + return 1; + } + const sk = ls.params; + let scale = 1; + switch (ls.type) + { + case 23: case 30: case 62: case 77: case 63: case 65: + scale = hpMul({types:sk.slice(0,sk.length-1)}, sk[sk.length-1]); + break; + case 29: case 114: case 45: case 111: case 46: case 48: case 67: + scale = hpMul({attrs:sk.slice(0,sk.length-1)}, sk[sk.length-1]); + break; + case 73: case 76: + scale = hpMul({attrs:sk[0],types:sk[1]}, sk[2]); + break; + case 106: case 107: case 108: + scale = sk[0] / 100; + break; + case 121: case 129: case 163: case 186: + scale = hpMul({attrs:flags(sk[0]),types:flags(sk[1])}, sk[2]); + break; + case 125: //队伍中必须有指定队员 + const needMonIdArr = sk.slice(0,5).filter(s=>s>0); + const memberIdArr = memberArr.map(m=>m.id); + scale = needMonIdArr.every(mid=>memberIdArr.includes(mid)) ? sk[5]/100 : 1; + break; + case 136: + scale = hpMul({attrs:flags(sk[0])}, sk[1]) * + sk[4]? hpMul({attrs:flags(sk[4])}, sk[5]) : 1; + break; + case 137: + scale = hpMul({types:flags(sk[0])}, sk[1]) * + sk[4]? hpMul({types:flags(sk[4])}, sk[5]) : 1; + break; + case 155: + scale = solo ? 1 : hpMul({attrs:flags(sk[0]),types:flags(sk[1])}, sk[2]); + break; + case 158: + scale = hpMul({attrs:flags(sk[1]),types:flags(sk[2])}, sk[4]); + break; + case 175: //队伍组成全为合作 + const needCollabIdIdArr = sk.slice(0,3).filter(s=>s>0); + const memberCollabIdArr = memberArr.map(m=>Cards[m.id].collabId); + scale = memberCollabIdArr.every(cid=>needCollabIdIdArr.includes(cid)) ? sk[3]/100 : 1; + break; + case 178: case 185: + scale = hpMul({attrs:flags(sk[1]),types:flags(sk[2])}, sk[3]); + break; + case 203: + switch (sk[0]) + { + case 0: //全是像素进化 + scale = memberArr.map(m=>Cards[m.id].evoMaterials).every(ems=>ems.includes(3826)) ? sk[1]/100 : 1; + break; + case 2: //全是转生、超转生(8格潜觉) + scale = memberArr.map(m=>Cards[m.id].is8Latent).every(is8=>is8) ? sk[1]/100 : 1; + break; + } + break; + case 138: //调用其他队长技 + scale = sk.reduce((pmul,skid)=>pmul * memberHpMul(card,Skills[skid],memberArr,solo),1) + break; + default: + } + return scale || 1; + } + return mHpArr; } \ No newline at end of file diff --git a/script.js b/script.js index cdd6eff7..51f3a499 100644 --- a/script.js +++ b/script.js @@ -17,6 +17,48 @@ var showSearch; //整个程序都可以用的显示搜索函数 const dataStructure = 3; //阵型输出数据的结构版本 const className_displayNone = "display-none"; +class Member2 +{ + constructor(oldMenber = null,isAssist = false) + { + if (oldMenber) + { //Copy一个 + this.id = oldMenber.id; + this.level = oldMenber.level; + this.plus = [...oldMenber.plus]; + this.awoken = oldMenber.awoken; + this.sAwoken = oldMenber.sAwoken; + this.latent = [...oldMenber.latent]; + this.skilllevel = oldMenber.sAwoken; + this.assist = oldMenber.assist; + }else + { //全新的 + this.id = 0; + this.level = 1; + this.plus = [0,0,0]; + this.awoken = 0; + this.sAwoken = null; + this.latent = []; + this.skilllevel = null; + this.assist = null; + } + this.isAssist = isAssist; + } + calculateAbility(solo,teamCount){ + const card = Cards[this.id]; + let bonus = null; + if (!this.isAssist && + this.assist && + this.assist.id>0 && + Cards[this.assist.id].attrs[0] === card.attrs[0] + ){ + bonus = this.assist.calculateAbility(solo,teamCount); + } + } + toJSON(){ + + } +} //队员基本的留空 var Member = function(){ this.id=0; @@ -2297,9 +2339,14 @@ function refreshTeamTotalHP(totalDom,team){ if (tHpDom) { - const tHP = team[0].reduce(function(value,mon){ //队伍计算的总HP - return value += mon.ability ? mon.ability[0] : 0; - },0); + //因为目前仅用于1P、3P,所以直接固定写了 + const leader1id = team[0][0].id; + //const leader2 = teamsCount==2 ? Cards[team2[0][0].id] : Cards[team[0][5].id]; //这个写法无法获得队伍2的队长 + const leader2id = team[0][5].id; + + const teamHPArr = countTeamHp(team[0],leader1id,leader2id,solo); + + const tHP = teamHPArr.reduce((pv,v)=>pv+v); //队伍计算的总HP const teamHPAwoken = awokenCountInTeam(team,46,solo, teamsCount); //全队大血包个数 let badgeHPScale = 1; //徽章倍率 @@ -2347,10 +2394,13 @@ function refreshFormationTotalHP(totalDom, teams){ if (tHpDom) { + //因为目前仅用于2P,所以直接在外面固定写了 + const leader1id = teams[0][0][0].id; + const leader2id = teams[1][0][0].id; const tHPArr = teams.map(function(team){ - const teamTHP = team[0].reduce(function(value,mon){ //队伍计算的总HP - return value += mon.ability ? mon.ability[0] : 0; - },0); + const teamHPArr = countTeamHp(team[0],leader1id,leader2id,solo); + + const teamTHP = teamHPArr.reduce((pv,v)=>pv+v); //队伍计算的总HP const teamHPAwoken = awokenCountInTeam(team,46,solo, teamsCount); //全队大血包个数 return [teamTHP,teamHPAwoken]; }); diff --git a/style.css b/style.css index 7b2dd388..3d53a5e0 100644 --- a/style.css +++ b/style.css @@ -546,6 +546,10 @@ ul{ display:inline-block; } */ +.formation-box::before { + content: "▼Calculate HP with leader skills, in test. Please give feedback."; + color : red; +} /*队伍的潜觉*/ .team-latents .latents{ width: var(--head-block-width);