From aaed32963e1bfc80a05ee39d883e442d47686f88 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=9E=AB=E8=B0=B7=E5=89=91=E4=BB=99?= Date: Fri, 13 Aug 2021 09:30:51 +0800 Subject: [PATCH] =?UTF-8?q?=E6=94=B9=E4=BA=86=E5=BE=88=E5=A4=9A=E5=9C=B0?= =?UTF-8?q?=E6=96=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- languages/zh-CN.js | 29 ++-- script-skill-parser.js | 279 +++++++++++++++++++++++++++-------- script-universal_function.js | 16 ++ style.css | 17 ++- 4 files changed, 260 insertions(+), 81 deletions(-) diff --git a/languages/zh-CN.js b/languages/zh-CN.js index 08f81955..aecba545 100644 --- a/languages/zh-CN.js +++ b/languages/zh-CN.js @@ -81,14 +81,17 @@ }, power: { unknown: tp`[ 未知能力提升: ${'type'} ]`, - scale_attributes: tp`${'attrs'}中${'min'}种属性同时攻击时${'stats'}${'bonus'}`, + scale_attributes: tp`${'orbs'}中${'min'}种属性同时攻击时${'stats'}${'bonus'}`, scale_attributes_bonus: tp`,每多1种${'bonus'},最大${'max'}种时${'stats_max'}`, scale_combos: tp`${'min'}连击时,${'stats'}${'bonus'}`, scale_combos_bonus: tp`,每多1连击${'bonus'},最大${'max'}连击时${'stats_max'}`, scale_match_attrs: tp`${'matches'}中${'min'}串匹配时,${'stats'}${'bonus'}`, scale_match_attrs_bonus: tp`,每多1串${'bonus'},最大${'max'}串时${'stats_max'}`, - scale_match_length: tp`相连消除${'min'}个${'attrs'}时${'stats'}${'bonus'}`, + scale_match_length: tp`${'in_once'}相连消除${'min'}个${'orbs'}时${'stats'}${'bonus'}`, scale_match_length_bonus: tp`,每多1个${'bonus'},最大${'max'}个时${'stats_max'}`, + scale_cross: tp`每以十字形式消除一组${'orbs'}时${'stats'}`, + scale_cross_single: tp`以十字形式消除${'orbs'}时${'stats'}`, + scale_state_kind_count: tp`以队伍中${'awakenings'}${'attrs'}${'types'}的数量提升,每个${'stats'}`, }, cond: { unknown: tp`[ 未知条件 ]`, @@ -104,7 +107,7 @@ exact_match_enhanced: tp`并且其中包含至少一个强化宝珠`, compo_type_card: tp`队伍中同时存在 ${'ids'} 时`, - compo_type_series: tp`队员组成全为 ${'ids'} 系列时`, + compo_type_series: tp`队员组成全为 ${'ids'} 合作时`, compo_type_evolution: tp`队员组成全为 ${'ids'} 进化时`, }, position: { @@ -125,6 +128,7 @@ hp_scale: tp`${'hp'}为100%时${'min'},${'hp'}为1时${'max'}`, random_atk: tp`${'atk'}×${'min'}${'max'}倍`, prob: tp`有${'value'}几率`, + x_awakenings: tp`${'awakenings'}数量×${'value'}`, }, target: { self: tp`发动者自身`, @@ -156,9 +160,11 @@ comma: tp`,`, //逗号 slight_pause: tp`、`, //顿号 range_hyphen: tp`~`, //范围连字符 + in_once: tp`同时`, affix_attr: tp`${'cotent'}属性`, //词缀-属性 affix_orb: tp`${'cotent'}宝珠`, //词缀-宝珠 affix_type: tp`${'cotent'}类型`, //词缀-类型 + affix_awakening: tp`${'cotent'}觉醒`, //词缀-觉醒 affix_exclude: tp`${'cotent'}以外`, //词缀-属性 }, attrs: { @@ -202,7 +208,7 @@ _5color: tp`${'icon'}5色`, _6color: tp`${'_5color'}+${'orb_rcv'}`, all: tp`所有`, - any: tp`任何`, + any: tp`任何${'cotent'}`, }, }, } @@ -273,15 +279,6 @@ function fastShowSkill(event) { console.log(Skills[skillId]); } } -//技能介绍里的头像的切换 -function changeToIdInSkillDetail(event) { - const settingBox = editBox.querySelector(".setting-box"); - const monstersID = settingBox.querySelector(".row-mon-id .m-id"); - const mid = this.getAttribute("data-cardid"); - monstersID.value = mid; - monstersID.onchange(); - return false; //取消链接的默认操作 -} //insertAdjacentHTML 可以只增加部分 HTML //高级技能解释 @@ -1397,12 +1394,6 @@ function parseSkillDescription(skill) { case 175: //隊員編成均為「マガジン」合作活動角色時,所有寵物的攻擊力8倍 let needCollabs = sk.slice(0,3).filter(s=>s>0); //最多3种id fragment.appendChild(document.createTextNode(`队员组成全是`)); - - //搜索并显示合作 - function searchCollab(event) { - const collabId = parseInt(this.getAttribute('data-collabId'), 10); - showSearch(Cards.filter(card => card.collabId == collabId)); - } needCollabs.forEach((cid,idx,arr)=>{ const lnk = fragment.appendChild(document.createElement("a")); diff --git a/script-skill-parser.js b/script-skill-parser.js index 77d08684..0548b07c 100644 --- a/script-skill-parser.js +++ b/script-skill-parser.js @@ -143,8 +143,10 @@ class Board } } //填充序列 - sequenceFill(sequence) + sequenceFill(sequence, exclude) { + if (!Array.isArray(exclude) && exclude != null) + exclude = [exclude]; const o = sequence.entries(); //65版部分 for (let ri=0;ri 0) + { + space -= this.#data.flat().filter(o=>exclude.includes(o)).length; + } + + let valueArray = new Array(space); attrs.forEach((attr,idx)=>{ valueArray.fill(attr, idx * count, (idx + 1) * count); }); //将上方数据重新乱序排列 const randomData = this.sequenceToRandom(valueArray); - this.sequenceFill(randomData); + this.sequenceFill(randomData, exclude); } //设定横行 setRow(rows, attr = 0) @@ -336,6 +347,7 @@ const SkillPowerUpKind = { ScaleMatchAttrs: 'scale-match-attrs', ScaleCross: 'scale-cross', ScaleAwakenings: 'scale-awakenings', + ScaleStateKindCount: 'scale-state-kind-count', }; const SkillKinds = { @@ -384,7 +396,7 @@ const SkillKinds = { function skillParser(skillId) { - /*function merge(skills) + function merge(skills) { //解封部分的合并 let unbinds = skills.filter(skill=>skill.kind == SkillKinds.Unbind); @@ -396,18 +408,30 @@ function skillParser(skillId) pre.matches = pre.matches || cur.matches; return pre }); - unbinds.shift(); //去除第一个 + unbinds.shift(); //从筛选中去除第一个 unbinds.forEach(skill=>skills.splice(skills.indexOf(skill),1)); //去掉所有后面的 } let fixedDamages = skills.filter(skill=>skill.kind == SkillKinds.DamageEnemy && skill.attr === 'fixed').filter((skill,idx,arr)=>skill.id==arr[0].id); if (fixedDamages.length>1) { //把后面的全都合并到第一个 - fixedDamages[0].times = 5; - fixedDamages.shift(); //去除第一个 + fixedDamages[0].times = fixedDamages.length; + fixedDamages.shift(); //从筛选中去除第一个 fixedDamages.forEach(skill=>skills.splice(skills.indexOf(skill),1)); //去掉所有后面的 } - - }*/ + let scaleCross = skills.filter(skill=>skill.kind == SkillKinds.PowerUp && skill.value.kind == SkillPowerUpKind.ScaleCross).filter((skill,idx,arr)=>{ + let atk = arr[0].value.crosses[0].atk; + return skill.value.crosses.every(cross=>cross.atk == atk); + }); + if (scaleCross.length>1) + { //把后面的全都合并到第一个 + scaleCross.reduce((pre,cur)=>{ + pre.value.crosses = pre.value.crosses.concat(cur.value.crosses); + return pre + }); + scaleCross.shift(); //从筛选中去除第一个 + scaleCross.forEach(skill=>skills.splice(skills.indexOf(skill),1)); //去掉所有后面的 + } + } const skill = Skills[skillId]; if (!skill) return []; if (!parsers[skill.type]) { @@ -477,7 +501,7 @@ const v = { return { kind: SkillValueKind.xTeamRCV, value: (value / 100) || 1 }; }, percentAwakenings: function(awakenings, value) { - return { kind: SkillValueKind.xAwakenings, awakenings: awakenings, value: value / 100 }; + return { kind: SkillValueKind.xAwakenings, awakenings: awakenings, value: value }; }, }; @@ -511,9 +535,9 @@ const p = { else { return { kind: SkillPowerUpKind.Multiplier, - hp: (values.hp || 100) / 100, - atk: (values.atk || 100) / 100, - rcv: (values.rcv || 100) / 100 + hp: (values.hp ?? 100) / 100, + atk: (values.atk ?? 100) / 100, + rcv: (values.rcv ?? 100) / 100 }; } }, @@ -549,8 +573,8 @@ const p = { scaleCross: function (crosses) { return { kind: SkillPowerUpKind.ScaleCross, crosses: crosses.map(cross => ({ ...cross, atk: (cross.atk / 100) || 1, rcv: (cross.rcv / 100) || 1 })) }; }, - scaleAwakenings: function (awakenings, value) { - return { kind: SkillPowerUpKind.ScaleAwakenings, awakenings: awakenings, value: value / 100 }; + scaleStateKindCount: function (awakenings, attrs, types, value) { + return { kind: SkillPowerUpKind.ScaleStateKindCount, awakenings: awakenings, attrs: attrs, types: types, value: value }; }, } @@ -886,17 +910,23 @@ const parsers = { [154](from, to) { return changeOrbs(fromTo(flags(from), flags(to))); }, [155](attrs, types, hp, atk, rcv) { return powerUp(flags(attrs), flags(types), p.mul({ hp, atk, rcv }), c.multiplayer()); }, [156](turns, awoken1, awoken2, awoken3, type, mul) { - return activeTurns(turns, type === 2 ? - powerUp(null, null, p.scaleAwakenings([awoken1, awoken2, awoken3].filter(Boolean), mul)) : - reduceDamage('all', v.percentAwakenings([awoken1, awoken2, awoken3].filter(Boolean), mul)) - ); + if (type == 1) + { + return heal(v.percentAwakenings([awoken1, awoken2, awoken3].filter(Boolean), v.xRCV(mul))); + }else + { + return activeTurns(turns, type === 2 ? + powerUp(null, null, p.scaleStateKindCount([awoken1, awoken2, awoken3].filter(Boolean), null, null, p.mul({atk: mul - 100, hp:0, rcv:0}))) : + reduceDamage('all', v.percentAwakenings([awoken1, awoken2, awoken3].filter(Boolean), v.percent(mul))) + ); + } }, [157](attr1, mul1, attr2, mul2, attr3, mul3) { return powerUp(null, null, p.scaleCross([ - { single: false, attr: attr1, mul: mul1 }, - { single: false, attr: attr2, mul: mul2 }, - { single: false, attr: attr3, mul: mul3 } - ].filter(cross => cross.mul))); + { single: false, attr: attr1, atk: mul1 }, + { single: false, attr: attr2, atk: mul2 }, + { single: false, attr: attr3, atk: mul3 } + ].filter(cross => cross.atk))); }, [158](len, attrs, types, atk, hp, rcv) { return [ @@ -922,7 +952,11 @@ const parsers = { [165](attrs, min, baseAtk, baseRcv, bonusAtk, bonusRcv, incr) { return powerUp(null, null, p.scaleAttrs(flags(attrs), min, min + (incr ?? 0), [baseAtk, baseRcv], [bonusAtk, bonusRcv])); }, [166](min, baseAtk, baseRcv, bonusAtk, bonusRcv, max) { return powerUp(null, null, p.scaleCombos(min, max, [baseAtk, baseRcv], [bonusAtk, bonusRcv])); }, [167](attrs, min, baseAtk, baseRcv, bonusAtk, bonusRcv, max) { return powerUp(null, null, p.scaleMatchLength(flags(attrs), min, max, [baseAtk, baseRcv], [bonusAtk, bonusRcv])); }, - + [168](turns, awoken1, awoken2, awoken3, awoken4, awoken5, awoken6, mul) { + return activeTurns(turns, + powerUp(null, null, p.scaleStateKindCount([awoken1, awoken2, awoken3, awoken4, awoken5, awoken6].filter(Boolean), null, null, p.mul({atk: mul, hp:0, rcv:0}))) + ); + }, [169](combo, mul, percent) { return powerUp(null, null, p.scaleCombos(combo, combo, [mul, 100], [0, 0]), undefined, v.percent(percent)); }, [170](attrs, min, mul, percent) { return powerUp(null, null, p.scaleAttrs(flags(attrs), min, min, [mul, 100], [0, 0]), undefined, v.percent(percent)); }, [171](attrs1, attrs2, attrs3, attrs4, min, mul, percent) { @@ -1010,6 +1044,14 @@ const parsers = { [224](turns, attr) { return activeTurns(turns, changeAttr('opponent', attr)); }, [227]() { return leaderChange(1); }, + [228](turns, attrs, types, atk, rcv) { + return activeTurns(turns, + powerUp(null, null, p.scaleStateKindCount(null, flags(attrs), flags(types), p.mul({atk: atk, rcv: rcv, hp:0}))) + ); + }, + [229](attrs, types, hp, atk, rcv) { + return powerUp(null, null, p.scaleStateKindCount(null, flags(attrs), flags(types), p.mul({hp: hp, atk: atk, rcv: rcv}))); + }, }; //将内容添加到代码片段 @@ -1059,6 +1101,54 @@ function renderSkillEntry(skills) li.skill = skill; li.addEventListener("click", showParsedSkill); }); + + /* + let boardChange = skills.filter(skill=> + skill.kind == SkillKinds.BoardChange || + skill.kind == SkillKinds.GenerateOrbs || + skill.kind == SkillKinds.FixedOrbs + ); + if (boardChange.length > 0) + { + const board = new Board(); + for (let skill of boardChange) + { + switch (skill.kind) + { + case SkillKinds.BoardChange: { //洗版 + const attrs = skill.attrs; + board.randomFill(attrs); + break; + } + case SkillKinds.GenerateOrbs: { //产生珠子 + let orbs = skill.orbs, exclude = skill.exclude, count = skill.count; + board.generateOrbs(orbs, count, exclude); + break; + } + case SkillKinds.FixedOrbs: { //固定位置产生珠子 + let generates = skill.generates; + for (const generate of generates) + { + let orb = generate.orbs?.[0]; + if (generate.type == 'shape') { + board.setShape(generate.positions, orb); + } else { + if (generate.type == 'row') + board.setRow(generate.positions, orb); + else + board.setColumn(generate.positions, orb); + } + } + break; + } + } + } + const li = ul.appendChild(document.createElement("li")); + li.appendChild(board.toTable()); + li.className = "merge-board"; + } + */ + return ul; } function renderSkill(skill, option = {}) @@ -1386,7 +1476,7 @@ function renderSkill(skill, option = {}) value: count, }; let board = new Board(); - board.generateOrbs(orbs, count); + board.generateOrbs(orbs, count, exclude); frg.ap(tsp.skill.generate_orbs(dict)); frg.ap(board.toTable()); break; @@ -1576,7 +1666,7 @@ function renderStat(stat, option) { function renderAttrs(attrs, option = {}) { if (!Array.isArray(attrs)) - attrs = [attrs ?? 0]; + attrs = [attrs ?? 0]; const frg = document.createDocumentFragment(); if (typeof localTranslating == "undefined") return frg; @@ -1584,7 +1674,7 @@ function renderAttrs(attrs, option = {}) { let contentFrg; if (isEqual(attrs, Attributes.all())) { - contentFrg = option.any ? tsp.attrs.any() : tsp.attrs.all(); + contentFrg = tsp.attrs.all(); } else { @@ -1596,13 +1686,15 @@ function renderAttrs(attrs, option = {}) { }) .nodeJoin(tsp.word.slight_pause()); } - frg.ap(option.affix ? tsp.word.affix_attr({cotent: contentFrg}) : contentFrg); + if (option.affix) + contentFrg = tsp.word.affix_attr({cotent: contentFrg}); + frg.ap(contentFrg); return frg; } function renderOrbs(attrs, option = {}) { if (!Array.isArray(attrs)) - attrs = [attrs ?? 0]; + attrs = [attrs ?? 0]; const frg = document.createDocumentFragment(); if (typeof localTranslating == "undefined") return frg; @@ -1611,7 +1703,7 @@ function renderOrbs(attrs, option = {}) { if (isEqual(attrs, Attributes.orbs())) { - contentFrg = option.any ? tsp.orbs.any() : tsp.orbs.all(); + contentFrg = tsp.orbs.all(); } else if (isEqual(attrs, Attributes.all())) { @@ -1635,13 +1727,17 @@ function renderOrbs(attrs, option = {}) { }) .nodeJoin(tsp.word.slight_pause()); } - frg.ap(option.affix ? tsp.word.affix_orb({cotent: contentFrg}) : contentFrg); + if (option.affix) + contentFrg = tsp.word.affix_orb({cotent: contentFrg}); + if (option.any) + contentFrg = tsp.orbs.any({cotent: contentFrg}); + frg.ap(contentFrg); return frg; } function renderTypes(types, option = {}) { if (!Array.isArray(types)) - types = [types ?? 0]; + types = [types ?? 0]; const frg = document.createDocumentFragment(); if (typeof localTranslating == "undefined") return frg; @@ -1657,6 +1753,24 @@ function renderTypes(types, option = {}) { return frg; } +function renderAwakenings(awakenings, option = {}) { + if (!Array.isArray(awakenings)) + awakenings = [awakenings ?? 0]; + const frg = document.createDocumentFragment(); + if (typeof localTranslating == "undefined") return frg; + + const tsp = localTranslating.skill_parse; + const contentFrg = awakenings.map(awoken => { + const icon = document.createElement("icon"); + icon.className = "awoken-icon"; + icon.setAttribute("data-awoken-icon",awoken); + return icon; + }) + .nodeJoin(tsp.word.slight_pause()); + frg.ap(option.affix ? tsp.word.affix_awakening({cotent: contentFrg}) : contentFrg); + return frg; +} + function renderCondition(cond) { const frg = document.createDocumentFragment(); const tsp = localTranslating.skill_parse; @@ -1699,12 +1813,23 @@ function renderCondition(cond) { switch (cond.compo.type) { case 'card':{ - dict.ids = cond.compo.ids.join(); + dict.ids = cond.compo.ids.map(mid=>{ + const dom = cardN(mid); + dom.monDom.onclick = changeToIdInSkillDetail; + return dom; + }).nodeJoin(); frg.ap(tsp.cond.compo_type_card(dict)); break; } case 'series':{ - dict.ids = cond.compo.ids.join(); + dict.ids = cond.compo.ids.map(cid=>{ + const lnk = document.createElement("a"); + lnk.className ="detail-search monster-collabId"; + lnk.setAttribute("data-collabId",cid); + lnk.onclick = searchCollab; + lnk.textContent = cid; + return lnk; + }).nodeJoin(tsp.word.slight_pause()); frg.ap(tsp.cond.compo_type_series(dict)); break; } @@ -1723,12 +1848,16 @@ function renderCondition(cond) { function renderPowerUp(powerUp) { const frg = document.createDocumentFragment(); const tsp = localTranslating.skill_parse; - function renderStats(hp, atk, rcv, mul = true) { + function renderStats(hp, atk, rcv, option = {}) { + const mul = option.mul ?? true; + option.percent = !mul; const frg = document.createDocumentFragment(); const operator = mul ? '' : '+'; let list = [['hp', hp], ['atk', atk], ['rcv', rcv]]; //去除不改变的值 - list = list.filter(([, value]) => value !== (mul ? 1 : 0)); + list = list.filter(([name, value]) => value !== (mul ? 1 : 0) && + !(name === 'hp' && value === 0)); + if (list.length === 0) return frg; if (list.every(([, value]) => value === list[0][1])) { @@ -1736,14 +1865,14 @@ function renderPowerUp(powerUp) { //三个值一样 frg.ap(list.map(([name]) => renderStat(name)).nodeJoin(tsp.word.slight_pause())); frg.ap(operator); - frg.ap(renderValue(mul ? v.percent(value * 100): v.constant(value))); + frg.ap(renderValue(v.percent(value * 100), option)); } else { //三个值不一样 let subDocument = list.map(([name, value]) => { let _frg = document.createDocumentFragment(); _frg.ap(renderStat(name)); _frg.ap(operator); - _frg.ap(renderValue(mul ? v.percent(value * 100): v.constant(value))); + _frg.ap(renderValue(v.percent(value * 100), option)); return _frg; }); frg.ap(subDocument.nodeJoin(tsp.word.comma())); @@ -1761,7 +1890,7 @@ function renderPowerUp(powerUp) { let attrs = powerUp.attrs, min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv; let dict = { - attrs: renderOrbs(attrs, {affix: true}), + orbs: renderOrbs(attrs, {affix: true}), min: min, stats: renderStats(1, baseAtk, baseRcv), } @@ -1769,7 +1898,7 @@ function renderPowerUp(powerUp) { { let _dict = { max: max, - bonus: renderStats(0, bonusAtk, bonusRcv, false), + bonus: renderStats(0, bonusAtk, bonusRcv, {mul: false}), stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)), } dict.bonus = frg.ap(tsp.power.scale_attributes_bonus(_dict)); @@ -1788,7 +1917,7 @@ function renderPowerUp(powerUp) { { let _dict = { max: max, - bonus: renderStats(0, bonusAtk, bonusRcv, false), + bonus: renderStats(0, bonusAtk, bonusRcv, {mul: false}), stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)), } dict.bonus = frg.ap(tsp.power.scale_combos_bonus(_dict)); @@ -1808,7 +1937,7 @@ function renderPowerUp(powerUp) { { let _dict = { max: max, - bonus: renderStats(0, bonusAtk, bonusRcv, false), + bonus: renderStats(0, bonusAtk, bonusRcv, {mul: false}), stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)), } dict.bonus = frg.ap(tsp.power.scale_match_attrs_bonus(_dict)); @@ -1818,18 +1947,19 @@ function renderPowerUp(powerUp) { break; } case SkillPowerUpKind.ScaleMatchLength: { - let attrs = powerUp.attrs, min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv; + let attrs = powerUp.attrs, min = powerUp.min, max = powerUp.max, baseAtk = powerUp.baseAtk, baseRcv = powerUp.baseRcv, bonusAtk = powerUp.bonusAtk, bonusRcv = powerUp.bonusRcv, matchAll = powerUp.matchAll; let dict = { - attrs: renderOrbs(attrs, {affix: true}), + orbs: renderOrbs(attrs, {affix: true}), min: min, stats: renderStats(1, baseAtk, baseRcv), + in_once: matchAll && tsp.word.in_once() || null, } if (max !== min) { let _dict = { max: max, - bonus: renderStats(0, bonusAtk, bonusRcv, false), + bonus: renderStats(0, bonusAtk, bonusRcv, {mul: false}), stats_max: renderStats(1, baseAtk + bonusAtk * (max-min), baseRcv + bonusRcv * (max-min)), } dict.bonus = frg.ap(tsp.power.scale_match_length_bonus(_dict)); @@ -1838,23 +1968,41 @@ function renderPowerUp(powerUp) { break; } - /* - - case SkillPowerUpKind.ScaleMatchLength: { - const { attrs, min, max, baseAtk, baseRcv, bonusAtk, bonusRcv } = powerUp as SkillPowerUp.ScaleAttrs; - return <> - ≥ {min} × {renderAttrs(attrs)} ⇒ {renderStats(1, baseAtk, baseRcv)} - {max !== min && <> for each ≤ {max} orbs: {renderStats(0, bonusAtk, bonusRcv, false)}} - ; - } case SkillPowerUpKind.ScaleCross: { - const { crosses } = powerUp as SkillPowerUp.ScaleCross; - return crosses.map(({ single, attr, mul }, i) => - {i !== 0 && ', '} - {mul !== 1 && <>{renderStat('atk')} × {formatNumber(mul)} } - {single ? 'when' : 'for each'} cross of {renderAttrs(attr)} - ); + let crosses = powerUp.crosses; + + if (crosses.length >= 2 && crosses.every(cross => cross.atk === crosses[0].atk)) { + //所有值一样 + let cross = crosses[0]; + let dict = { + orbs: renderOrbs(crosses.map(cross => cross.attr), {affix: true, any: true}), + stats: renderStats(1, cross.atk, cross.rcv), + } + frg.ap(cross.single ? tsp.power.scale_cross_single(dict) : tsp.power.scale_cross(dict)); + } else { + let subDocument = crosses.map(cross=>{ + let dict = { + orbs: renderOrbs(cross.attr, {affix: true, any: true}), + stats: renderStats(1, cross.atk, cross.rcv), + } + return cross.single ? tsp.power.scale_cross_single(dict) : tsp.power.scale_cross(dict); + }); + frg.ap(subDocument.nodeJoin(tsp.word.comma())); + } + break; } + case SkillPowerUpKind.ScaleStateKindCount: { + let awakenings = powerUp.awakenings, attrs = powerUp.attrs, types = powerUp.types, value = powerUp.value; + let dict = { + stats: renderStats(value.hp, value.atk, value.rcv, {mul: false, percent: true}), + awakenings: awakenings?.length && renderAwakenings(awakenings, {affix: true}) || null, + attrs: attrs?.length && renderAttrs(attrs, {affix: true}) || null, + types: types?.length && renderTypes(types, {affix: true}) || null, + } + frg.ap(tsp.power.scale_state_kind_count(dict)); + break; + } + /* case SkillPowerUpKind.ScaleAwakenings: { const { awakenings, value } = powerUp as SkillPowerUp.ScaleAwakenings; return <> @@ -2096,6 +2244,15 @@ function renderValue(_value, option = {}) { frg.ap(tspv.random_atk(dict)); break; } + case SkillValueKind.xAwakenings: { + let value = _value.value, awakenings = _value.awakenings; + let dict = { + value: renderValue(value,{percent : true}), + awakenings: renderAwakenings(awakenings, {affix: true}), + } + frg.ap(tsp.value.x_awakenings(dict)); + break; + } /* case SkillValueKind.xAwakenings: { const { value, awakenings } = _value as SkillValue.WithAwakenings; diff --git a/script-universal_function.js b/script-universal_function.js index b478d097..1ba44173 100644 --- a/script-universal_function.js +++ b/script-universal_function.js @@ -594,6 +594,22 @@ function cardN(id) { changeid({ id: id }, monDom); return monOuterDom; } +//技能介绍里的头像的切换 +function changeToIdInSkillDetail(event) { + const settingBox = editBox.querySelector(".setting-box"); + const monstersID = settingBox.querySelector(".row-mon-id .m-id"); + const mid = this.getAttribute("data-cardid"); + monstersID.value = mid; + monstersID.onchange(); + return false; //取消链接的默认操作 +} +//搜索并显示合作 +function searchCollab(event) { + const collabId = parseInt(this.getAttribute('data-collabId'), 10); + showSearch(Cards.filter(card => card.collabId == collabId)); + return false; +} + //将怪物的文字介绍解析为HTML function descriptionToHTML(str) { diff --git a/style.css b/style.css index 0d3ac326..8b331adb 100644 --- a/style.css +++ b/style.css @@ -3180,14 +3180,29 @@ table .orb-icon } .icon-skill, .skill-datail-parsed icon.orb, -.skill-datail-parsed icon.type +.skill-datail-parsed icon.type, +.skill-datail-parsed icon.awoken-icon { vertical-align: bottom; transform: scale(0.75); /*margin: -4px;*/ position: relative; } +.skill-datail-parsed .detail-search.monster-collabId +{ + cursor: pointer; + color: brown; +} +.skill-datail-parsed .detail-search.monster-collabId:hover +{ + background: rgba(150,110,10,0.5); + border-radius: 5px; +} +.skill-datail-parsed .merge-board +{ + margin-top: 5px; +} .skill-datail-parsed .board { border-collapse: collapse; background-color: #532;