diff --git a/script.js b/script.js index 9737d961..92016a2f 100644 --- a/script.js +++ b/script.js @@ -51,6 +51,7 @@ Member.prototype.outObj = function(){ const skill = Skills[card.activeSkillId]; //有技能等级,并且技能等级低于最大等级时才记录技能 if (m.skilllevel != undefined && m.skilllevel < skill.maxLevel) obj[6] = m.skilllevel; + m.ability = [0,0,0]; return obj; }; Member.prototype.loadObj = function(m,dataVersion){ @@ -80,7 +81,7 @@ Member.prototype.loadObj = function(m,dataVersion){ this.latent = dataVersion>1 ? m[4] : m.latent; if (!(this.latent instanceof Array)) this.latent = []; //如果潜觉不是数组,则改变 this.sawoken = dataVersion>1 ? m[5] : m.sawoken; - if (m[6] != undefined) this.skilllevel = m[6]; + this.skilllevel = m[6] || null; }; //只用来防坐的任何队员 var MemberDelay = function(){ @@ -167,11 +168,11 @@ Formation.prototype.loadObj= function(f){ this.badge = f.b ? f.b : 0; //徽章 const teamArr = dataVeision>1 ? f.f : f.team; this.teams.forEach(function(t,ti){ - var tf = teamArr[ti] || []; + let tf = teamArr[ti] || []; t.forEach(function(st,sti){ - var fst = tf[sti] || []; + let fst = tf[sti] || []; st.forEach(function(m,mi){ - var fm = fst[mi]; + let fm = fst[mi]; m.loadObj(fm,dataVeision); }); }); @@ -1868,23 +1869,13 @@ function refreshAbility(abilityDom,team,idx){ const bonusScale = [0.1,0.05,0.15]; //辅助宠物附加的属性倍率 //基底三维,如果辅助是武器,还要加上辅助的觉醒 const mainAbility = calculateAbility(memberData, assistData, solo); - if (mainAbility) - { - //辅助增加的三维,如果辅助的主属性相等,辅助宠物只计算等级和加值,不计算觉醒 - const memberCard = Cards[memberData.id]; - const assistCard = Cards[assistData.id]; - - const assistAbility = (assistCard && assistCard.enabled && memberCard.attrs[0] === assistCard.attrs[0]) ? - calculateAbility(assistData, null, solo) : null; if (mainAbility && memberData.ability) { for (let ai=0;ai<3;ai++) { memberData.ability[ai] = mainAbility[ai]; - if (assistAbility) memberData.ability[ai] += Math.round(assistAbility[ai]*bonusScale[ai]); } } - } if (!abilityDom) return; //如果没有dom,直接跳过 const abilityLi = abilityDom.querySelector(".abilitys-" + (idx+1)); const hpDom = abilityLi.querySelector(".hp"); @@ -1957,52 +1948,37 @@ function refreshFormationTotalHP(totalDom, teams){ const tHpDom = totalDom.querySelector(".tIf-total-hp"); const tRcvDom = totalDom.querySelector(".tIf-total-rcv"); - const tHP = teams.reduce(function(value, team){ + const tHPArr = teams.map(function(team){ const teamTHP = team[0].reduce(function(value,mon){ //队伍计算的总HP return value += mon.ability ? mon.ability[0] : 0; },0); - return value + teamTHP; - },0); - - const teamHPAwoken = awokenCountInFormation(teams,46,solo); //全队大血包个数 + const teamHPAwoken = awokenCountInTeam(team,46,solo); //全队大血包个数 + return [teamTHP,teamHPAwoken]; + }); + const tHP = tHPArr.reduce(function(value, teamHP){ + return [value[0] + teamHP[0], value[1] + Math.round(teamHP[0] * (1 + 0.05 * teamHP[1]))]; + },[0,0]); - let badgeHPScale = 1; //徽章倍率 - if (formation.badge == 4 && solo) - { - badgeHPScale = 1.05; - }else if (formation.badge == 11 && solo) - { - badgeHPScale = 1.15; - } - const tRCV = teams.reduce(function(value, team){ + const tRCVArr = teams.map(function(team){ const teamTRCV = team[0].reduce(function(value,mon){ //队伍计算的总回复 return value += mon.ability ? mon.ability[2] : 0; },0); - return value + teamTRCV; + const teamRCVAwoken = awokenCountInTeam(team,47,solo); //全队大回复个数 + return [teamTRCV,teamRCVAwoken]; },0); - const teamRCVAwoken = awokenCountInFormation(teams,47,solo); //全队大回复个数 + const tRCV = tRCVArr.reduce(function(value, teamRCV){ + return [value[0] + teamRCV[0], value[1] + Math.round(teamRCV[0] * (1 + 0.10 * teamRCV[1]))]; + },[0,0]); - let badgeRCVScale = 1; //徽章倍率 - if (formation.badge == 3) - { - badgeRCVScale = 1.25; - }else if (formation.badge == 10) - { - badgeRCVScale = 1.35; - } if (tHpDom) { - tHpDom.innerHTML = tHP.toString() + - (teamHPAwoken>0||badgeHPScale!=1 ? - ("("+Math.round(tHP * (1 + 0.05 * teamHPAwoken)*badgeHPScale).toString()+")") : - ""); + tHpDom.innerHTML = tHP[0].toString() + + (tHP[0] != tHP[1] ? `(${tHP[1]})` : ""); } if (tRcvDom) { - tRcvDom.innerHTML = tRCV.toString() + - (teamRCVAwoken>0||badgeRCVScale!=1 ? - ("("+Math.round(tRCV * (1 + 0.10 * teamRCVAwoken)*badgeRCVScale).toString()+")") : - ""); + tRcvDom.innerHTML = tRCV[0].toString() + + (tRCV[0] != tRCV[1] ? `(${tRCV[1]})` : ""); } } //刷新单人技能CD @@ -2024,12 +2000,12 @@ function refreshMemberSkillCD(teamDom,team,idx){ const assistSkillCd = assistSkill ? (assistSkill.initialCooldown - (assist.skilllevel||assistSkill.maxLevel) + 1) : 0; memberSkillCdDom.innerHTML = memberSkillCd; assistSkillCdDom.innerHTML = memberSkillCd + assistSkillCd; - - if (member.skilllevel < memberSkill.maxLevel) + + if (member.skilllevel && member.skilllevel < memberSkill.maxLevel) { memberSkillCdDom.classList.remove("max-skill"); assistSkillCdDom.classList.remove("max-skill"); - }else if (assist.skilllevel < assistSkill.maxLevel){ + }else if (assist.skilllevel && assist.skilllevel < assistSkill.maxLevel){ memberSkillCdDom.classList.add("max-skill"); assistSkillCdDom.classList.remove("max-skill"); }else diff --git a/style.css b/style.css index 40d85f21..b5a7dcac 100644 --- a/style.css +++ b/style.css @@ -115,13 +115,15 @@ ul{ border: none; box-shadow: inset black 0 0 7px; } +.member{ + vertical-align: top; +} .delay .monster{ background-color: yellow; box-shadow: inset orange 0 0 7px; border: 3px black solid; } .delay .monster::before{ - display: block; width: 94px; height: 94px; color: black; diff --git a/universal_function.js b/universal_function.js index 0a8079ff..ff8f35fb 100644 --- a/universal_function.js +++ b/universal_function.js @@ -153,6 +153,7 @@ function returnMonsterNameArr(card, lsList, defaultCode) function calculateAbility(member = null, assist = null, solo = true) { if (!member) return null; + /* const monid = member.id || 0; const level = member.level || 1; const plus = member.plus || [0,0,0]; @@ -161,9 +162,11 @@ function calculateAbility(member = null, assist = null, solo = true) const sawoken = member.sawoken; const weaponId = assist ? assist.id : null; const weaponAwoken = assist ? assist.awoken : null; - const card = Cards[monid]; //怪物数据 - if (monid == 0 || card == undefined || card.enabled == false) return null; +*/ + const memberCard = Cards[member.id]; + const assistCard = assist ? Cards[assist.id] : null; + if (!memberCard || memberCard.id == 0 || !memberCard.enabled) return null; //Code From pad-rikuu function valueAt(level, maxLevel, curve) { @@ -171,7 +174,7 @@ function calculateAbility(member = null, assist = null, solo = true) return curve.min + (curve.max - curve.min) * Math.pow(f, curve.scale); } //Code From pad-rikuu - function curve(c, maxLevel, limitBreakIncr) { + function curve(c, level, maxLevel, limitBreakIncr) { let value = valueAt(level, maxLevel, { min: c.min, max: c.max || (c.min * maxLevel), @@ -184,6 +187,7 @@ function calculateAbility(member = null, assist = null, solo = true) } return value; } + const bonusScale = [0.1,0.05,0.15]; //辅助宠物附加的属性倍率 const plusAdd = [10,5,3]; //加值的增加值 const awokenAdd = [ //对应加三维觉醒的序号与增加值 [{index:1,value:500},{index:65,value:-5000}], //HP @@ -206,45 +210,52 @@ function calculateAbility(member = null, assist = null, solo = true) [{index:2,scale:0.01},{index:12,scale:0.02},{index:26,scale:0.03}], //ATK [{index:3,scale:0.1},{index:12,scale:0.2},{index:27,scale:0.3}] //RCV ]; - - if (monid == 4691){console.log(curve(card.hp, card.maxLevel, card.limitBreakIncr))} + const memberCurves = [memberCard.hp, memberCard.atk, memberCard.rcv]; + const assistCurves = assistCard ? [assistCard.hp, assistCard.atk, assistCard.rcv] : null; - var abilitys = [card.hp, card.atk, card.rcv].map((ab, idx)=>{ - const n_base = Math.round(curve(ab, card.maxLevel, card.limitBreakIncr)); //等级基础三维 - const n_plus = plus[idx] * plusAdd[idx]; //加值增加量 - let awokenList = card.awakenings.slice(0,awoken); //储存点亮的觉醒 + let abilitys = memberCurves.map((ab, idx)=>{ + const n_base = Math.round(curve(ab, member.level, memberCard.maxLevel, memberCard.limitBreakIncr)); //等级基础三维 + const n_plus = member.plus[idx] * plusAdd[idx]; //加值增加量 + let n_assist_base = 0,n_assist_plus=0; //辅助的bonus + let awokenList = memberCard.awakenings.slice(0,member.awoken); //储存点亮的觉醒 //单人时增加超觉醒 - if (solo && sawoken>=0) + if (solo && member.sawoken>=0) { - awokenList = awokenList.concat(card.superAwakenings[sawoken]); + awokenList = awokenList.concat(memberCard.superAwakenings[member.sawoken]); } //如果有武器还要计算武器的觉醒 - if (weaponId>0) + if (assistCard && assistCard.id > 0 && assistCard.enabled) { - const weaponCard = Cards[weaponId]; //武器数据 - if (weaponCard && weaponCard.enabled) + const assistAwokenList = assistCard.awakenings.slice(0, assist.awoken); //储存武器点亮的觉醒 + if (assistAwokenList.indexOf(49)>=0) //49是武器觉醒,确认已经点亮了武器觉醒 + { + awokenList = awokenList.concat(assistAwokenList); + } + if (memberCard.attrs[0] === assistCard.attrs[0]) { - const weaponAwokenList = weaponCard.awakenings.slice(0,weaponAwoken); //储存武器点亮的觉醒 - if (weaponAwokenList.indexOf(49)>=0) //49是武器觉醒,确认已经点亮了武器觉醒 - {awokenList = awokenList.concat(weaponAwokenList);} + n_assist_base = Math.round(curve(assistCurves[idx], assist.level, assistCard.maxLevel, assistCard.limitBreakIncr)); //辅助等级基础三维 + n_assist_plus = assist.plus[idx] * plusAdd[idx]; //辅助加值增加量 } } //觉醒增加的数值 - const n_awoken = awoken ? + const n_awoken = awokenList.length>0 ? Math.round(awokenAdd[idx].reduce(function(previous,aw){ const awokenCount = awokenList.filter(function(a){return a==aw.index;}).length; //每个觉醒的数量 - return previous + aw.value * awokenCount; //那么多个觉醒的增加 + if (awokenCount>0) + return previous + aw.value * awokenCount; + else + return previous; },0)) : 0; //潜觉增加的倍率 - const n_latent = (latent && latent.length) ? + const n_latent = (member.latent && member.latent.length>0) ? Math.round(latentScale[idx].reduce(function(previous,la){ - const latentCount = latent.filter(function(l){return l==la.index;}).length; //每个潜觉的数量 + const latentCount = member.latent.filter(function(l){return l==la.index;}).length; //每个潜觉的数量 return previous + n_base * la.scale * latentCount; //无加值与觉醒的基础值,乘以那么多个潜觉的增加倍数 },0)) : 0; //console.log("基础值:%d,加蛋值:%d,觉醒x%d增加:%d,潜觉增加:%d",n_base,n_plus,awokenCount,n_awoken,n_latent); - let reValue = n_base + n_plus + n_awoken + n_latent; + let reValue = n_base + n_plus + n_awoken + n_latent + (n_assist_base + n_assist_plus) * bonusScale[idx]; //协力觉醒的倍率 reValue = Math.round(awokenScale[idx].reduce(function(previous,aw){ const awokenCount = awokenList.filter(function(a){return a==aw.index;}).length; //每个协力觉醒的数量