diff --git a/images/icon-skills.png b/images/icon-skills.png index 869ec259..a5dbeacd 100644 Binary files a/images/icon-skills.png and b/images/icon-skills.png differ diff --git a/images/project file/icon-skills.fw.png b/images/project file/icon-skills.fw.png index df41b16b..3ddfaacd 100644 Binary files a/images/project file/icon-skills.fw.png and b/images/project file/icon-skills.fw.png differ diff --git a/languages/zh-TW.js b/languages/zh-TW.js index c38e6782..4518f5f7 100644 --- a/languages/zh-TW.js +++ b/languages/zh-TW.js @@ -91,8 +91,9 @@ change_orbs: tp`${'from'}→${'to'}`, generate_orbs: tp`${'exclude'}生成${'orbs'}各${'value'}個`, fixed_orbs: tp`在${'position'}產生${'orbs'}`, - orb_drop_increase: tp`${'orbs'}的掉落率提高到${'value'}`, - orb_drop_increase_flag: tp`${'chance'}掉落${'flag'}${'orbs'}`, + orb_drop_increase: tp`${'orbs'}的掉落率提高到${'prob'}`, + orb_drop_increase_flag: tp`${'prob'}掉落${'flag'}狀態${'orbs'}${'value'}`, + orb_thorn: tp`,每次碰到減少${'value'}`, attr_absorb: tp`${'icon'}屬性吸收`, combo_absorb: tp`${'icon'}連擊吸收`, damage_absorb: tp`${'icon'}傷害吸收`, @@ -225,6 +226,7 @@ }, word: { comma: tp`,`, //逗號 + semicolon: tp`; `, //分號 slight_pause: tp`、`, //頓號 range_hyphen: tp`~`, //範圍連字符 in_once: tp`同時`, @@ -266,6 +268,7 @@ enhanced: tp`${'icon'}強化`, locked: tp`${'icon'}鎖定`, nail: tp`${'icon'}釘子`, + thorn: tp`${'icon'}荊棘`, _5color: tp`${'icon'}5色`, _6color: tp`${'_5color'}+${'orb_rcv'}`, all: tp`所有`, diff --git a/languages/zh.js b/languages/zh.js index 7df531a9..a64a17d6 100644 --- a/languages/zh.js +++ b/languages/zh.js @@ -91,8 +91,9 @@ change_orbs: tp`${'from'}→${'to'}`, generate_orbs: tp`${'exclude'}生成${'orbs'}各${'value'}个`, fixed_orbs: tp`在${'position'}产生${'orbs'}`, - orb_drop_increase: tp`${'orbs'}的掉落率提高到${'value'}`, - orb_drop_increase_flag: tp`${'chance'}掉落${'flag'}${'orbs'}`, + orb_drop_increase: tp`${'orbs'}的掉落率提高到${'prob'}`, + orb_drop_increase_flag: tp`${'prob'}掉落${'flag'}状态${'orbs'}${'value'}`, + orb_thorn: tp`,每次碰到减少${'value'}`, attr_absorb: tp`${'icon'}属性吸收`, combo_absorb: tp`${'icon'}连击吸收`, damage_absorb: tp`${'icon'}伤害吸收`, @@ -225,6 +226,7 @@ }, word: { comma: tp`,`, //逗号 + semicolon: tp`; `, //分号 slight_pause: tp`、`, //顿号 range_hyphen: tp`~`, //范围连字符 in_once: tp`同时`, @@ -266,6 +268,7 @@ enhanced: tp`${'icon'}强化`, locked: tp`${'icon'}锁定`, nail: tp`${'icon'}钉子`, + thorn: tp`${'icon'}荆棘`, _5color: tp`${'icon'}5色`, _6color: tp`${'_5color'}+${'orb_rcv'}`, all: tp`所有`, diff --git a/script-json_data.js b/script-json_data.js index c37ae520..41e4dc90 100644 --- a/script-json_data.js +++ b/script-json_data.js @@ -61,7 +61,7 @@ let localTranslating = { skill: { error: tp`😫An error occurred in skill parsing, please feedback the Card ID to the developer.`, unknown: tp`Unkonwn skill type: ${'type'}`, - active_turns: tp`${'skills'}, for ${'turns'} turns`, + active_turns: tp`Within ${'turns'} turns, ${'skills'}`, delay_active_turns: tp`${`icon`}[Activated after ${'turns'} turns]:${'skills'}`, random_skills: tp`Random Activates these skills:${'skills'}`, evolved_skills: tp`Skills evolve to the next stage when used:${'skills'}`, @@ -106,9 +106,9 @@ let localTranslating = { change_orbs: tp`Changes ${'from'} to ${'to'} orbs`, generate_orbs: tp`Creates ${'value'} ${'orbs'} orbs each at random ${'exclude'}`, fixed_orbs: tp`Changes the ${'position'} to ${'orbs'} orbs`, - orb_drop_increase: tp`Increases the skyfall of ${'orbs'} to ${'value'}`, - orb_drop_increase_flag: tp`${'orbs'} skyfall ${'chance'}${'flag'}`, - orb_drop_increase_chance: tp`by ${'value'}`, + orb_drop_increase: tp`Increases the skyfall of ${'orbs'} to ${'prob'}`, + orb_drop_increase_flag: tp`${'orbs'} skyfall ${'prob'} chance for ${'flag'}${'value'}`, + orb_thorn: tp`, reduces ${'value'} per encounter`, attr_absorb: tp`${'icon'}Attribute absorption`, combo_absorb: tp`${'icon'}Combo absorption`, damage_absorb: tp`${'icon'}Damage absorption`, @@ -241,6 +241,7 @@ let localTranslating = { }, word: { comma: tp`, `, + semicolon: tp`; `, slight_pause: tp`, `, range_hyphen: tp`~`, in_once: tp`in once `, @@ -282,6 +283,7 @@ let localTranslating = { enhanced: tp`${'icon'}Enhanced`, locked: tp`${'icon'}Locked`, nail: tp`${'icon'}Nail`, + thorn: tp`${'icon'}Thorn`, _5color: tp`${'icon'}5 Att.`, _6color: tp`${'_5color'}+${'orb_rcv'}`, all: tp`All`, @@ -954,13 +956,15 @@ const specialSearchFunctions = (function() { const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - if (sk[1] && sk[3]) - { - return `双吸×${sk[0]}T`; - }else - { - return `${['属','C','伤'][sk.slice(1).findIndex(Boolean)]}吸×${sk[0]}T`; - } + const fragment = document.createDocumentFragment(); + const icons = [ + sk[1] && 'attr-absorb', + sk[2] && 'combo-absorb', + sk[3] && 'damage-absorb' + ].filter(buff => typeof buff === 'string').map(buff=>createSkillIcon(buff)) + fragment.append(...icons); + fragment.append(`×${sk[0]}T`); + return fragment; } function unbind_Turns(card) { @@ -981,20 +985,20 @@ const specialSearchFunctions = (function() { function unbind_Addition(card) { const turns = unbind_Turns(card); - let strArr = []; - if (turns.normal > 0 && turns.normal == turns.awoken) - { - return `${turns.normal == 9999 ? "全" : turns.normal + "T"}解封+觉`; - } + + const fragment = document.createDocumentFragment(); if (turns.normal > 0) { - strArr.push(`${turns.normal >= 9999 ? "全" : turns.normal + "T"}解封`); + fragment.append(createSkillIcon('unbind-normal')); + if (turns.normal != turns.awoken) + fragment.append(`-${turns.normal>=9999 ? '全' : `${turns.normal}T` }`); } if (turns.awoken > 0) { - strArr.push(`${turns.awoken >= 9999 ? "全" : turns.awoken + "T"}解觉`); + fragment.append(createSkillIcon('unbind-awakenings')); + fragment.append(`-${turns.awoken>=9999 ? '全' : `${turns.awoken}T` }`); } - return strArr.join(','); + return fragment; } function boardChange_ColorTypes(skill) { @@ -1111,7 +1115,7 @@ const specialSearchFunctions = (function() { if (!skill) return; const sk = skill.params; const fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(`锁`)); + fragment.appendChild(createSkillIcon('orb-locked')); fragment.appendChild(createOrbsList(flags(sk[0] || 1))); return fragment; } @@ -1122,8 +1126,8 @@ const specialSearchFunctions = (function() { if (!skill) return; const sk = skill.params; const fragment = document.createDocumentFragment(); - fragment.appendChild(document.createTextNode(`掉锁`)); - fragment.appendChild(createOrbsList(flags(sk[0] != -1 ? sk[0] : 0b1111111111))); + fragment.append(createSkillIcon('orb-locked')); + fragment.appendChild(createOrbsList(flags(sk[0] != -1 ? sk[0] : 0b1111111111), 'drop')); fragment.appendChild(document.createTextNode(`×${sk[1]}T`)); return fragment; } @@ -1137,7 +1141,7 @@ const specialSearchFunctions = (function() { const colors = flags(sk[0]); const fragment = document.createDocumentFragment(); - fragment.appendChild(createOrbsList(colors)); + fragment.appendChild(createOrbsList(colors, 'drop')); fragment.appendChild(document.createTextNode(`↓${sk[3]}%×${sk[1]}${sk[1] != sk[2]?`~${sk[2]}`:""}T`)); return fragment; } @@ -1446,7 +1450,7 @@ const specialSearchFunctions = (function() { return ul; } //产生宝珠列表 - function createOrbsList(orbs) + function createOrbsList(orbs, className) { if (orbs == undefined) orbs = [0]; else if (!Array.isArray(orbs)) orbs = [orbs]; @@ -1454,7 +1458,7 @@ const specialSearchFunctions = (function() { ul.className = "board"; orbs.forEach(orbType => { const li = ul.appendChild(document.createElement("li")); - li.className = `orb`; + li.className = className ? `orb ${className}` :`orb`; li.setAttribute("data-orb-icon", orbType); }); return ul; @@ -1530,7 +1534,10 @@ const specialSearchFunctions = (function() { const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return document.createTextNode(`破贯×${sk[0]}T`); + const fragment = document.createDocumentFragment(); + fragment.append(createSkillIcon('damage-void')); + fragment.append(`×${sk[0]}T`); + return fragment; } }, ]}, @@ -1596,8 +1603,10 @@ const specialSearchFunctions = (function() { const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - const value = sk[0]; - return document.createTextNode(`${value == 9999 ? "全" : value + "T"}解禁消`); + const fragment = document.createDocumentFragment(); + fragment.append(createSkillIcon('unbind-matches')); + fragment.append(`-${sk[0]>=9999 ? '全' : `${sk[0]}T` }`); + return fragment; } }, ]}, @@ -1615,7 +1624,10 @@ const specialSearchFunctions = (function() { const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return document.createTextNode(`${sk[0]}${sk[0]!=sk[1]?`~${sk[1]}`:""}溜`); + const fragment = document.createDocumentFragment(); + fragment.append(createSkillIcon('skill-boost', 'boost-incr'), sk[0]); + if (sk[1] !== undefined && sk[0]!=sk[1]) fragment.append(`~${sk[1]}`); + return fragment; } }, {name:"↓Reduce skills charge(sort by turns)",otLangName:{chs:"【坐】增加CD(按回合排序)",cht:"【坐】增加CD(按回合排序)"}, @@ -1631,20 +1643,32 @@ const specialSearchFunctions = (function() { const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return document.createTextNode(`坐下${sk[0]}${sk[1] && sk[0]!=sk[1]?`~${sk[1]}`:""}`); + const fragment = document.createDocumentFragment(); + fragment.append(createSkillIcon('skill-boost', 'boost-decr'), sk[0]); + if (sk[1] !== undefined && sk[0]!=sk[1]) fragment.append(`~${sk[1]}`); + return fragment; } }, {name:"Change Leader",otLangName:{chs:"更换队长",cht:"更換隊長"}, - function:cards=>cards.filter(card=>{ + function:cards=>{ const searchTypeArray = [93, 227]; - const skill = getCardActiveSkill(card, searchTypeArray); - return skill; - }), + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>{ + const a_s = getCardActiveSkill(a, searchTypeArray), + b_s = getCardActiveSkill(b, searchTypeArray); + return a_s.type - b_s.type; + }); + }, addition:card=>{ const searchTypeArray = [93, 227]; const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; - return skill.type == 93 ? '换自身' : '换最后队员'; + const fragment = document.createDocumentFragment(); + fragment.append(createSkillIcon('leader-change')); + fragment.append(skill.type == 93 ? '换自身' : '换最后'); + return fragment; } }, {name:"Increase Damage Cap",otLangName:{chs:"增加伤害上限 buff",cht:"增加傷害上限 buff"}, @@ -2488,7 +2512,32 @@ const specialSearchFunctions = (function() { const skill = getCardActiveSkill(card, searchTypeArray); if (!skill) return; const sk = skill.params; - return `📌${sk[1]}%×${sk[0]}T`; + const fragment = document.createDocumentFragment(); + fragment.append(createSkillIcon('orb-nail'), `${sk[1]}%×${sk[0]}T`); + return fragment; + } + }, + {name:"Drop Thorn Orbs(sort by turns)",otLangName:{chs:"掉落荆棘(按回合排序)debuff",cht:"掉落荊棘(按回合排序)debuff"}, + function:cards=>{ + const searchTypeArray = [243]; + return cards.filter(card=>{ + const skill = getCardActiveSkill(card, searchTypeArray); + return skill; + }).sort((a,b)=>sortByParams(a,b,searchTypeArray)); + }, + addition:card=>{ + const searchTypeArray = [243]; + const skill = getCardActiveSkill(card, searchTypeArray); + if (!skill) return; + const sk = skill.params; + const fragment = document.createDocumentFragment(); + fragment.append(createSkillIcon('orb-thorn')); + if ((sk[1] & 0b1111111111) != 1023) { + let attrs = flags(sk[1]); + fragment.append(createOrbsList(attrs)); + } + fragment.append(`${sk[3]}%×${sk[0]}T`, document.createElement("br"), "/" ,createSkillIcon('maxhp-locked'), `${sk[2]}%`); + return fragment; } }, ]}, diff --git a/script-skill-parser.js b/script-skill-parser.js index 44051c35..f525b3d4 100644 --- a/script-skill-parser.js +++ b/script-skill-parser.js @@ -999,8 +999,8 @@ function setOrbState(orbs, state, arg) { function rateMultiply(value, rate) { return { kind: SkillKinds.RateMultiply, value: value, rate: rate }; } -function orbDropIncrease(value, attrs, flag) { - return { kind: SkillKinds.OrbDropIncrease, value: value, attrs: attrs, flag: flag }; +function orbDropIncrease(prob, attrs, flag, value) { + return { kind: SkillKinds.OrbDropIncrease, prob, attrs, flag, value }; } function resolve(min, max) { return { kind: SkillKinds.Resolve, min: min, max: max }; @@ -1588,8 +1588,8 @@ const skillObjectParsers = { [233](...ids) { return evolvedSkills(true, ids.map(id => this.parser(id))); }, [234](min, max) { return skillProviso(c.stage(min ?? 0, max ?? 0)); }, [235](attrs, lenMin, lenExact, atk, reducePercent, combo, damage) { - const len = lenMin || lenExact; //宝珠长度 - const ee = Boolean(lenExact); //是否为刚好等于 + // const len = lenMin || lenExact; //宝珠长度 + // const ee = Boolean(lenExact); //是否为刚好等于 //第二个参数为多少以上就算,第三个参数为多少以上才算 //return powerUp(null, null, p.mul({ atk: atk || 100}), c.exact('match-length', lenExact, flags(attr)), v.percent(percent), [combo ? addCombo(combo) : null, damage ? followAttackFixed(damage) : null].filter(Boolean), true); //let powerup, condition; @@ -1629,6 +1629,9 @@ const skillObjectParsers = { increaseDamageCap(cap * 1e8, ["self"]) ); }, + [243](turns, attrs, hpPercent, probPercent) { //掉落荆棘珠 + return activeTurns(turns, orbDropIncrease(v.percent(probPercent), flags(attrs), 'thorn', v.xMaxHP(hpPercent))); + }, [244](turns, type) { //改变板面大小主动技 let width, height; switch (type) { @@ -1830,19 +1833,21 @@ function posSplit(pos, axis = 'row') ]; //return {sequence: pos.filter(n=>n<=2).map(n=>n+1), reverse: pos.filter(n=>n>=3).reverse().map(n=>max-n)}; } + +function createSkillIcon(iconType, className){ + const idoc = document.createElement("icon"); + idoc.className = `icon-skill${className ? ` ${className}` : ''}`; + idoc.setAttribute("data-icon-type", iconType); + return idoc; +} + function renderSkill(skill, option = {}) { const frg = document.createDocumentFragment(); if (typeof localTranslating == "undefined") return frg; const tsp = localTranslating.skill_parse; - - function createIcon(iconType, className){ - const idoc = document.createElement("icon"); - idoc.className = `icon-skill${className ? ` ${className}` : ''}`; - idoc.setAttribute("data-icon-type", iconType); - return idoc; - } - + const createIcon = createSkillIcon; + if (Array.isArray(skill)) { frg.ap(skill.map(_skill=>renderSkill(_skill))); @@ -1866,7 +1871,7 @@ function renderSkill(skill, option = {}) let { turns, skills } = skill; let dict = { turns: Array.isArray(turns) ? turns.join(tsp.word.range_hyphen().textContent) : turns, - skills: skills?.map(renderSkill)?.nodeJoin(tsp.word.comma()), + skills: skills?.map(renderSkill)?.nodeJoin(tsp.word.semicolon()), }; frg.ap(tsp.skill.active_turns(dict)); break; @@ -2338,16 +2343,16 @@ function renderSkill(skill, option = {}) break; } case SkillKinds.OrbDropIncrease: { //增加天降 - let attrs = skill.attrs, value = skill.value, flag = skill.flag; - + let {prob, attrs, flag, value} = skill; + prob = prob || v.percent(100); let dict = { - value: value && renderValue(value, {percent: true}) || null, - chance: value && tsp.value.prob({ - value: renderValue(value, {percent: true}) - }) || null, + prob: renderValue(prob, {percent: true}), orbs: renderOrbs(attrs, {className: "drop", affix: true}), flag: flag && tsp.orbs[flag]({icon: createIcon("orb-" + flag)}) || null, }; + if (value?.kind == SkillValueKind.xMaxHP) { + dict.value = tsp.skill.orb_thorn({value: renderValue(value, {percent: true})}) + } frg.ap(flag ? tsp.skill.orb_drop_increase_flag(dict) : tsp.skill.orb_drop_increase(dict)); break; } @@ -2953,7 +2958,7 @@ function renderPowerUp(powerUp) { option.percent = !mul; const frg = document.createDocumentFragment(); const operator = mul ? ' ' : '+'; - let list = [['hp', hp], ['atk', atk], ['rcv', rcv]]; + let list = [['maxhp', hp], ['atk', atk], ['rcv', rcv]]; //去除不改变的值 list = list.filter(([, value]) => value !== (mul ? 1 : 0)); //&&!(name === 'hp' && value === 0)); diff --git a/service-worker.js b/service-worker.js index ba3e19e4..d033e88e 100644 --- a/service-worker.js +++ b/service-worker.js @@ -319,7 +319,7 @@ const cachesMap = new Map([ ], [ "images/cards_ja/CARDS_080.PNG", - "341ea3810e03822e7dd06c09e8605c68" + "6155dd5cd706a3ec8ddb85302a3521f5" ], [ "images/cards_ja/CARDS_081.PNG", @@ -395,7 +395,7 @@ const cachesMap = new Map([ ], [ "images/cards_ja/CARDS_099.PNG", - "505b6e21e6cff1b47b2acfd1fa9a9bb2" + "ba90044c898176d2f70e1d87720932d9" ], [ "sound/voice/ja/padv001.wav", @@ -11531,11 +11531,11 @@ const cachesMap = new Map([ ], [ "script-json_data.js", - "e2829df393d89951e9821cc10ec3ee2b" + "f69d32601aa7d67721914d4a367efa46" ], [ "script-skill-parser.js", - "1852abfeb76450f89260c9da2b81e7b6" + "41c22b8ec8b25f5764e660c10f738b9f" ], [ "script-universal_function.js", @@ -11555,7 +11555,7 @@ const cachesMap = new Map([ ], [ "style.css", - "4ffe954bedfaf3a2a185b98e1ffbb971" + "86847f6c991ec0fa8d0844c9580e8613" ], [ "temp.js", @@ -11607,7 +11607,7 @@ const cachesMap = new Map([ ], [ "languages/zh-TW.js", - "58c72be1357c34c63d44a6aa130efee4" + "444252ef8821272f4f887a36bdc8a5b0" ], [ "languages/zh.css", @@ -11615,7 +11615,7 @@ const cachesMap = new Map([ ], [ "languages/zh.js", - "606eababd8fb71dd480b2fd6939e0b71" + "c548ccae6f46fd3a94ae900f28b92835" ], [ "images/attrs.png", @@ -11747,7 +11747,7 @@ const cachesMap = new Map([ ], [ "images/icon-skills.png", - "a4e80cb11ffc6d23d333967430fe6bea" + "c5c7871863dfb83d93df34fef806a720" ], [ "images/icon-switch-leader.png", @@ -11799,7 +11799,7 @@ const cachesMap = new Map([ ], [ "monsters-info/ckey.json", - "079050b05b81649c3d96f3ca3f95d1cb" + "bfa9d2224a46afe658a1973c576b9e3d" ], [ "monsters-info/mon_en.json", @@ -11807,7 +11807,7 @@ const cachesMap = new Map([ ], [ "monsters-info/mon_ja.json", - "e2e8fdf70f47ac7d0e8400559feb9d79" + "f6d3b9977718743e6e57f48ac4264017" ], [ "monsters-info/mon_ko.json", @@ -11819,7 +11819,7 @@ const cachesMap = new Map([ ], [ "monsters-info/skill_ja.json", - "ba4cdba89abd3434367ff3b589296f09" + "932d64c9df53f8174bdca863cc1a3154" ], [ "monsters-info/skill_ko.json", diff --git a/style.css b/style.css index 39555013..d7085e1c 100644 --- a/style.css +++ b/style.css @@ -1429,7 +1429,6 @@ icon.inflicts::after { display: inline-block; vertical-align: top; - margin: 2px; } .detail-mon{ display: inline-block; @@ -3920,6 +3919,10 @@ body.external-link-support #external-support{ margin: -4px; position: relative; } +.custom-addition .icon-skill{ + transform: scale(0.5); + margin: -10px; +} .skill-datail-parsed a.detail-search { cursor: pointer; @@ -4240,9 +4243,13 @@ body.external-link-support #external-support{ { background-position-y:calc(-36px * 36); } -.icon-skill[data-icon-type="increase-damage-cap"] +.icon-skill[data-icon-type="orb-thorn"] { - background-position-y:calc(-36px * 36); + background-position-y:calc(-36px * 37); +} +.icon-skill[data-icon-type="maxhp-locked"] +{ + background-position-y:calc(-36px * 38); } :where(:lang(en), :lang(ko)) .icon-skill:where(