| @@ -51,6 +51,7 @@ Member.prototype.outObj = function(){ | |||||
| const skill = Skills[card.activeSkillId]; | const skill = Skills[card.activeSkillId]; | ||||
| //有技能等级,并且技能等级低于最大等级时才记录技能 | //有技能等级,并且技能等级低于最大等级时才记录技能 | ||||
| if (m.skilllevel != undefined && m.skilllevel < skill.maxLevel) obj[6] = m.skilllevel; | if (m.skilllevel != undefined && m.skilllevel < skill.maxLevel) obj[6] = m.skilllevel; | ||||
| m.ability = [0,0,0]; | |||||
| return obj; | return obj; | ||||
| }; | }; | ||||
| Member.prototype.loadObj = function(m,dataVersion){ | Member.prototype.loadObj = function(m,dataVersion){ | ||||
| @@ -80,7 +81,7 @@ Member.prototype.loadObj = function(m,dataVersion){ | |||||
| this.latent = dataVersion>1 ? m[4] : m.latent; | this.latent = dataVersion>1 ? m[4] : m.latent; | ||||
| if (!(this.latent instanceof Array)) this.latent = []; //如果潜觉不是数组,则改变 | if (!(this.latent instanceof Array)) this.latent = []; //如果潜觉不是数组,则改变 | ||||
| this.sawoken = dataVersion>1 ? m[5] : m.sawoken; | this.sawoken = dataVersion>1 ? m[5] : m.sawoken; | ||||
| if (m[6] != undefined) this.skilllevel = m[6]; | |||||
| this.skilllevel = m[6] || null; | |||||
| }; | }; | ||||
| //只用来防坐的任何队员 | //只用来防坐的任何队员 | ||||
| var MemberDelay = function(){ | var MemberDelay = function(){ | ||||
| @@ -167,11 +168,11 @@ Formation.prototype.loadObj= function(f){ | |||||
| this.badge = f.b ? f.b : 0; //徽章 | this.badge = f.b ? f.b : 0; //徽章 | ||||
| const teamArr = dataVeision>1 ? f.f : f.team; | const teamArr = dataVeision>1 ? f.f : f.team; | ||||
| this.teams.forEach(function(t,ti){ | this.teams.forEach(function(t,ti){ | ||||
| var tf = teamArr[ti] || []; | |||||
| let tf = teamArr[ti] || []; | |||||
| t.forEach(function(st,sti){ | t.forEach(function(st,sti){ | ||||
| var fst = tf[sti] || []; | |||||
| let fst = tf[sti] || []; | |||||
| st.forEach(function(m,mi){ | st.forEach(function(m,mi){ | ||||
| var fm = fst[mi]; | |||||
| let fm = fst[mi]; | |||||
| m.loadObj(fm,dataVeision); | m.loadObj(fm,dataVeision); | ||||
| }); | }); | ||||
| }); | }); | ||||
| @@ -1868,23 +1869,13 @@ function refreshAbility(abilityDom,team,idx){ | |||||
| const bonusScale = [0.1,0.05,0.15]; //辅助宠物附加的属性倍率 | const bonusScale = [0.1,0.05,0.15]; //辅助宠物附加的属性倍率 | ||||
| //基底三维,如果辅助是武器,还要加上辅助的觉醒 | //基底三维,如果辅助是武器,还要加上辅助的觉醒 | ||||
| const mainAbility = calculateAbility(memberData, assistData, solo); | 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) | if (mainAbility && memberData.ability) | ||||
| { | { | ||||
| for (let ai=0;ai<3;ai++) | for (let ai=0;ai<3;ai++) | ||||
| { | { | ||||
| memberData.ability[ai] = mainAbility[ai]; | memberData.ability[ai] = mainAbility[ai]; | ||||
| if (assistAbility) memberData.ability[ai] += Math.round(assistAbility[ai]*bonusScale[ai]); | |||||
| } | } | ||||
| } | } | ||||
| } | |||||
| if (!abilityDom) return; //如果没有dom,直接跳过 | if (!abilityDom) return; //如果没有dom,直接跳过 | ||||
| const abilityLi = abilityDom.querySelector(".abilitys-" + (idx+1)); | const abilityLi = abilityDom.querySelector(".abilitys-" + (idx+1)); | ||||
| const hpDom = abilityLi.querySelector(".hp"); | const hpDom = abilityLi.querySelector(".hp"); | ||||
| @@ -1957,52 +1948,37 @@ function refreshFormationTotalHP(totalDom, teams){ | |||||
| const tHpDom = totalDom.querySelector(".tIf-total-hp"); | const tHpDom = totalDom.querySelector(".tIf-total-hp"); | ||||
| const tRcvDom = totalDom.querySelector(".tIf-total-rcv"); | 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 | const teamTHP = team[0].reduce(function(value,mon){ //队伍计算的总HP | ||||
| return value += mon.ability ? mon.ability[0] : 0; | return value += mon.ability ? mon.ability[0] : 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){ //队伍计算的总回复 | const teamTRCV = team[0].reduce(function(value,mon){ //队伍计算的总回复 | ||||
| return value += mon.ability ? mon.ability[2] : 0; | return value += mon.ability ? mon.ability[2] : 0; | ||||
| },0); | },0); | ||||
| return value + teamTRCV; | |||||
| const teamRCVAwoken = awokenCountInTeam(team,47,solo); //全队大回复个数 | |||||
| return [teamTRCV,teamRCVAwoken]; | |||||
| },0); | },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) | 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) | 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 | //刷新单人技能CD | ||||
| @@ -2024,12 +2000,12 @@ function refreshMemberSkillCD(teamDom,team,idx){ | |||||
| const assistSkillCd = assistSkill ? (assistSkill.initialCooldown - (assist.skilllevel||assistSkill.maxLevel) + 1) : 0; | const assistSkillCd = assistSkill ? (assistSkill.initialCooldown - (assist.skilllevel||assistSkill.maxLevel) + 1) : 0; | ||||
| memberSkillCdDom.innerHTML = memberSkillCd; | memberSkillCdDom.innerHTML = memberSkillCd; | ||||
| assistSkillCdDom.innerHTML = memberSkillCd + assistSkillCd; | assistSkillCdDom.innerHTML = memberSkillCd + assistSkillCd; | ||||
| if (member.skilllevel < memberSkill.maxLevel) | |||||
| if (member.skilllevel && member.skilllevel < memberSkill.maxLevel) | |||||
| { | { | ||||
| memberSkillCdDom.classList.remove("max-skill"); | memberSkillCdDom.classList.remove("max-skill"); | ||||
| assistSkillCdDom.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"); | memberSkillCdDom.classList.add("max-skill"); | ||||
| assistSkillCdDom.classList.remove("max-skill"); | assistSkillCdDom.classList.remove("max-skill"); | ||||
| }else | }else | ||||
| @@ -115,13 +115,15 @@ ul{ | |||||
| border: none; | border: none; | ||||
| box-shadow: inset black 0 0 7px; | box-shadow: inset black 0 0 7px; | ||||
| } | } | ||||
| .member{ | |||||
| vertical-align: top; | |||||
| } | |||||
| .delay .monster{ | .delay .monster{ | ||||
| background-color: yellow; | background-color: yellow; | ||||
| box-shadow: inset orange 0 0 7px; | box-shadow: inset orange 0 0 7px; | ||||
| border: 3px black solid; | border: 3px black solid; | ||||
| } | } | ||||
| .delay .monster::before{ | .delay .monster::before{ | ||||
| display: block; | |||||
| width: 94px; | width: 94px; | ||||
| height: 94px; | height: 94px; | ||||
| color: black; | color: black; | ||||
| @@ -153,6 +153,7 @@ function returnMonsterNameArr(card, lsList, defaultCode) | |||||
| function calculateAbility(member = null, assist = null, solo = true) | function calculateAbility(member = null, assist = null, solo = true) | ||||
| { | { | ||||
| if (!member) return null; | if (!member) return null; | ||||
| /* | |||||
| const monid = member.id || 0; | const monid = member.id || 0; | ||||
| const level = member.level || 1; | const level = member.level || 1; | ||||
| const plus = member.plus || [0,0,0]; | const plus = member.plus || [0,0,0]; | ||||
| @@ -161,9 +162,11 @@ function calculateAbility(member = null, assist = null, solo = true) | |||||
| const sawoken = member.sawoken; | const sawoken = member.sawoken; | ||||
| const weaponId = assist ? assist.id : null; | const weaponId = assist ? assist.id : null; | ||||
| const weaponAwoken = assist ? assist.awoken : null; | const weaponAwoken = assist ? assist.awoken : null; | ||||
| const card = Cards[monid]; //怪物数据 | 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 | //Code From pad-rikuu | ||||
| function valueAt(level, maxLevel, curve) { | 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); | return curve.min + (curve.max - curve.min) * Math.pow(f, curve.scale); | ||||
| } | } | ||||
| //Code From pad-rikuu | //Code From pad-rikuu | ||||
| function curve(c, maxLevel, limitBreakIncr) { | |||||
| function curve(c, level, maxLevel, limitBreakIncr) { | |||||
| let value = valueAt(level, maxLevel, { | let value = valueAt(level, maxLevel, { | ||||
| min: c.min, | min: c.min, | ||||
| max: c.max || (c.min * maxLevel), | max: c.max || (c.min * maxLevel), | ||||
| @@ -184,6 +187,7 @@ function calculateAbility(member = null, assist = null, solo = true) | |||||
| } | } | ||||
| return value; | return value; | ||||
| } | } | ||||
| const bonusScale = [0.1,0.05,0.15]; //辅助宠物附加的属性倍率 | |||||
| const plusAdd = [10,5,3]; //加值的增加值 | const plusAdd = [10,5,3]; //加值的增加值 | ||||
| const awokenAdd = [ //对应加三维觉醒的序号与增加值 | const awokenAdd = [ //对应加三维觉醒的序号与增加值 | ||||
| [{index:1,value:500},{index:65,value:-5000}], //HP | [{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: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 | [{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){ | Math.round(awokenAdd[idx].reduce(function(previous,aw){ | ||||
| const awokenCount = awokenList.filter(function(a){return a==aw.index;}).length; //每个觉醒的数量 | 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)) : | ||||
| 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){ | 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; //无加值与觉醒的基础值,乘以那么多个潜觉的增加倍数 | return previous + n_base * la.scale * latentCount; //无加值与觉醒的基础值,乘以那么多个潜觉的增加倍数 | ||||
| },0)) : | },0)) : | ||||
| 0; | 0; | ||||
| //console.log("基础值:%d,加蛋值:%d,觉醒x%d增加:%d,潜觉增加:%d",n_base,n_plus,awokenCount,n_awoken,n_latent); | //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){ | reValue = Math.round(awokenScale[idx].reduce(function(previous,aw){ | ||||
| const awokenCount = awokenList.filter(function(a){return a==aw.index;}).length; //每个协力觉醒的数量 | const awokenCount = awokenList.filter(function(a){return a==aw.index;}).length; //每个协力觉醒的数量 | ||||