| @@ -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 | |||
| @@ -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; | |||
| @@ -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; //每个协力觉醒的数量 | |||