From 3601594e50f1d72de450bd19cfa47df6824b1ca3 Mon Sep 17 00:00:00 2001 From: viktor Xu Date: Sat, 10 Jun 2023 21:32:17 +0800 Subject: [PATCH] June 10 --- _data/config.yml | 2 +- _docs/character.js | 15 +- _docs/plot.js | 3 +- _docs/whatsnew.md | 9 +- resources/akdata.js | 6 +- resources/attributes.js | 225 +++++++++++++++------- resources/customdata/dps_options.json | 12 +- resources/customdata/dps_specialtags.json | 13 +- resources/customdata/enums.json | 5 + resources/customdata/mastery.json | 12 +- resources/version.json | 4 +- 11 files changed, 207 insertions(+), 99 deletions(-) diff --git a/_data/config.yml b/_data/config.yml index d24a9873..1d90bdb2 100644 --- a/_data/config.yml +++ b/_data/config.yml @@ -36,4 +36,4 @@ css: modules: - /assets/js/common.js - - /resources/akdata.js?ver=230609 + - /resources/akdata.js?ver=230610 diff --git a/_docs/character.js b/_docs/character.js index 75478009..448bd0aa 100644 --- a/_docs/character.js +++ b/_docs/character.js @@ -160,12 +160,12 @@ function show(hash) { '受击回复', '', '', '', '被动', - ][skillData.levels[0].spData.spType]; + ][AKDATA.checkEnum('spType', skillData.levels[0].spData.spType)]; let skillType = [ '', '手动触发', '自动触发', - ][skillData.levels[0].skillType]; + ][AKDATA.checkEnum('skillType', skillData.levels[0].skillType)]; skillHtml += pmBase.component.create({ type: 'list', card: true, @@ -200,16 +200,7 @@ function show(hash) { let spData = levelData.spData; let blackboard = Object.fromEntries(levelData.blackboard.map(x => [x.key.toLowerCase(), x.value])); let desc = AKDATA.formatString(levelData.description, true, blackboard, true); - /* - desc = desc.replace(variableRegex, (match, minus, key, format) => { - key = key.toLowerCase(); - let value = blackboard[key]; - delete blackboard[key]; - if (minus) value = value * -1; - if (format === '0%') value = Math.round(value * 100) + '%'; - else if (format === '0.0%') value = Math.round(value * 1000) / 10 + '%'; - return value; - });*/ + if ( levelData.rangeId && (l == 0 || levelData.rangeId != skillData.levels[l-1].rangeId ) ) desc += '
' + createRangeTable(levelData.rangeId); let bbtext = ``; diff --git a/_docs/plot.js b/_docs/plot.js index 4a7146a5..bde486f2 100644 --- a/_docs/plot.js +++ b/_docs/plot.js @@ -221,6 +221,7 @@ function init() { 'excel/skill_table.json', 'excel/uniequip_table.json', 'excel/battle_equip_table.json', + '../customdata/enums.json', '../version.json', '../customdata/dps_specialtags.json', '../customdata/dps_options.json', @@ -430,7 +431,7 @@ function load() { setSkill: function() { let skills=[], slv = 0; charDB[this.charId].skills.forEach((skill, sid) => { - if (this.details.phase >= skill.unlockCond.phase) { + if (this.details.phase >= AKDATA.checkEnum('phase', skill.unlockCond.phase)) { let name = skillDB[skill.skillId].levels[0].name; skills.push({id: skill.skillId, name: name}); slv = skillDB[skill.skillId].levels.length; diff --git a/_docs/whatsnew.md b/_docs/whatsnew.md index 76e77ce1..413fc0e5 100644 --- a/_docs/whatsnew.md +++ b/_docs/whatsnew.md @@ -6,10 +6,11 @@ category: 帮助与支持 icon: cloud-upload layout: text-page --- -## 23.06.09 -- [update] 圣约送葬人 -- [todo] 其余干员和模组有待更新。同时需要优化Log伤害表显示 -- [note] 补充了部分页面对新数据格式的枚举值的适配。可能还有一些页面的(稀有度和精英化等级)显示问题需要排查 +## 23.06.09-10 +- [update] 圣约送葬人,空构,隐现;怪杰、工匠、瑕光、焰尾模组 +- [dps] 优化了可变伤害类技能的计算过程中,伤害表格的显示 +- [fix] 普攻现在按照普攻前摇数据计算,而非技能。具体对结果的影响还在观察 +- [fix] 补充了部分页面(角色、图表)对新数据格式的枚举值的适配。可能还有一些页面的(稀有度和精英化等级)显示问题需要排查 ## 23.06.05 - [fix] Issue #22 优化了伤害颜色表示。现在可以按照DPS和HPS单独显示不同的伤害类型颜色了 diff --git a/resources/akdata.js b/resources/akdata.js index 5e78d8ae..e07dd880 100644 --- a/resources/akdata.js +++ b/resources/akdata.js @@ -9,12 +9,12 @@ const useCache = true; const cacheBeginTime = new Date(2019, 12, 10).getTime(); window.AKDATA = { - akdata: "230609-v1", // jsdelivr tag version + akdata: "230610", // jsdelivr tag version Data: {}, - new_op: [ "char_1032_excu2" /*, "char_498_inside", "char_4015_spuria"*/], - todo_list: ["char_498_inside", "char_4015_spuria"], + new_op: [ "char_1032_excu2", "char_498_inside", "char_4015_spuria"], + todo_list: [], professionNames: { "PIONEER": "先锋", diff --git a/resources/attributes.js b/resources/attributes.js index 0239fcb0..56c1f45a 100644 --- a/resources/attributes.js +++ b/resources/attributes.js @@ -411,21 +411,31 @@ function calculateDpsSeries(char, enemy, raidBuff, key, series) { magicResistance: 0, count: 1, }; + if (!enemy.def) enemy.def = 0; + if (!enemy.magicResistance) enemy.magicResistance = 0; + if (!enemy.count || enemy.count<1) enemy.count = 1; + enemy.count = Math.round(enemy.count); + raidBuff = raidBuff || { atk: 0, atkpct: 0, ats: 0, cdr: 0, base_atk: 0, damage_scale: 0 }; // 把raidBuff处理成blackboard的格式 let raidBlackboard = { - atk: raidBuff.atkpct / 100, - atk_override: raidBuff.atk, - attack_speed: raidBuff.ats, - sp_recovery_per_sec: raidBuff.cdr / 100, - base_atk: raidBuff.base_atk / 100, - damage_scale: 1 + raidBuff.damage_scale / 100 + atk: raidBuff.atkpct / 100 || 0, + atk_override: raidBuff.atk || 0, + attack_speed: raidBuff.ats || 0, + sp_recovery_per_sec: raidBuff.cdr / 100 || 0, + base_atk: raidBuff.base_atk / 100 || 0, + damage_scale: 1 + raidBuff.damage_scale / 100 || 1 }; - displayNames["raidBuff"] = ""; + displayNames["raidBuff"] = "团辅"; let charId = char.charId; let charData = AKDATA.Data.character_table[charId]; let skillData = AKDATA.Data.skill_table[char.skillId]; + let equipData = {}; + if (char.equipId && char.equipId.length > 0) { + equipData = AKDATA.Data.uniequip_table["equipDict"][char.equipId]; + displayNames[char.equipId] = equipData.uniEquipName; + } if (char.skillLevel == -1) char.skillLevel = skillData.levels.length - 1; let levelData = skillData.levels[char.skillLevel]; @@ -1030,6 +1040,12 @@ function applyBuff(charAttr, buffFrm, tag, blackbd, isSkill, isCrit, log, enemy) break; case "tachr_225_haak_1": blackboard.prob_override = 0.25; + if (blackboard.prob) { + blackboard.prob_override = blackboard.prob + (1-blackboard.prob)/4; + delete blackboard.prob; + } + log.write("说明:暴击率计算值表示[触发暴击或治疗]的概率"); + if (!options.equip) delete blackboard.sp_recovery_per_sec; break; case "tachr_2013_cerber_1": delete blackboard["atk_scale"]; @@ -2315,6 +2331,9 @@ function applyBuff(charAttr, buffFrm, tag, blackbd, isSkill, isCrit, log, enemy) log.write("普攻:计算期望攻击次数(类似慕斯天赋算法)"); // 但是慕斯连击不加技力 } break; + case "skchr_spuria_2": + delete blackboard.prob; + break; } } // --- applyBuff switch ends here --- @@ -2496,6 +2515,7 @@ function applyBuff(charAttr, buffFrm, tag, blackbd, isSkill, isCrit, log, enemy) case "uniequip_002_nearl": case "uniequip_002_sunbr": case "uniequip_002_demkni": + case "uniequip_003_blemsh": if (options.equip || skillId == "skchr_demkni_1") blackboard.heal_scale = blackboard.trait.heal_scale; break; @@ -2514,6 +2534,7 @@ function applyBuff(charAttr, buffFrm, tag, blackbd, isSkill, isCrit, log, enemy) case "uniequip_002_mm": case "uniequip_002_clour": case "uniequip_003_archet": + case "uniequip_002_inside": if (options.equip) blackboard.atk_scale = blackboard.trait.atk_scale; break; @@ -2611,6 +2632,7 @@ function applyBuff(charAttr, buffFrm, tag, blackbd, isSkill, isCrit, log, enemy) case "uniequip_002_blackd": case "uniequip_002_scave": case "uniequip_002_headbr": + case "uniequip_003_flamtl": if (options.equip) blackboard = blackboard.trait; break; @@ -2667,6 +2689,15 @@ function applyBuff(charAttr, buffFrm, tag, blackbd, isSkill, isCrit, log, enemy) if (options.equip && blackboard.talent && blackboard.talent.damage_scale) blackboard.damage_scale = blackboard.talent.damage_scale; break; + case "uniequip_002_spuria": + blackboard = {...blackboard.talent}; + if (!options.equip) delete blackboard.sp_recovery_per_sec; + if (!isCrit) delete blackboard.atk_scale; + break; + case "uniequip_002_ironmn": + if (options.equip) + blackboard.sp_recovery_per_sec = blackboard.talent.sp_recovery_per_sec; + break; } // -- uniequip switch ends here -- @@ -3099,12 +3130,15 @@ function calcDurations(isSkill, attackTime, attackSpeed, levelData, buffList, bu log.writeNote(`计入 ${new_mag - mag} 发额外弹药`); mag = new_mag; } + let extraMagazine = 0; if (charId == "char_1032_excu2") { - let extraMagazine = parseInt(options.extra_magazine) || 0; - if (extraMagazine > 0) { - log.writeNote(`计入 ${extraMagazine} 发额外弹药`); - mag += extraMagazine; - } + extraMagazine = parseInt(options.extra_magazine) || 0; + } else if (buffList["tachr_498_inside_1"]) { + extraMagazine = buffList["tachr_498_inside_1"].self_ammo; + } + if (extraMagazine > 0) { + log.writeNote(`计入 ${extraMagazine} 发额外弹药`); + mag += extraMagazine; } log.write(`弹药类技能: ${displayNames[skillId]}: 攻击 ${mag} 次`); attackCount = mag; @@ -3349,6 +3383,19 @@ function calcDurations(isSkill, attackTime, attackSpeed, levelData, buffList, bu duration += 1; log.writeNote("尾刀动画时间1s"); } + } else if (skillId == "skchr_spuria_2") { + if (attackTime < blackboard.stun_time) { + // attackCount * attackTime * (1-prob) + attackCount * stunTime * prob = duration + attackCount = Math.ceil(duration / (attackTime + blackboard.prob * (blackboard.stun_time - attackTime))); + let stunCount = Math.floor(attackCount * blackboard.prob); + let goodCount = attackCount - stunCount; + let stunTime = stunCount * blackboard.stun_time; + let goodTime = goodCount * attackTime; + log.writeNote(`攻击${attackCount}次,其中晕眩${stunCount}次`); + log.write(`计时 ${goodTime.toFixed(1)} + ${stunTime.toFixed(1)}s`); + } else { + log.writeNote("攻击间隔>晕眩时间,无影响"); + } } // -- calcDurations skill judge ends here @@ -3414,10 +3461,10 @@ function calcDurations(isSkill, attackTime, attackSpeed, levelData, buffList, bu log.write(`[重置普攻] 截断最后一个攻击间隔`); duration = dd; // 抬手时间 - var frameBegin = calcAttackBegin(skillId, attackSpeed, options, log); + var frameBegin = calcAttackBegin(charId, attackSpeed, options, log); var t = frameBegin / 30; attackCount = Math.ceil((duration - t) / attackTime); - log.write(`技能前摇: ${t.toFixed(3)}s, ${frameBegin} 帧`); + log.write(`普攻前摇: ${t.toFixed(3)}s, ${frameBegin} 帧`); } // June 20: 额外sp计算mixin @@ -3712,6 +3759,8 @@ function calcDurations(isSkill, attackTime, attackSpeed, levelData, buffList, bu function calcAttackBegin(tag, attackSpeed, options, log) { let attackBegin = checkSpecs(tag, "attack_begin"); + if (attackBegin == "0") attackBegin = 0; + if (options.token) { attackBegin = checkSpecs(tag, "token_attack_begin"); if (tag == "skchr_ling_3" && options.ling_fusion) { @@ -3723,7 +3772,7 @@ function calcAttackBegin(tag, attackSpeed, options, log) { log.writeNote("原本范围外前摇延长"); } - if (!attackBegin) { + if (isNaN(attackBegin)) { log.writeNote("暂无抬手数据,以12帧计算"); attackBegin = 12; } @@ -3996,6 +4045,9 @@ function calculateAttack(charAttr, enemy, raidBlackboard, isSkill, charData, lev } else if (blackboard.id == "skchr_aurora_2" && isSkill) { dur.critCount = (options.freeze ? 9 : 3); log.writeNote(`按 ${dur.critCount} 次暴击计算`); + } else if (charId == "char_4015_spuria") { + // 只把晕眩的计入暴击次数,其他(二连击,无视防御)记为额外伤害 + dur.critCount = Math.ceil(dur.attackCount * critBuffFrame.prob / 3); } else dur.critCount = dur.attackCount * critBuffFrame.prob; @@ -4011,6 +4063,12 @@ function calculateAttack(charAttr, enemy, raidBlackboard, isSkill, charData, lev if (charId == "char_1021_kroos2") { dur.critHitCount = Math.floor(dur.hitCount * critBuffFrame.prob); dur.hitCount -= dur.critHitCount; + } else if (charId == "char_4015_spuria") { + dur.hitCount = dur.attackCount - Math.floor(dur.attackCount * critBuffFrame.prob); + if ((dur.attackCount - dur.hitCount - dur.critCount) % 2 == 1) { + --dur.critCount; // 剩余攻击次数调整为偶数,方便计算额外伤害 + } + dur.critHitCount = dur.critCount; } else { dur.hitCount = (dur.attackCount - dur.critCount) * dur.times * ecount; } @@ -4628,7 +4686,7 @@ function calculateAttack(charAttr, enemy, raidBlackboard, isSkill, charData, lev damagePool[2] = 0; log.write("[特殊] 直接治疗为0"); break; case "skchr_blemsh_1": - heal = finalFrame.atk * bb.heal_scale / buffFrame.atk_scale; + heal = finalFrame.atk * bb.heal_scale * buffFrame.heal_scale / buffFrame.atk_scale; pool[2] += heal; break; case "skchr_blemsh_2": @@ -4640,7 +4698,7 @@ function calculateAttack(charAttr, enemy, raidBlackboard, isSkill, charData, lev case "skchr_blemsh_3": damage = finalFrame.atk * bb["attack@blemsh_s_3_extra_dmg[magic].atk_scale"]; damage = Math.max(damage * (1-emrpct), damage * 0.05) * buffFrame.damage_scale; - heal = finalFrame.atk / buffFrame.atk_scale * bb.heal_scale; + heal = finalFrame.atk / buffFrame.atk_scale * bb.heal_scale * buffFrame.heal_scale; log.write(`每次攻击额外法伤:${damage.toFixed(1)} (计算天赋加成),额外治疗: ${heal.toFixed(1)}`); pool[1] += damage * dur.attackCount; pool[2] += heal * dur.attackCount; @@ -5296,6 +5354,23 @@ function calculateAttack(charAttr, enemy, raidBlackboard, isSkill, charData, lev pool[0] += damage * ecount; log.writeNote(`尾刀伤害 ${damage.toFixed(1)}`); break; + case "tachr_4015_spuria_1": + let spur_count = (dur.attackCount - dur.hitCount - dur.critCount) / 2; + let spur_edef = edef * (1-bb.def_penetrate); + let spur_scale = 1; + if (buffList["uniequip_002_spuria"]) { + let theBuff = buffList["uniequip_002_spuria"].talent; + if (theBuff && theBuff.atk_scale) + spur_scale = theBuff.atk_scale; + } + let spur_atk = finalFrame.atk * spur_scale; + damage = Math.max(spur_atk - edef, spur_atk * 0.05) * buffFrame.damage_scale; + damage_defp = Math.max(spur_atk - spur_edef, spur_atk * 0.05) * buffFrame.damage_scale; + pool[0] += damage * 2 * spur_count + damage_defp * spur_count; + log.write("(此处暴击伤害对应仅晕眩的伤害)"); + log.write(`二连击伤害 ${damage.toFixed(1)}, 命中 ${spur_count*2}`); + log.write(`穿防伤害 ${damage_defp.toFixed(1)}, 命中 ${spur_count}`); + break; }; // extraDamage switch ends here // 百分比/固定回血 @@ -5364,6 +5439,7 @@ function calculateAttack(charAttr, enemy, raidBlackboard, isSkill, charData, lev case "skchr_bldsk_2": pool[2] -= bb.hp_ratio * finalFrame.maxHp * bb.duration * 2; break; case "tachr_225_haak_trait": // 阿-特性 + case "tachr_4015_spuria_trait": pool[2] -= bb.hp_ratio * finalFrame.maxHp * dur.duration; break; case "tachr_225_haak_1": if (options.crit) { @@ -5635,18 +5711,17 @@ function calculateGradDamage(_) { // _ -> args let excu2_expect = seq.map( x => excu2_dmg[x] + excu2_prob[x] * excu2_dmg[x+1] ); - ret = excu2_expect.reduce((x, y) => x + y); - - + ret = excu2_expect.reduce((x, y) => x + y); // explain with markdown - let lines = [ - ["攻击次数", ...(seq.map(x=>x+1))], - [":--:", ...(seq.map(x => ":--:"))], - ["攻击力", ...(excu2_atk.map(x=>Math.round(x)))], - ["连击期望", ...(excu2_prob.map(x=>`${Math.round(x*100)}%`))], - ["伤害期望", ...(excu2_expect.map(x=>Math.round(x)))] - ]; - let mdText = lines.map(x => `| ${x.join(" | ")} |`).join('\n'); + let mdText = makeMarkdownTable( + [ "攻击次数", "攻击力", { text: "连击期望" }, "伤害期望" ], + [ + seq.map(x=>x+1), + excu2_atk, + excu2_prob.map(x => `${Math.round(x*100)}%`), + excu2_expect + ] + ); _.log.write(mdText); _.log.write(""); @@ -5691,47 +5766,63 @@ function calculateGradDamage(_) { // _ -> args return ret; } -function explainGradAttackTiming(_, n=7) { - var lines = [], i=0; - var row_time = [...Array(_.duration).keys()]; - var l1 = row_time.map(x => ":--:"); - var row_atk = [..._.atk_by_sec.map(x => Math.round(x))]; - var row_timing = [..._.atk_timing.map(x => x.toFixed(2))]; - var row_scale = []; - var l2 = row_timing.map(x => ":--:"); - var row_dmg = [..._.dmg_table.map(x => Math.round(x))]; - if (_.scale_table) - row_scale = [..._.scale_table.map(x => x.toFixed(2))]; - - while (i +blablabla 1.00 2.00 3.00 4.00 5.00 +*/ +function makeMarkdownTable(headers, cols, maxCol=10) { + let i=0, ret = []; + let divLine = [...Array(cols[0].length).keys()].map(x => ":--:"); + // console.log(headers, cols); + // shortcut for string + let h = headers.map(x => (typeof x === 'string' ? { text: x, precision: 0 } : x)); + while (i < cols[0].length) { + let subTable = [...Array(h.length).keys()].map( + col => [h[col].text, ...cols[col].slice(i, i+maxCol).map( + x => isNaN(h[col].precision) ? x : x.toFixed(h[col].precision) + )] + ); + subTable.splice(1, 0, [":--:", ...divLine.slice(i, i+maxCol)]); + + let subTableLines = subTable.map(x => `| ${x.join(" | ")} |`); + ret.push(...subTableLines); + ret.push("\n"); + i+=maxCol; } - i=0; - while (it) +--- +攻击力 atk_by_sec Math.round + +攻击时点 atk_timing toFixed(2) +--- +倍率 scale_table toFixed(2) +*/ +function explainGradAttackTiming(_, n=7) { + let atkByTimeTable = makeMarkdownTable( + [ "时间", "攻击力" ], + [ [...Array(_.duration).keys()], _.atk_by_sec ], + n + ); + let dmgByTimeHeaders = [ + { text: "攻击时点", precision: 2 }, + "伤害" + ]; + let dmgByTimeCols = [ + _.atk_timing, + _.dmg_table + ]; + if (_.scale_table) { + dmgByTimeHeaders.splice(1, 0, { text: "倍率", precision: 2 }); + dmgByTimeCols.splice(1, 0, _.scale_table); } -// console.log(lines); - return lines.join("\n"); + let dmgByTimeTable = makeMarkdownTable(dmgByTimeHeaders, dmgByTimeCols, n); + return [atkByTimeTable, dmgByTimeTable].join("\n"); } let AttributeKeys = [ diff --git a/resources/customdata/dps_options.json b/resources/customdata/dps_options.json index 82b8eb10..8d9bf569 100644 --- a/resources/customdata/dps_options.json +++ b/resources/customdata/dps_options.json @@ -175,7 +175,7 @@ "char_367_swllow" : [ "crit", "equip", "archet", "chen" ], "char_137_brownb" : [ "stack" ], "char_131_flameb" : [ "stack", "equip", "short_mode" ], - "char_225_haak" : [ "crit" ], + "char_225_haak" : [ "crit", "equip" ], "char_226_hmau" : [ "cond" ], "char_2013_cerber" : [ "cond" ], "char_306_leizi" : [ "cond" ], @@ -209,7 +209,7 @@ "char_511_asnipe": [ "crit" ], "char_271_spikes": [ "cond", "ranged_penalty"], "char_346_aosta": [ "cond" ], - "char_423_blemsh": [ "cond" ], + "char_423_blemsh": [ "cond", "equip" ], "char_347_jaksel": [ "cond" ], "char_436_whispr": [ "ranged_penalty", "cond", "short_mode" ], "char_1001_amiya2": [ "stack" ], @@ -248,7 +248,7 @@ "char_430_fartth": [ "cond", "equip", "far" ], "char_431_ashlok": [ "cond" ], "char_1014_nearl2": [ "cond", "block", "short_mode" ], - "char_420_flamtl": [ "crit" ], + "char_420_flamtl": [ "crit", "equip" ], "char_144_red": [ "equip" ], "char_214_kafka": [ "cond", "equip" ], "char_206_gnosis": [ "freeze", "charge" ], @@ -314,7 +314,7 @@ "char_4065_judge": [ "charge" ], "char_1028_texas2": [ "cond", "equip" ], "char_427_vigil": [ "token", "cond", "stack" ], - "char_4072_ironmn": [ "token" ], + "char_4072_ironmn": [ "token", "equip" ], "char_112_siege": [ "equip" ], "char_1020_reed2": [ "rosmon_double", "reed2_fast" ], "char_297_hamoni": [ "cond" ], @@ -336,6 +336,8 @@ "char_1031_slent2": [ "cond", "musha_hp" ], "char_4027_heyak": [ "cond", "range4" ], "char_249_mlyss": [ "token", "cond", "mlyss_count" ], - "char_1032_excu2": [ "extra_magazine" ] + "char_1032_excu2": [ "extra_magazine" ], + "char_4015_spuria": [ "crit", "equip" ], + "char_498_inside": [ "equip" ] } } diff --git a/resources/customdata/dps_specialtags.json b/resources/customdata/dps_specialtags.json index 28ca466f..eee3fc8a 100644 --- a/resources/customdata/dps_specialtags.json +++ b/resources/customdata/dps_specialtags.json @@ -70,6 +70,7 @@ "char_459_tachak": { "times": 2 }, "char_476_blkngt": { "token": "token_10021_blkngt_hypnos", "use_token_for_mastery": true }, "char_485_pallas": { "note": "只计算单体治疗量(双目标x2)" }, + "char_498_inside": { "attack_begin": "0" }, "char_4013_kjera": { "grad": true, "frame_corr": 1 }, "char_512_aprot": { "note": "肉鸽临时招募/天赋必定触发" }, "char_4016_kazema": { "token": "token_10022_kazema_shadow" }, @@ -238,6 +239,8 @@ "skchr_ines_1": { "note": "DoT以3秒计" }, "skchr_ines_2": { "attack_begin": 14, "reset_attack": true }, "skchr_ines_3": { "attack_begin": 14 }, + "skchr_inside_1": { "magazine": 4, "attack_begin": 11 }, + "skchr_inside_2": { "magazine": 14, "attack_begin": 11 }, "skchr_irene_1": { "times": 2 }, "skchr_irene_2": { "reset_attack": "ogcd", "cast_time": 30, "attack_begin": 8 }, "skchr_irene_3": { "cast_time": 123, "reset_attack": "ogcd", "attack_begin": 4 }, @@ -375,6 +378,7 @@ "skchr_slent2_1": { "damage_type": 2, "reset_attack": true, "attack_begin": 19 }, "skchr_slent2_2": { "damage_type": 2, "reset_attack": true, "attack_begin": 19 }, "skchr_slent2_3": { "damage_type": 2, "reset_attack": true, "attack_begin": 19 }, + "skchr_spuria_2": { "reset_attack": true, "attack_begin": 1 }, "skchr_snsant_1": { "cast_time": 50 }, "skchr_snsant_2": { "cast_time": 75 }, "skchr_strong_2": { "damage_type": "0" }, @@ -572,6 +576,7 @@ "tachr_4082_qiubai_trait": { "ranged_penalty": true }, "tachr_4083_chimes_1": { "cond": true }, "tachr_4027_heyak_1": { "cond": true }, + "tachr_4015_spuria_1": { "crit": true }, "uniequip_002_kafka": { "override_talent": 1 }, "uniequip_002_red": { "override_talent": 1 }, "uniequip_002_pallas": { "override_trait": true, "override_talent": 1 }, @@ -708,5 +713,11 @@ "uniequip_002_greyy2": { "override_trait": true }, "uniequip_002_gnosis": { "override_talent": 1 }, "uniequip_002_melnte": { "override_talent": 1 }, - "uniequip_002_heyak": { "override_talent": 1 } + "uniequip_002_heyak": { "override_talent": 1 }, + "uniequip_002_inside": { "override_talent": 1 }, + "uniequip_002_haak": { "override_talent": 1 }, + "uniequip_002_windft": { "override_talent": 1 }, + "uniequip_002_robrta": { "override_talent": 1 }, + "uniequip_003_blemsh": { "override_talent": 2 }, + "uniequip_003_flamtl": { "override_talent": 2 } } diff --git a/resources/customdata/enums.json b/resources/customdata/enums.json index dbf26974..9c59d5f0 100644 --- a/resources/customdata/enums.json +++ b/resources/customdata/enums.json @@ -27,6 +27,11 @@ "INSTANT": 1, "LIMITED": 2 }, + "skillType": { + "PASSIVE": 0, + "MANUAL": 1, + "AUTO": 2 + }, "spType": { "INCREASE_WITH_TIME": 1, "INCREASE_WHEN_ATTACK": 2, diff --git a/resources/customdata/mastery.json b/resources/customdata/mastery.json index c93a8fef..675b7ec1 100644 --- a/resources/customdata/mastery.json +++ b/resources/customdata/mastery.json @@ -76,7 +76,7 @@ "char_196_sunbr": { "mod_update_time": "2022/6/18" }, "char_226_hmau": { "mod_update_time": "2022/6/18" }, "char_148_nearl": { "mod_update_time": "2022/6/18" }, - "char_423_blemsh": { "mod_update_time": "2022/6/18" }, + "char_423_blemsh": { "mod_update_time": "2023/6/10" }, "char_135_halo": { "mod_update_time": "2022/7/5" }, "char_456_ash": { "mod_update_time": "2022/7/5" }, "char_332_archet": { "mod_update_time": "2022/12/18" }, @@ -121,7 +121,7 @@ "char_4014_lunacu": { "mod_update_time": "2022/11/8" }, "char_1028_texas2": { "mod_update_time": "2022/11/8" }, "char_362_saga": { "mod_update_time": "2022/11/9" }, - "char_420_flamtl": { "mod_update_time": "2022/11/9" }, + "char_420_flamtl": { "mod_update_time": "2023/6/10" }, "char_102_texas": { "mod_update_time": "2022/11/9" }, "char_349_chiave": { "mod_update_time": "2022/11/9" }, "char_115_headbr": { "mod_update_time": "2022/11/9" }, @@ -172,5 +172,11 @@ "char_254_vodfox": { "mod_update_time": "2023/5/2" }, "char_4027_heyak": { "mod_update_time": "2023/5/4", "options": { "range4": 4 }, "emr": 10 }, "char_4006_melnte": { "mod_update_time": "2023/5/4", "options": { "range4": 0 } }, - "char_1031_slent2": { "options": { "musha_hp": 20 } } + "char_1031_slent2": { "options": { "musha_hp": 20 } }, + "char_498_inside": { "mod_update_time": "2023/6/10" }, + "char_225_haak": { "mod_update_time": "2023/6/10" }, + "char_4015_spuria": { "mod_update_time": "2023/6/10" }, + "char_4072_ironmn": { "mod_update_time": "2023/6/10" }, + "char_433_windft": { "mod_update_time": "2023/6/10" }, + "char_484_robrta": { "mod_update_time": "2023/6/10" } } diff --git a/resources/version.json b/resources/version.json index 702a4e73..0879d2fa 100644 --- a/resources/version.json +++ b/resources/version.json @@ -1,6 +1,6 @@ { - "akdata": "230609-v1", + "akdata": "230610", "gamedata": "23-06-02-08-53-11-4a65e4", - "customdata": "230609-v1", + "customdata": "230610", "whatsnew": "圣约送葬人" }