血量计算队长技能

This commit is contained in:
枫谷剑仙 2020-04-28 17:49:04 +08:00
parent 0f2acf2156
commit b3881e3fec
5 changed files with 133 additions and 9 deletions

View File

@ -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;

View File

@ -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: "简易搜索";

View File

@ -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<<i))
{
arr.push(i);
}
}
return arr;
}
function hpMul(parm,scale)
{
if (scale == undefined || scale == 0) return 1;
if (parm.attrs && card.attrs.some(a => 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;
}

View File

@ -2339,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; //徽章倍率
@ -2389,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];
});

View File

@ -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);