From 232fa91aa20c26d690c216d444cc468855c84019 Mon Sep 17 00:00:00 2001 From: waynebian01 Date: Sun, 30 Aug 2026 10:22:51 +0800 Subject: [PATCH] Add SpellFieldKey class for managing spell and aura keys - Introduced a new class `SpellFieldKey` to encapsulate constants and methods related to spell and aura identifiers. - Added methods for generating keys for spells and auras, including parsing functionality for spell and aura strings. - Implemented utility methods for stripping prefixes and canonicalizing aura IDs. --- App/Program.cs | 13 + Fuyutsui/Fuyutsui.toc | 2 +- Fuyutsui/core/events.lua | 1 + Fuyutsui/core/stateblocks.lua | 1 + Fuyutsui/unit/player.lua | 6 + Infrastructure/ClassStateCatalog.cs | 2 +- Infrastructure/ConfigService.cs | 16 +- Infrastructure/FuyutsuiConfigConverter.cs | 196 ++- Infrastructure/JsonHelpers.cs | 29 + Infrastructure/ModuleDependencyService.cs | 455 ++++--- Input/KeymapCatalog.cs | 24 +- Input/KeymapService.cs | 20 +- Modules/ConditionFieldCatalog.cs | 93 +- Modules/IKeymapResolver.cs | 8 +- Modules/ModuleSpecialActions.cs | 14 +- Modules/ModuleStore.cs | 80 +- Modules/ModuleUnit.cs | 8 +- Modules/SpellFieldKey.cs | 102 ++ Modules/UnitSelector.cs | 108 +- README.md | 23 +- Runtime/StateBuilder.cs | 38 +- Shigure.csproj | 6 +- UI/ConditionEditorForm.cs | 31 +- UI/MainForm.cs | 1 - UI/ModuleEditorControl.cs | 496 ++++++- UI/StatusForm.cs | 31 +- UI/UiDropDown.cs | 42 +- UI/UnitEditorForm.cs | 154 ++- UI/UnitSummary.cs | 27 +- config/DeathKnight.json | 972 +++++++++----- config/DemonHunter.json | 827 ++++++++---- config/Druid.json | 562 +++++--- config/Evoker.json | 1069 ++++++++++----- config/Hunter.json | 564 +++++--- config/Mage.json | 310 +++-- config/Monk.json | 1035 +++++++++++---- config/Paladin.json | 954 ++++++++++---- config/Priest.json | 1332 +++++++++++++------ config/Rogue.json | 750 +++++++---- config/Shaman.json | 1198 ++++++++++++----- config/Warlock.json | 544 +++++--- config/Warrior.json | 1457 ++++++++++++++------- 42 files changed, 9620 insertions(+), 3981 deletions(-) create mode 100644 Modules/SpellFieldKey.cs diff --git a/App/Program.cs b/App/Program.cs index 2e68a04f..99a56ea1 100644 --- a/App/Program.cs +++ b/App/Program.cs @@ -7,6 +7,19 @@ internal static class Program [STAThread] private static void Main(string[] args) { + if (args.Contains("--update-config", StringComparer.OrdinalIgnoreCase)) + { + var baseDirectory = Directory.GetCurrentDirectory(); + if (!Directory.Exists(Path.Combine(baseDirectory, "Fuyutsui", "class"))) + { + baseDirectory = AppPaths.BaseDirectory; + } + FuyutsuiConfigConverter.UpdateFromClassDirectory( + Path.Combine(baseDirectory, "Fuyutsui", "class"), + Path.Combine(baseDirectory, ConfigService.ConfigDirectoryName)); + return; + } + if (!OperatingSystem.IsWindows()) { MessageBox.Show( diff --git a/Fuyutsui/Fuyutsui.toc b/Fuyutsui/Fuyutsui.toc index c656c498..2ca5d92f 100644 --- a/Fuyutsui/Fuyutsui.toc +++ b/Fuyutsui/Fuyutsui.toc @@ -1,7 +1,7 @@ ## Interface: 120100 ## Title: Fuyutsui -## Version: 1.2.1.15 +## Version: 1.2.1.17 ## Author: Wayne ## IconTexture: Interface\AddOns\Fuyutsui\core\Spell_Misc_EmotionHappy.blp ## OptionalDeps: LibRangeCheck-3.0 diff --git a/Fuyutsui/core/events.lua b/Fuyutsui/core/events.lua index c90de801..849a8b17 100644 --- a/Fuyutsui/core/events.lua +++ b/Fuyutsui/core/events.lua @@ -190,6 +190,7 @@ function Fuyutsui:UNIT_SPELLCAST_SUCCEEDED(_, unitTarget, castGUID, spellID, cas if unitTarget ~= "player" or isSec(spellID) then return end self:RefreshDrinkStatus(spellID) self:UpdateInsertSpellBySuccess(spellID) + self:PreviousSkill(spellID) if spellID == 384255 then self:ClearAllFuyutsuiBars() print("切换天赋") diff --git a/Fuyutsui/core/stateblocks.lua b/Fuyutsui/core/stateblocks.lua index 4c3e8919..928d4ebd 100644 --- a/Fuyutsui/core/stateblocks.lua +++ b/Fuyutsui/core/stateblocks.lua @@ -140,6 +140,7 @@ local stateBlockGetters = { ["姿态"] = function() return state.shapeshiftFormID or 0 end, ["天启骑士数量"] = function() return state.knightCount or 0 end, ["自律"] = function() return state.forbearance or 0 end, + ["上个技能"] = function() return state.PreviousSkill or 0 end, ["爆发开关"] = function(self) return GetConfigPixel(self, "cooldowns") end, ["AOE开关"] = function(self) return GetConfigPixel(self, "aoeMode") end, diff --git a/Fuyutsui/unit/player.lua b/Fuyutsui/unit/player.lua index c6fbd125..67b89d99 100644 --- a/Fuyutsui/unit/player.lua +++ b/Fuyutsui/unit/player.lua @@ -519,3 +519,9 @@ function Fuyutsui:UpdatePlayerForbearance() -- 25771 自律 end end, 30) end + +function Fuyutsui:PreviousSkill(spellId) + local spellIndex = spellsList[spellId] and spellsList[spellId].index or 0 + state.PreviousSkill = spellIndex / 255 or 0 + self:UpdateStateBlock("状态", "上个技能") +end diff --git a/Infrastructure/ClassStateCatalog.cs b/Infrastructure/ClassStateCatalog.cs index e214f318..76860886 100644 --- a/Infrastructure/ClassStateCatalog.cs +++ b/Infrastructure/ClassStateCatalog.cs @@ -47,7 +47,7 @@ internal static class ClassStateCatalog "首领战", "难度", "英雄天赋", "施法目标", "施法技能", "敌人数量", "敌人数-无仇恨", "敌人数-有仇恨", "施法(正计时)", "施法(倒计时)", "引导", "蓄力", "蓄力层数", - "酒池", "符文", "姿态", "神圣军备", "自律", "英勇打击", "吸血鬼打击", "收割者战刃", + "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "英勇打击", "吸血鬼打击", "收割者战刃", ]), (CategoryConfig, [ diff --git a/Infrastructure/ConfigService.cs b/Infrastructure/ConfigService.cs index 9ac20f02..d02dab38 100644 --- a/Infrastructure/ConfigService.cs +++ b/Infrastructure/ConfigService.cs @@ -156,28 +156,28 @@ public sealed class ConfigService return string.IsNullOrWhiteSpace(value) ? "keymap.json" : value; } - public IReadOnlyDictionary GetFailedSpells(int? classId) + public IReadOnlyDictionary GetFailedSpells(int? classId) => GetClassSpellMap(classId, ModuleSpecialActions.OneKeySpell); - public IReadOnlyDictionary GetOneKeySpells(int? classId) + public IReadOnlyDictionary GetOneKeySpells(int? classId) => GetClassSpellMap(classId, ModuleSpecialActions.OneKeySpell); - private IReadOnlyDictionary GetClassSpellMap(int? classId, string configKey) + private IReadOnlyDictionary GetClassSpellMap(int? classId, string configKey) { if (classId is null || GetObject(classId.Value.ToString()) is not { } classObj || JsonHelpers.Get(classObj, configKey) is not JsonObject spellMap) { - return new Dictionary(); + return new Dictionary(); } - var result = new Dictionary(); + var result = new Dictionary(); foreach (var (idText, node) in spellMap) { - var spell = JsonHelpers.GetString(node); - if (int.TryParse(idText, out var id) && !string.IsNullOrWhiteSpace(spell)) + var spellId = JsonHelpers.GetLong(node); + if (int.TryParse(idText, out var id) && spellId is > 0) { - result[id] = spell.Trim(); + result[id] = spellId.Value; } } diff --git a/Infrastructure/FuyutsuiConfigConverter.cs b/Infrastructure/FuyutsuiConfigConverter.cs index dc0a489e..d9d9e52b 100644 --- a/Infrastructure/FuyutsuiConfigConverter.cs +++ b/Infrastructure/FuyutsuiConfigConverter.cs @@ -166,9 +166,9 @@ internal static class FuyutsuiConfigConverter List warnings, string label) { - var oneKeySpells = new SortedDictionary(); + var oneKeySpells = new SortedDictionary(); - foreach (var (_, value) in spellsList.Entries) + foreach (var (key, value) in spellsList.Entries) { if (value is not TableValue spell) { @@ -176,51 +176,60 @@ internal static class FuyutsuiConfigConverter } var indexValue = spell.GetNumber("index"); - var name = spell.GetString("name")?.Trim(); + var spellIdValue = key switch + { + long number => (double)number, + int number => number, + double number => number, + NumberValue number => (double)number.AsInt(), + _ => spell.GetNumber("spellId") + }; if (indexValue is null || indexValue.Value <= 0 || indexValue.Value > int.MaxValue || indexValue.Value != Math.Truncate(indexValue.Value) - || string.IsNullOrWhiteSpace(name)) + || spellIdValue is null + || spellIdValue.Value <= 0 + || spellIdValue.Value != Math.Truncate(spellIdValue.Value)) { - warnings.Add($"{label}: spellsList 条目缺少有效 index/name,已跳过"); + warnings.Add($"{label}: spellsList 条目缺少有效 index/spellId,已跳过"); continue; } var index = (int)indexValue.Value; - AddSpellMapEntry(oneKeySpells, index, name, "一键法术", warnings, label); + AddSpellMapEntry(oneKeySpells, index, (long)spellIdValue.Value, "一键法术", warnings, label); } target[ModuleSpecialActions.OneKeySpell] = ToSpellMap(oneKeySpells); } private static void AddSpellMapEntry( - IDictionary target, + IDictionary target, int index, - string name, + long spellId, string mapName, List warnings, string label) { if (!target.TryGetValue(index, out var existingName)) { - target[index] = name; + target[index] = spellId; return; } - if (!string.Equals(existingName, name, StringComparison.Ordinal)) + if (existingName != spellId) { warnings.Add( - $"{label}: {mapName} index {index} 同时对应“{existingName}”和“{name}”,已保留前者"); + $"{label}: {mapName} index {index} 同时对应 spellId {existingName} 和 {spellId},已保留前者"); } } - private static JsonObject ToSpellMap(IEnumerable> spells) + private static JsonObject ToSpellMap(IEnumerable> spells) { var result = new JsonObject(); - foreach (var (index, name) in spells) + foreach (var (index, spellId) in spells) { - result[index.ToString()] = name; + result[index.ToString()] = spellId; } return result; @@ -342,33 +351,48 @@ internal static class FuyutsuiConfigConverter // 主色块顺序与 LoadPlayerBlocks 一致: // 所有法术先占一个冷却格;充能法术再紧接着占一个充能冷却格。 - spellsObject[name] = Field(index, "int"); + var id = (long)spellId.Value; + spellsObject[$"{id}.{SpellFieldKey.SpellCooldown}"] = SpellField( + index, + name, + id, + SpellFieldKey.SpellCooldown); index++; var charge = spell.GetBool("charge") == true; if (charge) { - spellsObject[EnsureSuffix(name, "充能")] = Field(index, "int"); + spellsObject[$"{id}.{SpellFieldKey.SpellChargeCooldown}"] = SpellField( + index, + EnsureSuffix(name, "充能"), + id, + SpellFieldKey.SpellChargeCooldown); index++; } var maxCharge = spell.GetNumber("maxCharge"); if (charge && maxCharge is not null) { - var id = (long)spellId.Value; if (barSpellIds.Add(id)) { - spellsObject[EnsureSuffix(name, "层数")] = BarField(barIndex++); + spellsObject[$"{id}.{SpellFieldKey.SpellCount}"] = SpellBarField( + barIndex++, + EnsureSuffix(name, "层数"), + id, + SpellFieldKey.SpellCount); } } var castCount = spell.GetNumber("castCount"); if (castCount is not null && castCount.Value > 0) { - var id = (long)spellId.Value; if (barSpellIds.Add(id)) { - spellsObject[EnsureSuffix(name, "层数")] = BarField(barIndex++); + spellsObject[$"{id}.{SpellFieldKey.SpellCount}"] = SpellBarField( + barIndex++, + EnsureSuffix(name, "层数"), + id, + SpellFieldKey.SpellCount); } } } @@ -376,7 +400,11 @@ internal static class FuyutsuiConfigConverter foreach (var barName in playerAuraBarNames) { - aurasObject[barName] = BarField(barIndex++); + if (aurasObject[barName] is JsonObject metadata) + { + metadata["step"] = "bar"; + metadata["bar"] = barIndex++; + } } if (aurasObject.Count > 0) @@ -425,7 +453,23 @@ internal static class FuyutsuiConfigConverter auraName = $"光环{offset}"; } - groupJson[auraName] = Field((int)offset.Value, "int"); + var ids = ReadAuraIds(auraInfo); + var canonicalId = SpellFieldKey.CanonicalAuraId( + auraInfo.GetNumber("spellId") is { } primary ? (long)primary : null, + ids); + if (canonicalId is null) + { + warnings.Add($"{label}: group aura“{auraName}”缺少有效 spellId,已跳过"); + continue; + } + + groupJson[$"auras.{canonicalId}.{SpellFieldKey.AuraValue}"] = AuraField( + (int)offset.Value, + auraName, + canonicalId.Value, + "group", + SpellFieldKey.AuraValue, + ids); } } @@ -470,23 +514,78 @@ internal static class FuyutsuiConfigConverter name = "未命名光环"; } - var fieldName = unit switch + var ids = ReadAuraIds(aura); + var canonicalId = SpellFieldKey.CanonicalAuraId( + aura.GetNumber("spellId") is { } primary ? (long)primary : null, + ids); + if (canonicalId is null) { - "target" => "目标" + name, - "focus" => "焦点" + name, - _ => name - }; + warnings.Add($"{label}: aura“{name}”缺少有效 spellId,已跳过"); + continue; + } - aurasObject[fieldName] = Field(index, "int", classification); + var scope = classification switch + { + "目标减益" => "target.harmful", + "目标增益" => "target.helpful", + "焦点减益" => "focus.harmful", + "焦点增益" => "focus.helpful", + _ => "player" + }; + var valueKey = $"{scope}.{canonicalId}.{SpellFieldKey.AuraValue}"; + aurasObject[valueKey] = AuraField( + index, + name, + canonicalId.Value, + scope, + SpellFieldKey.AuraValue, + ids, + classification); index++; if (aura.GetNumber("maxApps") is not null && includeApplicationBars) { - playerAuraBarNames.Add(EnsureSuffix(fieldName, "层数")); + var appsKey = $"{scope}.{canonicalId}.{SpellFieldKey.AuraApplications}"; + aurasObject[appsKey] = AuraField( + 0, + EnsureSuffix(name, "层数"), + canonicalId.Value, + scope, + SpellFieldKey.AuraApplications, + ids, + classification); + playerAuraBarNames.Add(appsKey); } } } + private static List ReadAuraIds(TableValue aura) + { + var result = new List(); + if (aura.GetNumber("spellId") is { } spellId && spellId > 0) + { + result.Add((long)spellId); + } + + if (aura.GetTable("spellIds") is { } spellIds) + { + foreach (var item in spellIds.IPairs()) + { + var id = item switch + { + NumberValue number => number.AsInt(), + _ => (long?)null + }; + if (id is > 0 && !result.Contains(id.Value)) + { + result.Add(id.Value); + } + } + } + + return result; + } + private static void AddStateField( JsonObject result, string name, @@ -534,6 +633,45 @@ internal static class FuyutsuiConfigConverter ["type"] = "int" }; + private static JsonObject SpellField(int step, string displayName, long spellId, string metric) + { + var field = Field(step, "int"); + AddSpellMetadata(field, displayName, spellId, metric); + return field; + } + + private static JsonObject SpellBarField(int bar, string displayName, long spellId, string metric) + { + var field = BarField(bar); + AddSpellMetadata(field, displayName, spellId, metric); + return field; + } + + private static void AddSpellMetadata(JsonObject field, string displayName, long spellId, string metric) + { + field["displayName"] = displayName; + field["spellId"] = spellId; + field["metric"] = metric; + } + + private static JsonObject AuraField( + int step, + string displayName, + long spellId, + string scope, + string metric, + IEnumerable aliases, + string? classification = null) + { + var field = Field(step, "int", classification); + field["displayName"] = displayName; + field["spellId"] = spellId; + field["scope"] = scope; + field["metric"] = metric; + field["spellIds"] = new JsonArray(aliases.Where(id => id > 0).Distinct().Select(id => JsonValue.Create(id)).ToArray()); + return field; + } + private static string EnsureSuffix(string name, string suffix) => name.EndsWith(suffix, StringComparison.Ordinal) ? name : name + suffix; diff --git a/Infrastructure/JsonHelpers.cs b/Infrastructure/JsonHelpers.cs index 8a1df2c8..061d965d 100644 --- a/Infrastructure/JsonHelpers.cs +++ b/Infrastructure/JsonHelpers.cs @@ -39,6 +39,35 @@ public static class JsonHelpers return null; } + public static long? GetLong(JsonNode? node) + { + if (node is not JsonValue valueNode) + { + return null; + } + + try + { + if (valueNode.TryGetValue(out var longValue)) + { + return longValue; + } + + if (valueNode.TryGetValue(out var intValue)) + { + return intValue; + } + + return valueNode.TryGetValue(out var text) && long.TryParse(text, out var parsed) + ? parsed + : null; + } + catch + { + return null; + } + } + public static string? GetString(JsonNode? node) { if (node is null) diff --git a/Infrastructure/ModuleDependencyService.cs b/Infrastructure/ModuleDependencyService.cs index d928a836..0eae1e4f 100644 --- a/Infrastructure/ModuleDependencyService.cs +++ b/Infrastructure/ModuleDependencyService.cs @@ -75,7 +75,8 @@ internal sealed class ModuleDependencyService } EnsureMacroCapacity(classId.Value, macros); - module.Dependencies = new ModuleDependencySnapshot + var previous = module.Dependencies; + var captured = new ModuleDependencySnapshot { ClassId = classId.Value, SpecId = specId.Value, @@ -100,9 +101,97 @@ internal sealed class ModuleDependencyService SpecialSpells = macros.SpecialSpells.Select(CaptureMacro).ToList() } }; + PreservePreviousSpellDependencies(captured, previous); + module.Dependencies = captured; return null; } + private static void PreservePreviousSpellDependencies( + ModuleDependencySnapshot captured, + ModuleDependencySnapshot? previous) + { + if (previous is null || previous.ClassId != captured.ClassId || previous.SpecId != captured.SpecId) + { + return; + } + + PreserveAuras(captured.Config.Spec.PlayerAuras, previous.Config.Spec.PlayerAuras); + PreserveAuras(captured.Config.Spec.TargetHarmfulAuras, previous.Config.Spec.TargetHarmfulAuras); + PreserveAuras(captured.Config.Spec.TargetHelpfulAuras, previous.Config.Spec.TargetHelpfulAuras); + PreserveAuras(captured.Config.Spec.FocusHarmfulAuras, previous.Config.Spec.FocusHarmfulAuras); + PreserveAuras(captured.Config.Spec.FocusHelpfulAuras, previous.Config.Spec.FocusHelpfulAuras); + + foreach (var incoming in previous.Config.Spec.Spells ?? []) + { + var local = captured.Config.Spec.Spells.FirstOrDefault(spell => spell.SpellId == incoming.SpellId); + if (local is null) + { + captured.Config.Spec.Spells.Add(incoming.Clone()); + continue; + } + + local.Charge |= incoming.Charge; + local.ForcedKnown |= incoming.ForcedKnown; + local.InSpellBook |= incoming.InSpellBook; + local.MaxCharge ??= incoming.MaxCharge; + local.CastCount ??= incoming.CastCount; + if (string.IsNullOrWhiteSpace(local.Name)) + { + local.Name = incoming.Name; + } + } + + foreach (var incoming in previous.Config.SpellsList ?? []) + { + if (captured.Config.SpellsList.All(spell => spell.SpellId != incoming.SpellId)) + { + captured.Config.SpellsList.Add(incoming.Clone()); + } + } + + PreserveMacros(captured.Macros.StaticSpells, previous.Macros.StaticSpells); + PreserveMacros(captured.Macros.SpecialSpells, previous.Macros.SpecialSpells); + + static void PreserveAuras(List local, IEnumerable? incoming) + { + foreach (var aura in incoming ?? []) + { + var incomingIds = GetAuraSpellIds(aura.SpellId, aura.SpellIds).ToHashSet(); + var existing = local.FirstOrDefault(candidate => + GetAuraSpellIds(candidate.SpellId, candidate.SpellIds).Any(incomingIds.Contains)); + if (existing is null) + { + local.Add(aura.Clone()); + continue; + } + + foreach (var id in incomingIds) + { + if (existing.SpellId != id && !existing.SpellIds.Contains(id)) + { + existing.SpellIds.Add(id); + } + } + existing.MaxApps ??= aura.MaxApps; + if (string.IsNullOrWhiteSpace(existing.Name)) + { + existing.Name = aura.Name; + } + } + } + + static void PreserveMacros(List local, IEnumerable? incoming) + { + foreach (var macro in incoming ?? []) + { + if (local.All(existing => !MacroEntryEquals(existing, macro))) + { + local.Add(macro.Clone()); + } + } + } + } + public ModuleDependencyImportResult Import(IReadOnlyList modules) { lock (_gate) @@ -215,6 +304,30 @@ internal sealed class ModuleDependencyService { throw new InvalidDataException($"依赖快照包含未知状态分类“{unknownCategory}”。"); } + + var auraGroups = new[] + { + snapshot.Config.Spec.PlayerAuras, + snapshot.Config.Spec.TargetHarmfulAuras, + snapshot.Config.Spec.TargetHelpfulAuras, + snapshot.Config.Spec.FocusHarmfulAuras, + snapshot.Config.Spec.FocusHelpfulAuras + }; + if (auraGroups.SelectMany(entries => entries ?? []) + .Any(aura => !GetAuraSpellIds(aura.SpellId, aura.SpellIds).Any())) + { + throw new InvalidDataException("依赖快照包含缺少有效 spellId 的光环。"); + } + + if ((snapshot.Config.Spec.Spells ?? []).Any(spell => !IsValidSpellId(spell.SpellId))) + { + throw new InvalidDataException("依赖快照包含缺少有效 spellId 的法术。"); + } + + if ((snapshot.Config.SpellsList ?? []).Any(spell => !IsValidSpellId(spell.SpellId))) + { + throw new InvalidDataException("依赖快照包含缺少有效 spellId 的技能列表条目。"); + } } private static List RemoveUnknownStateFields(ModuleSpecSnapshot spec) @@ -382,7 +495,7 @@ internal sealed class ModuleDependencyService MergeAuras(local.FocusHarmfulAuras, incoming.FocusHarmfulAuras, "焦点减益", counters); MergeAuras(local.FocusHelpfulAuras, incoming.FocusHelpfulAuras, "焦点增益", counters); MergeSpells(local.Spells, incoming.Spells, counters); - MergeGroup(local, incoming.Group, counters); + // 队伍配置属于本地扫描布局;模块快照只为文件兼容保留,导入时不得比较或修改。 } private static void MergeStrings(List local, IEnumerable incoming, MergeCounters counters) @@ -535,15 +648,9 @@ internal sealed class ModuleDependencyService && incomingMaxApps is not null && target.MaxApps != incomingMaxApps) { - var mergedMaxApps = Math.Max(target.MaxApps.Value, incomingMaxApps.Value); counters.Conflicts.Add( $"{label}“{DisplayName(incomingName, incomingSpellId)}”的 maxApps 存在差异:" - + $"{target.MaxApps}、{incomingMaxApps},已采用 {mergedMaxApps}。"); - if (target.MaxApps != mergedMaxApps) - { - target.MaxApps = mergedMaxApps; - changed = true; - } + + $"本地 {target.MaxApps}、模块 {incomingMaxApps},已保留本地。"); } if (string.IsNullOrWhiteSpace(target.Name) && !string.IsNullOrWhiteSpace(incomingName)) @@ -571,10 +678,7 @@ internal sealed class ModuleDependencyService var existing = local.FirstOrDefault(item => SpellIdentityMatches(item, entry)); if (existing is not null) { - if (!SpellEquals(existing, entry)) - { - counters.Conflicts.Add($"法术“{name}”与本地内容不同,已保留本地。"); - } + MergeSpellMetadata(existing, entry, name, counters); continue; } @@ -605,31 +709,121 @@ internal sealed class ModuleDependencyService continue; } + MergeSpellMetadata(existing, current, DisplayName(current.Name, current.SpellId), counters); local.RemoveAt(index--); counters.ConfigUpdated++; } } + private static void MergeSpellMetadata( + ClassBlocksStore.SpellEntry target, + ModuleSpellSnapshot incoming, + string name, + MergeCounters counters) + => MergeSpellMetadataCore( + target, + incoming.Name, + incoming.Charge, + incoming.MaxCharge, + incoming.CastCount, + incoming.ForcedKnown, + incoming.InSpellBook, + name, + counters); + + private static void MergeSpellMetadata( + ClassBlocksStore.SpellEntry target, + ClassBlocksStore.SpellEntry incoming, + string name, + MergeCounters counters) + => MergeSpellMetadataCore( + target, + incoming.Name, + incoming.Charge, + incoming.MaxCharge, + incoming.CastCount, + incoming.ForcedKnown, + incoming.InSpellBook, + name, + counters); + + private static void MergeSpellMetadataCore( + ClassBlocksStore.SpellEntry target, + string? incomingName, + bool incomingCharge, + int? incomingMaxCharge, + int? incomingCastCount, + bool incomingForcedKnown, + bool incomingInSpellBook, + string name, + MergeCounters counters) + { + var changed = false; + if (!target.Charge && incomingCharge) + { + target.Charge = true; + changed = true; + } + if (!target.ForcedKnown && incomingForcedKnown) + { + target.ForcedKnown = true; + changed = true; + } + if (!target.InSpellBook && incomingInSpellBook) + { + target.InSpellBook = true; + changed = true; + } + + MergeNullable( + target.MaxCharge, + incomingMaxCharge, + value => target.MaxCharge = value, + "最大充能"); + MergeNullable( + target.CastCount, + incomingCastCount, + value => target.CastCount = value, + "施法次数"); + + if (string.IsNullOrWhiteSpace(target.Name) && !string.IsNullOrWhiteSpace(incomingName)) + { + target.Name = incomingName.Trim(); + changed = true; + } + + if (changed) + { + counters.ConfigUpdated++; + } + + void MergeNullable(int? localValue, int? incomingValue, Action assign, string field) + { + if (localValue is null && incomingValue is { } supplied) + { + assign(supplied); + changed = true; + } + else if (localValue is not null && incomingValue is not null && localValue != incomingValue) + { + counters.Conflicts.Add( + $"法术“{name}”的{field}存在差异:本地 {localValue}、模块 {incomingValue},已保留本地。"); + } + } + } + private static bool SpellIdentityMatches( ClassBlocksStore.SpellEntry left, ClassBlocksStore.SpellEntry right) { - return SpellIdentityMatches( - GetSpellIds(left.SpellId), - left.Name, - GetSpellIds(right.SpellId), - right.Name); + return IsValidSpellId(left.SpellId) && left.SpellId == right.SpellId; } private static bool SpellIdentityMatches( ClassBlocksStore.SpellEntry left, ModuleSpellSnapshot right) { - return SpellIdentityMatches( - GetSpellIds(left.SpellId), - left.Name, - GetSpellIds(right.SpellId), - right.Name); + return IsValidSpellId(left.SpellId) && left.SpellId == right.SpellId; } private static bool SpellIdentityMatches( @@ -640,14 +834,9 @@ internal sealed class ModuleDependencyService { var leftIdSet = leftIds.Where(IsValidSpellId).ToHashSet(); var rightIdSet = rightIds.Where(IsValidSpellId).ToHashSet(); - if (leftIdSet.Count > 0 || rightIdSet.Count > 0) - { - return leftIdSet.Count > 0 - && rightIdSet.Count > 0 - && leftIdSet.Overlaps(rightIdSet); - } - - return string.Equals(leftName?.Trim(), rightName?.Trim(), StringComparison.Ordinal); + return leftIdSet.Count > 0 + && rightIdSet.Count > 0 + && leftIdSet.Overlaps(rightIdSet); } private static IEnumerable GetSpellIds(long spellId) @@ -722,210 +911,6 @@ internal sealed class ModuleDependencyService } } - private static void MergeGroup( - ClassBlocksStore.SpecBlocks localSpec, - ModuleGroupSnapshot? incoming, - MergeCounters counters) - { - if (incoming is null) - { - return; - } - - if (localSpec.Group is null) - { - var group = new ClassBlocksStore.GroupBlocks - { - Num = incoming.Num, - HealthPercent = incoming.HealthPercent, - Role = incoming.Role, - Dispel = incoming.Dispel - }; - counters.ConfigAdded++; - foreach (var aura in incoming.Auras) - { - var existing = group.Auras.FirstOrDefault(item => GroupAuraIdentityMatches(item, aura)); - if (existing is not null) - { - MergeGroupAuraMetadata(existing, aura, counters); - continue; - } - - group.Auras.Add(ToGroupAura(aura, aura.Offset)); - counters.ConfigAdded++; - } - localSpec.Group = group; - return; - } - - var local = localSpec.Group; - CompactLocalGroupAuras(local.Auras, counters); - var occupied = new HashSet(local.Auras.Select(aura => aura.Offset)); - AddOffset(local.HealthPercent); - AddOffset(local.Role); - AddOffset(local.Dispel); - - if (local.HealthPercent is null && incoming.HealthPercent is not null) - { - local.HealthPercent = AllocateOffset(incoming.HealthPercent.Value, occupied); - counters.ConfigAdded++; - } - if (local.Role is null && incoming.Role is not null) - { - local.Role = AllocateOffset(incoming.Role.Value, occupied); - counters.ConfigAdded++; - } - if (local.Dispel is null && incoming.Dispel is not null) - { - local.Dispel = AllocateOffset(incoming.Dispel.Value, occupied); - counters.ConfigAdded++; - } - - foreach (var aura in incoming.Auras) - { - var existing = local.Auras.FirstOrDefault(item => GroupAuraIdentityMatches(item, aura)); - if (existing is not null) - { - MergeGroupAuraMetadata(existing, aura, counters); - continue; - } - - var offset = AllocateOffset(aura.Offset, occupied); - local.Auras.Add(ToGroupAura(aura, offset)); - counters.ConfigAdded++; - } - - if (occupied.Count > 0) - { - local.Num = Math.Max(local.Num, occupied.Max()); - } - - void AddOffset(int? offset) - { - if (offset is > 0) - { - occupied.Add(offset.Value); - } - } - } - - private static bool GroupAuraIdentityMatches( - ClassBlocksStore.GroupAuraEntry left, - ModuleGroupAuraSnapshot right) - { - // offset 是队伍光环的槽位,同一 spellId 出现在不同槽位时仍然是两个槽位。 - return left.Offset == right.Offset - && SpellIdentityMatches( - GetAuraSpellIds(left.SpellId, left.SpellIds), - left.Name, - GetAuraSpellIds(right.SpellId, right.SpellIds), - right.Name); - } - - private static bool GroupAuraIdentityMatches( - ClassBlocksStore.GroupAuraEntry left, - ClassBlocksStore.GroupAuraEntry right) - { - return left.Offset == right.Offset - && SpellIdentityMatches( - GetAuraSpellIds(left.SpellId, left.SpellIds), - left.Name, - GetAuraSpellIds(right.SpellId, right.SpellIds), - right.Name); - } - - private static void CompactLocalGroupAuras( - List local, - MergeCounters counters) - { - for (var index = 0; index < local.Count; index++) - { - var current = local[index]; - var existing = local.Take(index).FirstOrDefault(item => GroupAuraIdentityMatches(item, current)); - if (existing is null) - { - continue; - } - - if (existing.SpellId is null && current.SpellId is > 0) - { - existing.SpellId = current.SpellId; - } - - foreach (var spellId in GetAuraSpellIds(null, current.SpellIds)) - { - if (!existing.SpellIds.Contains(spellId)) - { - existing.SpellIds.Add(spellId); - } - } - - if (string.IsNullOrWhiteSpace(existing.Name) && !string.IsNullOrWhiteSpace(current.Name)) - { - existing.Name = current.Name; - } - - local.RemoveAt(index--); - counters.ConfigUpdated++; - } - } - - private static void MergeGroupAuraMetadata( - ClassBlocksStore.GroupAuraEntry target, - ModuleGroupAuraSnapshot incoming, - MergeCounters counters) - { - var changed = false; - if (target.SpellId is null && incoming.SpellId is > 0) - { - target.SpellId = incoming.SpellId; - changed = true; - } - - foreach (var spellId in GetAuraSpellIds(null, incoming.SpellIds)) - { - if (!target.SpellIds.Contains(spellId)) - { - target.SpellIds.Add(spellId); - changed = true; - } - } - - if (string.IsNullOrWhiteSpace(target.Name) && !string.IsNullOrWhiteSpace(incoming.Name)) - { - target.Name = incoming.Name; - changed = true; - } - - if (changed) - { - counters.ConfigUpdated++; - } - } - - private static int AllocateOffset(int desired, ISet occupied) - { - var offset = desired > 0 && !occupied.Contains(desired) ? desired : 1; - while (occupied.Contains(offset)) - { - offset++; - } - occupied.Add(offset); - return offset; - } - - private static ClassBlocksStore.GroupAuraEntry ToGroupAura(ModuleGroupAuraSnapshot entry, int offset) - { - var aura = new ClassBlocksStore.GroupAuraEntry - { - Offset = offset, - Name = entry.Name, - SpellId = entry.SpellId - }; - aura.SpellIds.AddRange(entry.SpellIds); - return aura; - } - private static void MergeMacros( ClassMacrosStore.ClassMacros local, int specId, diff --git a/Input/KeymapCatalog.cs b/Input/KeymapCatalog.cs index 4ec4f35a..4473f100 100644 --- a/Input/KeymapCatalog.cs +++ b/Input/KeymapCatalog.cs @@ -95,7 +95,29 @@ public sealed class KeymapCatalog public IReadOnlyCollection GetFailedSpellNames(int? classId) { - return _config?.GetFailedSpells(classId).Values.ToList() ?? []; + if (classId is null || _config is null) + { + return []; + } + + var ids = _config.GetFailedSpells(classId).Values.ToHashSet(); + var path = Path.Combine( + _baseDirectory, + "Fuyutsui", + "class", + $"{ClassNames.GetConfigFileName(classId.Value)}.lua"); + try + { + return ClassBlocksStore.Load(path).SpellsList + .Where(spell => ids.Contains(spell.SpellId) && !string.IsNullOrWhiteSpace(spell.Name)) + .Select(spell => spell.Name.Trim()) + .Distinct(StringComparer.Ordinal) + .ToList(); + } + catch + { + return []; + } } private KeymapEntries GetEntries(int? classId) diff --git a/Input/KeymapService.cs b/Input/KeymapService.cs index 88cbb67d..81efab96 100644 --- a/Input/KeymapService.cs +++ b/Input/KeymapService.cs @@ -10,6 +10,7 @@ public sealed class KeymapService : IKeymapResolver private readonly Dictionary<(int Unit, string Spell, string MacroCondition), string> _hotkeys = new(); private readonly Dictionary<(int Unit, string Spell), string> _fallbackHotkeys = new(); private readonly Dictionary _spellIndices = new(); + private readonly Dictionary _spellNames = new(); private int? _currentClassId; private int? _currentSpecId; @@ -36,6 +37,7 @@ public sealed class KeymapService : IKeymapResolver _hotkeys.Clear(); _fallbackHotkeys.Clear(); _spellIndices.Clear(); + _spellNames.Clear(); LoadSpellIndices(classId); @@ -111,12 +113,17 @@ public sealed class KeymapService : IKeymapResolver return null; } - public IReadOnlyDictionary GetCurrentFailedSpells() + public string? GetHotkey(int? unit, long spellId, string? macroCondition = null) + => _spellNames.TryGetValue(spellId, out var spell) + ? GetHotkey(unit, spell, macroCondition) + : null; + + public IReadOnlyDictionary GetCurrentFailedSpells() { return _config.GetFailedSpells(_currentClassId); } - public IReadOnlyDictionary GetCurrentOneKeySpells() + public IReadOnlyDictionary GetCurrentOneKeySpells() { return _config.GetOneKeySpells(_currentClassId); } @@ -126,6 +133,11 @@ public sealed class KeymapService : IKeymapResolver return _spellIndices; } + public IReadOnlyDictionary GetCurrentSpellNames() + { + return _spellNames; + } + private void LoadSpellIndices(int? classId) { if (classId is null) @@ -144,6 +156,10 @@ public sealed class KeymapService : IKeymapResolver foreach (var spell in document.SpellsList.Where(spell => spell.SpellId > 0)) { _spellIndices.TryAdd(spell.SpellId, spell.Index); + if (!string.IsNullOrWhiteSpace(spell.Name)) + { + _spellNames.TryAdd(spell.SpellId, spell.Name.Trim()); + } } } catch (Exception ex) when (ex is IOException or UnauthorizedAccessException diff --git a/Modules/ConditionFieldCatalog.cs b/Modules/ConditionFieldCatalog.cs index a06b3c9d..cc7aa48b 100644 --- a/Modules/ConditionFieldCatalog.cs +++ b/Modules/ConditionFieldCatalog.cs @@ -46,12 +46,14 @@ public static class SpellIdConditionFields public const string OneKeyAssist = "一键辅助"; public const string InsertSpell = "插入法术"; public const string CastingSpell = "施法技能"; + public const string PreviousSpell = "上个技能"; private static readonly HashSet Names = new(StringComparer.Ordinal) { OneKeyAssist, InsertSpell, - CastingSpell + CastingSpell, + PreviousSpell }; public static bool Contains(string? fieldName) @@ -151,11 +153,12 @@ public sealed class ConditionFieldCatalog { if (node is JsonObject field && field.ContainsKey("step")) { + var displayName = ReadDisplayName(field) ?? auraName; AddField( fields, seen, $"auras.{auraName}", - auraName, + $"{displayName} / {ReadSpellId(field)?.ToString() ?? "?"}", ReadType(field), ConditionFieldCategory.Aura, ReadClassification(field) @@ -171,7 +174,14 @@ public sealed class ConditionFieldCatalog { if (node is JsonObject field && field.ContainsKey("step")) { - AddField(fields, seen, $"spells.{spellName}", $"技能: {spellName}", ReadType(field), ConditionFieldCategory.Spell); + var displayName = ReadDisplayName(field) ?? spellName; + AddField( + fields, + seen, + $"spells.{spellName}", + $"技能: {displayName} / {ReadSpellId(field)?.ToString() ?? "?"}", + ReadType(field), + ConditionFieldCategory.Spell); } } } @@ -217,7 +227,12 @@ public sealed class ConditionFieldCatalog if (node is JsonObject field && field.ContainsKey("step") && seen.Add(key)) { - fields.Add(new ConditionField(key, key, ReadType(field))); + var displayName = ReadDisplayName(field) ?? key; + var spellId = ReadSpellId(field); + fields.Add(new ConditionField( + key, + spellId is null ? displayName : $"{displayName} / {spellId}", + ReadType(field))); } } @@ -230,6 +245,68 @@ public sealed class ConditionFieldCatalog return fields; } + /// + /// 返回多 ID 光环除规范 ID 外仍可解析的字段名。别名不加入下拉,避免同一逻辑光环重复显示。 + /// + public IReadOnlySet GetAuraAliasFieldNames(int? classId, int? specId, bool groupOnly) + { + var aliases = new HashSet(StringComparer.Ordinal); + if (_config is null) + { + return aliases; + } + + var stateConfig = _config.BuildStateConfig(classId, specId); + if (!groupOnly && JsonHelpers.Get(stateConfig, "auras") is JsonObject auras) + { + foreach (var (fieldName, node) in auras) + { + if (node is JsonObject field) + { + AddAliases(aliases, $"auras.{fieldName}", field, includeScope: true); + } + } + } + + if (groupOnly && JsonHelpers.Get(stateConfig, "group") is JsonObject group) + { + foreach (var (fieldName, node) in group) + { + if (node is JsonObject field && fieldName.StartsWith("auras.", StringComparison.Ordinal)) + { + AddAliases(aliases, fieldName, field, includeScope: false); + } + } + } + + return aliases; + + static void AddAliases(ISet target, string fieldName, JsonObject field, bool includeScope) + { + var canonicalId = ReadSpellId(field); + var metric = JsonHelpers.GetString(JsonHelpers.Get(field, "metric")); + var scope = JsonHelpers.GetString(JsonHelpers.Get(field, "scope")); + if (canonicalId is null || string.IsNullOrWhiteSpace(metric) + || JsonHelpers.Get(field, "spellIds") is not JsonArray spellIds) + { + return; + } + + foreach (var node in spellIds) + { + var alias = JsonHelpers.GetLong(node); + if (alias is null || alias <= 0 || alias == canonicalId) + { + continue; + } + + target.Add(includeScope + ? $"auras.{scope}.{alias}.{metric}" + : $"auras.{alias}.{metric}"); + } + } + } + private static void AddField( List fields, HashSet seen, @@ -325,6 +402,14 @@ public sealed class ConditionFieldCatalog ? value : null; + private static string? ReadDisplayName(JsonObject field) + => JsonHelpers.GetString(JsonHelpers.Get(field, "displayName"))?.Trim() is { Length: > 0 } value + ? value + : null; + + private static long? ReadSpellId(JsonObject field) + => JsonHelpers.GetLong(JsonHelpers.Get(field, "spellId")); + private static string InferStateClassification(string name) { foreach (var classification in ClassStateCatalog.TopCategories.Where(IsUnitStateClassification)) diff --git a/Modules/IKeymapResolver.cs b/Modules/IKeymapResolver.cs index 1be38509..fd7b348e 100644 --- a/Modules/IKeymapResolver.cs +++ b/Modules/IKeymapResolver.cs @@ -6,9 +6,13 @@ public interface IKeymapResolver string? GetHotkey(int? unit, string spell, string? macroCondition = null); - IReadOnlyDictionary GetCurrentFailedSpells(); + string? GetHotkey(int? unit, long spellId, string? macroCondition = null); - IReadOnlyDictionary GetCurrentOneKeySpells(); + IReadOnlyDictionary GetCurrentFailedSpells(); + + IReadOnlyDictionary GetCurrentOneKeySpells(); IReadOnlyDictionary GetCurrentSpellIndices(); + + IReadOnlyDictionary GetCurrentSpellNames(); } diff --git a/Modules/ModuleSpecialActions.cs b/Modules/ModuleSpecialActions.cs index 99c458f2..b24beff2 100644 --- a/Modules/ModuleSpecialActions.cs +++ b/Modules/ModuleSpecialActions.cs @@ -33,25 +33,25 @@ internal static class ModuleSpecialActions return string.Equals(spell?.Trim(), OneKeySpell, StringComparison.Ordinal); } - public static string? GetFailedSpell(GameState state, IReadOnlyDictionary? failedSpellMap) + public static long? GetFailedSpell(GameState state, IReadOnlyDictionary? failedSpellMap) { var failedSpellId = state.GetInt(InsertSpellState); - if (failedSpellMap is null || !failedSpellMap.TryGetValue(failedSpellId, out var spellName)) + if (failedSpellMap is null || !failedSpellMap.TryGetValue(failedSpellId, out var spellId)) { return null; } - return state.Spells.TryGetValue(spellName, out var cooldown) + return state.Spells.TryGetValue($"{spellId}.{SpellFieldKey.SpellCooldown}", out var cooldown) && IsZero(cooldown) - ? spellName + ? spellId : null; } - public static string? GetOneKeySpell(GameState state, IReadOnlyDictionary? oneKeySpellMap) + public static long? GetOneKeySpell(GameState state, IReadOnlyDictionary? oneKeySpellMap) { var oneKeyAssist = state.GetInt("一键辅助"); - return oneKeySpellMap is not null && oneKeySpellMap.TryGetValue(oneKeyAssist, out var spellName) - ? spellName + return oneKeySpellMap is not null && oneKeySpellMap.TryGetValue(oneKeyAssist, out var spellId) + ? spellId : null; } diff --git a/Modules/ModuleStore.cs b/Modules/ModuleStore.cs index 69cf2958..31efee1c 100644 --- a/Modules/ModuleStore.cs +++ b/Modules/ModuleStore.cs @@ -804,6 +804,7 @@ public static class ModuleLogic var unitSlots = ResolveDynamicFields(module, state, spellIndices); var failedSpells = keymap.GetCurrentFailedSpells(); var oneKeySpells = keymap.GetCurrentOneKeySpells(); + var spellNames = keymap.GetCurrentSpellNames(); for (var ruleIndex = 0; ruleIndex < module.Rules.Count; ruleIndex++) { @@ -856,38 +857,56 @@ public static class ModuleLogic resolvedUnit = int.TryParse(slot, out var slotUnit) ? slotUnit : 0; } - var actionSpell = rule.Spell; + long? actionSpellId = null; + var actionSpellName = rule.Spell.Trim(); var isOneKeySpell = false; - if (ModuleSpecialActions.IsFailedSpell(actionSpell)) + if (ModuleSpecialActions.IsFailedSpell(rule.Spell)) { - actionSpell = ModuleSpecialActions.GetFailedSpell(state, failedSpells); - if (string.IsNullOrWhiteSpace(actionSpell)) + actionSpellId = ModuleSpecialActions.GetFailedSpell(state, failedSpells); + if (actionSpellId is null) + { + continue; + } + if (!spellNames.TryGetValue(actionSpellId.Value, out actionSpellName)) { continue; } } - else if (ModuleSpecialActions.IsOneKeySpell(actionSpell)) + else if (ModuleSpecialActions.IsOneKeySpell(rule.Spell)) { isOneKeySpell = true; - actionSpell = ModuleSpecialActions.GetOneKeySpell(state, oneKeySpells); - if (string.IsNullOrWhiteSpace(actionSpell)) + actionSpellId = ModuleSpecialActions.GetOneKeySpell(state, oneKeySpells); + if (actionSpellId is null) + { + continue; + } + if (!spellNames.TryGetValue(actionSpellId.Value, out actionSpellName)) { continue; } resolvedUnit = 0; } + else if (long.TryParse(actionSpellName, NumberStyles.Integer, CultureInfo.InvariantCulture, out var legacySpellId) + && legacySpellId > 0 + && spellNames.TryGetValue(legacySpellId, out var legacySpellName)) + { + // 兼容曾以 spellId 保存的普通动作;编辑器再次保存时会落回技能名称。 + actionSpellName = legacySpellName; + } var resolvedMacroCondition = rule.MacroCondition; var hotkey = string.IsNullOrWhiteSpace(rule.Hotkey) - ? string.IsNullOrWhiteSpace(actionSpell) ? null : keymap.GetHotkey(resolvedUnit, actionSpell, resolvedMacroCondition) + ? actionSpellId is { } id + ? keymap.GetHotkey(resolvedUnit, id, resolvedMacroCondition) + : keymap.GetHotkey(resolvedUnit, actionSpellName, resolvedMacroCondition) : rule.Hotkey.Trim(); if (isOneKeySpell && string.IsNullOrWhiteSpace(rule.Hotkey) && string.IsNullOrWhiteSpace(hotkey) - && !string.IsNullOrWhiteSpace(actionSpell)) + && actionSpellId is not null) { - hotkey = keymap.GetHotkey(ReservedUnit.None, actionSpell, MacroConditionText.NoChanneling); + hotkey = keymap.GetHotkey(ReservedUnit.None, actionSpellId.Value, MacroConditionText.NoChanneling); if (!string.IsNullOrWhiteSpace(hotkey)) { resolvedUnit = ReservedUnit.None; @@ -895,9 +914,11 @@ public static class ModuleLogic } } - var step = BuildStep(module, rule, hotkey, actionSpell); + var step = BuildStep(module, rule, hotkey, actionSpellName); info["命中条件"] = string.IsNullOrWhiteSpace(rule.Condition) ? "始终" : rule.Condition; - info["动作技能"] = string.IsNullOrWhiteSpace(actionSpell) ? "-" : actionSpell; + info["动作技能"] = string.IsNullOrWhiteSpace(actionSpellName) + ? "-" + : actionSpellId is null ? actionSpellName : $"{actionSpellName} / {actionSpellId}"; info["宏条件"] = string.IsNullOrWhiteSpace(resolvedMacroCondition) ? "-" : MacroConditionText.ToDisplayText(resolvedMacroCondition); @@ -1301,7 +1322,7 @@ public static class ModuleConditionEvaluator GameState state, out bool matched, out string? error, - IReadOnlyDictionary? failedSpells = null, + IReadOnlyDictionary? failedSpells = null, IReadOnlyDictionary? spellIndices = null) { matched = false; @@ -1354,7 +1375,7 @@ public static class ModuleConditionEvaluator GameState state, out bool matched, out string? error, - IReadOnlyDictionary? failedSpells = null, + IReadOnlyDictionary? failedSpells = null, IReadOnlyDictionary? spellIndices = null) { if (!TryEvaluate(rule.Condition, state, out matched, out error, failedSpells, spellIndices)) @@ -1411,7 +1432,7 @@ public static class ModuleConditionEvaluator GameState state, out bool matched, out string? error, - IReadOnlyDictionary? failedSpells, + IReadOnlyDictionary? failedSpells, IReadOnlyDictionary? spellIndices) { matched = false; @@ -1434,6 +1455,11 @@ public static class ModuleConditionEvaluator } var inLeft = ResolveValue(state, inField, failedSpells); + if (inLeft is null && IsStructuredSpellReference(inField)) + { + matched = false; + return true; + } var inOp = NormalizeOperator(inMatch.Groups["op"].Value); var values = ParseListLiterals(inMatch.Groups["value"].Value); return TryCompareIn(inLeft, inOp, values, out matched, out error); @@ -1445,12 +1471,22 @@ public static class ModuleConditionEvaluator var invert = trimmed.StartsWith('!'); var fieldName = invert ? trimmed[1..].Trim() : trimmed; var value = ResolveValue(state, fieldName, failedSpells); + if (value is null && IsStructuredSpellReference(fieldName)) + { + matched = false; + return true; + } matched = invert ? !IsTruthy(value) : IsTruthy(value); return true; } var comparisonField = comparison.Groups["field"].Value.Trim(); var left = ResolveValue(state, comparisonField, failedSpells); + if (left is null && IsStructuredSpellReference(comparisonField)) + { + matched = false; + return true; + } var op = comparison.Groups["op"].Value; var right = ParseLiteral(comparison.Groups["value"].Value.Trim()); if (SpellIdConditionFields.Contains(comparisonField)) @@ -1475,6 +1511,18 @@ public static class ModuleConditionEvaluator return TryCompare(left, op, right, out matched, out error); } + private static bool IsStructuredSpellReference(string fieldName) + { + if (SpellFieldKey.TryParseSpell(fieldName, out _, out _) + || SpellFieldKey.TryParseAura(fieldName, out _, out _, out _)) + { + return true; + } + + var key = SpellFieldKey.StripRoot(fieldName); + return Regex.IsMatch(key, @"(?:^|\.)auras\.\d+\.(?:value|apps)$", RegexOptions.IgnoreCase); + } + private static bool TryToInt64(object? value, out long number) { switch (value) @@ -1502,7 +1550,7 @@ public static class ModuleConditionEvaluator private static object? ResolveValue( GameState state, string fieldName, - IReadOnlyDictionary? failedSpells = null) + IReadOnlyDictionary? failedSpells = null) { var key = fieldName.Trim(); if (key.StartsWith("state.", StringComparison.OrdinalIgnoreCase)) diff --git a/Modules/ModuleUnit.cs b/Modules/ModuleUnit.cs index af700458..00fae810 100644 --- a/Modules/ModuleUnit.cs +++ b/Modules/ModuleUnit.cs @@ -66,7 +66,7 @@ public enum UnitRoleFilterKind /// /// 模块内定义的命名动态单位。运行时由 解析为 group 槽位("1".."30")。 -/// 单光环类用 AuraNames[0]; WithAnyAura 用整个列表。 +/// 单光环类用 AuraSpellIds[0]; WithAnyAura 用整个列表。 /// public sealed class ModuleUnit { @@ -84,6 +84,8 @@ public sealed class ModuleUnit public UnitRoleFilterKind? RoleFilter { get; set; } public int? Role { get; set; } public bool Reverse { get; set; } + public List? AuraSpellIds { get; set; } + // 仅用于读取并迁移旧模块;当前版本保存前必须转换并清空。 public List? AuraNames { get; set; } public int? AuraCount { get; set; } public int? DispelType { get; set; } @@ -100,6 +102,7 @@ public sealed class ModuleUnit RoleFilter = RoleFilter, Role = Role, Reverse = Reverse, + AuraSpellIds = AuraSpellIds is null ? null : new List(AuraSpellIds), AuraNames = AuraNames is null ? null : new List(AuraNames), AuraCount = AuraCount, DispelType = DispelType @@ -143,6 +146,8 @@ public sealed class ModuleCountField public CountKind Kind { get; set; } = CountKind.UnitsBelowHealth; public int? HealthThreshold { get; set; } public string? HealthThresholdField { get; set; } + public long? AuraSpellId { get; set; } + // 仅用于读取并迁移旧模块;当前版本保存前必须转换并清空。 public string? AuraName { get; set; } public ModuleCountField Clone() @@ -153,6 +158,7 @@ public sealed class ModuleCountField Kind = Kind, HealthThreshold = HealthThreshold, HealthThresholdField = HealthThresholdField, + AuraSpellId = AuraSpellId, AuraName = AuraName }; } diff --git a/Modules/SpellFieldKey.cs b/Modules/SpellFieldKey.cs new file mode 100644 index 00000000..4fbcb79c --- /dev/null +++ b/Modules/SpellFieldKey.cs @@ -0,0 +1,102 @@ +using System.Globalization; + +namespace Shigure; + +internal static class SpellFieldKey +{ + public const string AuraValue = "value"; + public const string AuraApplications = "apps"; + public const string SpellCooldown = "cooldown"; + public const string SpellChargeCooldown = "chargeCooldown"; + public const string SpellCount = "count"; + + public static string Aura(string scope, long spellId, string metric = AuraValue) + => $"auras.{scope}.{spellId.ToString(CultureInfo.InvariantCulture)}.{metric}"; + + public static string AuraMember(long spellId, string metric = AuraValue) + => $"auras.{spellId.ToString(CultureInfo.InvariantCulture)}.{metric}"; + + public static string Spell(long spellId, string metric = SpellCooldown) + => $"spells.{spellId.ToString(CultureInfo.InvariantCulture)}.{metric}"; + + public static string StripRoot(string value) + { + var key = value.Trim(); + return key.StartsWith("state.", StringComparison.OrdinalIgnoreCase) + ? key["state.".Length..] + : key; + } + + public static bool TryParseSpell(string? value, out long spellId, out string metric) + { + var key = StripRoot(value ?? string.Empty); + var parts = key.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + if (parts.Length == 3 + && string.Equals(parts[0], "spells", StringComparison.OrdinalIgnoreCase) + && long.TryParse(parts[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out spellId) + && spellId > 0) + { + metric = parts[2]; + return true; + } + + spellId = 0; + metric = string.Empty; + return false; + } + + public static bool TryParseAura(string? value, out string scope, out long spellId, out string metric) + { + var key = StripRoot(value ?? string.Empty); + var parts = key.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + if (parts.Length >= 4 + && string.Equals(parts[0], "auras", StringComparison.OrdinalIgnoreCase) + && long.TryParse(parts[^2], NumberStyles.Integer, CultureInfo.InvariantCulture, out spellId) + && spellId > 0) + { + scope = string.Join('.', parts[1..^2]); + metric = parts[^1]; + return true; + } + + scope = string.Empty; + spellId = 0; + metric = string.Empty; + return false; + } + + public static bool TryParseAuraMember(string? value, out long spellId, out string metric) + { + var key = StripRoot(value ?? string.Empty); + var auraIndex = key.IndexOf("auras.", StringComparison.OrdinalIgnoreCase); + if (auraIndex > 0) + { + key = key[auraIndex..]; + } + + var parts = key.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries); + if (parts.Length == 3 + && string.Equals(parts[0], "auras", StringComparison.OrdinalIgnoreCase) + && long.TryParse(parts[1], NumberStyles.Integer, CultureInfo.InvariantCulture, out spellId) + && spellId > 0) + { + metric = parts[2]; + return true; + } + + spellId = 0; + metric = string.Empty; + return false; + } + + public static long? CanonicalAuraId(long? spellId, IEnumerable? spellIds) + { + if (spellId is > 0) + { + return spellId; + } + + var ids = (spellIds ?? []).Where(id => id > 0).Distinct().OrderBy(id => id).ToArray(); + return ids.Length == 0 ? null : ids[0]; + } +} diff --git a/Modules/UnitSelector.cs b/Modules/UnitSelector.cs index bc5ca8f0..c9cac988 100644 --- a/Modules/UnitSelector.cs +++ b/Modules/UnitSelector.cs @@ -21,7 +21,13 @@ public static class UnitSelector unit.HealthThresholdField, state, IsHealingAbsorbKind(unit.Kind) ? 0 : DefaultThreshold); - var aura = FirstAura(unit.AuraNames); + var aura = FirstAura(unit.AuraSpellIds); + if (RequiresAura(unit.Kind) + && (unit.AuraSpellIds is not { Count: > 0 } + || unit.AuraSpellIds.Any(id => !GroupContainsAuraField(group, id)))) + { + return null; + } return unit.Kind switch { @@ -29,13 +35,13 @@ public static class UnitSelector group, threshold, data => MatchesRoleFilter(data, unit.RoleFilter, unit.Role)), - UnitSelectorKind.LowestHealthWithAnyAura => unit.AuraNames is { Count: > 0 } names + UnitSelectorKind.LowestHealthWithAnyAura => unit.AuraSpellIds is { Count: > 0 } names ? LowestHealth( group, threshold, data => MatchesRoleFilter(data, unit.RoleFilter, unit.Role) && HasAnyAura(data, names)) : null, - UnitSelectorKind.LowestHealthWithoutAnyAura => unit.AuraNames is { Count: > 0 } names + UnitSelectorKind.LowestHealthWithoutAnyAura => unit.AuraSpellIds is { Count: > 0 } names ? LowestHealth( group, threshold, @@ -46,46 +52,46 @@ public static class UnitSelector : LowestHealth( group, threshold, - data => MatchesRoleFilter(data, unit.RoleFilter, unit.Role) && !HasAura(data, aura)), + data => MatchesRoleFilter(data, unit.RoleFilter, unit.Role) && !HasAura(data, aura.Value)), UnitSelectorKind.LowestHealthWithAura => aura is null ? null : LowestHealth( group, threshold, - data => MatchesRoleFilter(data, unit.RoleFilter, unit.Role) && HasAura(data, aura)), + data => MatchesRoleFilter(data, unit.RoleFilter, unit.Role) && HasAura(data, aura.Value)), UnitSelectorKind.LowestHealthWithAuraCount => aura is null || unit.AuraCount is null ? null : LowestHealth( group, threshold, data => MatchesRoleFilter(data, unit.RoleFilter, unit.Role) - && AuraEquals(data, aura, unit.AuraCount.Value)), + && AuraEquals(data, aura.Value, unit.AuraCount.Value)), UnitSelectorKind.UnitWithRole => unit.Role is null ? null : UnitWithRole(group, unit.Role.Value, unit.Reverse, _ => true), UnitSelectorKind.UnitWithRoleWithoutAura => unit.Role is null || aura is null ? null - : UnitWithRole(group, unit.Role.Value, unit.Reverse, data => !HasAura(data, aura)), - UnitSelectorKind.UnitWithAura => aura is null ? null : UnitWithAura(group, aura), + : UnitWithRole(group, unit.Role.Value, unit.Reverse, data => !HasAura(data, aura.Value)), + UnitSelectorKind.UnitWithAura => aura is null ? null : UnitWithAura(group, aura.Value), UnitSelectorKind.UnitWithDispelType => unit.DispelType is null ? null : UnitWithDispelType(group, unit.DispelType.Value), UnitSelectorKind.HighestHealingAbsorb => HighestHealingAbsorb(group, threshold, _ => true), - UnitSelectorKind.HighestHealingAbsorbWithAnyAura => unit.AuraNames is { Count: > 0 } names + UnitSelectorKind.HighestHealingAbsorbWithAnyAura => unit.AuraSpellIds is { Count: > 0 } names ? HighestHealingAbsorb(group, threshold, data => HasAnyAura(data, names)) : null, - UnitSelectorKind.HighestHealingAbsorbWithoutAnyAura => unit.AuraNames is { Count: > 0 } names + UnitSelectorKind.HighestHealingAbsorbWithoutAnyAura => unit.AuraSpellIds is { Count: > 0 } names ? HighestHealingAbsorb(group, threshold, data => !HasAnyAura(data, names)) : null, UnitSelectorKind.HighestHealingAbsorbWithoutAura => aura is null ? null - : HighestHealingAbsorb(group, threshold, data => !HasAura(data, aura)), + : HighestHealingAbsorb(group, threshold, data => !HasAura(data, aura.Value)), UnitSelectorKind.HighestHealingAbsorbWithAura => aura is null ? null - : HighestHealingAbsorb(group, threshold, data => HasAura(data, aura)), + : HighestHealingAbsorb(group, threshold, data => HasAura(data, aura.Value)), UnitSelectorKind.HighestHealingAbsorbWithAuraCount => aura is null || unit.AuraCount is null ? null - : HighestHealingAbsorb(group, threshold, data => AuraEquals(data, aura, unit.AuraCount.Value)), + : HighestHealingAbsorb(group, threshold, data => AuraEquals(data, aura.Value, unit.AuraCount.Value)), _ => null }; } @@ -99,36 +105,41 @@ public static class UnitSelector count.HealthThresholdField, state, IsHealingAbsorbKind(count.Kind) ? 0 : DefaultThreshold); + if (RequiresAura(count.Kind) + && (count.AuraSpellId is null || !GroupContainsAuraField(group, count.AuraSpellId.Value))) + { + return 0; + } return count.Kind switch { CountKind.UnitsBelowHealth => CountUnits(group, data => BelowThreshold(data, threshold)), - CountKind.UnitsWithoutAuraBelowHealth => count.AuraName is null + CountKind.UnitsWithoutAuraBelowHealth => count.AuraSpellId is null ? 0 - : CountUnits(group, data => !HasAura(data, count.AuraName) && BelowThreshold(data, threshold)), - CountKind.UnitsWithAura => count.AuraName is null + : CountUnits(group, data => !HasAura(data, count.AuraSpellId.Value) && BelowThreshold(data, threshold)), + CountKind.UnitsWithAura => count.AuraSpellId is null ? 0 - : CountUnits(group, data => HasAura(data, count.AuraName)), - CountKind.UnitsWithAuraBelowHealth => count.AuraName is null + : CountUnits(group, data => HasAura(data, count.AuraSpellId.Value)), + CountKind.UnitsWithAuraBelowHealth => count.AuraSpellId is null ? 0 : CountUnits( group, - data => HasAura(data, count.AuraName) + data => HasAura(data, count.AuraSpellId.Value) && BelowThreshold(data, threshold)), CountKind.UnitsAboveHealingAbsorb => CountUnits( group, data => AboveHealingAbsorbThreshold(data, threshold)), - CountKind.UnitsWithoutAuraAboveHealingAbsorb => count.AuraName is null + CountKind.UnitsWithoutAuraAboveHealingAbsorb => count.AuraSpellId is null ? 0 : CountUnits( group, - data => !HasAura(data, count.AuraName) + data => !HasAura(data, count.AuraSpellId.Value) && AboveHealingAbsorbThreshold(data, threshold)), - CountKind.UnitsWithAuraAboveHealingAbsorb => count.AuraName is null + CountKind.UnitsWithAuraAboveHealingAbsorb => count.AuraSpellId is null ? 0 : CountUnits( group, - data => HasAura(data, count.AuraName) + data => HasAura(data, count.AuraSpellId.Value) && AboveHealingAbsorbThreshold(data, threshold)), _ => 0 }; @@ -197,7 +208,7 @@ public static class UnitSelector /// 取拥有某光环(数值 > 0)且持续时间最长的单位。 private static string? UnitWithAura( IReadOnlyDictionary> group, - string auraName) + long auraSpellId) { string? bestUnit = null; var bestDuration = 0; @@ -209,7 +220,7 @@ public static class UnitSelector continue; } - if (!TryInt(GetField(data, auraName), out var duration) || duration <= 0) + if (!TryInt(GetField(data, SpellFieldKey.AuraMember(auraSpellId)), out var duration) || duration <= 0) { continue; } @@ -335,9 +346,9 @@ public static class UnitSelector or CountKind.UnitsWithoutAuraAboveHealingAbsorb or CountKind.UnitsWithAuraAboveHealingAbsorb; - private static bool AuraEquals(IReadOnlyDictionary data, string auraName, int target) + private static bool AuraEquals(IReadOnlyDictionary data, long auraSpellId, int target) { - return TryInt(GetField(data, auraName), out var val) && val == target; + return TryInt(GetField(data, SpellFieldKey.AuraMember(auraSpellId)), out var val) && val == target; } private static bool MatchesRoleFilter( @@ -372,16 +383,16 @@ public static class UnitSelector return !TryInt(role, out var r) || r != 0; } - private static bool HasAura(IReadOnlyDictionary data, string auraName) + private static bool HasAura(IReadOnlyDictionary data, long auraSpellId) { - return TryInt(GetField(data, auraName), out var n) && n != 0; + return TryInt(GetField(data, SpellFieldKey.AuraMember(auraSpellId)), out var n) && n != 0; } - private static bool HasAnyAura(IReadOnlyDictionary data, IEnumerable auraNames) + private static bool HasAnyAura(IReadOnlyDictionary data, IEnumerable auraSpellIds) { - foreach (var name in auraNames) + foreach (var spellId in auraSpellIds) { - if (HasAura(data, name)) + if (HasAura(data, spellId)) { return true; } @@ -390,9 +401,38 @@ public static class UnitSelector return false; } - private static string? FirstAura(List? auraNames) + private static bool GroupContainsAuraField( + IReadOnlyDictionary> group, + long spellId) { - return auraNames is { Count: > 0 } ? auraNames[0] : null; + var key = SpellFieldKey.AuraMember(spellId); + return group.Values.Any(member => member.ContainsKey(key)); + } + + private static bool RequiresAura(UnitSelectorKind kind) + => kind is UnitSelectorKind.LowestHealthWithAnyAura + or UnitSelectorKind.LowestHealthWithoutAnyAura + or UnitSelectorKind.LowestHealthWithoutAura + or UnitSelectorKind.LowestHealthWithAura + or UnitSelectorKind.LowestHealthWithAuraCount + or UnitSelectorKind.UnitWithRoleWithoutAura + or UnitSelectorKind.UnitWithAura + or UnitSelectorKind.HighestHealingAbsorbWithAnyAura + or UnitSelectorKind.HighestHealingAbsorbWithoutAnyAura + or UnitSelectorKind.HighestHealingAbsorbWithoutAura + or UnitSelectorKind.HighestHealingAbsorbWithAura + or UnitSelectorKind.HighestHealingAbsorbWithAuraCount; + + private static bool RequiresAura(CountKind kind) + => kind is CountKind.UnitsWithoutAuraBelowHealth + or CountKind.UnitsWithAura + or CountKind.UnitsWithAuraBelowHealth + or CountKind.UnitsWithoutAuraAboveHealingAbsorb + or CountKind.UnitsWithAuraAboveHealingAbsorb; + + private static long? FirstAura(List? auraSpellIds) + { + return auraSpellIds is { Count: > 0 } ? auraSpellIds[0] : null; } private static object? GetField(IReadOnlyDictionary data, string field) diff --git a/README.md b/README.md index 8a59a2d8..44032c08 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Shigure 是一个 Windows WinForms 桌面程序。它从目标窗口读取 Fuyut 程序采用单实例运行;再次启动时会提示“Shigure 已经在运行”,随后退出新实例。 -当前版本:`1.2.1` +当前版本:`1.2.1.17` ## 主要功能 @@ -144,7 +144,7 @@ Tools\ 辅助脚本 `common.json` 保存固定启动字段 `锚点`、`职业`、`专精`。其余文件按英文职业名命名,例如 `Warrior.json`、`Priest.json`,每个文件包含: - `keymap`:该职业使用的 keymap 文件名。 -- `一键法术`:状态编号到技能名的映射。 +- `一键法术`:状态中的本地技能索引到 spellId 的映射。 - 以专精 ID 为键的对象,包含普通状态字段,以及可选的 `auras`、`spells`、`group`。 运行时先读取 `common.json` 确定职业和专精,再合并对应专精配置。`group.start` 是队伍数据起始列,`group.num` 是每名成员占用的列数;组内字段的 `step` 是相对偏移。 @@ -167,7 +167,7 @@ Tools\ 辅助脚本 模块以 `模块名.json` 保存在我的文档目录 `{MyDocuments}/Shigure/module`。名称不能重复;加载时会递归扫描子目录,以兼容旧版布局。模块页保存时会写入当前 Shigure 版本。模块的 `Version` 必须与当前软件版本完整一致才会参与依赖导入、模块选择和运行;版本不一致或为空的模块仍在编辑器列表中显示为红色,可在检查并显式保存后升级到当前版本。职业和专精均已指定时,模块还会携带该专精的 `ClassBlocks`、职业 `spellsList`,以及该职业的通用/专精动态宏、静态宏和特殊宏。 -启动和“刷新模块”会把模块携带而本地缺少的配置与宏追加到项目 `Fuyutsui/`,不会覆盖或删除本地已有条目。技能列表仅以 `spellId` 判断是否已存在;同一 spellId 使用本地索引和名称,缺失 spellId 按模块快照追加,允许多个 spellId 共用同一索引。发生新增后会自动重建 `config/keymap`、同步游戏插件并按需重启运行。导入前会按每项动态宏 30 个槽位、静态/特殊宏各 1 个槽位检查该职业所有受影响专精;合并结果超过 273 个槽位时,整个模块不会进入模块列表或运行时,本地 Lua 也不会被修改。模块文件仍保留在模块目录,清理宏后可刷新重试。 +启动和“刷新模块”会把模块携带而本地缺少的配置与宏追加到项目 `Fuyutsui/`。光环、法术和技能列表都以 `spellId` 判断同一条目,不再按名称回退:光环任一 ID 重合即合并 ID 集合,`maxApps` 仅补本地空值;法术的布尔属性采用 true 补齐 false,最大充能和施法次数仅补本地空值;双方都有不同值时保留本地并提示冲突。技能列表同一 spellId 保留本地索引和名称,缺失 spellId 按模块快照追加,允许多个 spellId 共用同一索引。队伍依赖快照只为模块文件兼容保留,读取时不比较、不导入,也不修改本地队伍配置。发生新增后会自动重建 `config/keymap`、同步游戏插件并按需重启运行。导入前会按每项动态宏 30 个槽位、静态/特殊宏各 1 个槽位检查该职业所有受影响专精;合并结果超过 273 个槽位时,整个模块不会进入模块列表或运行时,本地 Lua 也不会被修改。模块文件仍保留在模块目录,清理宏后可刷新重试。 模块匹配字段: @@ -186,7 +186,7 @@ Tools\ 辅助脚本 "Name": "戒律", "Author": "模块作者", "RecommendedTalent": "推荐天赋代码或说明", - "Version": "1.2.1.16", + "Version": "1.2.1.17", "UnitMappingVersion": 3, "Enabled": true, "Match": { @@ -201,7 +201,7 @@ Tools\ 辅助脚本 "Rules": [ { "Enabled": true, - "Condition": "生命值 < 50 && spells.真言术:盾 == 0", + "Condition": "生命值 < 50 && spells.17.cooldown == 0", "Unit": 31, "Spell": "真言术:盾", "Hotkey": "", @@ -211,7 +211,7 @@ Tools\ 辅助脚本 } ``` -规则按顺序判断,第一条命中的规则会执行。`Spell` 通过当前职业 keymap 和目标单位查找热键;填写 `Hotkey` 时会直接发送该键。技能下拉还包含以下特殊动作: +规则按顺序判断,第一条命中的规则会执行。普通动作的 `Spell` 保存并使用“技能”列中的技能或宏名称,不用 spellId 判断;运行时按名称、目标单位和宏条件查找 keymap 热键。填写 `Hotkey` 时会直接发送该键。技能下拉还包含以下特殊动作: - `暂停`:命中后不发送按键,并停止继续匹配本轮后续规则。 - `自动插入法术`:读取状态字段 `插入法术`,按职业配置映射到当前可用技能。 @@ -222,15 +222,18 @@ Tools\ 辅助脚本 支持的常见表达式: - 状态:`生命值 < 50`、`战斗时间 > 0`。 -- 光环:`auras.圣光涌动 > 0`。 -- 技能:`spells.圣疗术 == 0`。 +- 玩家光环:`auras.player.114255.value > 0`;层数使用 `.apps`。 +- 目标/焦点光环:`auras.target.harmful.55078.value > 0`、`auras.focus.helpful.12345.value > 0`。 +- 技能:`spells.633.cooldown == 0`;充能冷却和层数分别使用 `.chargeCooldown`、`.count`。 - 队伍:`group.1.生命值 < 60`。 - 列表:`目标类型 in (1, 2)`、`职业 not in (4, 9)`。 -- 组合:`生命值 < 50 && spells.圣疗术 == 0`、`目标类型 == 1 || 首领战 > 0`。 +- 组合:`生命值 < 50 && spells.633.cooldown == 0`、`目标类型 == 1 || 首领战 > 0`。 - 布尔简写:`移动` 表示为真,`!移动` 表示为假。 - 空条件:始终命中。 -`一键辅助`、`插入法术`、`施法技能` 是技能列表索引状态。可视化编辑器为这三个字段提供“技能图标 / 技能名称 / spellId”下拉,并且只允许 `==`、`!=`;模块条件保存 spellId,运行时按当前职业的 `spellsList` 把 spellId 转换为本地索引后再比较,因此模块不依赖来源职业文件中的索引分配。找不到 spellId 时,该条件行和所属规则行显示为红色,条件按不命中处理。 +`一键辅助`、`插入法术`、`施法技能`、`上个技能` 是技能列表索引状态。可视化编辑器为这些字段提供“技能图标 / 技能名称 / spellId”下拉,并且只允许 `==`、`!=`;模块条件保存 spellId,运行时按当前职业的 `spellsList` 把 spellId 转换为本地索引后再比较,因此模块不依赖来源职业文件中的索引分配。找不到 spellId 时,该条件行和所属规则行显示为红色,条件按不命中处理。 + +生成的 `config/*.json` 和运行时状态使用“范围 + spellId + 数值类型”的结构化键;字段节点中的 `displayName`、`spellId`、`scope`、`metric` 和 `spellIds` 仅用于显示及别名解析。多 ID 光环优先使用单值 `spellId`,否则使用最小有效 ID 作为规范键,其余 ID 映射到同一运行时值。普通条件、子条件、动态数值、公式、动态单位和人数统计均持久化 spellId;缺失引用会保留原 ID、显示红色并按不命中处理。 字符串可以使用单引号或双引号。`true/yes/是`、`false/no/否`、`null/nil/空` 会转换为对应字面量。`&&` 的优先级高于 `||`,主表达式不支持括号嵌套。 diff --git a/Runtime/StateBuilder.cs b/Runtime/StateBuilder.cs index 056f2fc2..51242f5d 100644 --- a/Runtime/StateBuilder.cs +++ b/Runtime/StateBuilder.cs @@ -64,7 +64,9 @@ public sealed class StateBuilder : IRuntimeStateBuilder continue; } - values[fieldName] = ConvertRawValue(ResolveRaw(field, rowData, barData), JsonHelpers.GetString(JsonHelpers.Get(field, "type"))); + var value = ConvertRawValue(ResolveRaw(field, rowData, barData), JsonHelpers.GetString(JsonHelpers.Get(field, "type"))); + values[fieldName] = value; + AddAuraAliases(values, field, value, includeScope: true); } return values; @@ -105,7 +107,9 @@ public sealed class StateBuilder : IRuntimeStateBuilder : rowData.TryGetValue(baseStep + relStep.Value, out var rawValue) ? rawValue : null; } - sub[fieldName] = ConvertRawValue(raw, JsonHelpers.GetString(JsonHelpers.Get(field, "type"))); + var value = ConvertRawValue(raw, JsonHelpers.GetString(JsonHelpers.Get(field, "type"))); + sub[fieldName] = value; + AddAuraAliases(sub, field, value, includeScope: false); } // 治疗吸收来自网格扫描:白块右侧像素的 B=单位编号,G-1=吸收值。 @@ -124,6 +128,36 @@ public sealed class StateBuilder : IRuntimeStateBuilder return group; } + private static void AddAuraAliases( + IDictionary target, + JsonObject field, + object? value, + bool includeScope) + { + var canonicalId = JsonHelpers.GetLong(JsonHelpers.Get(field, "spellId")); + var metric = JsonHelpers.GetString(JsonHelpers.Get(field, "metric")); + var scope = JsonHelpers.GetString(JsonHelpers.Get(field, "scope")); + if (canonicalId is null || string.IsNullOrWhiteSpace(metric) + || JsonHelpers.Get(field, "spellIds") is not JsonArray aliases) + { + return; + } + + foreach (var node in aliases) + { + var alias = JsonHelpers.GetLong(node); + if (alias is null || alias == canonicalId) + { + continue; + } + + var key = includeScope + ? $"{scope}.{alias}.{metric}" + : $"auras.{alias}.{metric}"; + target[key] = value; + } + } + private static int? ResolveRaw(JsonObject field, IReadOnlyDictionary rowData, IReadOnlyDictionary barData) { var stepNode = JsonHelpers.Get(field, "step"); diff --git a/Shigure.csproj b/Shigure.csproj index db9b6796..6fde0f1d 100644 --- a/Shigure.csproj +++ b/Shigure.csproj @@ -9,9 +9,9 @@ Shigure Shigure Arasaka Corporation - 1.2.1.16 - 1.2.1.16 - 1.2.1.16 + 1.2.1.17 + 1.2.1.17 + 1.2.1.17 Assets\arasaka-icon.ico PerMonitorV2 diff --git a/UI/ConditionEditorForm.cs b/UI/ConditionEditorForm.cs index 8417066f..8698cc9b 100644 --- a/UI/ConditionEditorForm.cs +++ b/UI/ConditionEditorForm.cs @@ -662,6 +662,7 @@ public sealed class ConditionEditorForm : Form "一键辅助" => "一键辅助,条件保存技能列表中的 spellId", "插入法术" => "插入法术,条件保存技能列表中的 spellId", "施法技能" => "施法技能,条件保存技能列表中的 spellId", + "上个技能" => "上个技能,条件保存技能列表中的 spellId", _ => e.Value?.ToString() ?? string.Empty }; return; @@ -772,11 +773,15 @@ public sealed class ConditionEditorForm : Form var items = sourceItems .Select(item => item switch { - FieldItem field => new UiDropDownOption(field.Name, field.Display), + FieldItem field => new UiDropDownOption( + field.Name, + field.Display, + ResolveFieldIcon(field)), SpellValueItem spell => new UiDropDownOption( spell.Value, spell.Display, - spell.Missing ? null : SpellIconCatalog.Get(spell.SpellId)), + spell.Missing ? null : SpellIconCatalog.Get(spell.SpellId), + spell.Index?.ToString(CultureInfo.InvariantCulture)), _ => new UiDropDownOption(item.ToString() ?? string.Empty, item.ToString() ?? string.Empty) }) .DistinctBy(item => item.Value?.ToString(), StringComparer.Ordinal) @@ -818,6 +823,24 @@ public sealed class ConditionEditorForm : Form _conditionComboDropDown = dropDown; } + private static Image? ResolveFieldIcon(FieldItem field) + { + if (field.IsCustom + || field.Category is not (ConditionFieldCategory.Spell or ConditionFieldCategory.Aura)) + { + return null; + } + + if (SpellFieldKey.TryParseSpell(field.Name, out var spellId, out _) + || SpellFieldKey.TryParseAura(field.Name, out _, out spellId, out _) + || SpellFieldKey.TryParseAuraMember(field.Name, out spellId, out _)) + { + return SpellIconCatalog.Get(spellId); + } + + return null; + } + private void CloseConditionComboDropDown() { _conditionComboDropDown?.Close(ToolStripDropDownCloseReason.AppClicked); @@ -1345,7 +1368,8 @@ public sealed class ConditionEditorForm : Form combo.Items.Add(new SpellValueItem( spell.SpellId.ToString(CultureInfo.InvariantCulture), spell.DisplayName, - spell.SpellId)); + spell.SpellId, + spell.Index)); } var value = preserveRaw ? rawValue?.Trim() ?? string.Empty : string.Empty; @@ -1663,6 +1687,7 @@ public sealed class ConditionEditorForm : Form string Value, string Display, long SpellId, + int? Index = null, bool Missing = false) { public override string ToString() => Display; diff --git a/UI/MainForm.cs b/UI/MainForm.cs index 21348007..aafed1f5 100644 --- a/UI/MainForm.cs +++ b/UI/MainForm.cs @@ -1532,7 +1532,6 @@ public sealed class MainForm : Form, IMessageFilter { try { - module.Version = AppInfo.Version; var warning = _moduleDependencyService.Capture(module); _moduleStore.SaveDependenciesInPlace(module); savedCount++; diff --git a/UI/ModuleEditorControl.cs b/UI/ModuleEditorControl.cs index 6deb60be..d2bfee49 100644 --- a/UI/ModuleEditorControl.cs +++ b/UI/ModuleEditorControl.cs @@ -1,6 +1,8 @@ using System.Diagnostics; using System.Drawing; using System.Drawing.Drawing2D; +using System.Globalization; +using System.Text.RegularExpressions; namespace Shigure; @@ -1299,6 +1301,132 @@ public sealed class ModuleEditorControl : UserControl // 动态数值也是可用于条件的字段;新增、改名或删除后立即刷新规则行的缺失字段提示。 InvalidateConditionFieldValidation(); + RefreshAdjustmentValidation(); + } + + private void RefreshAdjustmentValidation() + { + var structuredFields = BuildStructuredFieldSet(); + foreach (DataGridViewRow row in _adjustmentsGrid.Rows) + { + if (row.IsNewRow) + { + continue; + } + + var messages = new List(); + AddMissingStructuredField(CellText(row, "Field"), "调整目标", structuredFields, messages); + AddMissingConditionReferences(CellText(row, "Condition"), structuredFields, messages); + ApplyAdjustmentValidationStyle(row, messages); + } + + foreach (DataGridViewRow row in _formulaAdjustmentsGrid.Rows) + { + if (row.IsNewRow) + { + continue; + } + + var messages = new List(); + foreach (Match match in Regex.Matches( + FormulaEvaluator.NormalizeExpression(CellText(row, "Formula")), + @"\b(?:auras|aura|spells|spell)\.[_$\p{L}\p{N}.]+", + RegexOptions.IgnoreCase)) + { + AddMissingStructuredField(match.Value, "公式字段", structuredFields, messages); + } + ApplyAdjustmentValidationStyle(row, messages); + } + } + + private HashSet BuildStructuredFieldSet() + { + var classId = ReadMatchCombo(_classBox); + var specId = ReadMatchCombo(_specBox); + var fields = new HashSet( + _fieldCatalog.GetFields(classId, specId) + .Where(field => field.Category is ConditionFieldCategory.Aura or ConditionFieldCategory.Spell) + .Select(field => NormalizeConditionFieldName(field.Name)), + StringComparer.Ordinal); + fields.UnionWith(_fieldCatalog.GetAuraAliasFieldNames(classId, specId, groupOnly: false)); + var groupFields = _fieldCatalog.GetGroupFields(classId, specId) + .Where(field => SpellFieldKey.TryParseAuraMember(field.Name, out _, out _)) + .Select(field => field.Name) + .ToList(); + groupFields.AddRange(_fieldCatalog.GetAuraAliasFieldNames(classId, specId, groupOnly: true)); + fields.UnionWith(groupFields); + foreach (var unit in _units.Where(unit => !string.IsNullOrWhiteSpace(unit.Name))) + { + fields.UnionWith(groupFields.Select(field => $"{unit.Name}.{field}")); + } + return fields; + } + + private void AddMissingConditionReferences( + string expression, + IReadOnlySet structuredFields, + ICollection messages) + { + var availableSpellIds = _currentClassConditionSpells.Select(spell => spell.SpellId).ToHashSet(); + foreach (var term in ConditionExpression.Parse(expression)) + { + if (SpellIdConditionFields.Contains(term.Field)) + { + if (!long.TryParse(term.Value.Trim(), out var spellId) + || spellId <= 0 + || !availableSpellIds.Contains(spellId)) + { + AddUnique(messages, $"{term.Field}不存在 spellId 为 {term.Value.Trim()} 的法术"); + } + continue; + } + + AddMissingStructuredField(term.Field, "条件字段", structuredFields, messages); + } + } + + private static void AddMissingStructuredField( + string field, + string source, + IReadOnlySet available, + ICollection messages) + { + var normalized = NormalizeConditionFieldName(field); + var isStructured = normalized.StartsWith("auras.", StringComparison.Ordinal) + || normalized.StartsWith("spells.", StringComparison.Ordinal) + || normalized.Contains(".auras.", StringComparison.Ordinal); + if (!isStructured || available.Contains(normalized)) + { + return; + } + + var spellId = normalized.Split('.', StringSplitOptions.RemoveEmptyEntries) + .FirstOrDefault(part => long.TryParse(part, out var id) && id > 0); + AddUnique(messages, spellId is null + ? $"{source}不存在:{field}" + : $"{source}不存在 spellId 为 {spellId} 的字段:{field}"); + } + + private static void AddUnique(ICollection values, string value) + { + if (!values.Contains(value)) + { + values.Add(value); + } + } + + private static void ApplyAdjustmentValidationStyle(DataGridViewRow row, IReadOnlyCollection messages) + { + var text = string.Join('\n', messages); + row.ErrorText = text; + row.DefaultCellStyle.BackColor = messages.Count == 0 ? Color.Empty : UiTheme.DangerSoft; + row.DefaultCellStyle.ForeColor = messages.Count == 0 ? Color.Empty : UiTheme.Danger; + row.DefaultCellStyle.SelectionBackColor = messages.Count == 0 ? Color.Empty : UiTheme.Danger; + row.DefaultCellStyle.SelectionForeColor = messages.Count == 0 ? Color.Empty : UiTheme.Background; + foreach (DataGridViewCell cell in row.Cells) + { + cell.ToolTipText = text; + } } // 按该行选中的"类型"重建"数值"单元格的可选项 = 该类别下的字段。 @@ -1419,6 +1547,8 @@ public sealed class ModuleEditorControl : UserControl { InvalidateConditionFieldValidation(); } + + RefreshAdjustmentValidation(); } private IReadOnlyList BuildAdjustmentFields() @@ -1628,19 +1758,51 @@ public sealed class ModuleEditorControl : UserControl private void RefreshUnitsList() { + var availableAuraIds = GetAuraFields() + .SelectMany(field => field.Name.Split('.', StringSplitOptions.RemoveEmptyEntries)) + .Where(part => long.TryParse(part, out _)) + .Select(long.Parse) + .ToHashSet(); _unitsList.BeginUpdate(); _unitsList.Items.Clear(); foreach (var unit in _units) { var name = string.IsNullOrWhiteSpace(unit.HealthName) ? unit.Name : $"{unit.Name} / {unit.HealthName}"; - var summary = UnitSummary.Describe(unit); - _unitsList.Items.Add(new ListViewItem([name, "单位", summary]) { ToolTipText = $"{name}\n{summary}" }); + var summary = UnitSummary.Describe(unit, ResolveGroupAuraName); + var item = new ListViewItem([name, "单位", summary]) { ToolTipText = $"{name}\n{summary}" }; + var missing = (unit.AuraSpellIds ?? []).Where(id => !availableAuraIds.Contains(id)).ToArray(); + if (unit.AuraNames is { Count: > 0 }) + { + item.BackColor = UiTheme.DangerSoft; + item.ForeColor = UiTheme.Danger; + item.ToolTipText += $"\n旧名称光环引用尚未转换:{string.Join("、", unit.AuraNames)}"; + } + else if (missing.Length > 0) + { + item.BackColor = UiTheme.DangerSoft; + item.ForeColor = UiTheme.Danger; + item.ToolTipText += $"\n队伍不存在 spellId 为 {string.Join("、", missing)} 的光环"; + } + _unitsList.Items.Add(item); } foreach (var count in _counts) { - var summary = UnitSummary.Describe(count); - _unitsList.Items.Add(new ListViewItem([count.Name, "数量", summary]) { ToolTipText = $"{count.Name}\n{summary}" }); + var summary = UnitSummary.Describe(count, ResolveGroupAuraName); + var item = new ListViewItem([count.Name, "数量", summary]) { ToolTipText = $"{count.Name}\n{summary}" }; + if (!string.IsNullOrWhiteSpace(count.AuraName)) + { + item.BackColor = UiTheme.DangerSoft; + item.ForeColor = UiTheme.Danger; + item.ToolTipText += $"\n旧名称光环引用尚未转换:{count.AuraName}"; + } + else if (count.AuraSpellId is { } id && !availableAuraIds.Contains(id)) + { + item.BackColor = UiTheme.DangerSoft; + item.ForeColor = UiTheme.Danger; + item.ToolTipText += $"\n队伍不存在 spellId 为 {id} 的光环"; + } + _unitsList.Items.Add(item); } _unitsList.EndUpdate(); @@ -1662,15 +1824,28 @@ public sealed class ModuleEditorControl : UserControl InvalidateConditionFieldValidation(); } - private IReadOnlyList GetAuraFields() + private IReadOnlyList GetAuraFields() { return _fieldCatalog .GetGroupFields(ReadMatchCombo(_classBox), ReadMatchCombo(_specBox)) - .Select(field => field.Name) - .Where(name => !NonAuraGroupFields.Contains(name)) + .Where(field => !NonAuraGroupFields.Contains(field.Name)) .ToList(); } + private string? ResolveGroupAuraName(long spellId) + { + foreach (var field in GetAuraFields()) + { + if (field.Name.Split('.', StringSplitOptions.RemoveEmptyEntries) + .Any(part => long.TryParse(part, out var id) && id == spellId)) + { + return field.DisplayName.Split(" / ", 2, StringSplitOptions.TrimEntries)[0]; + } + } + + return null; + } + private IReadOnlyList GetThresholdFields() { // 阈值字段仅取状态/动态单位/动态数值(可加减数值), 排除技能/光环字段。 @@ -2032,6 +2207,10 @@ public sealed class ModuleEditorControl : UserControl _availableGroupConditionFields = new HashSet( _fieldCatalog.GetGroupFields(classId, specId).Select(field => field.Name), StringComparer.Ordinal); + _availableConditionFields.UnionWith( + _fieldCatalog.GetAuraAliasFieldNames(classId, specId, groupOnly: false)); + _availableGroupConditionFields.UnionWith( + _fieldCatalog.GetAuraAliasFieldNames(classId, specId, groupOnly: true)); // 运行时也支持“动态单位名.队伍字段”;编辑器目录未展开这些组合,这里仍应判定为有效。 foreach (var unit in _units.Where(unit => !string.IsNullOrWhiteSpace(unit.Name))) @@ -2629,12 +2808,14 @@ public sealed class ModuleEditorControl : UserControl if (!string.IsNullOrWhiteSpace(editor.ConditionText)) { _adjustmentsGrid.Rows.Add(true, string.Empty, 0, editor.ConditionText); + RefreshAdjustmentFieldColumn(); } return; } row.Cells["Condition"].Value = editor.ConditionText; + RefreshAdjustmentValidation(); } private void OpenFormulaEditor(int rowIndex) @@ -3289,11 +3470,11 @@ public sealed class ModuleEditorControl : UserControl _counts.AddRange(module.Counts.Select(count => count.Clone())); _valueAdjustments.Clear(); _valueAdjustments.AddRange(module.ValueAdjustments.Select(adjustment => adjustment.Clone())); - RefreshUnitsList(); SelectClass(module.Match.ClassId); SelectSpec(module.Match.SpecId); SelectPartyType(module.Match.PartyType); SelectHeroTalent(module.Match.HeroTalent); + RefreshUnitsList(); _pathLabel.Text = module.FilePath ?? "尚未保存"; _versionLabel.Text = string.IsNullOrWhiteSpace(module.Version) ? "版本 未知" : $"版本 {module.Version}"; _adjustmentsGrid.Rows.Clear(); @@ -3323,16 +3504,17 @@ public sealed class ModuleEditorControl : UserControl foreach (var rule in module.Rules) { + var ruleSpellDisplay = DisplayRuleSpell(rule.Spell); // 动态目标优先显示单位名;保留单位显示中文,其余团队槽位显示数字。 var unitText = !string.IsNullOrWhiteSpace(rule.UnitName) ? rule.UnitName! : rule.Unit is { } unit ? ReservedUnit.ToDisplayText(unit) : string.Empty; - EnsureComboItem(_spellColumn, rule.Spell); + EnsureComboItem(_spellColumn, ruleSpellDisplay); // 先加行(目标先留空), 再按技能重建目标选项并写回目标值, 避免值不在选项内被吞掉。 var index = _rulesGrid.Rows.Add( rule.Enabled, - GetRuleSpellIcon(rule.Spell)!, - rule.Spell, + GetRuleSpellIcon(ruleSpellDisplay)!, + ruleSpellDisplay, string.Empty, string.Empty, rule.Condition, @@ -3524,10 +3706,276 @@ public sealed class ModuleEditorControl : UserControl } module.ValueAdjustments = valueAdjustments; - module.Rules = ReadRules(); + if (!TryReadRules(out var rules, out var rulesError)) + { + MessageBox.Show(rulesError, "Shigure", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + + module.Rules = rules; + if (!TryUpgradeLegacySpellReferences(module, out var upgradeError)) + { + MessageBox.Show(upgradeError, "Shigure", MessageBoxButtons.OK, MessageBoxIcon.Warning); + return false; + } + return true; } + private bool TryUpgradeLegacySpellReferences(ModuleDefinition module, out string error) + { + error = string.Empty; + var failure = string.Empty; + var candidates = new Dictionary>(StringComparer.Ordinal); + void Add(string legacy, string current) + { + if (string.IsNullOrWhiteSpace(legacy) || string.IsNullOrWhiteSpace(current)) + { + return; + } + + if (!candidates.TryGetValue(legacy, out var values)) + { + values = new HashSet(StringComparer.Ordinal); + candidates[legacy] = values; + } + values.Add(current); + } + + var spec = module.Dependencies?.Config?.Spec; + if (spec is not null) + { + AddAuraEntries(spec.PlayerAuras, "player", string.Empty); + AddAuraEntries(spec.TargetHarmfulAuras, "target.harmful", "目标"); + AddAuraEntries(spec.TargetHelpfulAuras, "target.helpful", "目标"); + AddAuraEntries(spec.FocusHarmfulAuras, "focus.harmful", "焦点"); + AddAuraEntries(spec.FocusHelpfulAuras, "focus.helpful", "焦点"); + foreach (var spell in spec.Spells ?? []) + { + if (spell.SpellId <= 0 || string.IsNullOrWhiteSpace(spell.Name)) + { + continue; + } + Add($"spells.{spell.Name}", SpellFieldKey.Spell(spell.SpellId)); + if (spell.Charge) + { + Add($"spells.{spell.Name}充能", SpellFieldKey.Spell(spell.SpellId, SpellFieldKey.SpellChargeCooldown)); + } + if (spell.MaxCharge is not null || spell.CastCount is not null) + { + Add($"spells.{spell.Name}层数", SpellFieldKey.Spell(spell.SpellId, SpellFieldKey.SpellCount)); + } + } + } + + foreach (var field in _fieldCatalog.GetGroupFields(module.Match.ClassId, module.Match.SpecId) + .Where(field => field.Name.StartsWith("auras.", StringComparison.Ordinal))) + { + var display = field.DisplayName.Split(" / ", 2, StringSplitOptions.TrimEntries)[0]; + Add(display, field.Name); + } + + var ambiguous = candidates.Where(pair => pair.Value.Count != 1).Select(pair => pair.Key).ToHashSet(StringComparer.Ordinal); + var replacements = candidates + .Where(pair => pair.Value.Count == 1) + .ToDictionary(pair => pair.Key, pair => pair.Value.Single(), StringComparer.Ordinal); + var dynamicFieldNames = module.Units + .SelectMany(unit => new[] { unit.Name, unit.HealthName }) + .Concat(module.Counts.Select(count => count.Name)) + .Where(name => !string.IsNullOrWhiteSpace(name)) + .Select(name => name!.Trim()) + .Distinct(StringComparer.Ordinal) + .ToArray(); + + for (var ruleIndex = 0; ruleIndex < module.Rules.Count; ruleIndex++) + { + var rule = module.Rules[ruleIndex]; + var rowLabel = $"规则第 {ruleIndex + 1} 行"; + if (!TryReplace(rule.Condition, $"{rowLabel}主条件", out var condition) + || rule.SubConditions is not null + && !TryReplaceList(rule.SubConditions, index => $"{rowLabel}子条件第 {index + 1} 行")) + { + error = failure; + return false; + } + rule.Condition = condition; + } + for (var adjustmentIndex = 0; adjustmentIndex < module.ValueAdjustments.Count; adjustmentIndex++) + { + var adjustment = module.ValueAdjustments[adjustmentIndex]; + var rowLabel = $"动态数值第 {adjustmentIndex + 1} 行"; + if (!TryReplace(adjustment.Condition, $"{rowLabel}条件", out var condition) + || !TryReplace(adjustment.Field, $"{rowLabel}调整目标", out var field) + || !TryReplace(adjustment.Formula, $"{rowLabel}公式", out var formula)) + { + error = failure; + return false; + } + adjustment.Condition = condition; + adjustment.Field = field; + adjustment.Formula = formula; + } + + for (var unitIndex = 0; unitIndex < module.Units.Count; unitIndex++) + { + var unit = module.Units[unitIndex]; + if (unit.AuraNames is not { Count: > 0 }) + { + continue; + } + var ids = new List(); + foreach (var name in unit.AuraNames) + { + if (!replacements.TryGetValue(name, out var key) || !TryExtractId(key, out var id)) + { + error = $"动态单位第 {unitIndex + 1} 行“{unit.Name}”引用的队伍光环“{name}”无法唯一转换为本地 spellId。"; + return false; + } + ids.Add(id); + } + unit.AuraSpellIds = ids.Distinct().ToList(); + unit.AuraNames = null; + } + for (var countIndex = 0; countIndex < module.Counts.Count; countIndex++) + { + var count = module.Counts[countIndex]; + if (string.IsNullOrWhiteSpace(count.AuraName)) + { + continue; + } + if (!replacements.TryGetValue(count.AuraName, out var key) || !TryExtractId(key, out var id)) + { + error = $"动态数量第 {countIndex + 1} 行“{count.Name}”引用的队伍光环“{count.AuraName}”无法唯一转换为本地 spellId。"; + return false; + } + count.AuraSpellId = id; + count.AuraName = null; + } + + return true; + + void AddAuraEntries(IEnumerable? entries, string scope, string prefix) + { + foreach (var aura in entries ?? []) + { + var id = SpellFieldKey.CanonicalAuraId(aura.SpellId, aura.SpellIds); + if (id is null || string.IsNullOrWhiteSpace(aura.Name)) + { + continue; + } + Add($"auras.{prefix}{aura.Name}", SpellFieldKey.Aura(scope, id.Value)); + if (aura.MaxApps is not null) + { + Add($"auras.{prefix}{aura.Name}层数", SpellFieldKey.Aura(scope, id.Value, SpellFieldKey.AuraApplications)); + } + } + } + + bool TryReplace(string source, string location, out string result) + { + result = source ?? string.Empty; + + // 兼容修复旧迁移逻辑曾经造成的子串污染,例如: + // “无救赎最低”被错误写成“无auras.194384.value最低”。 + foreach (var dynamicName in dynamicFieldNames) + { + foreach (var pair in replacements) + { + if (!dynamicName.Contains(pair.Key, StringComparison.Ordinal)) + { + continue; + } + + var corrupted = dynamicName.Replace(pair.Key, pair.Value, StringComparison.Ordinal); + if (!string.Equals(corrupted, dynamicName, StringComparison.Ordinal)) + { + result = ReplaceFieldReference(result, corrupted, dynamicName); + } + } + } + + // 动态单位/生命值/数量名称优先于旧光环显示名。先暂存完整引用, + // 防止名称恰好等于或包含旧光环名时被迁移逻辑改写。 + var protectedReferences = new List<(string Placeholder, string Name)>(); + for (var index = 0; index < dynamicFieldNames.Length; index++) + { + var name = dynamicFieldNames[index]; + if (!ContainsFieldReference(result, name)) + { + continue; + } + + var placeholder = $"__SHIGURE_DYNAMIC_FIELD_{index}__"; + result = ReplaceFieldReference(result, name, placeholder); + protectedReferences.Add((placeholder, name)); + } + + foreach (var key in ambiguous) + { + if (ContainsFieldReference(result, key)) + { + failure = $"{location}:旧模块字段“{key}”对应多个 spellId,请重新选择后再保存。"; + return false; + } + } + foreach (var pair in replacements.OrderByDescending(pair => pair.Key.Length)) + { + result = ReplaceFieldReference(result, pair.Key, pair.Value); + } + if (Regex.IsMatch(result, @"\b(?:auras|spells)\.[^\s&|<>=!+\-*/()]+")) + { + var unresolved = Regex.Match(result, @"\b(?:auras|spells)\.[^\s&|<>=!+\-*/()]+").Value; + if (!SpellFieldKey.TryParseAura(unresolved, out _, out _, out _) + && !SpellFieldKey.TryParseAuraMember(unresolved, out _, out _) + && !SpellFieldKey.TryParseSpell(unresolved, out _, out _)) + { + failure = $"{location}:旧模块字段“{unresolved}”无法转换为 spellId,请重新选择后再保存。"; + return false; + } + } + foreach (var (placeholder, name) in protectedReferences) + { + result = result.Replace(placeholder, name, StringComparison.Ordinal); + } + return true; + } + + static bool ContainsFieldReference(string source, string field) + => Regex.IsMatch(source, FieldReferencePattern(field)); + + static string ReplaceFieldReference(string source, string field, string replacement) + => Regex.Replace(source, FieldReferencePattern(field), _ => replacement); + + static string FieldReferencePattern(string field) + => $@"(? values, Func location) + { + for (var i = 0; i < values.Count; i++) + { + if (!TryReplace(values[i], location(i), out var replaced)) + { + return false; + } + values[i] = replaced; + } + return true; + } + + static bool TryExtractId(string key, out long id) + { + foreach (var part in key.Split('.', StringSplitOptions.RemoveEmptyEntries)) + { + if (long.TryParse(part, out id) && id > 0) + { + return true; + } + } + id = 0; + return false; + } + } + private bool TryReadValueAdjustments(out List adjustments, out string error) { adjustments = new List(); @@ -3612,12 +4060,13 @@ public sealed class ModuleEditorControl : UserControl return true; } - private List ReadRules() + private bool TryReadRules(out List rules, out string error) { + error = string.Empty; var unitNames = new HashSet( _units.Where(unit => !string.IsNullOrWhiteSpace(unit.Name)).Select(unit => unit.Name), StringComparer.Ordinal); - var rules = new List(); + rules = new List(); foreach (DataGridViewRow row in _rulesGrid.Rows) { if (row.IsNewRow) @@ -3666,7 +4115,24 @@ public sealed class ModuleEditorControl : UserControl }); } - return rules; + return true; + } + + private string DisplayRuleSpell(string? persisted) + { + var value = persisted?.Trim() ?? string.Empty; + if (value.Length == 0 || ModuleSpecialActions.IsPauseSpell(value) + || ModuleSpecialActions.IsFailedSpell(value) || ModuleSpecialActions.IsOneKeySpell(value)) + { + return value; + } + + if (long.TryParse(value, NumberStyles.Integer, CultureInfo.InvariantCulture, out var spellId)) + { + return _currentClassConditionSpells.FirstOrDefault(spell => spell.SpellId == spellId)?.Name ?? value; + } + + return value; } private static RuleRowMetadata GetRuleMetadata(DataGridViewRow row) diff --git a/UI/StatusForm.cs b/UI/StatusForm.cs index d52e1c77..3928e099 100644 --- a/UI/StatusForm.cs +++ b/UI/StatusForm.cs @@ -1194,7 +1194,7 @@ public sealed class StatusForm : Form "队伍类型", "队伍人数", "首领战", "难度", "英雄天赋", "施法目标", "施法技能", "敌人数量", "敌人数-无仇恨", "敌人数-有仇恨", "施法(正计时)", "施法(倒计时)", "引导", "蓄力", "蓄力层数", - "酒池", "符文", "姿态", "神圣军备", "自律", "英勇打击", "吸血鬼打击", "收割者战刃" + "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "英勇打击", "吸血鬼打击", "收割者战刃" ], 150), 0, 0); fields.Controls.Add(CreateCommonFieldCard( @@ -1536,7 +1536,7 @@ public sealed class StatusForm : Form items.Add(new ListViewItem(new[] { index.ToString(), - key, + DisplaySpellStateKey("auras", key), UiTheme.FormatValue(value) })); } @@ -1585,13 +1585,38 @@ public sealed class StatusForm : Form foreach (var (key, value) in snapshot.State.Spells) { index++; - items.Add(new ListViewItem(new[] { index.ToString(), key, UiTheme.FormatValue(value) })); + items.Add(new ListViewItem(new[] + { + index.ToString(), + DisplaySpellStateKey("spells", key), + UiTheme.FormatValue(value) + })); } } ReplaceItems(_spellList, items); } + private static string DisplaySpellStateKey(string root, string key) + { + long spellId; + string metric; + if (root == "spells") + { + if (!SpellFieldKey.TryParseSpell($"spells.{key}", out spellId, out metric)) + { + return key; + } + } + else if (!SpellFieldKey.TryParseAura($"auras.{key}", out _, out spellId, out metric)) + { + return key; + } + + var name = SpellIconCatalog.ResolveSuggestionName(spellId, null) ?? "未知法术"; + return $"{name} / {spellId} / {metric}"; + } + private void UpdatePartyList(RenderSnapshot snapshot) { var items = new List(); diff --git a/UI/UiDropDown.cs b/UI/UiDropDown.cs index 4f0a310d..ceaf8afc 100644 --- a/UI/UiDropDown.cs +++ b/UI/UiDropDown.cs @@ -3,7 +3,11 @@ using System.Drawing.Drawing2D; namespace Shigure; -internal sealed record UiDropDownOption(object? Value, string Display, Image? Icon = null) +internal sealed record UiDropDownOption( + object? Value, + string Display, + Image? Icon = null, + string? LeadingText = null) { public override string ToString() => Display; } @@ -38,7 +42,19 @@ internal static class UiDropDownPopup } var visibleItems = Math.Clamp(items.Count, 1, maximumVisibleItems); var measuredWidth = items.Max(item => - TextRenderer.MeasureText(DisplayText(item.Display), owner.Font).Width); + { + var width = TextRenderer.MeasureText(DisplayText(item.Display), owner.Font).Width; + if (!string.IsNullOrWhiteSpace(item.LeadingText)) + { + width += TextRenderer.MeasureText(item.LeadingText, owner.Font).Width + + (int)Math.Round(8 * scale); + } + if (item.Icon is not null) + { + width += (int)Math.Round(36 * scale); + } + return width; + }); var requestedWidth = Math.Max( anchorBounds.Width, Math.Max( @@ -186,6 +202,28 @@ internal static class UiDropDownPopup } var textLeft = e.Bounds.Left + 10; + if (!string.IsNullOrWhiteSpace(item.LeadingText)) + { + var leadingWidth = listBox.Items + .Cast() + .Where(option => !string.IsNullOrWhiteSpace(option.LeadingText)) + .Select(option => TextRenderer.MeasureText(option.LeadingText, listBox.Font).Width) + .DefaultIfEmpty(0) + .Max(); + var leadingBounds = new Rectangle( + textLeft, + e.Bounds.Top, + leadingWidth, + e.Bounds.Height); + TextRenderer.DrawText( + e.Graphics, + item.LeadingText, + listBox.Font, + leadingBounds, + selected ? UiTheme.Accent : UiTheme.Muted, + TextFormatFlags.Right | TextFormatFlags.VerticalCenter | TextFormatFlags.SingleLine); + textLeft = leadingBounds.Right + 8; + } if (item.Icon is not null) { var iconSize = Math.Min( diff --git a/UI/UnitEditorForm.cs b/UI/UnitEditorForm.cs index 914776bf..5fb0f0c0 100644 --- a/UI/UnitEditorForm.cs +++ b/UI/UnitEditorForm.cs @@ -71,7 +71,7 @@ public sealed class UnitEditorForm : Form new("动态阈值", true) ]; - private readonly IReadOnlyList _auraFields; + private readonly IReadOnlyList _auraFields; private readonly IReadOnlyList _thresholdFields; private readonly HashSet _takenNames; @@ -114,7 +114,7 @@ public sealed class UnitEditorForm : Form public ModuleCountField? ResultCount { get; private set; } public UnitEditorForm( - IReadOnlyList auraFields, + IReadOnlyList auraFields, IReadOnlyList thresholdFields, IReadOnlyCollection takenNames, ModuleUnit? existingUnit, @@ -626,10 +626,10 @@ public sealed class UnitEditorForm : Form { Name = _nameBox.Text.Trim(), Kind = (_selectorBox.SelectedItem as CountItem)?.Kind ?? CountKind.UnitsBelowHealth, - AuraName = SelectedAura() + AuraSpellId = SelectedAura() }; ApplyPreviewThreshold(v => count.HealthThreshold = v, f => count.HealthThresholdField = f); - return UnitSummary.Describe(count); + return UnitSummary.Describe(count, ResolveAuraName); } var unit = new ModuleUnit @@ -642,14 +642,14 @@ public sealed class UnitEditorForm : Form AuraCount = (int)_auraCountBox.Value, DispelType = SelectedDispelType() }; - unit.AuraNames = unit.Kind is UnitSelectorKind.LowestHealthWithAnyAura + unit.AuraSpellIds = unit.Kind is UnitSelectorKind.LowestHealthWithAnyAura or UnitSelectorKind.LowestHealthWithoutAnyAura or UnitSelectorKind.HighestHealingAbsorbWithAnyAura or UnitSelectorKind.HighestHealingAbsorbWithoutAnyAura ? CheckedAuras() : SingleAuraList(); ApplyPreviewThreshold(v => unit.HealthThreshold = v, f => unit.HealthThresholdField = f); - return UnitSummary.Describe(unit); + return UnitSummary.Describe(unit, ResolveAuraName); } // "生命值最低"/"治疗吸收最高" 的具体子类型取决于光环筛选下拉, 与 OnConfirm 的分支保持一致。 @@ -709,7 +709,7 @@ public sealed class UnitEditorForm : Form } SeedThresholdField(count.HealthThresholdField); - SelectAura(_auraBox, count.AuraName); + SelectAura(_auraBox, count.AuraSpellId ?? ResolveLegacyAura(count.AuraName)); return; } @@ -734,8 +734,11 @@ public sealed class UnitEditorForm : Form } _reverseBox.Checked = unit.Reverse; - SelectAura(_auraBox, unit.AuraNames is { Count: > 0 } ? unit.AuraNames[0] : null); - CheckAuras(unit.AuraNames); + var auraSpellIds = unit.AuraSpellIds is { Count: > 0 } + ? unit.AuraSpellIds + : (unit.AuraNames ?? []).Select(ResolveLegacyAura).Where(id => id is not null).Select(id => id!.Value).ToList(); + SelectAura(_auraBox, auraSpellIds is { Count: > 0 } ? auraSpellIds[0] : null); + CheckAuras(auraSpellIds); if (unit.AuraCount is { } ac) { _auraCountBox.Value = Clamp(ac, _auraCountBox); @@ -776,7 +779,7 @@ public sealed class UnitEditorForm : Form return; } - count.AuraName = SelectedAura(); + count.AuraSpellId = SelectedAura(); break; case CountKind.UnitsWithAuraBelowHealth: if (!ApplyThreshold(count)) @@ -784,10 +787,10 @@ public sealed class UnitEditorForm : Form return; } - count.AuraName = SelectedAura(); + count.AuraSpellId = SelectedAura(); break; case CountKind.UnitsWithAura: - count.AuraName = SelectedAura(); + count.AuraSpellId = SelectedAura(); break; case CountKind.UnitsAboveHealingAbsorb: if (!ApplyThreshold(count)) @@ -803,11 +806,11 @@ public sealed class UnitEditorForm : Form return; } - count.AuraName = SelectedAura(); + count.AuraSpellId = SelectedAura(); break; } - if (RequiresAura(kind) && string.IsNullOrEmpty(count.AuraName)) + if (RequiresAura(kind) && count.AuraSpellId is null) { MessageBox.Show("请选择光环。", "Shigure", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; @@ -842,8 +845,8 @@ public sealed class UnitEditorForm : Form moduleUnit.Kind = healingAbsorb ? UnitSelectorKind.HighestHealingAbsorbWithAnyAura : UnitSelectorKind.LowestHealthWithAnyAura; - moduleUnit.AuraNames = CheckedAuras(); - if (moduleUnit.AuraNames.Count == 0) + moduleUnit.AuraSpellIds = CheckedAuras(); + if (moduleUnit.AuraSpellIds.Count == 0) { MessageBox.Show("请至少勾选一个光环。", "Shigure", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; @@ -854,8 +857,8 @@ public sealed class UnitEditorForm : Form moduleUnit.Kind = healingAbsorb ? UnitSelectorKind.HighestHealingAbsorbWithoutAnyAura : UnitSelectorKind.LowestHealthWithoutAnyAura; - moduleUnit.AuraNames = CheckedAuras(); - if (moduleUnit.AuraNames.Count == 0) + moduleUnit.AuraSpellIds = CheckedAuras(); + if (moduleUnit.AuraSpellIds.Count == 0) { MessageBox.Show("请至少勾选一个光环。", "Shigure", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; @@ -866,19 +869,19 @@ public sealed class UnitEditorForm : Form moduleUnit.Kind = healingAbsorb ? UnitSelectorKind.HighestHealingAbsorbWithoutAura : UnitSelectorKind.LowestHealthWithoutAura; - moduleUnit.AuraNames = SingleAuraList(); + moduleUnit.AuraSpellIds = SingleAuraList(); break; case LowestHealthAuraFilterKind.WithAura: moduleUnit.Kind = healingAbsorb ? UnitSelectorKind.HighestHealingAbsorbWithAura : UnitSelectorKind.LowestHealthWithAura; - moduleUnit.AuraNames = SingleAuraList(); + moduleUnit.AuraSpellIds = SingleAuraList(); break; case LowestHealthAuraFilterKind.WithAuraCount: moduleUnit.Kind = healingAbsorb ? UnitSelectorKind.HighestHealingAbsorbWithAuraCount : UnitSelectorKind.LowestHealthWithAuraCount; - moduleUnit.AuraNames = SingleAuraList(); + moduleUnit.AuraSpellIds = SingleAuraList(); moduleUnit.AuraCount = (int)_auraCountBox.Value; break; } @@ -893,8 +896,8 @@ public sealed class UnitEditorForm : Form return; } - moduleUnit.AuraNames = CheckedAuras(); - if (moduleUnit.AuraNames.Count == 0) + moduleUnit.AuraSpellIds = CheckedAuras(); + if (moduleUnit.AuraSpellIds.Count == 0) { MessageBox.Show("请至少勾选一个光环。", "Shigure", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; @@ -910,7 +913,7 @@ public sealed class UnitEditorForm : Form return; } - moduleUnit.AuraNames = SingleAuraList(); + moduleUnit.AuraSpellIds = SingleAuraList(); break; case UnitSelectorKind.LowestHealthWithAuraCount: case UnitSelectorKind.HighestHealingAbsorbWithAuraCount: @@ -919,7 +922,7 @@ public sealed class UnitEditorForm : Form return; } - moduleUnit.AuraNames = SingleAuraList(); + moduleUnit.AuraSpellIds = SingleAuraList(); moduleUnit.AuraCount = (int)_auraCountBox.Value; break; case UnitSelectorKind.UnitWithRole: @@ -929,17 +932,17 @@ public sealed class UnitEditorForm : Form case UnitSelectorKind.UnitWithRoleWithoutAura: moduleUnit.Role = SelectedRole(); moduleUnit.Reverse = _reverseBox.Checked; - moduleUnit.AuraNames = SingleAuraList(); + moduleUnit.AuraSpellIds = SingleAuraList(); break; case UnitSelectorKind.UnitWithAura: - moduleUnit.AuraNames = SingleAuraList(); + moduleUnit.AuraSpellIds = SingleAuraList(); break; case UnitSelectorKind.UnitWithDispelType: moduleUnit.DispelType = SelectedDispelType(); break; } - if (UnitRequiresAura(moduleUnit.Kind) && (moduleUnit.AuraNames is null || moduleUnit.AuraNames.Count == 0)) + if (UnitRequiresAura(moduleUnit.Kind) && (moduleUnit.AuraSpellIds is null || moduleUnit.AuraSpellIds.Count == 0)) { MessageBox.Show("请选择光环。", "Shigure", MessageBoxButtons.OK, MessageBoxIcon.Warning); return; @@ -1107,7 +1110,8 @@ public sealed class UnitEditorForm : Form or UnitSelectorKind.UnitWithRoleWithoutAura or UnitSelectorKind.UnitWithAura; - private string? SelectedAura() => _auraBox.SelectedItem?.ToString(); + private long? SelectedAura() + => TryReadAuraSpellId(_auraBox.SelectedItem, out var spellId) ? spellId : null; private LowestHealthAuraFilterKind SelectedLowestHealthAuraFilter() => (_lowestHealthAuraFilterBox.SelectedItem as LowestHealthAuraFilterItem)?.Kind @@ -1116,20 +1120,20 @@ public sealed class UnitEditorForm : Form private UnitRoleFilterKind? SelectedLowestHealthRoleFilter() => (_lowestHealthRoleFilterBox.SelectedItem as LowestHealthRoleFilterItem)?.Kind; - private List SingleAuraList() + private List SingleAuraList() { var aura = SelectedAura(); - return string.IsNullOrEmpty(aura) ? new List() : new List { aura }; + return aura is null ? new List() : new List { aura.Value }; } - private List CheckedAuras() + private List CheckedAuras() { - var list = new List(); + var list = new List(); foreach (var item in _aurasBox.CheckedItems) { - if (item?.ToString() is { Length: > 0 } name) + if (TryReadAuraSpellId(item, out var spellId) && !list.Contains(spellId)) { - list.Add(name); + list.Add(spellId); } } @@ -1286,42 +1290,104 @@ public sealed class UnitEditorForm : Form _dispelTypeBox.SelectedIndex = 0; } - private static void SelectAura(UiDropDown box, string? aura) + private static void SelectAura(UiDropDown box, long? auraSpellId) { - if (string.IsNullOrEmpty(aura)) + if (auraSpellId is null) { return; } - var index = box.Items.IndexOf(aura); + var index = -1; + for (var i = 0; i < box.Items.Count; i++) + { + if (TryReadAuraSpellId(box.Items[i], out var existing) && existing == auraSpellId) + { + index = i; + break; + } + } if (index < 0) { - box.Items.Add(aura); + box.Items.Add(UnknownAura(auraSpellId.Value)); index = box.Items.Count - 1; } box.SelectedIndex = index; } - private void CheckAuras(List? auras) + private void CheckAuras(List? auraSpellIds) { - if (auras is null) + if (auraSpellIds is null) { return; } - foreach (var aura in auras) + foreach (var auraSpellId in auraSpellIds) { - var index = _aurasBox.Items.IndexOf(aura); + var index = -1; + for (var i = 0; i < _aurasBox.Items.Count; i++) + { + if (TryReadAuraSpellId(_aurasBox.Items[i], out var existing) && existing == auraSpellId) + { + index = i; + break; + } + } if (index < 0) { - index = _aurasBox.Items.Add(aura); + index = _aurasBox.Items.Add(UnknownAura(auraSpellId)); } _aurasBox.SetItemChecked(index, true); } } + private static ConditionField UnknownAura(long spellId) + => new( + SpellFieldKey.AuraMember(spellId), + $"未知光环 / {spellId}", + ConditionFieldType.Int, + ConditionFieldCategory.Aura); + + private static bool TryReadAuraSpellId(object? item, out long spellId) + { + var value = item is ConditionField field ? field.Name : item?.ToString(); + foreach (var part in value?.Split('.', StringSplitOptions.RemoveEmptyEntries | StringSplitOptions.TrimEntries) ?? []) + { + if (long.TryParse(part, out spellId) && spellId > 0) + { + return true; + } + } + + spellId = 0; + return false; + } + + private string? ResolveAuraName(long spellId) + => _auraFields.FirstOrDefault(field => TryReadAuraSpellId(field, out var id) && id == spellId) + ?.DisplayName.Split(" / ", 2, StringSplitOptions.TrimEntries)[0]; + + private long? ResolveLegacyAura(string? name) + { + if (string.IsNullOrWhiteSpace(name)) + { + return null; + } + + var matches = _auraFields + .Where(field => string.Equals( + field.DisplayName.Split(" / ", 2, StringSplitOptions.TrimEntries)[0], + name.Trim(), + StringComparison.Ordinal)) + .Select(field => TryReadAuraSpellId(field, out var id) ? id : 0) + .Where(id => id > 0) + .Distinct() + .Take(2) + .ToArray(); + return matches.Length == 1 ? matches[0] : null; + } + private static decimal Clamp(int value, NumericUpDown box) { return Math.Clamp(value, (int)box.Minimum, (int)box.Maximum); diff --git a/UI/UnitSummary.cs b/UI/UnitSummary.cs index bb362ec9..b91a7ad7 100644 --- a/UI/UnitSummary.cs +++ b/UI/UnitSummary.cs @@ -6,14 +6,16 @@ namespace Shigure; /// internal static class UnitSummary { - public static string Describe(ModuleUnit unit) + public static string Describe(ModuleUnit unit, Func? resolveAuraName = null) { var threshold = DescribeThreshold( unit.HealthThreshold, unit.HealthThresholdField, IsHealingAbsorbKind(unit.Kind) ? 0 : 100); - var aura = unit.AuraNames is { Count: > 0 } ? unit.AuraNames[0] : "?"; - var auras = unit.AuraNames is { Count: > 0 } ? string.Join("/", unit.AuraNames) : "?"; + var aura = unit.AuraSpellIds is { Count: > 0 } ? FormatAura(unit.AuraSpellIds[0], resolveAuraName) : "?"; + var auras = unit.AuraSpellIds is { Count: > 0 } + ? string.Join("/", unit.AuraSpellIds.Select(id => FormatAura(id, resolveAuraName))) + : "?"; var dir = unit.Reverse ? "逆序" : "正序"; var roleFilter = DescribeRoleFilter(unit); return roleFilter + (unit.Kind switch @@ -38,25 +40,32 @@ internal static class UnitSummary }); } - public static string Describe(ModuleCountField count) + public static string Describe(ModuleCountField count, Func? resolveAuraName = null) { var threshold = DescribeThreshold( count.HealthThreshold, count.HealthThresholdField, IsHealingAbsorbKind(count.Kind) ? 0 : 100); + var aura = count.AuraSpellId is { } id ? FormatAura(id, resolveAuraName) : "?"; return count.Kind switch { CountKind.UnitsBelowHealth => $"血量<{threshold} 的人数", - CountKind.UnitsWithoutAuraBelowHealth => $"不带[{count.AuraName}]且血<{threshold} 的人数", - CountKind.UnitsWithAuraBelowHealth => $"带[{count.AuraName}]且血<{threshold} 的人数", - CountKind.UnitsWithAura => $"带[{count.AuraName}] 的人数", + CountKind.UnitsWithoutAuraBelowHealth => $"不带[{aura}]且血<{threshold} 的人数", + CountKind.UnitsWithAuraBelowHealth => $"带[{aura}]且血<{threshold} 的人数", + CountKind.UnitsWithAura => $"带[{aura}] 的人数", CountKind.UnitsAboveHealingAbsorb => $"治疗吸收>{threshold} 的人数", - CountKind.UnitsWithoutAuraAboveHealingAbsorb => $"不带[{count.AuraName}]且治疗吸收>{threshold} 的人数", - CountKind.UnitsWithAuraAboveHealingAbsorb => $"带[{count.AuraName}]且治疗吸收>{threshold} 的人数", + CountKind.UnitsWithoutAuraAboveHealingAbsorb => $"不带[{aura}]且治疗吸收>{threshold} 的人数", + CountKind.UnitsWithAuraAboveHealingAbsorb => $"带[{aura}]且治疗吸收>{threshold} 的人数", _ => count.Kind.ToString() }; } + private static string FormatAura(long spellId, Func? resolveAuraName) + { + var name = resolveAuraName?.Invoke(spellId); + return string.IsNullOrWhiteSpace(name) ? spellId.ToString() : $"{name} / {spellId}"; + } + private static string DescribeThreshold(int? fixedValue, string? field, int defaultValue = 100) { return string.IsNullOrWhiteSpace(field) diff --git a/config/DeathKnight.json b/config/DeathKnight.json index e7943b3b..4bcc269e 100644 --- a/config/DeathKnight.json +++ b/config/DeathKnight.json @@ -1,77 +1,77 @@ { "keymap": "deathknight.json", "一键法术": { - "1": "反魔法领域", - "2": "窒息", - "3": "致盲冰雨", - "4": "亡者大军", - "5": "心脏打击", - "6": "枯萎凋零", - "7": "死神的抚摩", - "8": "灵界打击", - "9": "符文刃舞", - "10": "精髓分裂", - "11": "血液沸腾", - "12": "吸血鬼打击", - "13": "亡者复生", - "14": "凋零缠绕", - "15": "天灾打击", - "16": "扩散", - "17": "爆发", - "18": "脓疮打击", - "19": "腐化", - "20": "黑暗突变", - "21": "灵魂收割", - "22": "脓疮毒镰", - "23": "血魔之握", - "24": "憎恶附肢", - "25": "死神印记", - "26": "冰川突进", - "27": "冰霜巨龙之怒", - "28": "冷酷严冬", - "29": "冰霜之柱", - "30": "冰霜打击", - "31": "凛风冲击", - "32": "冰霜之镰", - "33": "冰龙吐息", - "34": "湮灭", - "35": "符文武器增效", - "36": "符文打击", - "37": "冰霜巨龙之怒", - "38": "冰霜灾祸", - "39": "死亡之握", - "40": "吞噬", - "41": "灾殃坟茔", - "42": "死灵缠绕", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 51052, + "2": 221562, + "3": 207167, + "4": 42650, + "5": 206930, + "6": 43265, + "7": 195292, + "8": 49998, + "9": 49028, + "10": 195182, + "11": 50842, + "12": 433895, + "13": 46584, + "14": 47541, + "15": 55090, + "16": 207317, + "17": 77575, + "18": 85948, + "19": 1247378, + "20": 1233448, + "21": 343294, + "22": 458128, + "23": 108199, + "24": 1263569, + "25": 439843, + "26": 194913, + "27": 279302, + "28": 196770, + "29": 51271, + "30": 49143, + "31": 49184, + "32": 207230, + "33": 1249658, + "34": 49020, + "35": 47568, + "36": 316239, + "37": 1265384, + "38": 1228433, + "39": 49576, + "40": 1263824, + "41": 383269, + "42": 1242174, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -165,7 +165,7 @@ "category": "状态" }, "符文": { - "step": 26, + "step": 27, "type": "int", "category": "能量" }, @@ -179,324 +179,515 @@ "type": "int", "category": "状态" }, - "符文能量": { + "吸血鬼打击": { "step": 25, "type": "int", + "category": "状态" + }, + "符文能量": { + "step": 26, + "type": "int", "category": "能量" }, "治疗石": { - "step": 27, - "type": "int", - "category": "物品" - }, - "鲁莽药水": { "step": 28, "type": "int", "category": "物品" }, - "圣光潜力": { + "鲁莽药水": { "step": 29, "type": "int", "category": "物品" }, - "爆发开关": { + "圣光潜力": { "step": 30, "type": "int", - "category": "配置开关" + "category": "物品" }, - "爆发药水开关": { + "爆发开关": { "step": 31, "type": "int", "category": "配置开关" }, - "目标类型": { + "爆发药水开关": { "step": 32, "type": "int", - "category": "目标" + "category": "配置开关" }, - "目标生命值": { + "目标类型": { "step": 33, "type": "int", "category": "目标" }, - "目标施法(倒计时)": { + "目标生命值": { "step": 34, "type": "int", "category": "目标" }, - "目标施法(正计时)": { + "目标施法(倒计时)": { "step": 35, "type": "int", "category": "目标" }, - "目标施法可打断": { + "目标施法(正计时)": { "step": 36, "type": "int", "category": "目标" }, - "目标引导": { + "目标施法可打断": { "step": 37, "type": "int", "category": "目标" }, - "目标引导可打断": { + "目标引导": { "step": 38, "type": "int", "category": "目标" }, - "目标距离": { + "目标引导可打断": { "step": 39, "type": "int", "category": "目标" }, - "焦点施法(倒计时)": { + "目标距离": { "step": 40, "type": "int", - "category": "焦点" + "category": "目标" }, - "焦点施法(正计时)": { + "焦点施法(倒计时)": { "step": 41, "type": "int", "category": "焦点" }, - "焦点施法可打断": { + "焦点施法(正计时)": { "step": 42, "type": "int", "category": "焦点" }, - "焦点引导": { + "焦点施法可打断": { "step": 43, "type": "int", "category": "焦点" }, - "焦点引导可打断": { + "焦点引导": { "step": 44, "type": "int", "category": "焦点" }, - "焦点距离": { + "焦点引导可打断": { "step": 45, "type": "int", "category": "焦点" }, - "鼠标类型": { + "焦点距离": { "step": 46, "type": "int", - "category": "鼠标" + "category": "焦点" }, - "鼠标驱散类型": { + "鼠标类型": { "step": 47, "type": "int", "category": "鼠标" }, - "鼠标生命值": { + "鼠标驱散类型": { "step": 48, "type": "int", "category": "鼠标" }, - "鼠标距离": { + "鼠标生命值": { "step": 49, "type": "int", "category": "鼠标" }, - "鼠标施法(倒计时)": { + "鼠标距离": { "step": 50, "type": "int", "category": "鼠标" }, - "鼠标施法(正计时)": { + "鼠标施法(倒计时)": { "step": 51, "type": "int", "category": "鼠标" }, - "鼠标施法可打断": { + "鼠标施法(正计时)": { "step": 52, "type": "int", "category": "鼠标" }, - "鼠标引导": { + "鼠标施法可打断": { "step": 53, "type": "int", "category": "鼠标" }, - "鼠标引导可打断": { + "鼠标引导": { "step": 54, "type": "int", "category": "鼠标" }, + "鼠标引导可打断": { + "step": 55, + "type": "int", + "category": "鼠标" + }, "auras": { - "白骨之盾": { - "step": 55, - "type": "int", - "category": "玩家" - }, - "符文刃舞": { + "player.195181.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "白骨之盾", + "spellId": 195181, + "scope": "player", + "metric": "value", + "spellIds": [ + 195181 + ] }, - "吸血鬼之血": { + "player.195181.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "白骨之盾层数", + "spellId": 195181, + "scope": "player", + "metric": "apps", + "spellIds": [ + 195181 + ], + "bar": 3 + }, + "player.81256.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "符文刃舞", + "spellId": 81256, + "scope": "player", + "metric": "value", + "spellIds": [ + 81256 + ] }, - "冰封之韧": { + "player.55233.value": { "step": 58, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "吸血鬼之血", + "spellId": 55233, + "scope": "player", + "metric": "value", + "spellIds": [ + 55233 + ] }, - "枯萎凋零": { + "player.48792.value": { "step": 59, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "冰封之韧", + "spellId": 48792, + "scope": "player", + "metric": "value", + "spellIds": [ + 48792 + ] }, - "破灭": { + "player.188290.value": { "step": 60, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "枯萎凋零", + "spellId": 188290, + "scope": "player", + "metric": "value", + "spellIds": [ + 188290 + ] }, - "午夜舞步": { + "player.441416.value": { "step": 61, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "破灭", + "spellId": 441416, + "scope": "player", + "metric": "value", + "spellIds": [ + 441416 + ] }, - "沸点": { + "player.1264407.value": { "step": 62, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "午夜舞步", + "spellId": 1264407, + "scope": "player", + "metric": "value", + "spellIds": [ + 1264407 + ] }, - "赤色天灾": { + "player.1265968.value": { "step": 63, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "沸点", + "spellId": 1265968, + "scope": "player", + "metric": "value", + "spellIds": [ + 1265968 + ] }, - "鲜血护盾": { + "player.81136.value": { "step": 64, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "赤色天灾", + "spellId": 81136, + "scope": "player", + "metric": "value", + "spellIds": [ + 81136 + ] }, - "鲜血禁闭": { + "player.77535.value": { "step": 65, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "鲜血护盾", + "spellId": 77535, + "scope": "player", + "metric": "value", + "spellIds": [ + 77535 + ] }, - "鲜血女王的精华": { + "player.77535.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "鲜血护盾层数", + "spellId": 77535, + "scope": "player", + "metric": "apps", + "spellIds": [ + 77535 + ], + "bar": 4 + }, + "player.273947.value": { "step": 66, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "鲜血禁闭", + "spellId": 273947, + "scope": "player", + "metric": "value", + "spellIds": [ + 273947 + ] }, - "目标血之疫病": { + "player.273947.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "鲜血禁闭层数", + "spellId": 273947, + "scope": "player", + "metric": "apps", + "spellIds": [ + 273947 + ], + "bar": 5 + }, + "player.433925.value": { "step": 67, "type": "int", - "category": "目标减益" + "category": "玩家", + "displayName": "鲜血女王的精华", + "spellId": 433925, + "scope": "player", + "metric": "value", + "spellIds": [ + 433925 + ] }, - "白骨之盾层数": { + "player.433925.apps": { "step": "bar", - "bar": 3, - "type": "int" + "type": "int", + "category": "玩家", + "displayName": "鲜血女王的精华层数", + "spellId": 433925, + "scope": "player", + "metric": "apps", + "spellIds": [ + 433925 + ], + "bar": 6 }, - "鲜血护盾层数": { - "step": "bar", - "bar": 4, - "type": "int" - }, - "鲜血禁闭层数": { - "step": "bar", - "bar": 5, - "type": "int" - }, - "鲜血女王的精华层数": { - "step": "bar", - "bar": 6, - "type": "int" + "target.harmful.55078.value": { + "step": 68, + "type": "int", + "category": "目标减益", + "displayName": "血之疫病", + "spellId": 55078, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 55078 + ] } }, "spells": { - "死亡之握": { - "step": 68, - "type": "int" - }, - "反魔法领域": { + "49576.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "死亡之握", + "spellId": 49576, + "metric": "cooldown" }, - "窒息": { + "51052.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "反魔法领域", + "spellId": 51052, + "metric": "cooldown" }, - "致盲冰雨": { + "221562.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "窒息", + "spellId": 221562, + "metric": "cooldown" }, - "心灵冰冻": { + "207167.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "致盲冰雨", + "spellId": 207167, + "metric": "cooldown" }, - "死神的抚摩": { + "47528.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "心灵冰冻", + "spellId": 47528, + "metric": "cooldown" }, - "死神印记": { + "195292.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "死神的抚摩", + "spellId": 195292, + "metric": "cooldown" }, - "亡者复生": { + "439843.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "死神印记", + "spellId": 439843, + "metric": "cooldown" }, - "吸血鬼之血": { + "46585.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "亡者复生", + "spellId": 46585, + "metric": "cooldown" }, - "冰封之韧": { + "55233.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "吸血鬼之血", + "spellId": 55233, + "metric": "cooldown" }, - "巫妖之躯": { + "48792.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "冰封之韧", + "spellId": 48792, + "metric": "cooldown" }, - "血魔之握": { + "49039.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "巫妖之躯", + "spellId": 49039, + "metric": "cooldown" }, - "憎恶附肢": { + "108199.cooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "血魔之握", + "spellId": 108199, + "metric": "cooldown" }, - "吞噬": { + "1263569.cooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "憎恶附肢", + "spellId": 1263569, + "metric": "cooldown" }, - "血液沸腾": { + "1263824.cooldown": { "step": 82, - "type": "int" + "type": "int", + "displayName": "吞噬", + "spellId": 1263824, + "metric": "cooldown" }, - "血液沸腾充能": { + "50842.cooldown": { "step": 83, - "type": "int" + "type": "int", + "displayName": "血液沸腾", + "spellId": 50842, + "metric": "cooldown" }, - "血液沸腾层数": { + "50842.chargeCooldown": { + "step": 84, + "type": "int", + "displayName": "血液沸腾充能", + "spellId": 50842, + "metric": "chargeCooldown" + }, + "50842.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "血液沸腾层数", + "spellId": 50842, + "metric": "count" }, - "枯萎凋零": { - "step": 84, - "type": "int" - }, - "枯萎凋零充能": { + "43265.cooldown": { "step": 85, - "type": "int" + "type": "int", + "displayName": "枯萎凋零", + "spellId": 43265, + "metric": "cooldown" }, - "枯萎凋零层数": { + "43265.chargeCooldown": { + "step": 86, + "type": "int", + "displayName": "枯萎凋零充能", + "spellId": 43265, + "metric": "chargeCooldown" + }, + "43265.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "枯萎凋零层数", + "spellId": 43265, + "metric": "count" }, - "符文刃舞": { - "step": 86, - "type": "int" + "49028.cooldown": { + "step": 87, + "type": "int", + "displayName": "符文刃舞", + "spellId": 49028, + "metric": "cooldown" } } }, @@ -727,101 +918,218 @@ "category": "鼠标" }, "auras": { - "白霜": { + "player.59052.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "白霜", + "spellId": 59052, + "scope": "player", + "metric": "value", + "spellIds": [ + 59057, + 59052 + ] }, - "冰霜之柱": { + "player.51271.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "冰霜之柱", + "spellId": 51271, + "scope": "player", + "metric": "value", + "spellIds": [ + 51271 + ] }, - "杀戮机器": { + "player.51124.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "杀戮机器", + "spellId": 51124, + "scope": "player", + "metric": "value", + "spellIds": [ + 51128, + 51124 + ] }, - "冰龙吐息": { - "step": 58, + "player.1249658.value": { + "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "冰龙吐息", + "spellId": 1249658, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249658 + ] }, - "黑暗援助": { + "player.101568.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "黑暗援助", + "spellId": 101568, + "scope": "player", + "metric": "value", + "spellIds": [ + 101568 + ] }, - "霜巢之眷": { + "player.1265639.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "霜巢之眷", + "spellId": 1265639, + "scope": "player", + "metric": "value", + "spellIds": [ + 1265639 + ] }, - "破灭": { + "player.441378.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "破灭", + "spellId": 441378, + "scope": "player", + "metric": "value", + "spellIds": [ + 441426, + 447954, + 441424, + 441416, + 441378 + ] }, - "冷酷严冬": { + "player.1233152.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "冷酷严冬", + "spellId": 1233152, + "scope": "player", + "metric": "value", + "spellIds": [ + 1233152 + ] }, - "强效打击": { + "player.1269300.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "强效打击", + "spellId": 1269300, + "scope": "player", + "metric": "value", + "spellIds": [ + 1269300 + ] + }, + "player.12449658.value": { + "step": 58, + "type": "int", + "category": "玩家", + "displayName": "冰龙吐息", + "spellId": 12449658, + "scope": "player", + "metric": "value", + "spellIds": [ + 12449658 + ] } }, "spells": { - "死亡之握": { + "49576.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "死亡之握", + "spellId": 49576, + "metric": "cooldown" }, - "反魔法领域": { + "51052.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "反魔法领域", + "spellId": 51052, + "metric": "cooldown" }, - "窒息": { + "221562.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "窒息", + "spellId": 221562, + "metric": "cooldown" }, - "致盲冰雨": { + "207167.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "致盲冰雨", + "spellId": 207167, + "metric": "cooldown" }, - "冰霜之柱": { + "51271.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "冰霜之柱", + "spellId": 51271, + "metric": "cooldown" }, - "冰霜巨龙之怒": { + "279302.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "冰霜巨龙之怒", + "spellId": 279302, + "metric": "cooldown" }, - "死神印记": { + "439843.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "死神印记", + "spellId": 439843, + "metric": "cooldown" }, - "符文武器增效": { + "47568.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "符文武器增效", + "spellId": 47568, + "metric": "cooldown" }, - "符文武器增效充能": { + "47568.chargeCooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "符文武器增效充能", + "spellId": 47568, + "metric": "chargeCooldown" }, - "符文武器增效层数": { + "47568.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "符文武器增效层数", + "spellId": 47568, + "metric": "count" }, - "冰龙吐息": { + "1249658.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "冰龙吐息", + "spellId": 1249658, + "metric": "cooldown" }, - "心灵冰冻": { + "47528.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "心灵冰冻", + "spellId": 47528, + "metric": "cooldown" } } }, @@ -916,7 +1224,7 @@ "type": "int", "category": "状态" }, - "施法": { + "吸血鬼打击": { "step": 22, "type": "int", "category": "状态" @@ -1006,168 +1314,206 @@ "type": "int", "category": "目标" }, - "目标施法": { - "step": 40, - "type": "int", - "category": "目标" - }, "焦点类型": { - "step": 41, + "step": 40, "type": "int", "category": "焦点" }, "焦点生命值": { - "step": 42, + "step": 41, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 43, + "step": 42, "type": "int", "category": "焦点" }, "焦点施法(倒计时)": { - "step": 44, + "step": 43, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 45, + "step": 44, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 46, + "step": 45, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 47, + "step": 46, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 48, - "type": "int", - "category": "焦点" - }, - "焦点施法": { - "step": 49, + "step": 47, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 50, + "step": 48, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 51, + "step": 49, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 52, + "step": 50, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 53, + "step": 51, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 54, + "step": 52, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 55, + "step": 53, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 56, + "step": 54, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 57, + "step": 55, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 58, + "step": 56, "type": "int", "category": "鼠标" }, "spells": { - "死亡之握": { + "49576.cooldown": { + "step": 57, + "type": "int", + "displayName": "死亡之握", + "spellId": 49576, + "metric": "cooldown" + }, + "51052.cooldown": { + "step": 58, + "type": "int", + "displayName": "反魔法领域", + "spellId": 51052, + "metric": "cooldown" + }, + "221562.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "窒息", + "spellId": 221562, + "metric": "cooldown" }, - "反魔法领域": { + "207167.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "致盲冰雨", + "spellId": 207167, + "metric": "cooldown" }, - "窒息": { + "46584.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "亡者复生", + "spellId": 46584, + "metric": "cooldown" }, - "致盲冰雨": { + "42650.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "亡者大军", + "spellId": 42650, + "metric": "cooldown" }, - "亡者复生": { + "1247378.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "腐化", + "spellId": 1247378, + "metric": "cooldown" }, - "亡者大军": { + "1247378.chargeCooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "腐化充能", + "spellId": 1247378, + "metric": "chargeCooldown" }, - "腐化": { - "step": 65, - "type": "int" - }, - "腐化充能": { - "step": 66, - "type": "int" - }, - "腐化层数": { + "1247378.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "腐化层数", + "spellId": 1247378, + "metric": "count" }, - "黑暗突变": { + "1233448.cooldown": { + "step": 65, + "type": "int", + "displayName": "黑暗突变", + "spellId": 1233448, + "metric": "cooldown" + }, + "343294.cooldown": { + "step": 66, + "type": "int", + "displayName": "灵魂收割", + "spellId": 343294, + "metric": "cooldown" + }, + "43265.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "枯萎凋零", + "spellId": 43265, + "metric": "cooldown" }, - "灵魂收割": { + "43265.chargeCooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "枯萎凋零充能", + "spellId": 43265, + "metric": "chargeCooldown" }, - "枯萎凋零": { - "step": 69, - "type": "int" - }, - "枯萎凋零充能": { - "step": 70, - "type": "int" - }, - "枯萎凋零层数": { + "43265.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "枯萎凋零层数", + "spellId": 43265, + "metric": "count" }, - "天灾打击": { - "step": 71, - "type": "int" + "55090.cooldown": { + "step": 69, + "type": "int", + "displayName": "天灾打击", + "spellId": 55090, + "metric": "cooldown" }, - "天灾打击层数": { + "55090.count": { "step": "bar", "bar": 3, - "type": "int" + "type": "int", + "displayName": "天灾打击层数", + "spellId": 55090, + "metric": "count" } } } diff --git a/config/DemonHunter.json b/config/DemonHunter.json index 2bbacd47..6ae43b31 100644 --- a/config/DemonHunter.json +++ b/config/DemonHunter.json @@ -1,92 +1,92 @@ { "keymap": "demonhunter.json", "一键法术": { - "1": "复仇回避", - "2": "投掷利刃", - "3": "悲苦咒符", - "4": "禁锢", - "5": "献祭光环", - "6": "混乱新星", - "7": "恶魔变形", - "8": "邪能之刃", - "9": "刃舞", - "10": "混乱打击", - "11": "疾影", - "12": "恶魔追击", - "13": "眼棱", - "14": "邪能冲撞", - "15": "精华破碎", - "16": "恶魔变形", - "17": "地狱火撞击", - "18": "恶魔尖刺", - "19": "烈火烙印", - "20": "幽魂炸弹", - "21": "灵魂切削", - "22": "烈焰咒符", - "23": "怨念咒符", - "24": "灵魂裂劈", - "25": "破裂", - "26": "邪能毁灭", - "27": "沉默咒符", - "28": "虚空新星", - "29": "虚空变形", - "30": "虚空之刃", - "31": "变换", - "32": "收割", - "33": "吞噬", - "34": "虚空射线", - "35": "恶魔追击", - "36": "饥渴斩击", - "37": "剔除", - "38": "毁灭", - "39": "死亡横扫", - "40": "吞噬之焰", - "41": "献祭光环", - "42": "投掷利刃", - "43": "黑暗", - "44": "吞噬", - "45": "坍缩之星", - "46": "根除", - "47": "灵魂献祭", - "48": "深渊凝视", - "49": "邪能之刃", - "50": "毁灭", - "51": "毁灭", - "52": "混乱打击", - "53": "混乱打击", - "54": "恶魔变形", - "55": "恶魔变形", - "56": "吞噬之焰", - "57": "收割者战刃", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 198793, + "2": 185123, + "3": 207684, + "4": 217832, + "5": 258920, + "6": 179057, + "7": 191427, + "8": 232893, + "9": 188499, + "10": 162794, + "11": 198589, + "12": 370965, + "13": 198013, + "14": 195072, + "15": 258860, + "16": 187827, + "17": 189110, + "18": 203720, + "19": 204021, + "20": 247454, + "21": 207407, + "22": 204596, + "23": 390163, + "24": 228477, + "25": 263642, + "26": 212084, + "27": 202137, + "28": 1234195, + "29": 1217605, + "30": 1245412, + "31": 1234796, + "32": 1226019, + "33": 473662, + "34": 473728, + "35": 1246167, + "36": 1239123, + "37": 1245453, + "38": 201427, + "39": 210152, + "40": 452487, + "41": 427917, + "42": 204157, + "43": 196718, + "44": 1217610, + "45": 1221150, + "46": 1225826, + "47": 1241937, + "48": 452497, + "49": 213243, + "50": 227518, + "51": 201428, + "52": 222031, + "53": 199547, + "54": 201453, + "55": 200166, + "56": 456640, + "57": 1283344, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -285,73 +285,124 @@ "category": "鼠标" }, "spells": { - "黑暗": { + "196718.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "黑暗", + "spellId": 196718, + "metric": "cooldown" }, - "复仇回避": { + "198793.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "复仇回避", + "spellId": 198793, + "metric": "cooldown" }, - "投掷利刃": { + "185123.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "投掷利刃", + "spellId": 185123, + "metric": "cooldown" }, - "投掷利刃充能": { + "185123.chargeCooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "投掷利刃充能", + "spellId": 185123, + "metric": "chargeCooldown" }, - "悲苦咒符": { + "207684.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "悲苦咒符", + "spellId": 207684, + "metric": "cooldown" }, - "禁锢": { + "217832.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "禁锢", + "spellId": 217832, + "metric": "cooldown" }, - "献祭光环": { + "258920.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "献祭光环", + "spellId": 258920, + "metric": "cooldown" }, - "混乱新星": { + "179057.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "混乱新星", + "spellId": 179057, + "metric": "cooldown" }, - "恶魔变形": { + "191427.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "恶魔变形", + "spellId": 191427, + "metric": "cooldown" }, - "邪能之刃": { + "232893.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "邪能之刃", + "spellId": 232893, + "metric": "cooldown" }, - "刃舞": { + "188499.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "刃舞", + "spellId": 188499, + "metric": "cooldown" }, - "混乱打击": { + "162794.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "混乱打击", + "spellId": 162794, + "metric": "cooldown" }, - "疾影": { + "198589.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "疾影", + "spellId": 198589, + "metric": "cooldown" }, - "恶魔追击": { + "370965.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "恶魔追击", + "spellId": 370965, + "metric": "cooldown" }, - "眼棱": { + "198013.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "眼棱", + "spellId": 198013, + "metric": "cooldown" }, - "邪能冲撞": { + "195072.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "邪能冲撞", + "spellId": 195072, + "metric": "cooldown" }, - "精华破碎": { + "258860.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "精华破碎", + "spellId": 258860, + "metric": "cooldown" } } }, @@ -592,207 +643,405 @@ "category": "鼠标" }, "auras": { - "恶魔尖刺": { + "player.203819.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "恶魔尖刺", + "spellId": 203819, + "scope": "player", + "metric": "value", + "spellIds": [ + 203819 + ] }, - "烈火烙印": { + "player.207771.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "烈火烙印", + "spellId": 207771, + "scope": "player", + "metric": "value", + "spellIds": [ + 207771 + ] }, - "灵魂残片": { + "player.203981.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "灵魂残片", + "spellId": 203981, + "scope": "player", + "metric": "value", + "spellIds": [ + 203981 + ] }, - "献祭光环": { + "player.203981.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "灵魂残片层数", + "spellId": 203981, + "scope": "player", + "metric": "apps", + "spellIds": [ + 203981 + ], + "bar": 6 + }, + "player.258920.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "献祭光环", + "spellId": 258920, + "scope": "player", + "metric": "value", + "spellIds": [ + 258920 + ] }, - "战刃绝技": { + "player.444661.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "战刃绝技", + "spellId": 444661, + "scope": "player", + "metric": "value", + "spellIds": [ + 444661 + ] }, - "撕裂猛击": { + "player.444661.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "战刃绝技层数", + "spellId": 444661, + "scope": "player", + "metric": "apps", + "spellIds": [ + 444661 + ], + "bar": 7 + }, + "player.442442.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "撕裂猛击", + "spellId": 442442, + "scope": "player", + "metric": "value", + "spellIds": [ + 442442 + ] }, - "战刃乱舞": { + "player.442435.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "战刃乱舞", + "spellId": 442435, + "scope": "player", + "metric": "value", + "spellIds": [ + 442435 + ] }, - "酣战热血": { + "player.442695.value": { "step": 58, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "酣战热血", + "spellId": 442695, + "scope": "player", + "metric": "value", + "spellIds": [ + 442695 + ] }, - "沸腾怒意": { + "player.1270547.value": { "step": 59, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "沸腾怒意", + "spellId": 1270547, + "scope": "player", + "metric": "value", + "spellIds": [ + 1270547 + ] }, - "无羁邪怒": { + "player.1270547.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "沸腾怒意层数", + "spellId": 1270547, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1270547 + ], + "bar": 8 + }, + "player.1270476.value": { "step": 60, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "无羁邪怒", + "spellId": 1270476, + "scope": "player", + "metric": "value", + "spellIds": [ + 1270476 + ] }, - "目标烈焰咒符": { + "target.harmful.204598.value": { "step": 61, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "烈焰咒符", + "spellId": 204598, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 204598 + ] }, - "目标脆弱": { + "target.harmful.247456.value": { "step": 62, "type": "int", - "category": "目标减益" - }, - "灵魂残片层数": { - "step": "bar", - "bar": 6, - "type": "int" - }, - "战刃绝技层数": { - "step": "bar", - "bar": 7, - "type": "int" - }, - "沸腾怒意层数": { - "step": "bar", - "bar": 8, - "type": "int" + "category": "目标减益", + "displayName": "脆弱", + "spellId": 247456, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 247456 + ] } }, "spells": { - "破裂": { + "263642.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "破裂", + "spellId": 263642, + "metric": "cooldown" }, - "破裂充能": { + "263642.chargeCooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "破裂充能", + "spellId": 263642, + "metric": "chargeCooldown" }, - "破裂层数": { + "263642.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "破裂层数", + "spellId": 263642, + "metric": "count" }, - "灵魂裂劈": { + "228477.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "灵魂裂劈", + "spellId": 228477, + "metric": "cooldown" }, - "灵魂裂劈层数": { + "228477.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "灵魂裂劈层数", + "spellId": 228477, + "metric": "count" }, - "幽魂炸弹": { + "247454.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "幽魂炸弹", + "spellId": 247454, + "metric": "cooldown" }, - "怨念咒符": { + "390163.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "怨念咒符", + "spellId": 390163, + "metric": "cooldown" }, - "烈焰咒符": { + "204596.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "烈焰咒符", + "spellId": 204596, + "metric": "cooldown" }, - "邪能之刃": { + "232893.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "邪能之刃", + "spellId": 232893, + "metric": "cooldown" }, - "投掷利刃": { + "185123.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "投掷利刃", + "spellId": 185123, + "metric": "cooldown" }, - "投掷利刃充能": { + "185123.chargeCooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "投掷利刃充能", + "spellId": 185123, + "metric": "chargeCooldown" }, - "投掷利刃层数": { + "185123.count": { "step": "bar", "bar": 3, - "type": "int" + "type": "int", + "displayName": "投掷利刃层数", + "spellId": 185123, + "metric": "count" }, - "献祭光环": { + "258920.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "献祭光环", + "spellId": 258920, + "metric": "cooldown" }, - "恶魔尖刺": { + "203720.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "恶魔尖刺", + "spellId": 203720, + "metric": "cooldown" }, - "瓦解": { + "183752.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "瓦解", + "spellId": 183752, + "metric": "cooldown" }, - "烈火烙印": { + "204021.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "烈火烙印", + "spellId": 204021, + "metric": "cooldown" }, - "烈火烙印充能": { + "204021.chargeCooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "烈火烙印充能", + "spellId": 204021, + "metric": "chargeCooldown" }, - "烈火烙印层数": { + "204021.count": { "step": "bar", "bar": 4, - "type": "int" + "type": "int", + "displayName": "烈火烙印层数", + "spellId": 204021, + "metric": "count" }, - "邪能毁灭": { + "212084.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "邪能毁灭", + "spellId": 212084, + "metric": "cooldown" }, - "恶魔变形": { + "187827.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "恶魔变形", + "spellId": 187827, + "metric": "cooldown" }, - "地狱火撞击": { + "189110.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "地狱火撞击", + "spellId": 189110, + "metric": "cooldown" }, - "地狱火撞击充能": { + "189110.chargeCooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "地狱火撞击充能", + "spellId": 189110, + "metric": "chargeCooldown" }, - "地狱火撞击层数": { + "189110.count": { "step": "bar", "bar": 5, - "type": "int" + "type": "int", + "displayName": "地狱火撞击层数", + "spellId": 189110, + "metric": "count" }, - "黑暗": { + "196718.cooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "黑暗", + "spellId": 196718, + "metric": "cooldown" }, - "复仇回避": { + "198793.cooldown": { "step": 82, - "type": "int" + "type": "int", + "displayName": "复仇回避", + "spellId": 198793, + "metric": "cooldown" }, - "悲苦咒符": { + "207684.cooldown": { "step": 83, - "type": "int" + "type": "int", + "displayName": "悲苦咒符", + "spellId": 207684, + "metric": "cooldown" }, - "禁锢": { + "217832.cooldown": { "step": 84, - "type": "int" + "type": "int", + "displayName": "禁锢", + "spellId": 217832, + "metric": "cooldown" }, - "混乱新星": { + "179057.cooldown": { "step": 85, - "type": "int" + "type": "int", + "displayName": "混乱新星", + "spellId": 179057, + "metric": "cooldown" }, - "灵魂切削": { + "207407.cooldown": { "step": 86, - "type": "int" + "type": "int", + "displayName": "灵魂切削", + "spellId": 207407, + "metric": "cooldown" }, - "沉默咒符": { + "202137.cooldown": { "step": 87, - "type": "int" + "type": "int", + "displayName": "沉默咒符", + "spellId": 202137, + "metric": "cooldown" } } }, @@ -988,86 +1237,146 @@ "category": "鼠标" }, "spells": { - "黑暗": { + "196718.cooldown": { "step": 42, - "type": "int" + "type": "int", + "displayName": "黑暗", + "spellId": 196718, + "metric": "cooldown" }, - "复仇回避": { + "198793.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "复仇回避", + "spellId": 198793, + "metric": "cooldown" }, - "投掷利刃": { + "185123.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "投掷利刃", + "spellId": 185123, + "metric": "cooldown" }, - "投掷利刃充能": { + "185123.chargeCooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "投掷利刃充能", + "spellId": 185123, + "metric": "chargeCooldown" }, - "悲苦咒符": { + "207684.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "悲苦咒符", + "spellId": 207684, + "metric": "cooldown" }, - "禁锢": { + "217832.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "禁锢", + "spellId": 217832, + "metric": "cooldown" }, - "献祭光环": { + "258920.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "献祭光环", + "spellId": 258920, + "metric": "cooldown" }, - "虚空新星": { + "1234195.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "虚空新星", + "spellId": 1234195, + "metric": "cooldown" }, - "虚空变形": { + "1217605.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "虚空变形", + "spellId": 1217605, + "metric": "cooldown" }, - "虚空变形层数": { + "1217605.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "虚空变形层数", + "spellId": 1217605, + "metric": "count" }, - "虚空之刃": { + "1245412.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "虚空之刃", + "spellId": 1245412, + "metric": "cooldown" }, - "变换": { + "1234796.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "变换", + "spellId": 1234796, + "metric": "cooldown" }, - "变换充能": { + "1234796.chargeCooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "变换充能", + "spellId": 1234796, + "metric": "chargeCooldown" }, - "收割": { + "1226019.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "收割", + "spellId": 1226019, + "metric": "cooldown" }, - "吞噬": { + "473662.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "吞噬", + "spellId": 473662, + "metric": "cooldown" }, - "疾影": { + "198589.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "疾影", + "spellId": 198589, + "metric": "cooldown" }, - "虚空射线": { + "473728.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "虚空射线", + "spellId": 473728, + "metric": "cooldown" }, - "恶魔追击": { + "1246167.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "恶魔追击", + "spellId": 1246167, + "metric": "cooldown" }, - "饥渴斩击": { + "1239123.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "饥渴斩击", + "spellId": 1239123, + "metric": "cooldown" }, - "剔除": { + "1245453.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "剔除", + "spellId": 1245453, + "metric": "cooldown" } } } diff --git a/config/Druid.json b/config/Druid.json index 965ceabd..11d1e999 100644 --- a/config/Druid.json +++ b/config/Druid.json @@ -1,103 +1,103 @@ { "keymap": "druid.json", "一键法术": { - "1": "台风", - "2": "夺魂咆哮", - "3": "乌索尔旋风", - "4": "自然迅捷", - "5": "月火术", - "6": "野性印记", - "7": "摧折", - "8": "明月普照", - "9": "横扫", - "10": "熊形态", - "11": "痛击", - "12": "裂伤", - "13": "赤红之月", - "14": "毁灭", - "15": "凶猛撕咬", - "16": "割裂", - "17": "撕碎", - "18": "斜掠", - "19": "愤怒", - "20": "愈合", - "21": "野性生长", - "22": "宁静", - "23": "愤怒", - "24": "星涌术", - "25": "星火术", - "26": "万灵之召", - "27": "星辰坠落", - "28": "自然之力", - "29": "日蚀", - "30": "超凡之盟", - "31": "日光术", - "32": "化身:艾露恩之眷", - "33": "艾露恩之怒", - "34": "新月", - "35": "枭兽形态", - "36": "阳炎术", - "37": "月蚀", - "38": "猎豹形态", - "39": "化身:阿莎曼之灵", - "40": "原始之怒", - "41": "迎头痛击", - "42": "怒意狂乱", - "43": "猛虎之怒", - "44": "生存本能", - "45": "野性冲锋", - "46": "群体缠绕", - "47": "狂暴", - "48": "啃噬", - "49": "野性狂乱", - "50": "横扫", - "51": "毁灭", - "52": "碎甲咆哮", - "53": "重殴", - "54": "野性之心", - "55": "迎头痛击", - "56": "迎头痛击", - "57": "铁鬃", - "58": "明月普照", - "59": "树皮术", - "60": "安抚", - "61": "急奔", - "62": "纠缠根须", - "63": "清除腐蚀", - "64": "低吼", - "65": "狂奔怒吼", - "66": "旅行形态", - "67": "化身:乌索克的守护者", - "68": "狂奔怒吼", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 132469, + "2": 99, + "3": 102793, + "4": 132158, + "5": 8921, + "6": 1126, + "7": 400254, + "8": 204066, + "9": 213771, + "10": 5487, + "11": 77758, + "12": 33917, + "13": 1252871, + "14": 441605, + "15": 22568, + "16": 1079, + "17": 5221, + "18": 1822, + "19": 5176, + "20": 8936, + "21": 48438, + "22": 740, + "23": 190984, + "24": 78674, + "25": 194153, + "26": 391528, + "27": 191034, + "28": 205636, + "29": 1233346, + "30": 194223, + "31": 78675, + "32": 102560, + "33": 202770, + "34": 274281, + "35": 24858, + "36": 93402, + "37": 1233272, + "38": 768, + "39": 102543, + "40": 285381, + "41": 106839, + "42": 1243807, + "43": 5217, + "44": 61336, + "45": 102401, + "46": 102359, + "47": 106951, + "48": 1244258, + "49": 274837, + "50": 106785, + "51": 441591, + "52": 1253799, + "53": 6807, + "54": 1261867, + "55": 93985, + "56": 314330, + "57": 192081, + "58": 1270292, + "59": 22812, + "60": 2908, + "61": 1850, + "62": 339, + "63": 2782, + "64": 6795, + "65": 77761, + "66": 783, + "67": 102558, + "68": 77764, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -301,29 +301,47 @@ "category": "鼠标" }, "spells": { - "树皮术": { + "22812.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "树皮术", + "spellId": 22812, + "metric": "cooldown" }, - "台风": { + "132469.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "台风", + "spellId": 132469, + "metric": "cooldown" }, - "夺魂咆哮": { + "99.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "夺魂咆哮", + "spellId": 99, + "metric": "cooldown" }, - "激活": { + "29166.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "激活", + "spellId": 29166, + "metric": "cooldown" }, - "乌索尔旋风": { + "102793.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "乌索尔旋风", + "spellId": 102793, + "metric": "cooldown" }, - "日光术": { + "78675.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "日光术", + "spellId": 78675, + "metric": "cooldown" } } }, @@ -529,25 +547,40 @@ "category": "鼠标" }, "spells": { - "树皮术": { + "22812.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "树皮术", + "spellId": 22812, + "metric": "cooldown" }, - "台风": { + "132469.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "台风", + "spellId": 132469, + "metric": "cooldown" }, - "夺魂咆哮": { + "99.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "夺魂咆哮", + "spellId": 99, + "metric": "cooldown" }, - "激活": { + "29166.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "激活", + "spellId": 29166, + "metric": "cooldown" }, - "乌索尔旋风": { + "102793.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "乌索尔旋风", + "spellId": 102793, + "metric": "cooldown" } } }, @@ -743,103 +776,203 @@ "category": "鼠标" }, "auras": { - "铁鬓": { + "player.192081.value": { "step": 42, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "铁鬓", + "spellId": 192081, + "scope": "player", + "metric": "value", + "spellIds": [ + 192081 + ] }, - "化身:乌索克的守护者": { + "player.192081.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "铁鬓层数", + "spellId": 192081, + "scope": "player", + "metric": "apps", + "spellIds": [ + 192081 + ], + "bar": 1 + }, + "player.102558.value": { "step": 43, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "化身:乌索克的守护者", + "spellId": 102558, + "scope": "player", + "metric": "value", + "spellIds": [ + 102558 + ] }, - "星河守护者": { + "player.213708.value": { "step": 44, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "星河守护者", + "spellId": 213708, + "scope": "player", + "metric": "value", + "spellIds": [ + 213708 + ] }, - "目标月火术": { + "target.harmful.164812.value": { "step": 45, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "月火术", + "spellId": 164812, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 164812 + ] }, - "目标痛击": { + "target.harmful.192090.value": { "step": 46, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "痛击", + "spellId": 192090, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 192090 + ] }, - "目标月光普照": { + "target.harmful.192090.apps": { + "step": "bar", + "type": "int", + "category": "目标减益", + "displayName": "痛击层数", + "spellId": 192090, + "scope": "target.harmful", + "metric": "apps", + "spellIds": [ + 192090 + ], + "bar": 2 + }, + "target.harmful.1270292.value": { "step": 47, "type": "int", - "category": "目标减益" - }, - "铁鬓层数": { - "step": "bar", - "bar": 1, - "type": "int" - }, - "目标痛击层数": { - "step": "bar", - "bar": 2, - "type": "int" + "category": "目标减益", + "displayName": "月光普照", + "spellId": 1270292, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 1270292 + ] } }, "spells": { - "树皮术": { + "22812.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "树皮术", + "spellId": 22812, + "metric": "cooldown" }, - "台风": { + "132469.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "台风", + "spellId": 132469, + "metric": "cooldown" }, - "夺魂咆哮": { + "99.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "夺魂咆哮", + "spellId": 99, + "metric": "cooldown" }, - "激活": { + "29166.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "激活", + "spellId": 29166, + "metric": "cooldown" }, - "乌索尔旋风": { + "102793.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "乌索尔旋风", + "spellId": 102793, + "metric": "cooldown" }, - "狂暴回复": { + "22842.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "狂暴回复", + "spellId": 22842, + "metric": "cooldown" }, - "狂暴回复充能": { + "22842.chargeCooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "狂暴回复充能", + "spellId": 22842, + "metric": "chargeCooldown" }, - "生存本能": { + "61336.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "生存本能", + "spellId": 61336, + "metric": "cooldown" }, - "化身:乌索克的守护者": { + "102558.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "化身:乌索克的守护者", + "spellId": 102558, + "metric": "cooldown" }, - "野性之心": { + "1261867.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "野性之心", + "spellId": 1261867, + "metric": "cooldown" }, - "碎甲咆哮": { + "1253799.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "碎甲咆哮", + "spellId": 1253799, + "metric": "cooldown" }, - "赤红之月": { + "1252871.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "赤红之月", + "spellId": 1252871, + "metric": "cooldown" }, - "重殴": { + "6807.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "重殴", + "spellId": 6807, + "metric": "cooldown" }, - "痛击": { + "77758.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "痛击", + "spellId": 77758, + "metric": "cooldown" } } }, @@ -1015,57 +1148,96 @@ "category": "鼠标" }, "spells": { - "树皮术": { + "22812.cooldown": { "step": 38, - "type": "int" + "type": "int", + "displayName": "树皮术", + "spellId": 22812, + "metric": "cooldown" }, - "台风": { + "132469.cooldown": { "step": 39, - "type": "int" + "type": "int", + "displayName": "台风", + "spellId": 132469, + "metric": "cooldown" }, - "夺魂咆哮": { + "99.cooldown": { "step": 40, - "type": "int" + "type": "int", + "displayName": "夺魂咆哮", + "spellId": 99, + "metric": "cooldown" }, - "激活": { + "29166.cooldown": { "step": 41, - "type": "int" + "type": "int", + "displayName": "激活", + "spellId": 29166, + "metric": "cooldown" }, - "乌索尔旋风": { + "102793.cooldown": { "step": 42, - "type": "int" + "type": "int", + "displayName": "乌索尔旋风", + "spellId": 102793, + "metric": "cooldown" }, - "迅捷治愈": { + "18562.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "迅捷治愈", + "spellId": 18562, + "metric": "cooldown" }, - "迅捷治愈充能": { + "18562.chargeCooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "迅捷治愈充能", + "spellId": 18562, + "metric": "chargeCooldown" }, - "野性成长": { + "48438.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "野性成长", + "spellId": 48438, + "metric": "cooldown" }, - "万灵之召": { + "391528.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "万灵之召", + "spellId": 391528, + "metric": "cooldown" }, - "自然之愈": { + "88423.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "自然之愈", + "spellId": 88423, + "metric": "cooldown" }, - "铁木树皮": { + "102342.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "铁木树皮", + "spellId": 102342, + "metric": "cooldown" }, - "自然迅捷": { + "132158.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "自然迅捷", + "spellId": 132158, + "metric": "cooldown" }, - "野性之心": { + "1261867.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "野性之心", + "spellId": 1261867, + "metric": "cooldown" } }, "group": { diff --git a/config/Evoker.json b/config/Evoker.json index bf64112c..32737df6 100644 --- a/config/Evoker.json +++ b/config/Evoker.json @@ -1,87 +1,87 @@ { "keymap": "evoker.json", "一键法术": { - "1": "净除", - "2": "火焰吐息", - "3": "青铜龙的祝福", - "4": "灼烧之焰", - "5": "黑曜鳞片", - "6": "山崩", - "7": "悬空", - "8": "碧蓝打击", - "9": "扫尾", - "10": "翡翠之花", - "11": "扭转天平", - "12": "活化烈焰", - "13": "裂解", - "14": "深呼吸", - "15": "青翠之拥", - "16": "永恒之涌", - "17": "葬火", - "18": "狂龙之怒", - "19": "镇压", - "20": "梦游", - "21": "微风", - "22": "时间螺旋", - "23": "空间悖论", - "24": "营救", - "25": "碧蓝横扫", - "26": "火焰吐息", - "27": "永恒之涌", - "28": "时间膨胀", - "29": "回溯", - "30": "时空畸体", - "31": "梦境吐息", - "32": "梦境飞行", - "33": "孪生烈焰", - "34": "时光屏障", - "35": "孪生烈焰", - "36": "深呼吸", - "37": "静滞", - "38": "静滞", - "39": "麦琳瑟拉的祝福", - "40": "回响", - "41": "青翠之拥", - "42": "自然平衡", - "43": "梦境吐息", - "44": "聚能冲击", - "45": "黑龙协调", - "46": "青铜协调", - "47": "黑檀之力", - "48": "亘古吐息", - "49": "先知先觉", - "50": "喷发", - "51": "地壳激变", - "52": "威力感知", - "53": "炽火龙鳞", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 365585, + "2": 382266, + "3": 364342, + "4": 374251, + "5": 363916, + "6": 358385, + "7": 358267, + "8": 362969, + "9": 368970, + "10": 355913, + "11": 370553, + "12": 361469, + "13": 356995, + "14": 357210, + "15": 360995, + "16": 382411, + "17": 357211, + "18": 375087, + "19": 351338, + "20": 360806, + "21": 374227, + "22": 374968, + "23": 406732, + "24": 370665, + "25": 1265872, + "26": 357208, + "27": 359073, + "28": 357170, + "29": 363534, + "30": 373861, + "31": 355936, + "32": 359618, + "33": 1265991, + "34": 1291636, + "35": 1265980, + "36": 362019, + "37": 370537, + "38": 370564, + "39": 1256581, + "40": 364343, + "41": 361195, + "42": 360823, + "43": 363922, + "44": 370454, + "45": 403264, + "46": 403265, + "47": 395152, + "48": 442204, + "49": 409311, + "50": 395160, + "51": 396286, + "52": 361021, + "53": 360827, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -275,77 +275,131 @@ "category": "鼠标" }, "spells": { - "净除": { + "365585.cooldown": { "step": 42, - "type": "int" + "type": "int", + "displayName": "净除", + "spellId": 365585, + "metric": "cooldown" }, - "黑曜鳞片": { + "363916.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片", + "spellId": 363916, + "metric": "cooldown" }, - "黑曜鳞片充能": { + "363916.chargeCooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片充能", + "spellId": 363916, + "metric": "chargeCooldown" }, - "山崩": { + "358385.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "山崩", + "spellId": 358385, + "metric": "cooldown" }, - "青翠之拥": { + "360995.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "青翠之拥", + "spellId": 360995, + "metric": "cooldown" }, - "深呼吸": { + "357210.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "深呼吸", + "spellId": 357210, + "metric": "cooldown" }, - "微风": { + "374227.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "微风", + "spellId": 374227, + "metric": "cooldown" }, - "悬空": { + "358267.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "悬空", + "spellId": 358267, + "metric": "cooldown" }, - "悬空充能": { + "358267.chargeCooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "悬空充能", + "spellId": 358267, + "metric": "chargeCooldown" }, - "扫尾": { + "368970.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "扫尾", + "spellId": 368970, + "metric": "cooldown" }, - "扭转天平": { + "370553.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "扭转天平", + "spellId": 370553, + "metric": "cooldown" }, - "营救": { + "370665.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "营救", + "spellId": 370665, + "metric": "cooldown" }, - "时间螺旋": { + "374968.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "时间螺旋", + "spellId": 374968, + "metric": "cooldown" }, - "空间悖论": { + "406732.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "空间悖论", + "spellId": 406732, + "metric": "cooldown" }, - "永恒之涌": { + "359073.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "永恒之涌", + "spellId": 359073, + "metric": "cooldown" }, - "镇压": { + "351338.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "镇压", + "spellId": 351338, + "metric": "cooldown" }, - "狂龙之怒": { + "375087.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "狂龙之怒", + "spellId": 375087, + "metric": "cooldown" }, - "火焰吐息": { + "357208.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "火焰吐息", + "spellId": 357208, + "metric": "cooldown" } } }, @@ -546,265 +600,533 @@ "category": "鼠标" }, "auras": { - "扭转天平": { + "player.370553.value": { "step": 43, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "扭转天平", + "spellId": 370553, + "scope": "player", + "metric": "value", + "spellIds": [ + 370553 + ] }, - "麦琳瑟拉的祝福": { + "player.1256579.value": { "step": 44, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "麦琳瑟拉的祝福", + "spellId": 1256579, + "scope": "player", + "metric": "value", + "spellIds": [ + 1256579 + ] }, - "生命火花": { + "player.443176.value": { "step": 45, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "生命火花", + "spellId": 443176, + "scope": "player", + "metric": "value", + "spellIds": [ + 443176 + ] }, - "上古之火": { + "player.375583.value": { "step": 46, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "上古之火", + "spellId": 375583, + "scope": "player", + "metric": "value", + "spellIds": [ + 375583 + ] }, - "悬空": { + "player.358267.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "悬空", + "spellId": 358267, + "scope": "player", + "metric": "value", + "spellIds": [ + 358267 + ] }, - "黑曜鳞片": { + "player.363916.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "黑曜鳞片", + "spellId": 363916, + "scope": "player", + "metric": "value", + "spellIds": [ + 363916 + ] }, - "静滞-释放": { + "player.370562.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "静滞-释放", + "spellId": 370562, + "scope": "player", + "metric": "value", + "spellIds": [ + 370562 + ] }, - "静滞-存入": { + "player.370537.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "静滞-存入", + "spellId": 370537, + "scope": "player", + "metric": "value", + "spellIds": [ + 370537 + ] }, - "精华迸发": { + "player.370537.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "静滞-存入层数", + "spellId": 370537, + "scope": "player", + "metric": "apps", + "spellIds": [ + 370537 + ], + "bar": 6 + }, + "player.369299.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "精华迸发", + "spellId": 369299, + "scope": "player", + "metric": "value", + "spellIds": [ + 369299 + ] }, - "飞扑烈焰": { + "player.369299.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "精华迸发层数", + "spellId": 369299, + "scope": "player", + "metric": "apps", + "spellIds": [ + 369299 + ], + "bar": 7 + }, + "player.370901.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "飞扑烈焰", + "spellId": 370901, + "scope": "player", + "metric": "value", + "spellIds": [ + 370901 + ] }, - "压缩时光": { + "player.370901.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "飞扑烈焰层数", + "spellId": 370901, + "scope": "player", + "metric": "apps", + "spellIds": [ + 370901 + ], + "bar": 8 + }, + "player.362877.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "压缩时光", + "spellId": 362877, + "scope": "player", + "metric": "value", + "spellIds": [ + 362877 + ] }, - "目标火焰吐息": { + "player.362877.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "压缩时光层数", + "spellId": 362877, + "scope": "player", + "metric": "apps", + "spellIds": [ + 362877 + ], + "bar": 9 + }, + "target.harmful.357209.value": { "step": 54, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "火焰吐息", + "spellId": 357209, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 357209 + ] }, - "目标时间膨胀": { + "target.helpful.357170.value": { "step": 55, "type": "int", - "category": "目标增益" + "category": "目标增益", + "displayName": "时间膨胀", + "spellId": 357170, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 357170 + ] }, - "目标逆转": { + "target.helpful.366155.value": { "step": 56, "type": "int", - "category": "目标增益" + "category": "目标增益", + "displayName": "逆转", + "spellId": 366155, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 366155 + ] }, - "目标回响": { + "target.helpful.364343.value": { "step": 57, "type": "int", - "category": "目标增益" + "category": "目标增益", + "displayName": "回响", + "spellId": 364343, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 364343 + ] }, - "目标梦境吐息": { + "target.helpful.355941.value": { "step": 58, "type": "int", - "category": "目标增益" + "category": "目标增益", + "displayName": "梦境吐息", + "spellId": 355941, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 355941 + ] }, - "焦点火焰吐息": { + "focus.harmful.357209.value": { "step": 59, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "火焰吐息", + "spellId": 357209, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 357209 + ] }, - "焦点时间膨胀": { + "focus.helpful.357170.value": { "step": 60, "type": "int", - "category": "焦点增益" + "category": "焦点增益", + "displayName": "时间膨胀", + "spellId": 357170, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 357170 + ] }, - "焦点逆转": { + "focus.helpful.366155.value": { "step": 61, "type": "int", - "category": "焦点增益" + "category": "焦点增益", + "displayName": "逆转", + "spellId": 366155, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 366155 + ] }, - "焦点回响": { + "focus.helpful.364343.value": { "step": 62, "type": "int", - "category": "焦点增益" + "category": "焦点增益", + "displayName": "回响", + "spellId": 364343, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 364343 + ] }, - "焦点梦境吐息": { + "focus.helpful.355941.value": { "step": 63, "type": "int", - "category": "焦点增益" - }, - "静滞-存入层数": { - "step": "bar", - "bar": 6, - "type": "int" - }, - "精华迸发层数": { - "step": "bar", - "bar": 7, - "type": "int" - }, - "飞扑烈焰层数": { - "step": "bar", - "bar": 8, - "type": "int" - }, - "压缩时光层数": { - "step": "bar", - "bar": 9, - "type": "int" + "category": "焦点增益", + "displayName": "梦境吐息", + "spellId": 355941, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 355941 + ] } }, "spells": { - "净除": { + "365585.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "净除", + "spellId": 365585, + "metric": "cooldown" }, - "山崩": { + "358385.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "山崩", + "spellId": 358385, + "metric": "cooldown" }, - "梦境飞行": { + "359816.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "梦境飞行", + "spellId": 359816, + "metric": "cooldown" }, - "深呼吸": { + "357210.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "深呼吸", + "spellId": 357210, + "metric": "cooldown" }, - "微风": { + "374227.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "微风", + "spellId": 374227, + "metric": "cooldown" }, - "扫尾": { + "368970.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "扫尾", + "spellId": 368970, + "metric": "cooldown" }, - "扭转天平": { + "370553.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "扭转天平", + "spellId": 370553, + "metric": "cooldown" }, - "营救": { + "370665.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "营救", + "spellId": 370665, + "metric": "cooldown" }, - "时间螺旋": { + "374968.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "时间螺旋", + "spellId": 374968, + "metric": "cooldown" }, - "空间悖论": { + "406732.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "空间悖论", + "spellId": 406732, + "metric": "cooldown" }, - "灼烧之焰": { - "step": 74, - "type": "int" - }, - "翡翠之拥": { + "374251.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "翡翠之拥", + "spellId": 374251, + "metric": "cooldown" }, - "青翠之拥": { + "360995.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "青翠之拥", + "spellId": 360995, + "metric": "cooldown" }, - "时光屏障": { + "1291636.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "时光屏障", + "spellId": 1291636, + "metric": "cooldown" }, - "时空畸体": { + "373861.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "时空畸体", + "spellId": 373861, + "metric": "cooldown" }, - "时间膨胀": { + "357170.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "时间膨胀", + "spellId": 357170, + "metric": "cooldown" }, - "静滞": { + "370537.cooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "静滞", + "spellId": 370537, + "metric": "cooldown" }, - "回溯": { + "363534.cooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "回溯", + "spellId": 363534, + "metric": "cooldown" }, - "回溯充能": { + "363534.chargeCooldown": { "step": 82, - "type": "int" + "type": "int", + "displayName": "回溯充能", + "spellId": 363534, + "metric": "chargeCooldown" }, - "回溯层数": { + "363534.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "回溯层数", + "spellId": 363534, + "metric": "count" }, - "火焰吐息": { + "357208.cooldown": { "step": 83, - "type": "int" + "type": "int", + "displayName": "火焰吐息", + "spellId": 357208, + "metric": "cooldown" }, - "火焰吐息充能": { + "357208.chargeCooldown": { "step": 84, - "type": "int" + "type": "int", + "displayName": "火焰吐息充能", + "spellId": 357208, + "metric": "chargeCooldown" }, - "火焰吐息层数": { + "357208.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "火焰吐息层数", + "spellId": 357208, + "metric": "count" }, - "逆转": { + "366155.cooldown": { "step": 85, - "type": "int" + "type": "int", + "displayName": "逆转", + "spellId": 366155, + "metric": "cooldown" }, - "逆转充能": { + "366155.chargeCooldown": { "step": 86, - "type": "int" + "type": "int", + "displayName": "逆转充能", + "spellId": 366155, + "metric": "chargeCooldown" }, - "逆转层数": { + "366155.count": { "step": "bar", "bar": 3, - "type": "int" + "type": "int", + "displayName": "逆转层数", + "spellId": 366155, + "metric": "count" }, - "悬空": { + "358267.cooldown": { "step": 87, - "type": "int" + "type": "int", + "displayName": "悬空", + "spellId": 358267, + "metric": "cooldown" }, - "悬空充能": { + "358267.chargeCooldown": { "step": 88, - "type": "int" + "type": "int", + "displayName": "悬空充能", + "spellId": 358267, + "metric": "chargeCooldown" }, - "悬空层数": { + "358267.count": { "step": "bar", "bar": 4, - "type": "int" + "type": "int", + "displayName": "悬空层数", + "spellId": 358267, + "metric": "count" }, - "黑曜鳞片": { + "363916.cooldown": { "step": 89, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片", + "spellId": 363916, + "metric": "cooldown" }, - "黑曜鳞片充能": { + "363916.chargeCooldown": { "step": 90, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片充能", + "spellId": 363916, + "metric": "chargeCooldown" }, - "黑曜鳞片层数": { + "363916.count": { "step": "bar", "bar": 5, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片层数", + "spellId": 363916, + "metric": "count" } }, "group": { @@ -822,17 +1144,38 @@ "step": 3, "type": "int" }, - "逆转": { + "auras.366155.value": { "step": 4, - "type": "int" + "type": "int", + "displayName": "逆转", + "spellId": 366155, + "scope": "group", + "metric": "value", + "spellIds": [ + 366155 + ] }, - "回响": { + "auras.364343.value": { "step": 5, - "type": "int" + "type": "int", + "displayName": "回响", + "spellId": 364343, + "scope": "group", + "metric": "value", + "spellIds": [ + 364343 + ] }, - "梦境吐息": { + "auras.355941.value": { "step": 6, - "type": "int" + "type": "int", + "displayName": "梦境吐息", + "spellId": 355941, + "scope": "group", + "metric": "value", + "spellIds": [ + 355941 + ] } } }, @@ -1033,136 +1376,232 @@ "category": "鼠标" }, "spells": { - "净除": { + "365585.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "净除", + "spellId": 365585, + "metric": "cooldown" }, - "黑曜鳞片": { + "363916.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片", + "spellId": 363916, + "metric": "cooldown" }, - "黑曜鳞片充能": { + "363916.chargeCooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片充能", + "spellId": 363916, + "metric": "chargeCooldown" }, - "黑曜鳞片层数": { + "363916.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "黑曜鳞片层数", + "spellId": 363916, + "metric": "count" }, - "山崩": { + "358385.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "山崩", + "spellId": 358385, + "metric": "cooldown" }, - "青翠之拥": { + "360995.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "青翠之拥", + "spellId": 360995, + "metric": "cooldown" }, - "深呼吸": { + "357210.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "深呼吸", + "spellId": 357210, + "metric": "cooldown" }, - "微风": { + "374227.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "微风", + "spellId": 374227, + "metric": "cooldown" }, - "悬空": { + "358267.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "悬空", + "spellId": 358267, + "metric": "cooldown" }, - "悬空充能": { + "358267.chargeCooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "悬空充能", + "spellId": 358267, + "metric": "chargeCooldown" }, - "悬空层数": { + "358267.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "悬空层数", + "spellId": 358267, + "metric": "count" }, - "扫尾": { + "368970.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "扫尾", + "spellId": 368970, + "metric": "cooldown" }, - "扭转天平": { + "370553.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "扭转天平", + "spellId": 370553, + "metric": "cooldown" }, - "营救": { + "370665.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "营救", + "spellId": 370665, + "metric": "cooldown" }, - "时间螺旋": { + "374968.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "时间螺旋", + "spellId": 374968, + "metric": "cooldown" }, - "空间悖论": { + "406732.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "空间悖论", + "spellId": 406732, + "metric": "cooldown" }, - "火焰吐息": { + "357208.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "火焰吐息", + "spellId": 357208, + "metric": "cooldown" }, - "地壳激变": { + "396286.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "地壳激变", + "spellId": 396286, + "metric": "cooldown" }, - "黑檀之力": { + "395152.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "黑檀之力", + "spellId": 395152, + "metric": "cooldown" }, - "亘古吐息": { + "442204.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "亘古吐息", + "spellId": 442204, + "metric": "cooldown" }, - "先知先觉": { + "409311.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "先知先觉", + "spellId": 409311, + "metric": "cooldown" }, - "先知先觉充能": { + "409311.chargeCooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "先知先觉充能", + "spellId": 409311, + "metric": "chargeCooldown" }, - "先知先觉层数": { + "409311.count": { "step": "bar", "bar": 3, - "type": "int" + "type": "int", + "displayName": "先知先觉层数", + "spellId": 409311, + "metric": "count" }, - "喷发": { + "395160.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "喷发", + "spellId": 395160, + "metric": "cooldown" }, - "炽火龙鳞": { + "360827.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "炽火龙鳞", + "spellId": 360827, + "metric": "cooldown" }, - "活化烈焰": { + "361469.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "活化烈焰", + "spellId": 361469, + "metric": "cooldown" }, - "威力感知": { + "361021.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "威力感知", + "spellId": 361021, + "metric": "cooldown" }, - "镇压": { + "351338.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "镇压", + "spellId": 351338, + "metric": "cooldown" }, - "灼烧之焰": { + "374251.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "灼烧之焰", + "spellId": 374251, + "metric": "cooldown" }, - "翡翠之花": { + "355913.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "翡翠之花", + "spellId": 355913, + "metric": "cooldown" }, - "青铜协调": { + "403265.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "青铜协调", + "spellId": 403265, + "metric": "cooldown" }, - "黑龙协调": { + "403264.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "黑龙协调", + "spellId": 403264, + "metric": "cooldown" } }, "group": { diff --git a/config/Hunter.json b/config/Hunter.json index 6fda62cd..1141d753 100644 --- a/config/Hunter.json +++ b/config/Hunter.json @@ -1,81 +1,81 @@ { "keymap": "hunter.json", "一键法术": { - "1": "倒刺射击", - "2": "杀戮命令", - "3": "眼镜蛇射击", - "4": "狂野怒火", - "5": "荒野呼唤", - "6": "夺命黑鸦", - "7": "弹幕射击", - "8": "血溅十方", - "9": "瞄准射击", - "10": "急速射击", - "11": "稳固射击", - "12": "多重射击", - "13": "百发百中", - "14": "夺命射击", - "15": "爆炸射击", - "16": "哀恸箭", - "17": "猎人印记", - "18": "奥术射击", - "19": "奇美拉射击", - "20": "召唤宠物1", - "21": "狂野鞭笞", - "22": "意气风发", - "23": "灵龟守护", - "24": "反制射击", - "25": "哀恸箭", - "26": "黑蚀箭", - "27": "胁迫", - "28": "乱射", - "29": "多重射击", - "30": "杀戮命令", - "31": "投掷手斧", - "32": "燎焰沥青", - "33": "爆裂火铳", - "34": "狩魂一击", - "35": "鱼叉猛刺", - "36": "猛禽一击", - "37": "野火炸弹", - "38": "牺牲咆哮", - "39": "震荡射击", - "40": "宁神射击", - "41": "焦油陷进", - "42": "恐吓野兽", - "43": "束缚射击", - "44": "伪装", - "45": "摔绊", - "46": "猛禽横扫", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 217200, + "2": 34026, + "3": 193455, + "4": 19574, + "5": 201430, + "6": 131894, + "7": 120360, + "8": 321530, + "9": 19434, + "10": 257044, + "11": 56641, + "12": 2643, + "13": 288613, + "14": 53351, + "15": 212431, + "16": 389831, + "17": 257284, + "18": 185358, + "19": 342049, + "20": 883, + "21": 1264359, + "22": 109304, + "23": 186265, + "24": 147362, + "25": 392060, + "26": 466930, + "27": 19577, + "28": 260243, + "29": 257620, + "30": 259489, + "31": 193265, + "32": 1251592, + "33": 1261193, + "34": 1250646, + "35": 190925, + "36": 186270, + "37": 259495, + "38": 53480, + "39": 5116, + "40": 19801, + "41": 187698, + "42": 1513, + "43": 109248, + "44": 199483, + "45": 195645, + "46": 1262293, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -284,116 +284,228 @@ "category": "鼠标" }, "auras": { - "猎群领袖之嚎": { + "player.471877.value": { "step": 45, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "猎群领袖之嚎", + "spellId": 471877, + "scope": "player", + "metric": "value", + "spellIds": [ + 471877 + ] }, - "眼镜蛇利牙": { + "player.1299389.value": { "step": 46, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "眼镜蛇利牙", + "spellId": 1299389, + "scope": "player", + "metric": "value", + "spellIds": [ + 1299389 + ] }, - "自然之友": { + "player.1299389.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "眼镜蛇利牙层数", + "spellId": 1299389, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1299389 + ], + "bar": 1 + }, + "player.1276720.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "自然之友", + "spellId": 1276720, + "scope": "player", + "metric": "value", + "spellIds": [ + 1276720 + ] }, - "野兽顺劈": { + "player.268877.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "野兽顺劈", + "spellId": 268877, + "scope": "player", + "metric": "value", + "spellIds": [ + 268877 + ] }, - "龙": { + "player.471878.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "龙", + "spellId": 471878, + "scope": "player", + "metric": "value", + "spellIds": [ + 471878 + ] }, - "猪": { + "player.472324.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "猪", + "spellId": 472324, + "scope": "player", + "metric": "value", + "spellIds": [ + 472324 + ] }, - "熊": { + "player.472325.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "熊", + "spellId": 472325, + "scope": "player", + "metric": "value", + "spellIds": [ + 472325 + ] }, - "目标猎人印记": { + "target.harmful.259556.value": { "step": 52, "type": "int", - "category": "目标减益" - }, - "眼镜蛇利牙层数": { - "step": "bar", - "bar": 1, - "type": "int" + "category": "目标减益", + "displayName": "猎人印记", + "spellId": 259556, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 259556 + ] } }, "spells": { - "牺牲咆哮": { + "53480.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "牺牲咆哮", + "spellId": 53480, + "metric": "cooldown" }, - "意气风发": { + "109304.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "意气风发", + "spellId": 109304, + "metric": "cooldown" }, - "胁迫": { + "19577.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "胁迫", + "spellId": 19577, + "metric": "cooldown" }, - "震荡射击": { + "5116.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "震荡射击", + "spellId": 5116, + "metric": "cooldown" }, - "宁神射击": { + "19801.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "宁神射击", + "spellId": 19801, + "metric": "cooldown" }, - "焦油陷进": { + "187698.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "焦油陷进", + "spellId": 187698, + "metric": "cooldown" }, - "恐吓野兽": { + "1513.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "恐吓野兽", + "spellId": 1513, + "metric": "cooldown" }, - "束缚射击": { + "109248.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "束缚射击", + "spellId": 109248, + "metric": "cooldown" }, - "摔绊": { + "195645.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "摔绊", + "spellId": 195645, + "metric": "cooldown" }, - "杀戮命令": { + "34026.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "杀戮命令", + "spellId": 34026, + "metric": "cooldown" }, - "杀戮命令充能": { + "34026.chargeCooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "杀戮命令充能", + "spellId": 34026, + "metric": "chargeCooldown" }, - "倒刺射击": { + "217200.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "倒刺射击", + "spellId": 217200, + "metric": "cooldown" }, - "倒刺射击充能": { + "217200.chargeCooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "倒刺射击充能", + "spellId": 217200, + "metric": "chargeCooldown" }, - "反制射击": { + "147362.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "反制射击", + "spellId": 147362, + "metric": "cooldown" }, - "狂野怒火": { + "19574.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "狂野怒火", + "spellId": 19574, + "metric": "cooldown" }, - "狂野鞭笞": { + "1264359.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "狂野鞭笞", + "spellId": 1264359, + "metric": "cooldown" } } }, @@ -584,61 +696,103 @@ "category": "鼠标" }, "spells": { - "牺牲咆哮": { + "53480.cooldown": { "step": 41, - "type": "int" + "type": "int", + "displayName": "牺牲咆哮", + "spellId": 53480, + "metric": "cooldown" }, - "意气风发": { + "109304.cooldown": { "step": 42, - "type": "int" + "type": "int", + "displayName": "意气风发", + "spellId": 109304, + "metric": "cooldown" }, - "胁迫": { + "19577.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "胁迫", + "spellId": 19577, + "metric": "cooldown" }, - "震荡射击": { + "5116.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "震荡射击", + "spellId": 5116, + "metric": "cooldown" }, - "宁神射击": { + "19801.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "宁神射击", + "spellId": 19801, + "metric": "cooldown" }, - "焦油陷进": { + "187698.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "焦油陷进", + "spellId": 187698, + "metric": "cooldown" }, - "恐吓野兽": { + "1513.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "恐吓野兽", + "spellId": 1513, + "metric": "cooldown" }, - "束缚射击": { + "109248.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "束缚射击", + "spellId": 109248, + "metric": "cooldown" }, - "摔绊": { + "195645.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "摔绊", + "spellId": 195645, + "metric": "cooldown" }, - "反制射击": { + "147362.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "反制射击", + "spellId": 147362, + "metric": "cooldown" }, - "瞄准射击": { + "19434.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "瞄准射击", + "spellId": 19434, + "metric": "cooldown" }, - "瞄准射击充能": { + "19434.chargeCooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "瞄准射击充能", + "spellId": 19434, + "metric": "chargeCooldown" }, - "急速射击": { + "257044.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "急速射击", + "spellId": 257044, + "metric": "cooldown" }, - "百发百中": { + "288613.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "百发百中", + "spellId": 288613, + "metric": "cooldown" } } }, @@ -829,61 +983,103 @@ "category": "鼠标" }, "spells": { - "牺牲咆哮": { + "53480.cooldown": { "step": 41, - "type": "int" + "type": "int", + "displayName": "牺牲咆哮", + "spellId": 53480, + "metric": "cooldown" }, - "意气风发": { + "109304.cooldown": { "step": 42, - "type": "int" + "type": "int", + "displayName": "意气风发", + "spellId": 109304, + "metric": "cooldown" }, - "胁迫": { + "19577.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "胁迫", + "spellId": 19577, + "metric": "cooldown" }, - "震荡射击": { + "5116.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "震荡射击", + "spellId": 5116, + "metric": "cooldown" }, - "宁神射击": { + "19801.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "宁神射击", + "spellId": 19801, + "metric": "cooldown" }, - "焦油陷进": { + "187698.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "焦油陷进", + "spellId": 187698, + "metric": "cooldown" }, - "恐吓野兽": { + "1513.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "恐吓野兽", + "spellId": 1513, + "metric": "cooldown" }, - "束缚射击": { + "109248.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "束缚射击", + "spellId": 109248, + "metric": "cooldown" }, - "摔绊": { + "195645.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "摔绊", + "spellId": 195645, + "metric": "cooldown" }, - "爆裂火铳": { + "1261193.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "爆裂火铳", + "spellId": 1261193, + "metric": "cooldown" }, - "狩魂一击": { + "1250646.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "狩魂一击", + "spellId": 1250646, + "metric": "cooldown" }, - "鱼叉猛刺": { + "190925.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "鱼叉猛刺", + "spellId": 190925, + "metric": "cooldown" }, - "猛禽一击": { + "186270.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "猛禽一击", + "spellId": 186270, + "metric": "cooldown" }, - "野火炸弹": { + "259495.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "野火炸弹", + "spellId": 259495, + "metric": "cooldown" } } } diff --git a/config/Mage.json b/config/Mage.json index 712802bb..00ae70d3 100644 --- a/config/Mage.json +++ b/config/Mage.json @@ -1,90 +1,90 @@ { "keymap": "mage.json", "一键法术": { - "1": "寒冰屏障", - "2": "解除诅咒", - "3": "强化隐形术", - "4": "超级新星", - "5": "冰锥术", - "6": "操控时间", - "7": "回归", - "8": "时间扭曲", - "9": "镜像", - "10": "法术反制", - "11": "闪现术", - "12": "缓落术", - "13": "魔爆术", - "14": "寒冰新星", - "15": "闪光术", - "16": "传送距离", - "17": "闪回", - "18": "强化隐形术", - "19": "冰霜新星", - "20": "龙息术", - "21": "群体隐形", - "22": "法术吸取", - "23": "暴风雪", - "24": "暴风雪", - "25": "奥术智慧", - "26": "寒冰箭", - "27": "冰川尖刺", - "28": "冰枪术", - "29": "冰霜射线", - "30": "冰风暴", - "31": "寒冰宝珠", - "32": "霜火之箭", - "33": "彗星风暴", - "34": "急速冷却", - "35": "棱光护体", - "36": "奥术脉冲", - "37": "奥术弹幕", - "38": "大法师之触", - "39": "奥术飞弹", - "40": "奥术冲击", - "41": "奥术宝珠", - "42": "奥术涌动", - "43": "烈焰护体", - "44": "深寒凝冰", - "45": "燃烧", - "46": "流星", - "47": "火球术", - "48": "火焰冲击", - "49": "炎爆术", - "50": "烈焰风暴", - "51": "变形术", - "52": "霜火之箭", - "53": "烈焰风暴", - "54": "灼烧", - "55": "造餐术", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 45438, + "2": 475, + "3": 110960, + "4": 157980, + "5": 120, + "6": 342247, + "7": 371817, + "8": 80353, + "9": 55342, + "10": 2139, + "11": 1953, + "12": 130, + "13": 1449, + "14": 157997, + "15": 212653, + "16": 62388, + "17": 389713, + "18": 110959, + "19": 122, + "20": 31661, + "21": 414664, + "22": 30449, + "23": 1248829, + "24": 190356, + "25": 1459, + "26": 116, + "27": 199786, + "28": 30455, + "29": 205021, + "30": 44614, + "31": 84714, + "32": 431044, + "33": 153595, + "34": 235215, + "35": 235450, + "36": 1241462, + "37": 44425, + "38": 321507, + "39": 5143, + "40": 30451, + "41": 153626, + "42": 365350, + "43": 235313, + "44": 414658, + "45": 190319, + "46": 153561, + "47": 133, + "48": 108853, + "49": 11366, + "50": 1254851, + "51": 118, + "52": 468655, + "53": 2120, + "54": 2948, + "55": 190336, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -273,60 +273,140 @@ "category": "鼠标" }, "auras": { - "奥数齐射": { + "player.1242974.value": { "step": 41, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "奥数齐射", + "spellId": 1242974, + "scope": "player", + "metric": "value", + "spellIds": [ + 1242974 + ] }, - "溢流能量": { + "player.1242974.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "奥数齐射层数", + "spellId": 1242974, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1242974 + ], + "bar": 1 + }, + "player.394195.value": { "step": 42, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "溢流能量", + "spellId": 394195, + "scope": "player", + "metric": "value", + "spellIds": [ + 394195 + ] }, - "节能施法": { + "player.394195.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "溢流能量层数", + "spellId": 394195, + "scope": "player", + "metric": "apps", + "spellIds": [ + 394195 + ], + "bar": 2 + }, + "player.263725.value": { "step": 43, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "节能施法", + "spellId": 263725, + "scope": "player", + "metric": "value", + "spellIds": [ + 263725 + ] }, - "过载飞弹": { + "player.263725.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "节能施法层数", + "spellId": 263725, + "scope": "player", + "metric": "apps", + "spellIds": [ + 263725 + ], + "bar": 3 + }, + "player.1277009.value": { "step": 44, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "过载飞弹", + "spellId": 1277009, + "scope": "player", + "metric": "value", + "spellIds": [ + 1277009 + ] }, - "敏锐直觉": { + "player.1223797.value": { "step": 45, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "敏锐直觉", + "spellId": 1223797, + "scope": "player", + "metric": "value", + "spellIds": [ + 1223797 + ] }, - "奥术之魂": { + "player.451038.value": { "step": 46, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "奥术之魂", + "spellId": 451038, + "scope": "player", + "metric": "value", + "spellIds": [ + 451038 + ] }, - "奥术涌动": { + "player.365362.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "奥术涌动", + "spellId": 365362, + "scope": "player", + "metric": "value", + "spellIds": [ + 365362 + ] }, - "棱光护体": { + "player.235450.value": { "step": 48, "type": "int", - "category": "玩家" - }, - "奥数齐射层数": { - "step": "bar", - "bar": 1, - "type": "int" - }, - "溢流能量层数": { - "step": "bar", - "bar": 2, - "type": "int" - }, - "节能施法层数": { - "step": "bar", - "bar": 3, - "type": "int" + "category": "玩家", + "displayName": "棱光护体", + "spellId": 235450, + "scope": "player", + "metric": "value", + "spellIds": [ + 235450 + ] } } }, diff --git a/config/Monk.json b/config/Monk.json index 3c8976a7..8c58987c 100644 --- a/config/Monk.json +++ b/config/Monk.json @@ -1,67 +1,67 @@ { "keymap": "monk.json", "一键法术": { - "1": "轮回之触", - "2": "扫堂腿", - "3": "魂体双分", - "4": "转移", - "5": "还魂术", - "6": "平心之环", - "7": "分筋错骨", - "8": "玄牛下凡", - "9": "猛虎掌", - "10": "神鹤引项踢", - "11": "幻灭踢", - "12": "爆炸酒桶", - "13": "真气爆裂", - "14": "醉酿投", - "15": "火焰之息", - "16": "碧玉疾风", - "17": "碎玉闪电", - "18": "神鹤引项踢", - "19": "幻灭踢", - "20": "怒雷破", - "21": "旭日东升踢", - "22": "风领主之击", - "23": "疾风呼啸踢", - "24": "升龙霸", - "25": "神龙之赐", - "26": "活血术", - "27": "抚慰之雾", - "28": "天神御身", - "29": "氤氲之雾", - "30": "法力茶", - "31": "乾元之巅", - "32": "乾元镇踏", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 322109, + "2": 119381, + "3": 101643, + "4": 119996, + "5": 115310, + "6": 116844, + "7": 115078, + "8": 132578, + "9": 100780, + "10": 322729, + "11": 205523, + "12": 325153, + "13": 123986, + "14": 121253, + "15": 115181, + "16": 116847, + "17": 117952, + "18": 101546, + "19": 100784, + "20": 113656, + "21": 107428, + "22": 392983, + "23": 467307, + "24": 152175, + "25": 399491, + "26": 116670, + "27": 115175, + "28": 443028, + "29": 124682, + "30": 115294, + "31": 1249625, + "32": 1272696, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -265,109 +265,188 @@ "category": "鼠标" }, "auras": { - "清空酒窖": { + "player.1262768.value": { "step": 44, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "清空酒窖", + "spellId": 1262768, + "scope": "player", + "metric": "value", + "spellIds": [ + 1262768 + ] } }, "spells": { - "醉酿投": { + "121253.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "醉酿投", + "spellId": 121253, + "metric": "cooldown" }, - "醉酿投充能": { + "121253.chargeCooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "醉酿投充能", + "spellId": 121253, + "metric": "chargeCooldown" }, - "活血酒": { + "119582.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "活血酒", + "spellId": 119582, + "metric": "cooldown" }, - "活血酒充能": { + "119582.chargeCooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "活血酒充能", + "spellId": 119582, + "metric": "chargeCooldown" }, - "天神酒": { + "322507.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "天神酒", + "spellId": 322507, + "metric": "cooldown" }, - "天神酒充能": { + "322507.chargeCooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "天神酒充能", + "spellId": 322507, + "metric": "chargeCooldown" }, - "天神灌注": { + "1241059.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "天神灌注", + "spellId": 1241059, + "metric": "cooldown" }, - "天神灌注充能": { + "1241059.chargeCooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "天神灌注充能", + "spellId": 1241059, + "metric": "chargeCooldown" }, - "轮回之触": { + "322109.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "轮回之触", + "spellId": 322109, + "metric": "cooldown" }, - "扫堂腿": { + "119381.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "扫堂腿", + "spellId": 119381, + "metric": "cooldown" }, - "移花接木": { + "322101.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "移花接木", + "spellId": 322101, + "metric": "cooldown" }, - "移花接木层数": { + "322101.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "移花接木层数", + "spellId": 322101, + "metric": "count" }, - "魂体双分": { + "101643.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "魂体双分", + "spellId": 101643, + "metric": "cooldown" }, - "魂体双分:转移": { + "119996.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "魂体双分:转移", + "spellId": 119996, + "metric": "cooldown" }, - "切喉手": { + "116705.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "切喉手", + "spellId": 116705, + "metric": "cooldown" }, - "火焰之息": { + "115181.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "火焰之息", + "spellId": 115181, + "metric": "cooldown" }, - "真气爆裂": { + "123986.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "真气爆裂", + "spellId": 123986, + "metric": "cooldown" }, - "爆炸酒桶": { + "325153.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "爆炸酒桶", + "spellId": 325153, + "metric": "cooldown" }, - "赤精之歌": { + "198898.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "赤精之歌", + "spellId": 198898, + "metric": "cooldown" }, - "玄牛酒": { + "115399.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "玄牛酒", + "spellId": 115399, + "metric": "cooldown" }, - "平心之环": { + "116844.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "平心之环", + "spellId": 116844, + "metric": "cooldown" }, - "分筋错骨": { + "115078.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "分筋错骨", + "spellId": 115078, + "metric": "cooldown" }, - "玄牛下凡": { + "132578.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "玄牛下凡", + "spellId": 132578, + "metric": "cooldown" }, - "幻灭踢": { + "205523.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "幻灭踢", + "spellId": 205523, + "metric": "cooldown" } } }, @@ -548,91 +627,154 @@ "category": "鼠标" }, "spells": { - "雷光聚神茶": { + "116680.cooldown": { "step": 39, - "type": "int" + "type": "int", + "displayName": "雷光聚神茶", + "spellId": 116680, + "metric": "cooldown" }, - "雷光聚神茶充能": { + "116680.chargeCooldown": { "step": 40, - "type": "int" + "type": "int", + "displayName": "雷光聚神茶充能", + "spellId": 116680, + "metric": "chargeCooldown" }, - "复苏之雾": { + "115151.cooldown": { "step": 41, - "type": "int" + "type": "int", + "displayName": "复苏之雾", + "spellId": 115151, + "metric": "cooldown" }, - "复苏之雾充能": { + "115151.chargeCooldown": { "step": 42, - "type": "int" + "type": "int", + "displayName": "复苏之雾充能", + "spellId": 115151, + "metric": "chargeCooldown" }, - "还魂术": { + "115310.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "还魂术", + "spellId": 115310, + "metric": "cooldown" }, - "作茧缚命": { + "116849.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "作茧缚命", + "spellId": 116849, + "metric": "cooldown" }, - "清创生血": { + "115450.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "清创生血", + "spellId": 115450, + "metric": "cooldown" }, - "天神御身": { + "443028.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "天神御身", + "spellId": 443028, + "metric": "cooldown" }, - "轮回之触": { + "322109.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "轮回之触", + "spellId": 322109, + "metric": "cooldown" }, - "扫堂腿": { + "119381.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "扫堂腿", + "spellId": 119381, + "metric": "cooldown" }, - "宁神茶": { + "1270621.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "宁神茶", + "spellId": 1270621, + "metric": "cooldown" }, - "魂体双分": { + "101643.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "魂体双分", + "spellId": 101643, + "metric": "cooldown" }, - "魂体双分:转移": { + "119996.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "魂体双分:转移", + "spellId": 119996, + "metric": "cooldown" }, - "旭日东升踢": { + "107428.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "旭日东升踢", + "spellId": 107428, + "metric": "cooldown" }, - "幻灭踢": { + "100784.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "幻灭踢", + "spellId": 100784, + "metric": "cooldown" }, - "平心之环": { + "116844.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "平心之环", + "spellId": 116844, + "metric": "cooldown" }, - "分筋错骨": { + "115078.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "分筋错骨", + "spellId": 115078, + "metric": "cooldown" }, - "法力茶": { + "115294.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "法力茶", + "spellId": 115294, + "metric": "cooldown" }, - "法力茶层数": { + "115294.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "法力茶层数", + "spellId": 115294, + "metric": "count" }, - "神龙之赐": { + "399491.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "神龙之赐", + "spellId": 399491, + "metric": "cooldown" }, - "神龙之赐层数": { + "399491.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "神龙之赐层数", + "spellId": 399491, + "metric": "count" } }, "group": { @@ -860,269 +1002,580 @@ "category": "鼠标" }, "auras": { - "乾元镇踏": { + "player.1291484.value": { "step": 46, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "乾元镇踏", + "spellId": 1291484, + "scope": "player", + "metric": "value", + "spellIds": [ + 1291484 + ] }, - "乾元之巅": { + "player.1291484.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "乾元镇踏层数", + "spellId": 1291484, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1291484 + ], + "bar": 3 + }, + "player.1249625.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "乾元之巅", + "spellId": 1249625, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249625 + ] }, - "虎眼酒": { + "player.1249625.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "乾元之巅层数", + "spellId": 1249625, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1249625 + ], + "bar": 4 + }, + "player.1261724.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "虎眼酒", + "spellId": 1261724, + "scope": "player", + "metric": "value", + "spellIds": [ + 1261724 + ] }, - "风之舞蹈": { + "player.1261724.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "虎眼酒层数", + "spellId": 1261724, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1261724 + ], + "bar": 5 + }, + "player.432180.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "风之舞蹈", + "spellId": 432180, + "scope": "player", + "metric": "value", + "spellIds": [ + 432180 + ] }, - "连击": { + "player.432180.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "风之舞蹈层数", + "spellId": 432180, + "scope": "player", + "metric": "apps", + "spellIds": [ + 432180 + ], + "bar": 6 + }, + "player.196741.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "连击", + "spellId": 196741, + "scope": "player", + "metric": "value", + "spellIds": [ + 196741 + ] }, - "幻灭踢强化": { + "player.196741.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "连击层数", + "spellId": 196741, + "scope": "player", + "metric": "apps", + "spellIds": [ + 196741 + ], + "bar": 7 + }, + "player.116768.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "幻灭踢强化", + "spellId": 116768, + "scope": "player", + "metric": "value", + "spellIds": [ + 116768 + ] }, - "赤精之舞": { + "player.116768.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "幻灭踢强化层数", + "spellId": 116768, + "scope": "player", + "metric": "apps", + "spellIds": [ + 116768 + ], + "bar": 8 + }, + "player.325202.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "赤精之舞", + "spellId": 325202, + "scope": "player", + "metric": "value", + "spellIds": [ + 325202 + ] }, - "疾风呼啸踢可用": { + "player.325202.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "赤精之舞层数", + "spellId": 325202, + "scope": "player", + "metric": "apps", + "spellIds": [ + 325202 + ], + "bar": 9 + }, + "player.1250554.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "疾风呼啸踢可用", + "spellId": 1250554, + "scope": "player", + "metric": "value", + "spellIds": [ + 1250554 + ] }, - "青龙之心": { + "player.443421.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "青龙之心", + "spellId": 443421, + "scope": "player", + "metric": "value", + "spellIds": [ + 443421, + 443616, + 1238904 + ] }, - "天神御身": { + "player.443421.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "青龙之心层数", + "spellId": 443421, + "scope": "player", + "metric": "apps", + "spellIds": [ + 443421, + 443616, + 1238904 + ], + "bar": 10 + }, + "player.443028.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "天神御身", + "spellId": 443028, + "scope": "player", + "metric": "value", + "spellIds": [ + 443028 + ] }, - "组合拳-旭日东升踢": { + "player.1249753.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-旭日东升踢", + "spellId": 1249753, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249753 + ] }, - "组合拳-神鹤引项踢": { + "player.1249754.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-神鹤引项踢", + "spellId": 1249754, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249754 + ] }, - "组合拳-猛虎掌": { + "player.1249756.value": { "step": 58, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-猛虎掌", + "spellId": 1249756, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249756 + ] }, - "组合拳-幻灭踢": { + "player.1249757.value": { "step": 59, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-幻灭踢", + "spellId": 1249757, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249757 + ] }, - "组合拳-怒雷破": { + "player.1249758.value": { "step": 60, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-怒雷破", + "spellId": 1249758, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249758 + ] }, - "组合拳-切空踢": { + "player.1249759.value": { "step": 61, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-切空踢", + "spellId": 1249759, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249759 + ] }, - "组合拳-风火雷电": { + "player.1249762.value": { "step": 62, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-风火雷电", + "spellId": 1249762, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249762 + ] }, - "组合拳-乾元镇踏": { + "player.1249763.value": { "step": 63, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-乾元镇踏", + "spellId": 1249763, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249763 + ] }, - "组合拳-碎玉闪电": { + "player.1249764.value": { "step": 64, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-碎玉闪电", + "spellId": 1249764, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249764 + ] }, - "组合拳-升龙霸": { + "player.1249765.value": { "step": 65, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-升龙霸", + "spellId": 1249765, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249765 + ] }, - "组合拳-风领主之击": { + "player.1249766.value": { "step": 66, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "组合拳-风领主之击", + "spellId": 1249766, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249766 + ] }, - "121套装BUFF": { + "player.1297033.value": { "step": 67, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "121套装BUFF", + "spellId": 1297033, + "scope": "player", + "metric": "value", + "spellIds": [ + 1297033 + ] }, - "可以释放天神御身": { + "player.1248992.value": { "step": 68, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "可以释放天神御身", + "spellId": 1248992, + "scope": "player", + "metric": "value", + "spellIds": [ + 1248992 + ] }, - "组合拳天神御身": { + "player.1249790.value": { "step": 69, "type": "int", - "category": "玩家" - }, - "乾元镇踏层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "乾元之巅层数": { - "step": "bar", - "bar": 4, - "type": "int" - }, - "虎眼酒层数": { - "step": "bar", - "bar": 5, - "type": "int" - }, - "风之舞蹈层数": { - "step": "bar", - "bar": 6, - "type": "int" - }, - "连击层数": { - "step": "bar", - "bar": 7, - "type": "int" - }, - "幻灭踢强化层数": { - "step": "bar", - "bar": 8, - "type": "int" - }, - "赤精之舞层数": { - "step": "bar", - "bar": 9, - "type": "int" - }, - "青龙之心层数": { - "step": "bar", - "bar": 10, - "type": "int" + "category": "玩家", + "displayName": "组合拳天神御身", + "spellId": 1249790, + "scope": "player", + "metric": "value", + "spellIds": [ + 1249790 + ] } }, "spells": { - "业报之触": { + "122470.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "业报之触", + "spellId": 122470, + "metric": "cooldown" }, - "旭日东升踢": { + "107428.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "旭日东升踢", + "spellId": 107428, + "metric": "cooldown" }, - "乾元之巅": { + "1249625.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "乾元之巅", + "spellId": 1249625, + "metric": "cooldown" }, - "乾元之巅充能": { + "1249625.chargeCooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "乾元之巅充能", + "spellId": 1249625, + "metric": "chargeCooldown" }, - "乾元之巅层数": { + "1249625.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "乾元之巅层数", + "spellId": 1249625, + "metric": "count" }, - "清创生血": { + "218164.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "清创生血", + "spellId": 218164, + "metric": "cooldown" }, - "升龙霸": { + "152175.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "升龙霸", + "spellId": 152175, + "metric": "cooldown" }, - "翔龙在天": { + "101545.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "翔龙在天", + "spellId": 101545, + "metric": "cooldown" }, - "怒雷破": { + "113656.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "怒雷破", + "spellId": 113656, + "metric": "cooldown" }, - "轮回之触": { + "322109.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "轮回之触", + "spellId": 322109, + "metric": "cooldown" }, - "扫堂腿": { + "119381.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "扫堂腿", + "spellId": 119381, + "metric": "cooldown" }, - "移花接木": { + "322101.cooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "移花接木", + "spellId": 322101, + "metric": "cooldown" }, - "魂体双分": { + "101643.cooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "魂体双分", + "spellId": 101643, + "metric": "cooldown" }, - "魂体双分:转移": { + "119996.cooldown": { "step": 82, - "type": "int" + "type": "int", + "displayName": "魂体双分:转移", + "spellId": 119996, + "metric": "cooldown" }, - "切喉手": { + "116705.cooldown": { "step": 83, - "type": "int" + "type": "int", + "displayName": "切喉手", + "spellId": 116705, + "metric": "cooldown" }, - "赤精之歌": { + "198898.cooldown": { "step": 84, - "type": "int" + "type": "int", + "displayName": "赤精之歌", + "spellId": 198898, + "metric": "cooldown" }, - "平心之环": { + "116844.cooldown": { "step": 85, - "type": "int" + "type": "int", + "displayName": "平心之环", + "spellId": 116844, + "metric": "cooldown" }, - "分筋错骨": { + "115078.cooldown": { "step": 86, - "type": "int" + "type": "int", + "displayName": "分筋错骨", + "spellId": 115078, + "metric": "cooldown" }, - "白虎下凡": { + "123904.cooldown": { "step": 87, - "type": "int" + "type": "int", + "displayName": "白虎下凡", + "spellId": 123904, + "metric": "cooldown" }, - "天神御身": { + "443028.cooldown": { "step": 88, - "type": "int" + "type": "int", + "displayName": "天神御身", + "spellId": 443028, + "metric": "cooldown" }, - "风领主之击": { + "392983.cooldown": { "step": 89, - "type": "int" + "type": "int", + "displayName": "风领主之击", + "spellId": 392983, + "metric": "cooldown" }, - "众神聚心": { + "443591.cooldown": { "step": 90, - "type": "int" + "type": "int", + "displayName": "众神聚心", + "spellId": 443591, + "metric": "cooldown" }, - "乾元镇踏": { + "1272696.cooldown": { "step": 91, - "type": "int" + "type": "int", + "displayName": "乾元镇踏", + "spellId": 1272696, + "metric": "cooldown" }, - "乾元镇踏充能": { + "1272696.chargeCooldown": { "step": 92, - "type": "int" + "type": "int", + "displayName": "乾元镇踏充能", + "spellId": 1272696, + "metric": "chargeCooldown" }, - "乾元镇踏层数": { + "1272696.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "乾元镇踏层数", + "spellId": 1272696, + "metric": "count" } } } diff --git a/config/Paladin.json b/config/Paladin.json index 168f91ca..dc202fc4 100644 --- a/config/Paladin.json +++ b/config/Paladin.json @@ -1,70 +1,70 @@ { "keymap": "paladin.json", "一键法术": { - "1": "盲目之光", - "2": "光环掌握", - "3": "自由祝福", - "4": "制裁之锤", - "5": "保护祝福", - "6": "圣盾术", - "7": "圣洁鸣钟", - "8": "复仇者之盾", - "9": "奉献", - "10": "审判", - "11": "正义盾击", - "12": "祝福之锤", - "13": "公正之剑", - "14": "审判", - "15": "最终审判", - "16": "灰烬觉醒", - "17": "神圣风暴", - "18": "圣光之锤", - "19": "愤怒之锤", - "20": "处决宣判", - "21": "愤怒之锤", - "22": "圣光术", - "23": "圣光闪现", - "24": "美德道标", - "25": "神圣棱镜", - "26": "正义之锤", - "27": "牺牲祝福", - "28": "代祷", - "29": "圣疗术", - "30": "十字军打击", - "31": "愤怒之锤", - "32": "愤怒之锤", - "33": "愤怒之锤", - "34": "清洁术", - "35": "黎明之光", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 115750, + "2": 31821, + "3": 1044, + "4": 853, + "5": 1022, + "6": 642, + "7": 375576, + "8": 31935, + "9": 26573, + "10": 275779, + "11": 53600, + "12": 204019, + "13": 184575, + "14": 20271, + "15": 383328, + "16": 255937, + "17": 53385, + "18": 427453, + "19": 24275, + "20": 343527, + "21": 1241413, + "22": 82326, + "23": 19750, + "24": 200025, + "25": 114165, + "26": 53595, + "27": 6940, + "28": 391054, + "29": 633, + "30": 35395, + "31": 1241288, + "32": 1277026, + "33": 1279408, + "34": 4987, + "35": 85222, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -283,189 +283,394 @@ "category": "首领2" }, "auras": { - "神圣壁垒": { + "player.432502.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "神圣壁垒", + "spellId": 432502, + "scope": "player", + "metric": "value", + "spellIds": [ + 432502 + ] }, - "圣洁武器": { + "player.432496.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "圣洁武器", + "spellId": 432496, + "scope": "player", + "metric": "value", + "spellIds": [ + 432496 + ] }, - "神圣意志": { + "player.223819.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "神圣意志", + "spellId": 223819, + "scope": "player", + "metric": "value", + "spellIds": [ + 223819 + ] }, - "苍穹之遗": { + "player.387178.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "苍穹之遗", + "spellId": 387178, + "scope": "player", + "metric": "value", + "spellIds": [ + 387178 + ] }, - "圣光灌注": { + "player.54149.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "圣光灌注", + "spellId": 54149, + "scope": "player", + "metric": "value", + "spellIds": [ + 54149 + ] }, - "晨光": { + "player.54149.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "圣光灌注层数", + "spellId": 54149, + "scope": "player", + "metric": "apps", + "spellIds": [ + 54149 + ], + "bar": 3 + }, + "player.431522.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "晨光", + "spellId": 431522, + "scope": "player", + "metric": "value", + "spellIds": [ + 431522 + ] }, - "晨光-恢复": { + "player.431522.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "晨光层数", + "spellId": 431522, + "scope": "player", + "metric": "apps", + "spellIds": [ + 431522 + ], + "bar": 4 + }, + "player.431831.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "晨光-恢复", + "spellId": 431831, + "scope": "player", + "metric": "value", + "spellIds": [ + 431831 + ] }, - "神性之手": { + "player.431831.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "晨光-恢复层数", + "spellId": 431831, + "scope": "player", + "metric": "apps", + "spellIds": [ + 431831 + ], + "bar": 5 + }, + "player.414273.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "神性之手", + "spellId": 414273, + "scope": "player", + "metric": "value", + "spellIds": [ + 414273 + ] }, - "复仇之怒": { + "player.414273.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "神性之手层数", + "spellId": 414273, + "scope": "player", + "metric": "apps", + "spellIds": [ + 414273 + ], + "bar": 6 + }, + "player.31884.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "复仇之怒", + "spellId": 31884, + "scope": "player", + "metric": "value", + "spellIds": [ + 31884 + ] }, - "觉醒": { + "player.31884.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "复仇之怒层数", + "spellId": 31884, + "scope": "player", + "metric": "apps", + "spellIds": [ + 31884 + ], + "bar": 7 + }, + "player.414193.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "觉醒", + "spellId": 414193, + "scope": "player", + "metric": "value", + "spellIds": [ + 414193 + ] }, - "美德道标": { + "player.200025.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "美德道标", + "spellId": 200025, + "scope": "player", + "metric": "value", + "spellIds": [ + 200025 + ] }, - "目标失格者": { + "target.harmful.414022.value": { "step": 58, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "失格者", + "spellId": 414022, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 414022 + ] }, - "目标奉献": { + "target.harmful.204242.value": { "step": 59, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "奉献", + "spellId": 204242, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 204242 + ] }, - "焦点失格者": { + "focus.harmful.414022.value": { "step": 60, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "失格者", + "spellId": 414022, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 414022 + ] }, - "焦点奉献": { + "focus.harmful.204242.value": { "step": 61, "type": "int", - "category": "焦点减益" - }, - "圣光灌注层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "晨光层数": { - "step": "bar", - "bar": 4, - "type": "int" - }, - "晨光-恢复层数": { - "step": "bar", - "bar": 5, - "type": "int" - }, - "神性之手层数": { - "step": "bar", - "bar": 6, - "type": "int" - }, - "复仇之怒层数": { - "step": "bar", - "bar": 7, - "type": "int" + "category": "焦点减益", + "displayName": "奉献", + "spellId": 204242, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 204242 + ] } }, "spells": { - "盲目之光": { + "115750.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "盲目之光", + "spellId": 115750, + "metric": "cooldown" }, - "制裁之锤": { + "853.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "制裁之锤", + "spellId": 853, + "metric": "cooldown" }, - "圣盾术": { + "642.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "圣盾术", + "spellId": 642, + "metric": "cooldown" }, - "牺牲祝福": { + "6940.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "牺牲祝福", + "spellId": 6940, + "metric": "cooldown" }, - "自由祝福": { + "1044.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "自由祝福", + "spellId": 1044, + "metric": "cooldown" }, - "保护祝福": { + "1022.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "保护祝福", + "spellId": 1022, + "metric": "cooldown" }, - "圣疗术": { + "633.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "圣疗术", + "spellId": 633, + "metric": "cooldown" }, - "神圣震击": { + "20473.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "神圣震击", + "spellId": 20473, + "metric": "cooldown" }, - "神圣震击充能": { + "20473.chargeCooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "神圣震击充能", + "spellId": 20473, + "metric": "chargeCooldown" }, - "神圣震击层数": { + "20473.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "神圣震击层数", + "spellId": 20473, + "metric": "count" }, - "清洁术": { + "4987.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "清洁术", + "spellId": 4987, + "metric": "cooldown" }, - "审判": { + "275773.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "审判", + "spellId": 275773, + "metric": "cooldown" }, - "圣洁鸣钟": { + "375576.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "圣洁鸣钟", + "spellId": 375576, + "metric": "cooldown" }, - "神圣棱镜": { + "114165.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "神圣棱镜", + "spellId": 114165, + "metric": "cooldown" }, - "光环掌握": { + "31821.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "光环掌握", + "spellId": 31821, + "metric": "cooldown" }, - "美德道标": { + "200025.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "美德道标", + "spellId": 200025, + "metric": "cooldown" }, - "神圣壁垒": { + "432459.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "神圣壁垒", + "spellId": 432459, + "metric": "cooldown" }, - "神圣壁垒充能": { + "432459.chargeCooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "神圣壁垒充能", + "spellId": 432459, + "metric": "chargeCooldown" }, - "神圣壁垒层数": { + "432459.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "神圣壁垒层数", + "spellId": 432459, + "metric": "count" }, - "代祷": { + "391054.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "代祷", + "spellId": 391054, + "metric": "cooldown" } }, "group": { @@ -483,17 +688,29 @@ "step": 3, "type": "int" }, - "救赎之魂": { + "auras.53563.value": { "step": 4, - "type": "int" + "type": "int", + "displayName": "圣光道标", + "spellId": 53563, + "scope": "group", + "metric": "value", + "spellIds": [ + 53563, + 156910, + 1244893 + ] }, - "圣光道标": { + "auras.156322.value": { "step": 5, - "type": "int" - }, - "永恒之火": { - "step": 6, - "type": "int" + "type": "int", + "displayName": "永恒之火", + "spellId": 156322, + "scope": "group", + "metric": "value", + "spellIds": [ + 156322 + ] } } }, @@ -749,163 +966,305 @@ "category": "鼠标" }, "auras": { - "闪耀之光": { + "player.327510.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "闪耀之光", + "spellId": 327510, + "scope": "player", + "metric": "value", + "spellIds": [ + 327510 + ] }, - "小闪耀之光": { + "player.327510.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "闪耀之光层数", + "spellId": 327510, + "scope": "player", + "metric": "apps", + "spellIds": [ + 327510 + ], + "bar": 5 + }, + "player.182104.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "小闪耀之光", + "spellId": 182104, + "scope": "player", + "metric": "value", + "spellIds": [ + 182104 + ] }, - "正义盾击": { + "player.182104.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "小闪耀之光层数", + "spellId": 182104, + "scope": "player", + "metric": "apps", + "spellIds": [ + 182104 + ], + "bar": 6 + }, + "player.132403.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "正义盾击", + "spellId": 132403, + "scope": "player", + "metric": "value", + "spellIds": [ + 132403 + ] }, - "奉献": { + "player.188370.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "奉献", + "spellId": 188370, + "scope": "player", + "metric": "value", + "spellIds": [ + 188370 + ] }, - "圣言祭礼": { + "player.433550.value": { "step": 58, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "圣言祭礼", + "spellId": 433550, + "scope": "player", + "metric": "value", + "spellIds": [ + 433550 + ] }, - "虔诚光环": { + "player.135893.value": { "step": 59, "type": "int", - "category": "玩家" - }, - "闪耀之光层数": { - "step": "bar", - "bar": 5, - "type": "int" - }, - "小闪耀之光层数": { - "step": "bar", - "bar": 6, - "type": "int" + "category": "玩家", + "displayName": "虔诚光环", + "spellId": 135893, + "scope": "player", + "metric": "value", + "spellIds": [ + 135893 + ] } }, "spells": { - "圣洁武器": { + "432472.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "圣洁武器", + "spellId": 432472, + "metric": "cooldown" }, - "圣洁武器充能": { + "432472.chargeCooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "圣洁武器充能", + "spellId": 432472, + "metric": "chargeCooldown" }, - "圣洁武器层数": { + "432472.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "圣洁武器层数", + "spellId": 432472, + "metric": "count" }, - "神圣壁垒": { + "432459.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "神圣壁垒", + "spellId": 432459, + "metric": "cooldown" }, - "神圣壁垒充能": { + "432459.chargeCooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "神圣壁垒充能", + "spellId": 432459, + "metric": "chargeCooldown" }, - "神圣壁垒层数": { + "432459.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "神圣壁垒层数", + "spellId": 432459, + "metric": "count" }, - "清毒术": { + "213644.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "清毒术", + "spellId": 213644, + "metric": "cooldown" }, - "审判": { + "275779.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "审判", + "spellId": 275779, + "metric": "cooldown" }, - "审判充能": { + "275779.chargeCooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "审判充能", + "spellId": 275779, + "metric": "chargeCooldown" }, - "审判层数": { + "275779.count": { "step": "bar", "bar": 3, - "type": "int" + "type": "int", + "displayName": "审判层数", + "spellId": 275779, + "metric": "count" }, - "复仇者之盾": { + "31935.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "复仇者之盾", + "spellId": 31935, + "metric": "cooldown" }, - "奉献": { + "26573.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "奉献", + "spellId": 26573, + "metric": "cooldown" }, - "正义盾击": { + "53600.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "正义盾击", + "spellId": 53600, + "metric": "cooldown" }, - "荣耀圣令": { + "85673.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "荣耀圣令", + "spellId": 85673, + "metric": "cooldown" }, - "责难": { + "96231.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "责难", + "spellId": 96231, + "metric": "cooldown" }, - "祝福之锤": { + "204019.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "祝福之锤", + "spellId": 204019, + "metric": "cooldown" }, - "祝福之锤充能": { + "204019.chargeCooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "祝福之锤充能", + "spellId": 204019, + "metric": "chargeCooldown" }, - "祝福之锤层数": { + "204019.count": { "step": "bar", "bar": 4, - "type": "int" + "type": "int", + "displayName": "祝福之锤层数", + "spellId": 204019, + "metric": "count" }, - "戒卫": { + "389539.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "戒卫", + "spellId": 389539, + "metric": "cooldown" }, - "圣洁鸣钟": { + "375576.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "圣洁鸣钟", + "spellId": 375576, + "metric": "cooldown" }, - "盲目之光": { + "115750.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "盲目之光", + "spellId": 115750, + "metric": "cooldown" }, - "制裁之锤": { + "853.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "制裁之锤", + "spellId": 853, + "metric": "cooldown" }, - "圣盾术": { + "642.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "圣盾术", + "spellId": 642, + "metric": "cooldown" }, - "牺牲祝福": { + "6940.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "牺牲祝福", + "spellId": 6940, + "metric": "cooldown" }, - "自由祝福": { + "1044.cooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "自由祝福", + "spellId": 1044, + "metric": "cooldown" }, - "保护祝福": { + "1022.cooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "保护祝福", + "spellId": 1022, + "metric": "cooldown" }, - "圣疗术": { + "633.cooldown": { "step": 82, - "type": "int" + "type": "int", + "displayName": "圣疗术", + "spellId": 633, + "metric": "cooldown" }, - "正义之锤": { + "24275.cooldown": { "step": 83, - "type": "int" + "type": "int", + "displayName": "愤怒之锤", + "spellId": 24275, + "metric": "cooldown" } }, "group": { @@ -1153,65 +1512,110 @@ "category": "鼠标" }, "spells": { - "盲目之光": { + "115750.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "盲目之光", + "spellId": 115750, + "metric": "cooldown" }, - "制裁之锤": { + "853.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "制裁之锤", + "spellId": 853, + "metric": "cooldown" }, - "圣盾术": { + "642.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "圣盾术", + "spellId": 642, + "metric": "cooldown" }, - "牺牲祝福": { + "6940.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "牺牲祝福", + "spellId": 6940, + "metric": "cooldown" }, - "自由祝福": { + "1044.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "自由祝福", + "spellId": 1044, + "metric": "cooldown" }, - "保护祝福": { + "1022.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "保护祝福", + "spellId": 1022, + "metric": "cooldown" }, - "圣疗术": { + "633.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "圣疗术", + "spellId": 633, + "metric": "cooldown" }, - "清毒术": { + "213644.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "清毒术", + "spellId": 213644, + "metric": "cooldown" }, - "审判": { + "20271.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "审判", + "spellId": 20271, + "metric": "cooldown" }, - "审判充能": { + "20271.chargeCooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "审判充能", + "spellId": 20271, + "metric": "chargeCooldown" }, - "圣洁鸣钟": { + "375576.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "圣洁鸣钟", + "spellId": 375576, + "metric": "cooldown" }, - "公正之剑": { + "184575.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "公正之剑", + "spellId": 184575, + "metric": "cooldown" }, - "处决宣判": { + "343527.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "处决宣判", + "spellId": 343527, + "metric": "cooldown" }, - "灰烬觉醒": { + "255937.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "灰烬觉醒", + "spellId": 255937, + "metric": "cooldown" }, - "复仇之怒": { + "31884.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "复仇之怒", + "spellId": 31884, + "metric": "cooldown" } }, "group": { diff --git a/config/Priest.json b/config/Priest.json index 95a5648d..9591a76e 100644 --- a/config/Priest.json +++ b/config/Priest.json @@ -1,71 +1,71 @@ { "keymap": "priest.json", "一键法术": { - "1": "心灵尖啸", - "2": "群体驱散", - "3": "真言术:障", - "4": "终极苦修", - "5": "神圣化身", - "6": "光晕", - "7": "神圣赞美诗", - "8": "虚空形态", - "9": "吸血鬼的拥抱", - "10": "真言术:韧", - "11": "心灵震爆", - "12": "惩击", - "13": "暗言术:灭", - "14": "暗言术:痛", - "15": "苦修", - "16": "圣言术:罚", - "17": "神圣之火", - "18": "神圣新星", - "19": "吸血鬼之触", - "20": "暗影形态", - "21": "暗言术:癫", - "22": "精神鞭笞", - "23": "虚空洪流", - "24": "触须猛击", - "25": "虚空冲击", - "26": "虚空齐射", - "27": "精神鞭笞:狂", - "28": "光晕", - "29": "快速治疗", - "30": "真言术:耀", - "31": "神圣赞美诗", - "32": "治疗祷言", - "33": "祈福", - "34": "暗影愈合", - "35": "福音", - "36": "驱散魔法", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 8122, + "2": 32375, + "3": 62618, + "4": 421453, + "5": 200183, + "6": 120517, + "7": 64843, + "8": 228260, + "9": 15286, + "10": 21562, + "11": 8092, + "12": 585, + "13": 32379, + "14": 589, + "15": 47540, + "16": 88625, + "17": 14914, + "18": 132157, + "19": 34914, + "20": 232698, + "21": 335467, + "22": 15407, + "23": 263165, + "24": 1227280, + "25": 450983, + "26": 1242173, + "27": 391403, + "28": 120644, + "29": 2061, + "30": 194509, + "31": 64863, + "32": 596, + "33": 1262763, + "34": 186263, + "35": 472433, + "36": 528, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -269,194 +269,409 @@ "category": "鼠标" }, "auras": { - "熵能裂隙": { + "player.450193.value": { "step": 44, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "熵能裂隙", + "spellId": 450193, + "scope": "player", + "metric": "value", + "spellIds": [ + 450193 + ] }, - "天使长": { + "player.81700.value": { "step": 45, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "天使长", + "spellId": 81700, + "scope": "player", + "metric": "value", + "spellIds": [ + 81700 + ] }, - "阴暗面之力": { + "player.198069.value": { "step": 46, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "阴暗面之力", + "spellId": 198069, + "scope": "player", + "metric": "value", + "spellIds": [ + 198069 + ] }, - "黑暗主宰": { + "player.1253591.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "黑暗主宰", + "spellId": 1253591, + "scope": "player", + "metric": "value", + "spellIds": [ + 1253591 + ] }, - "圣光涌动": { + "player.1253591.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "黑暗主宰层数", + "spellId": 1253591, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1253591 + ], + "bar": 3 + }, + "player.114255.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "圣光涌动", + "spellId": 114255, + "scope": "player", + "metric": "value", + "spellIds": [ + 114255 + ] }, - "福音": { + "player.114255.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "圣光涌动层数", + "spellId": 114255, + "scope": "player", + "metric": "apps", + "spellIds": [ + 114255 + ], + "bar": 4 + }, + "player.472433.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "福音", + "spellId": 472433, + "scope": "player", + "metric": "value", + "spellIds": [ + 472433 + ] }, - "强效惩击": { + "player.472433.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "福音层数", + "spellId": 472433, + "scope": "player", + "metric": "apps", + "spellIds": [ + 472433 + ], + "bar": 5 + }, + "player.1253725.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "强效惩击", + "spellId": 1253725, + "scope": "player", + "metric": "value", + "spellIds": [ + 1253725 + ] }, - "严酷戒律": { + "player.1253725.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "强效惩击层数", + "spellId": 1253725, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1253725 + ], + "bar": 6 + }, + "player.373183.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "严酷戒律", + "spellId": 373183, + "scope": "player", + "metric": "value", + "spellIds": [ + 373183 + ] }, - "祸福相依": { + "player.373183.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "严酷戒律层数", + "spellId": 373183, + "scope": "player", + "metric": "apps", + "spellIds": [ + 373183 + ], + "bar": 7 + }, + "player.390787.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "祸福相依", + "spellId": 390787, + "scope": "player", + "metric": "value", + "spellIds": [ + 390787 + ] }, - "目标暗言术:痛": { + "player.390787.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "祸福相依层数", + "spellId": 390787, + "scope": "player", + "metric": "apps", + "spellIds": [ + 390787 + ], + "bar": 8 + }, + "target.harmful.589.value": { "step": 53, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "暗言术:痛", + "spellId": 589, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 589 + ] }, - "目标救赎": { + "target.helpful.194384.value": { "step": 54, "type": "int", - "category": "目标增益" + "category": "目标增益", + "displayName": "救赎", + "spellId": 194384, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 194384 + ] }, - "目标真言术:盾": { + "target.helpful.17.value": { "step": 55, "type": "int", - "category": "目标增益" + "category": "目标增益", + "displayName": "真言术:盾", + "spellId": 17, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 17, + 1253593 + ] }, - "焦点暗言术:痛": { + "focus.harmful.589.value": { "step": 56, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "暗言术:痛", + "spellId": 589, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 589 + ] }, - "焦点救赎": { + "focus.helpful.194384.value": { "step": 57, "type": "int", - "category": "焦点增益" + "category": "焦点增益", + "displayName": "救赎", + "spellId": 194384, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 194384 + ] }, - "焦点真言术:盾": { + "focus.helpful.17.value": { "step": 58, "type": "int", - "category": "焦点增益" - }, - "黑暗主宰层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "圣光涌动层数": { - "step": "bar", - "bar": 4, - "type": "int" - }, - "福音层数": { - "step": "bar", - "bar": 5, - "type": "int" - }, - "强效惩击层数": { - "step": "bar", - "bar": 6, - "type": "int" - }, - "严酷戒律层数": { - "step": "bar", - "bar": 7, - "type": "int" - }, - "祸福相依层数": { - "step": "bar", - "bar": 8, - "type": "int" + "category": "焦点增益", + "displayName": "真言术:盾", + "spellId": 17, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 17, + 1253593 + ] } }, "spells": { - "心灵尖啸": { + "8122.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "心灵尖啸", + "spellId": 8122, + "metric": "cooldown" }, - "群体驱散": { + "32375.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "群体驱散", + "spellId": 32375, + "metric": "cooldown" }, - "纯净术": { + "527.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "纯净术", + "spellId": 527, + "metric": "cooldown" }, - "绝望祷言": { + "19236.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "绝望祷言", + "spellId": 19236, + "metric": "cooldown" }, - "奥术洪流": { + "232633.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "奥术洪流", + "spellId": 232633, + "metric": "cooldown" }, - "苦修": { + "47540.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "苦修", + "spellId": 47540, + "metric": "cooldown" }, - "苦修充能": { + "47540.chargeCooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "苦修充能", + "spellId": 47540, + "metric": "chargeCooldown" }, - "苦修层数": { + "47540.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "苦修层数", + "spellId": 47540, + "metric": "count" }, - "真言术:耀": { + "194509.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "真言术:耀", + "spellId": 194509, + "metric": "cooldown" }, - "真言术:耀充能": { + "194509.chargeCooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "真言术:耀充能", + "spellId": 194509, + "metric": "chargeCooldown" }, - "真言术:耀层数": { + "194509.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "真言术:耀层数", + "spellId": 194509, + "metric": "count" }, - "真言术:盾": { + "17.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "真言术:盾", + "spellId": 17, + "metric": "cooldown" }, - "真言术:障": { + "62618.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "真言术:障", + "spellId": 62618, + "metric": "cooldown" }, - "终极苦修": { + "421453.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "终极苦修", + "spellId": 421453, + "metric": "cooldown" }, - "福音": { + "472433.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "福音", + "spellId": 472433, + "metric": "cooldown" }, - "心灵震爆": { + "8092.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "心灵震爆", + "spellId": 8092, + "metric": "cooldown" }, - "暗言术:灭": { + "32379.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "暗言术:灭", + "spellId": 32379, + "metric": "cooldown" }, - "暗影魔": { + "34433.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "暗影魔", + "spellId": 34433, + "metric": "cooldown" }, - "暗影分流": { + "1235211.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "暗影分流", + "spellId": 1235211, + "metric": "cooldown" }, - "渐隐术": { + "586.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "渐隐术", + "spellId": 586, + "metric": "cooldown" } }, "group": { @@ -474,13 +689,28 @@ "step": 3, "type": "int" }, - "救赎": { + "auras.194384.value": { "step": 4, - "type": "int" + "type": "int", + "displayName": "救赎", + "spellId": 194384, + "scope": "group", + "metric": "value", + "spellIds": [ + 194384 + ] }, - "真言术:盾": { + "auras.17.value": { "step": 5, - "type": "int" + "type": "int", + "displayName": "真言术:盾", + "spellId": 17, + "scope": "group", + "metric": "value", + "spellIds": [ + 17, + 1253593 + ] } } }, @@ -575,287 +805,433 @@ "type": "int", "category": "状态" }, - "救赎之魂1": { - "step": 22, - "type": "int", - "category": "状态" - }, - "救赎之魂2": { - "step": 23, - "type": "int", - "category": "状态" - }, - "打断施法": { - "step": 24, - "type": "int", - "category": "状态" - }, "法力值": { - "step": 25, + "step": 22, "type": "int", "category": "能量" }, "治疗药水": { - "step": 26, + "step": 23, "type": "int", "category": "物品" }, "延迟": { - "step": 27, + "step": 24, "type": "int", "category": "配置开关" }, "爆发开关": { - "step": 28, + "step": 25, "type": "int", "category": "配置开关" }, "目标类型": { - "step": 29, + "step": 26, "type": "int", "category": "目标" }, "目标施法(倒计时)": { - "step": 30, + "step": 27, "type": "int", "category": "目标" }, "目标施法(正计时)": { - "step": 31, + "step": 28, "type": "int", "category": "目标" }, "目标施法可打断": { - "step": 32, + "step": 29, "type": "int", "category": "目标" }, "目标驱散类型": { - "step": 33, + "step": 30, "type": "int", "category": "目标" }, "鼠标类型": { - "step": 34, + "step": 31, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 35, + "step": 32, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 36, + "step": 33, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 37, + "step": 34, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 38, + "step": 35, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 39, + "step": 36, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 40, + "step": 37, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 41, + "step": 38, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 42, + "step": 39, "type": "int", "category": "鼠标" }, "首领1施法(倒计时)": { - "step": 43, + "step": 40, "type": "int", "category": "首领1" }, "首领1施法(正计时)": { - "step": 44, + "step": 41, "type": "int", "category": "首领1" }, "首领2施法(倒计时)": { - "step": 45, + "step": 42, "type": "int", "category": "首领2" }, "首领2施法(正计时)": { - "step": 46, + "step": 43, "type": "int", "category": "首领2" }, "auras": { - "神圣化身": { + "player.200183.value": { + "step": 44, + "type": "int", + "category": "玩家", + "displayName": "神圣化身", + "spellId": 200183, + "scope": "player", + "metric": "value", + "spellIds": [ + 200183 + ] + }, + "player.405216.value": { + "step": 45, + "type": "int", + "category": "玩家", + "displayName": "神圣镜像", + "spellId": 405216, + "scope": "player", + "metric": "value", + "spellIds": [ + 405216 + ] + }, + "player.114255.value": { + "step": 46, + "type": "int", + "category": "玩家", + "displayName": "圣光涌动", + "spellId": 114255, + "scope": "player", + "metric": "value", + "spellIds": [ + 114255 + ] + }, + "player.114255.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "圣光涌动层数", + "spellId": 114255, + "scope": "player", + "metric": "apps", + "spellIds": [ + 114255 + ], + "bar": 3 + }, + "player.1262766.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "祈福", + "spellId": 1262766, + "scope": "player", + "metric": "value", + "spellIds": [ + 1262766 + ] }, - "神圣镜像": { + "player.1262766.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "祈福层数", + "spellId": 1262766, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1262766 + ], + "bar": 4 + }, + "player.194384.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "救赎之魂", + "spellId": 194384, + "scope": "player", + "metric": "value", + "spellIds": [ + 194384 + ] }, - "圣光涌动": { + "target.harmful.589.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "目标减益", + "displayName": "暗言术:痛", + "spellId": 589, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 589 + ] }, - "祈福": { + "target.harmful.14914.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "目标减益", + "displayName": "神圣之火", + "spellId": 14914, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 14914 + ] }, - "救赎之魂": { + "target.helpful.41635.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "目标增益", + "displayName": "愈合祷言", + "spellId": 41635, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 41635 + ] }, - "目标暗言术:痛": { + "target.helpful.139.value": { "step": 52, "type": "int", - "category": "目标减益" + "category": "目标增益", + "displayName": "恢复", + "spellId": 139, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 139 + ] }, - "目标神圣之火": { + "focus.harmful.589.value": { "step": 53, "type": "int", - "category": "目标减益" + "category": "焦点减益", + "displayName": "暗言术:痛", + "spellId": 589, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 589 + ] }, - "目标愈合祷言": { + "focus.harmful.14914.value": { "step": 54, "type": "int", - "category": "目标增益" + "category": "焦点减益", + "displayName": "神圣之火", + "spellId": 14914, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 14914 + ] }, - "目标恢复": { + "focus.helpful.41635.value": { "step": 55, "type": "int", - "category": "目标增益" + "category": "焦点增益", + "displayName": "愈合祷言", + "spellId": 41635, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 41635 + ] }, - "焦点暗言术:痛": { + "focus.helpful.139.value": { "step": 56, "type": "int", - "category": "焦点减益" - }, - "焦点神圣之火": { - "step": 57, - "type": "int", - "category": "焦点减益" - }, - "焦点愈合祷言": { - "step": 58, - "type": "int", - "category": "焦点增益" - }, - "焦点恢复": { - "step": 59, - "type": "int", - "category": "焦点增益" - }, - "圣光涌动层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "祈福层数": { - "step": "bar", - "bar": 4, - "type": "int" + "category": "焦点增益", + "displayName": "恢复", + "spellId": 139, + "scope": "focus.helpful", + "metric": "value", + "spellIds": [ + 139 + ] } }, "spells": { - "心灵尖啸": { + "8122.cooldown": { + "step": 57, + "type": "int", + "displayName": "心灵尖啸", + "spellId": 8122, + "metric": "cooldown" + }, + "32375.cooldown": { + "step": 58, + "type": "int", + "displayName": "群体驱散", + "spellId": 32375, + "metric": "cooldown" + }, + "527.cooldown": { + "step": 59, + "type": "int", + "displayName": "纯净术", + "spellId": 527, + "metric": "cooldown" + }, + "19236.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "绝望祷言", + "spellId": 19236, + "metric": "cooldown" }, - "群体驱散": { + "232633.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "奥术洪流", + "spellId": 232633, + "metric": "cooldown" }, - "纯净术": { + "33076.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "愈合祷言", + "spellId": 33076, + "metric": "cooldown" }, - "绝望祷言": { + "33076.chargeCooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "愈合祷言充能", + "spellId": 33076, + "metric": "chargeCooldown" }, - "奥术洪流": { - "step": 64, - "type": "int" - }, - "愈合祷言": { - "step": 65, - "type": "int" - }, - "愈合祷言充能": { - "step": 66, - "type": "int" - }, - "愈合祷言层数": { + "33076.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "愈合祷言层数", + "spellId": 33076, + "metric": "count" }, - "圣言术:静": { - "step": 67, - "type": "int" + "2050.cooldown": { + "step": 64, + "type": "int", + "displayName": "圣言术:静", + "spellId": 2050, + "metric": "cooldown" }, - "圣言术:静充能": { - "step": 68, - "type": "int" + "2050.chargeCooldown": { + "step": 65, + "type": "int", + "displayName": "圣言术:静充能", + "spellId": 2050, + "metric": "chargeCooldown" }, - "圣言术:静层数": { + "2050.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "圣言术:静层数", + "spellId": 2050, + "metric": "count" }, - "圣言术:罚": { + "88625.cooldown": { + "step": 66, + "type": "int", + "displayName": "圣言术:罚", + "spellId": 88625, + "metric": "cooldown" + }, + "200183.cooldown": { + "step": 67, + "type": "int", + "displayName": "神圣化身", + "spellId": 200183, + "metric": "cooldown" + }, + "14914.cooldown": { + "step": 68, + "type": "int", + "displayName": "神圣之火", + "spellId": 14914, + "metric": "cooldown" + }, + "120517.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "光晕", + "spellId": 120517, + "metric": "cooldown" }, - "神圣化身": { + "64843.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "神圣赞美诗", + "spellId": 64843, + "metric": "cooldown" }, - "神圣之火": { + "586.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "渐隐术", + "spellId": 586, + "metric": "cooldown" }, - "光晕": { + "528.cooldown": { "step": 72, - "type": "int" - }, - "神圣赞美诗": { - "step": 73, - "type": "int" - }, - "渐隐术": { - "step": 74, - "type": "int" - }, - "驱散魔法": { - "step": 75, - "type": "int" + "type": "int", + "displayName": "驱散魔法", + "spellId": 528, + "metric": "cooldown" } }, "group": { - "start": 76, - "num": 6, + "start": 73, + "num": 5, "生命值": { "step": 1, "type": "int" @@ -868,17 +1244,27 @@ "step": 3, "type": "int" }, - "恢复": { + "auras.139.value": { "step": 4, - "type": "int" + "type": "int", + "displayName": "恢复", + "spellId": 139, + "scope": "group", + "metric": "value", + "spellIds": [ + 139 + ] }, - "愈合祷言": { + "auras.41635.value": { "step": 5, - "type": "int" - }, - "救赎之魂": { - "step": 6, - "type": "int" + "type": "int", + "displayName": "愈合祷言", + "spellId": 41635, + "scope": "group", + "metric": "value", + "spellIds": [ + 41635 + ] } } }, @@ -1114,154 +1500,330 @@ "category": "鼠标" }, "auras": { - "虚空齐射": { + "player.1242171.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "虚空齐射", + "spellId": 1242171, + "scope": "player", + "metric": "value", + "spellIds": [ + 1242171 + ] }, - "命运多舛": { + "player.1242171.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "虚空齐射层数", + "spellId": 1242171, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1242171 + ], + "bar": 1 + }, + "player.390978.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "命运多舛", + "spellId": 390978, + "scope": "player", + "metric": "value", + "spellIds": [ + 390978 + ] }, - "熵能裂隙": { + "player.450193.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "熵能裂隙", + "spellId": 450193, + "scope": "player", + "metric": "value", + "spellIds": [ + 450193 + ] }, - "暗影洞察": { + "player.375981.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "暗影洞察", + "spellId": 375981, + "scope": "player", + "metric": "value", + "spellIds": [ + 375981 + ] }, - "尤格-萨隆的神像": { + "player.373276.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "尤格-萨隆的神像", + "spellId": 373276, + "scope": "player", + "metric": "value", + "spellIds": [ + 373276 + ] }, - "目标暗言术:痛": { + "player.373276.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "尤格-萨隆的神像层数", + "spellId": 373276, + "scope": "player", + "metric": "apps", + "spellIds": [ + 373276 + ], + "bar": 2 + }, + "target.harmful.589.value": { "step": 55, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "暗言术:痛", + "spellId": 589, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 589 + ] }, - "目标吸血鬼之触": { + "target.harmful.34914.value": { "step": 56, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "吸血鬼之触", + "spellId": 34914, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 34914 + ] }, - "目标暗言术:癫": { + "target.harmful.335467.value": { "step": 57, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "暗言术:癫", + "spellId": 335467, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 335467 + ] }, - "目标精神鞭笞": { + "target.harmful.15407.value": { "step": 58, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "精神鞭笞", + "spellId": 15407, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 15407 + ] }, - "目标惊魂幻象": { + "target.harmful.1243069.value": { "step": 59, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "惊魂幻象", + "spellId": 1243069, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 1243069 + ] }, - "焦点暗言术:痛": { + "target.harmful.1243069.apps": { + "step": "bar", + "type": "int", + "category": "目标减益", + "displayName": "惊魂幻象层数", + "spellId": 1243069, + "scope": "target.harmful", + "metric": "apps", + "spellIds": [ + 1243069 + ], + "bar": 3 + }, + "focus.harmful.589.value": { "step": 60, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "暗言术:痛", + "spellId": 589, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 589 + ] }, - "焦点吸血鬼之触": { + "focus.harmful.34914.value": { "step": 61, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "吸血鬼之触", + "spellId": 34914, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 34914 + ] }, - "焦点暗言术:癫": { + "focus.harmful.335467.value": { "step": 62, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "暗言术:癫", + "spellId": 335467, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 335467 + ] }, - "焦点精神鞭笞": { + "focus.harmful.15407.value": { "step": 63, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "精神鞭笞", + "spellId": 15407, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 15407 + ] }, - "焦点惊魂幻象": { + "focus.harmful.1243069.value": { "step": 64, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "惊魂幻象", + "spellId": 1243069, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 1243069 + ] }, - "虚空齐射层数": { + "focus.harmful.1243069.apps": { "step": "bar", - "bar": 1, - "type": "int" - }, - "尤格-萨隆的神像层数": { - "step": "bar", - "bar": 2, - "type": "int" - }, - "目标惊魂幻象层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "焦点惊魂幻象层数": { - "step": "bar", - "bar": 4, - "type": "int" + "type": "int", + "category": "焦点减益", + "displayName": "惊魂幻象层数", + "spellId": 1243069, + "scope": "focus.harmful", + "metric": "apps", + "spellIds": [ + 1243069 + ], + "bar": 4 } }, "spells": { - "心灵尖啸": { + "8122.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "心灵尖啸", + "spellId": 8122, + "metric": "cooldown" }, - "群体驱散": { + "32375.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "群体驱散", + "spellId": 32375, + "metric": "cooldown" }, - "纯净术": { + "527.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "纯净术", + "spellId": 527, + "metric": "cooldown" }, - "绝望祷言": { + "19236.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "绝望祷言", + "spellId": 19236, + "metric": "cooldown" }, - "奥术洪流": { + "232633.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "奥术洪流", + "spellId": 232633, + "metric": "cooldown" }, - "心灵震爆": { + "8092.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "心灵震爆", + "spellId": 8092, + "metric": "cooldown" }, - "暗言术:灭": { + "32379.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "暗言术:灭", + "spellId": 32379, + "metric": "cooldown" }, - "虚空洪流": { + "263165.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "虚空洪流", + "spellId": 263165, + "metric": "cooldown" }, - "虚空形态": { + "228260.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "虚空形态", + "spellId": 228260, + "metric": "cooldown" }, - "触须猛击": { + "1227280.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "触须猛击", + "spellId": 1227280, + "metric": "cooldown" }, - "吸血鬼的拥抱": { + "15286.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "吸血鬼的拥抱", + "spellId": 15286, + "metric": "cooldown" }, - "光晕": { + "120644.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "光晕", + "spellId": 120644, + "metric": "cooldown" }, - "虚空齐射": { + "1242173.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "虚空齐射", + "spellId": 1242173, + "metric": "cooldown" } } } diff --git a/config/Rogue.json b/config/Rogue.json index e6ac567f..56f012f6 100644 --- a/config/Rogue.json +++ b/config/Rogue.json @@ -1,95 +1,95 @@ { "keymap": "rogue.json", "一键法术": { - "1": "毒刃", - "2": "致盲", - "3": "暗影斗篷", - "4": "凿击", - "5": "嫁祸诀窍", - "6": "闪避", - "7": "迟钝药膏", - "8": "萎缩药膏", - "9": "菊花茶", - "10": "肾击", - "11": "佯攻", - "12": "偷袭", - "13": "消失", - "14": "切割", - "15": "潜伏帷幕", - "16": "扰乱", - "17": "猩红之瓶", - "18": "疾跑", - "19": "闷棍", - "20": "速效药膏", - "21": "致伤药膏", - "22": "夺命药膏", - "23": "增效药膏", - "24": "减速药膏", - "25": "刀扇", - "26": "死亡印记", - "27": "死亡印记", - "28": "锁喉", - "29": "剧毒之刃", - "30": "割裂", - "31": "毁伤", - "32": "君王之灾", - "33": "毒伤", - "34": "暗影步", - "35": "猩红风暴", - "36": "伏击", - "37": "脚踢", - "38": "冲动", - "39": "影舞步", - "40": "正中眉心", - "41": "刀锋冲刺", - "42": "手枪射击", - "43": "剑刃乱舞", - "44": "抓钩", - "45": "命运骨骰", - "46": "斩击", - "47": "时运继延", - "48": "伺机待发", - "49": "黑火药", - "50": "影分身", - "51": "暗影之刃", - "52": "背刺", - "53": "暗影之舞", - "54": "袖剑风暴", - "55": "暗影打击", - "56": "飞镖投掷", - "57": "幽暗之刃", - "58": "赤喉之咬", - "59": "影袭", - "60": "致命一击", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 5938, + "2": 2094, + "3": 31224, + "4": 1776, + "5": 57934, + "6": 5277, + "7": 5761, + "8": 381637, + "9": 381623, + "10": 408, + "11": 1966, + "12": 1833, + "13": 1856, + "14": 315496, + "15": 114018, + "16": 1725, + "17": 185311, + "18": 2983, + "19": 6770, + "20": 315584, + "21": 8679, + "22": 2823, + "23": 381664, + "24": 3408, + "25": 51723, + "26": 360194, + "27": 1293340, + "28": 703, + "29": 185565, + "30": 1943, + "31": 1329, + "32": 385627, + "33": 32645, + "34": 36554, + "35": 1247227, + "36": 8676, + "37": 1766, + "38": 13750, + "39": 51690, + "40": 315341, + "41": 271877, + "42": 185763, + "43": 13877, + "44": 195475, + "45": 1214909, + "46": 2098, + "47": 381989, + "48": 1277933, + "49": 319175, + "50": 280719, + "51": 121471, + "52": 53, + "53": 185313, + "54": 197835, + "55": 185438, + "56": 114014, + "57": 200758, + "58": 426591, + "59": 193315, + "60": 441776, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -278,81 +278,145 @@ "category": "鼠标" }, "spells": { - "毒刃": { + "5938.cooldown": { "step": 41, - "type": "int" + "type": "int", + "displayName": "毒刃", + "spellId": 5938, + "metric": "cooldown" }, - "致盲": { + "2094.cooldown": { "step": 42, - "type": "int" + "type": "int", + "displayName": "致盲", + "spellId": 2094, + "metric": "cooldown" }, - "佯攻": { + "1966.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "佯攻", + "spellId": 1966, + "metric": "cooldown" }, - "消失": { + "1856.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "消失", + "spellId": 1856, + "metric": "cooldown" }, - "偷袭": { + "1833.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "偷袭", + "spellId": 1833, + "metric": "cooldown" }, - "潜伏帷幕": { + "114018.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "潜伏帷幕", + "spellId": 114018, + "metric": "cooldown" }, - "菊花茶": { + "381623.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "菊花茶", + "spellId": 381623, + "metric": "cooldown" }, - "闪避": { + "5277.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "闪避", + "spellId": 5277, + "metric": "cooldown" }, - "猩红之瓶": { + "185311.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "猩红之瓶", + "spellId": 185311, + "metric": "cooldown" }, - "扰乱": { + "1725.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "扰乱", + "spellId": 1725, + "metric": "cooldown" }, - "疾跑": { + "2983.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "疾跑", + "spellId": 2983, + "metric": "cooldown" }, - "凿击": { + "1776.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "凿击", + "spellId": 1776, + "metric": "cooldown" }, - "肾击": { + "408.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "肾击", + "spellId": 408, + "metric": "cooldown" }, - "暗影斗篷": { + "31224.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "暗影斗篷", + "spellId": 31224, + "metric": "cooldown" }, - "脚踢": { + "1766.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "脚踢", + "spellId": 1766, + "metric": "cooldown" }, - "死亡印记": { + "360194.cooldown": { + "step": 56, + "type": "int", + "displayName": "死亡印记", + "spellId": 360194, + "metric": "cooldown" + }, + "1293340.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "死亡印记", + "spellId": 1293340, + "metric": "cooldown" }, - "锁喉": { + "703.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "锁喉", + "spellId": 703, + "metric": "cooldown" }, - "君王之灾": { + "385627.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "君王之灾", + "spellId": 385627, + "metric": "cooldown" }, - "暗影步": { + "36554.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "暗影步", + "spellId": 36554, + "metric": "cooldown" } } }, @@ -573,157 +637,303 @@ "category": "鼠标" }, "auras": { - "切割": { + "player.315496.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "切割", + "spellId": 315496, + "scope": "player", + "metric": "value", + "spellIds": [ + 315496 + ] }, - "剑刃乱舞": { + "player.13877.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "剑刃乱舞", + "spellId": 13877, + "scope": "player", + "metric": "value", + "spellIds": [ + 13877 + ] }, - "冲动": { + "player.13750.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "冲动", + "spellId": 13750, + "scope": "player", + "metric": "value", + "spellIds": [ + 13750 + ] }, - "灌铅骰子": { + "player.256171.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "灌铅骰子", + "spellId": 256171, + "scope": "player", + "metric": "value", + "spellIds": [ + 256171 + ] }, - "可乘之机": { + "player.195627.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "可乘之机", + "spellId": 195627, + "scope": "player", + "metric": "value", + "spellIds": [ + 195627 + ] }, - "独一无二": { + "player.195627.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "可乘之机层数", + "spellId": 195627, + "scope": "player", + "metric": "apps", + "spellIds": [ + 195627 + ], + "bar": 1 + }, + "player.1214933.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "独一无二", + "spellId": 1214933, + "scope": "player", + "metric": "value", + "spellIds": [ + 1214933 + ] }, - "双重麻烦": { + "player.1214934.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "双重麻烦", + "spellId": 1214934, + "scope": "player", + "metric": "value", + "spellIds": [ + 1214934 + ] }, - "三重威胁": { + "player.1214935.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "三重威胁", + "spellId": 1214935, + "scope": "player", + "metric": "value", + "spellIds": [ + 1214935 + ] }, - "头奖": { + "player.1214937.value": { "step": 55, "type": "int", - "category": "玩家" - }, - "可乘之机层数": { - "step": "bar", - "bar": 1, - "type": "int" + "category": "玩家", + "displayName": "头奖", + "spellId": 1214937, + "scope": "player", + "metric": "value", + "spellIds": [ + 1214937 + ] } }, "spells": { - "毒刃": { + "5938.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "毒刃", + "spellId": 5938, + "metric": "cooldown" }, - "致盲": { + "2094.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "致盲", + "spellId": 2094, + "metric": "cooldown" }, - "佯攻": { + "1966.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "佯攻", + "spellId": 1966, + "metric": "cooldown" }, - "消失": { + "1856.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "消失", + "spellId": 1856, + "metric": "cooldown" }, - "偷袭": { + "1833.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "偷袭", + "spellId": 1833, + "metric": "cooldown" }, - "潜伏帷幕": { + "114018.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "潜伏帷幕", + "spellId": 114018, + "metric": "cooldown" }, - "菊花茶": { + "381623.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "菊花茶", + "spellId": 381623, + "metric": "cooldown" }, - "闪避": { + "5277.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "闪避", + "spellId": 5277, + "metric": "cooldown" }, - "猩红之瓶": { + "185311.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "猩红之瓶", + "spellId": 185311, + "metric": "cooldown" }, - "扰乱": { + "1725.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "扰乱", + "spellId": 1725, + "metric": "cooldown" }, - "疾跑": { + "2983.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "疾跑", + "spellId": 2983, + "metric": "cooldown" }, - "凿击": { + "1776.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "凿击", + "spellId": 1776, + "metric": "cooldown" }, - "肾击": { + "408.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "肾击", + "spellId": 408, + "metric": "cooldown" }, - "暗影斗篷": { + "31224.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "暗影斗篷", + "spellId": 31224, + "metric": "cooldown" }, - "脚踢": { + "1766.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "脚踢", + "spellId": 1766, + "metric": "cooldown" }, - "冲动": { + "13750.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "冲动", + "spellId": 13750, + "metric": "cooldown" }, - "影舞步": { + "51690.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "影舞步", + "spellId": 51690, + "metric": "cooldown" }, - "刀锋冲刺": { + "271877.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "刀锋冲刺", + "spellId": 271877, + "metric": "cooldown" }, - "正中眉心": { + "315341.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "正中眉心", + "spellId": 315341, + "metric": "cooldown" }, - "剑刃乱舞": { + "13877.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "剑刃乱舞", + "spellId": 13877, + "metric": "cooldown" }, - "抓钩": { + "195475.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "抓钩", + "spellId": 195475, + "metric": "cooldown" }, - "抓钩充能": { + "195475.chargeCooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "抓钩充能", + "spellId": 195475, + "metric": "chargeCooldown" }, - "命运骨骰": { + "1214909.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "命运骨骰", + "spellId": 1214909, + "metric": "cooldown" }, - "时运继延": { + "381989.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "时运继延", + "spellId": 381989, + "metric": "cooldown" }, - "伺机待发": { + "1277933.cooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "伺机待发", + "spellId": 1277933, + "metric": "cooldown" } } }, @@ -934,85 +1144,145 @@ "category": "鼠标" }, "spells": { - "毒刃": { + "5938.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "毒刃", + "spellId": 5938, + "metric": "cooldown" }, - "致盲": { + "2094.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "致盲", + "spellId": 2094, + "metric": "cooldown" }, - "佯攻": { + "1966.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "佯攻", + "spellId": 1966, + "metric": "cooldown" }, - "消失": { + "1856.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "消失", + "spellId": 1856, + "metric": "cooldown" }, - "偷袭": { + "1833.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "偷袭", + "spellId": 1833, + "metric": "cooldown" }, - "潜伏帷幕": { + "114018.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "潜伏帷幕", + "spellId": 114018, + "metric": "cooldown" }, - "菊花茶": { + "381623.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "菊花茶", + "spellId": 381623, + "metric": "cooldown" }, - "闪避": { + "5277.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "闪避", + "spellId": 5277, + "metric": "cooldown" }, - "猩红之瓶": { + "185311.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "猩红之瓶", + "spellId": 185311, + "metric": "cooldown" }, - "扰乱": { + "1725.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "扰乱", + "spellId": 1725, + "metric": "cooldown" }, - "疾跑": { + "2983.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "疾跑", + "spellId": 2983, + "metric": "cooldown" }, - "凿击": { + "1776.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "凿击", + "spellId": 1776, + "metric": "cooldown" }, - "肾击": { + "408.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "肾击", + "spellId": 408, + "metric": "cooldown" }, - "暗影斗篷": { + "31224.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "暗影斗篷", + "spellId": 31224, + "metric": "cooldown" }, - "脚踢": { + "1766.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "脚踢", + "spellId": 1766, + "metric": "cooldown" }, - "暗影步": { + "36554.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "暗影步", + "spellId": 36554, + "metric": "cooldown" }, - "影分身": { + "280719.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "影分身", + "spellId": 280719, + "metric": "cooldown" }, - "暗影之刃": { + "121471.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "暗影之刃", + "spellId": 121471, + "metric": "cooldown" }, - "暗影之舞": { + "185313.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "暗影之舞", + "spellId": 185313, + "metric": "cooldown" }, - "暗影之舞充能": { + "185313.chargeCooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "暗影之舞充能", + "spellId": 185313, + "metric": "chargeCooldown" } } } diff --git a/config/Shaman.json b/config/Shaman.json index 624bf45c..1e6bc18e 100644 --- a/config/Shaman.json +++ b/config/Shaman.json @@ -1,90 +1,90 @@ { "keymap": "shaman.json", "一键法术": { - "1": "唤潮者的护卫", - "2": "大地生命武器", - "3": "天怒", - "4": "水之护盾", - "5": "烈焰震击", - "6": "熔岩爆裂", - "7": "闪电箭", - "8": "闪电链", - "9": "治疗之泉图腾", - "10": "风剪", - "11": "先祖迅捷", - "12": "自然迅捷", - "13": "涌动图腾", - "14": "电能图腾", - "15": "阵风", - "16": "灵魂链接图腾", - "17": "土元素", - "18": "战栗图腾", - "19": "清毒图腾", - "20": "图腾投射", - "21": "升腾", - "22": "治疗之潮图腾", - "23": "毁灭闪电", - "24": "流电炽焰", - "25": "火舌武器", - "26": "熔岩猛击", - "27": "裂地术", - "28": "始源风暴", - "29": "风切", - "30": "风怒武器", - "31": "风暴打击", - "32": "狂风怒号", - "33": "元素冲击", - "34": "地震术", - "35": "大地震击", - "36": "风暴守护者", - "37": "闪电之盾", - "38": "治疗波", - "39": "治疗链", - "40": "激流", - "41": "大地之盾", - "42": "净化灵魂", - "43": "生命释放", - "44": "风暴涌流图腾", - "45": "治疗之雨", - "46": "倾盆大雨", - "47": "狂风图腾", - "48": "治疗之雨", - "49": "灵魂行者的恩赐", - "50": "星界转移", - "51": "幽魂之狼", - "52": "净化术", - "53": "强效净化术", - "54": "升腾", - "55": "雷霆风暴", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 457481, + "2": 382021, + "3": 462854, + "4": 52127, + "5": 470411, + "6": 51505, + "7": 188196, + "8": 188443, + "9": 5394, + "10": 57994, + "11": 443454, + "12": 378081, + "13": 444995, + "14": 192058, + "15": 192063, + "16": 98008, + "17": 198103, + "18": 8143, + "19": 383013, + "20": 108287, + "21": 114052, + "22": 108280, + "23": 187874, + "24": 470057, + "25": 318038, + "26": 60103, + "27": 197214, + "28": 1218090, + "29": 115356, + "30": 33757, + "31": 17364, + "32": 452201, + "33": 117014, + "34": 462620, + "35": 8042, + "36": 191634, + "37": 192106, + "38": 77472, + "39": 1064, + "40": 61295, + "41": 974, + "42": 77130, + "43": 73685, + "44": 1267068, + "45": 73920, + "46": 462603, + "47": 192077, + "48": 456366, + "49": 79206, + "50": 108271, + "51": 2645, + "52": 370, + "53": 378773, + "54": 114050, + "55": 51490, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -298,221 +298,466 @@ "category": "鼠标" }, "auras": { - "天怒": { + "player.462854.value": { "step": 46, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "天怒", + "spellId": 462854, + "scope": "player", + "metric": "value", + "spellIds": [ + 462854 + ] }, - "熔岩奔腾": { + "player.77762.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "熔岩奔腾", + "spellId": 77762, + "scope": "player", + "metric": "value", + "spellIds": [ + 77762 + ] }, - "风暴守护者": { + "player.191634.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "风暴守护者", + "spellId": 191634, + "scope": "player", + "metric": "value", + "spellIds": [ + 191634 + ] }, - "暴风": { + "player.191634.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "风暴守护者层数", + "spellId": 191634, + "scope": "player", + "metric": "apps", + "spellIds": [ + 191634 + ], + "bar": 2 + }, + "player.454015.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "暴风", + "spellId": 454015, + "scope": "player", + "metric": "value", + "spellIds": [ + 454015 + ] }, - "元素宗师": { + "player.454015.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "暴风层数", + "spellId": 454015, + "scope": "player", + "metric": "apps", + "spellIds": [ + 454015 + ], + "bar": 3 + }, + "player.267344.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "元素宗师", + "spellId": 267344, + "scope": "player", + "metric": "value", + "spellIds": [ + 267344 + ] }, - "净化烈焰": { + "player.1259491.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "净化烈焰", + "spellId": 1259491, + "scope": "player", + "metric": "value", + "spellIds": [ + 1259491 + ] }, - "风之爆发": { + "player.263806.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "风之爆发", + "spellId": 263806, + "scope": "player", + "metric": "value", + "spellIds": [ + 263806 + ] }, - "先祖召唤": { + "player.263806.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "风之爆发层数", + "spellId": 263806, + "scope": "player", + "metric": "apps", + "spellIds": [ + 263806 + ], + "bar": 4 + }, + "player.447244.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "先祖召唤", + "spellId": 447244, + "scope": "player", + "metric": "value", + "spellIds": [ + 447244 + ] }, - "升腾": { + "player.1219480.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "升腾", + "spellId": 1219480, + "scope": "player", + "metric": "value", + "spellIds": [ + 1219480 + ] }, - "火元素": { + "player.188592.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "火元素", + "spellId": 188592, + "scope": "player", + "metric": "value", + "spellIds": [ + 188592 + ] }, - "风暴元素": { + "player.157299.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "风暴元素", + "spellId": 157299, + "scope": "player", + "metric": "value", + "spellIds": [ + 157299 + ] }, - "漩涡之力": { + "player.191877.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "漩涡之力", + "spellId": 191877, + "scope": "player", + "metric": "value", + "spellIds": [ + 191877 + ] }, - "元素冲击暴击": { + "player.191877.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "漩涡之力层数", + "spellId": 191877, + "scope": "player", + "metric": "apps", + "spellIds": [ + 191877 + ], + "bar": 5 + }, + "player.118522.value": { "step": 58, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "元素冲击暴击", + "spellId": 118522, + "scope": "player", + "metric": "value", + "spellIds": [ + 118522 + ] }, - "元素冲击急速": { + "player.173183.value": { "step": 59, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "元素冲击急速", + "spellId": 173183, + "scope": "player", + "metric": "value", + "spellIds": [ + 173183 + ] }, - "元素冲击精通": { + "player.173184.value": { "step": 60, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "元素冲击精通", + "spellId": 173184, + "scope": "player", + "metric": "value", + "spellIds": [ + 173184 + ] }, - "闪电之盾": { + "player.192106.value": { "step": 61, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "闪电之盾", + "spellId": 192106, + "scope": "player", + "metric": "value", + "spellIds": [ + 192106 + ] }, - "先祖迅捷": { + "player.443454.value": { "step": 62, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "先祖迅捷", + "spellId": 443454, + "scope": "player", + "metric": "value", + "spellIds": [ + 443454 + ] }, - "元素奔涌": { + "player.1300219.value": { "step": 63, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "元素奔涌", + "spellId": 1300219, + "scope": "player", + "metric": "value", + "spellIds": [ + 1300219 + ] }, - "过载!": { + "player.1300222.value": { "step": 64, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "过载!", + "spellId": 1300222, + "scope": "player", + "metric": "value", + "spellIds": [ + 1300222 + ] }, - "目标烈焰震击": { + "target.harmful.188389.value": { "step": 65, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "烈焰震击", + "spellId": 188389, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 188389 + ] }, - "目标引雷针": { + "target.harmful.197209.value": { "step": 66, "type": "int", - "category": "目标减益" - }, - "风暴守护者层数": { - "step": "bar", - "bar": 2, - "type": "int" - }, - "暴风层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "风之爆发层数": { - "step": "bar", - "bar": 4, - "type": "int" - }, - "漩涡之力层数": { - "step": "bar", - "bar": 5, - "type": "int" + "category": "目标减益", + "displayName": "引雷针", + "spellId": 197209, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 197209 + ] } }, "spells": { - "风剪": { + "57994.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "风剪", + "spellId": 57994, + "metric": "cooldown" }, - "土元素": { + "198103.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "土元素", + "spellId": 198103, + "metric": "cooldown" }, - "电能图腾": { + "192058.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "电能图腾", + "spellId": 192058, + "metric": "cooldown" }, - "自然迅捷": { + "378081.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "自然迅捷", + "spellId": 378081, + "metric": "cooldown" }, - "图腾投射": { + "108287.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "图腾投射", + "spellId": 108287, + "metric": "cooldown" }, - "妖术": { + "51514.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "妖术", + "spellId": 51514, + "metric": "cooldown" }, - "强化净化术": { + "378773.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "强化净化术", + "spellId": 378773, + "metric": "cooldown" }, - "战栗图腾": { + "8143.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "战栗图腾", + "spellId": 8143, + "metric": "cooldown" }, - "清毒图腾": { + "383013.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "清毒图腾", + "spellId": 383013, + "metric": "cooldown" }, - "阵风": { + "192063.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "阵风", + "spellId": 192063, + "metric": "cooldown" }, - "幽魂步": { + "58875.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "幽魂步", + "spellId": 58875, + "metric": "cooldown" }, - "治疗之雨": { + "73920.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "治疗之雨", + "spellId": 73920, + "metric": "cooldown" }, - "升腾": { + "114050.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "升腾", + "spellId": 114050, + "metric": "cooldown" }, - "雷霆风暴": { + "51490.cooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "雷霆风暴", + "spellId": 51490, + "metric": "cooldown" }, - "狂风图腾": { + "192077.cooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "狂风图腾", + "spellId": 192077, + "metric": "cooldown" }, - "净化灵魂": { + "77130.cooldown": { "step": 82, - "type": "int" + "type": "int", + "displayName": "净化灵魂", + "spellId": 77130, + "metric": "cooldown" }, - "熔岩爆裂": { + "51505.cooldown": { "step": 83, - "type": "int" + "type": "int", + "displayName": "熔岩爆裂", + "spellId": 51505, + "metric": "cooldown" }, - "熔岩爆裂充能": { + "51505.chargeCooldown": { "step": 84, - "type": "int" + "type": "int", + "displayName": "熔岩爆裂充能", + "spellId": 51505, + "metric": "chargeCooldown" }, - "熔岩爆裂层数": { + "51505.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "熔岩爆裂层数", + "spellId": 51505, + "metric": "count" }, - "流电炽焰": { + "470057.cooldown": { "step": 85, - "type": "int" + "type": "int", + "displayName": "流电炽焰", + "spellId": 470057, + "metric": "cooldown" }, - "风暴守护者": { + "191634.cooldown": { "step": 86, - "type": "int" + "type": "int", + "displayName": "风暴守护者", + "spellId": 191634, + "metric": "cooldown" }, - "先祖迅捷": { + "443454.cooldown": { "step": 87, - "type": "int" + "type": "int", + "displayName": "先祖迅捷", + "spellId": 443454, + "metric": "cooldown" } } }, @@ -743,82 +988,139 @@ "category": "鼠标" }, "spells": { - "风剪": { + "57994.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "风剪", + "spellId": 57994, + "metric": "cooldown" }, - "土元素": { + "198103.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "土元素", + "spellId": 198103, + "metric": "cooldown" }, - "电能图腾": { + "192058.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "电能图腾", + "spellId": 192058, + "metric": "cooldown" }, - "自然迅捷": { + "378081.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "自然迅捷", + "spellId": 378081, + "metric": "cooldown" }, - "图腾投射": { + "108287.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "图腾投射", + "spellId": 108287, + "metric": "cooldown" }, - "妖术": { + "51514.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "妖术", + "spellId": 51514, + "metric": "cooldown" }, - "强化净化术": { + "378773.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "强化净化术", + "spellId": 378773, + "metric": "cooldown" }, - "战栗图腾": { + "8143.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "战栗图腾", + "spellId": 8143, + "metric": "cooldown" }, - "清毒图腾": { + "383013.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "清毒图腾", + "spellId": 383013, + "metric": "cooldown" }, - "阵风": { + "192063.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "阵风", + "spellId": 192063, + "metric": "cooldown" }, - "幽魂步": { + "58875.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "幽魂步", + "spellId": 58875, + "metric": "cooldown" }, - "毁灭闪电": { + "187874.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "毁灭闪电", + "spellId": 187874, + "metric": "cooldown" }, - "熔岩猛击": { + "60103.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "熔岩猛击", + "spellId": 60103, + "metric": "cooldown" }, - "风暴打击": { + "17364.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "风暴打击", + "spellId": 17364, + "metric": "cooldown" }, - "流电炽焰": { + "470057.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "流电炽焰", + "spellId": 470057, + "metric": "cooldown" }, - "狂野扑击": { + "196884.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "狂野扑击", + "spellId": 196884, + "metric": "cooldown" }, - "星界转移": { + "108271.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "星界转移", + "spellId": 108271, + "metric": "cooldown" }, - "溢流漩涡": { + "8004.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "溢流漩涡", + "spellId": 8004, + "metric": "cooldown" }, - "溢流漩涡层数": { + "8004.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "溢流漩涡层数", + "spellId": 8004, + "metric": "count" } } }, @@ -1059,219 +1361,430 @@ "category": "首领2" }, "auras": { - "大地之盾": { + "player.383648.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "大地之盾", + "spellId": 383648, + "scope": "player", + "metric": "value", + "spellIds": [ + 383648 + ] }, - "水之护盾": { + "player.52127.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "水之护盾", + "spellId": 52127, + "scope": "player", + "metric": "value", + "spellIds": [ + 52127 + ] }, - "治疗之雨": { + "player.1307888.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "治疗之雨", + "spellId": 1307888, + "scope": "player", + "metric": "value", + "spellIds": [ + 1307888 + ] }, - "飞旋之土": { + "player.453406.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "飞旋之土", + "spellId": 453406, + "scope": "player", + "metric": "value", + "spellIds": [ + 453406 + ] }, - "飞旋之水": { + "player.453407.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "飞旋之水", + "spellId": 453407, + "scope": "player", + "metric": "value", + "spellIds": [ + 453407 + ] }, - "飞旋之风": { + "player.453409.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "飞旋之风", + "spellId": 453409, + "scope": "player", + "metric": "value", + "spellIds": [ + 453409 + ] }, - "潮汐奔涌": { + "player.53390.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "潮汐奔涌", + "spellId": 53390, + "scope": "player", + "metric": "value", + "spellIds": [ + 53390 + ] }, - "激流": { + "player.53390.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "潮汐奔涌层数", + "spellId": 53390, + "scope": "player", + "metric": "apps", + "spellIds": [ + 53390 + ], + "bar": 3 + }, + "player.61295.value": { "step": 58, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "激流", + "spellId": 61295, + "scope": "player", + "metric": "value", + "spellIds": [ + 61295 + ] }, - "聚合水流": { + "player.470077.value": { "step": 59, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "聚合水流", + "spellId": 470077, + "scope": "player", + "metric": "value", + "spellIds": [ + 470077 + ] }, - "升腾": { + "player.114052.value": { "step": 60, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "升腾", + "spellId": 114052, + "scope": "player", + "metric": "value", + "spellIds": [ + 114052 + ] }, - "生命释放": { + "player.73685.value": { "step": 61, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "生命释放", + "spellId": 73685, + "scope": "player", + "metric": "value", + "spellIds": [ + 73685 + ] }, - "风暴涌流图腾": { + "player.1267089.value": { "step": 62, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "风暴涌流图腾", + "spellId": 1267089, + "scope": "player", + "metric": "value", + "spellIds": [ + 1267089 + ] }, - "倾盆大雨": { + "player.1267089.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "风暴涌流图腾层数", + "spellId": 1267089, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1267089 + ], + "bar": 4 + }, + "player.462603.value": { "step": 63, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "倾盆大雨", + "spellId": 462603, + "scope": "player", + "metric": "value", + "spellIds": [ + 462603 + ] }, - "自然迅捷": { + "player.378081.value": { "step": 64, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "自然迅捷", + "spellId": 378081, + "scope": "player", + "metric": "value", + "spellIds": [ + 378081 + ] }, - "目标激流": { + "target.helpful.61295.value": { "step": 65, "type": "int", - "category": "目标增益" - }, - "潮汐奔涌层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "风暴涌流图腾层数": { - "step": "bar", - "bar": 4, - "type": "int" + "category": "目标增益", + "displayName": "激流", + "spellId": 61295, + "scope": "target.helpful", + "metric": "value", + "spellIds": [ + 61295 + ] } }, "spells": { - "风剪": { + "57994.cooldown": { "step": 66, - "type": "int" + "type": "int", + "displayName": "风剪", + "spellId": 57994, + "metric": "cooldown" }, - "土元素": { + "198103.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "土元素", + "spellId": 198103, + "metric": "cooldown" }, - "电能图腾": { + "192058.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "电能图腾", + "spellId": 192058, + "metric": "cooldown" }, - "自然迅捷": { + "378081.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "自然迅捷", + "spellId": 378081, + "metric": "cooldown" }, - "图腾投射": { + "108287.cooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "图腾投射", + "spellId": 108287, + "metric": "cooldown" }, - "妖术": { + "51514.cooldown": { "step": 71, - "type": "int" + "type": "int", + "displayName": "妖术", + "spellId": 51514, + "metric": "cooldown" }, - "强化净化术": { + "378773.cooldown": { "step": 72, - "type": "int" + "type": "int", + "displayName": "强化净化术", + "spellId": 378773, + "metric": "cooldown" }, - "战栗图腾": { + "8143.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "战栗图腾", + "spellId": 8143, + "metric": "cooldown" }, - "清毒图腾": { + "383013.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "清毒图腾", + "spellId": 383013, + "metric": "cooldown" }, - "阵风": { + "192063.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "阵风", + "spellId": 192063, + "metric": "cooldown" }, - "幽魂步": { + "58875.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "幽魂步", + "spellId": 58875, + "metric": "cooldown" }, - "熔岩爆裂": { + "51505.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "熔岩爆裂", + "spellId": 51505, + "metric": "cooldown" }, - "熔岩爆裂充能": { + "51505.chargeCooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "熔岩爆裂充能", + "spellId": 51505, + "metric": "chargeCooldown" }, - "激流": { + "61295.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "激流", + "spellId": 61295, + "metric": "cooldown" }, - "激流充能": { + "61295.chargeCooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "激流充能", + "spellId": 61295, + "metric": "chargeCooldown" }, - "激流层数": { + "61295.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "激流层数", + "spellId": 61295, + "metric": "count" }, - "治疗之泉图腾": { + "5394.cooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "治疗之泉图腾", + "spellId": 5394, + "metric": "cooldown" }, - "治疗之泉图腾充能": { + "5394.chargeCooldown": { "step": 82, - "type": "int" + "type": "int", + "displayName": "治疗之泉图腾充能", + "spellId": 5394, + "metric": "chargeCooldown" }, - "治疗之泉图腾层数": { + "5394.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "治疗之泉图腾层数", + "spellId": 5394, + "metric": "count" }, - "烈焰震击": { + "470411.cooldown": { "step": 83, - "type": "int" + "type": "int", + "displayName": "烈焰震击", + "spellId": 470411, + "metric": "cooldown" }, - "净化灵魂": { + "77130.cooldown": { "step": 84, - "type": "int" + "type": "int", + "displayName": "净化灵魂", + "spellId": 77130, + "metric": "cooldown" }, - "生命释放": { + "73685.cooldown": { "step": 85, - "type": "int" + "type": "int", + "displayName": "生命释放", + "spellId": 73685, + "metric": "cooldown" }, - "先祖迅捷": { + "443454.cooldown": { "step": 86, - "type": "int" + "type": "int", + "displayName": "先祖迅捷", + "spellId": 443454, + "metric": "cooldown" }, - "涌动图腾": { + "444995.cooldown": { "step": 87, - "type": "int" + "type": "int", + "displayName": "涌动图腾", + "spellId": 444995, + "metric": "cooldown" }, - "灵魂链接图腾": { + "98008.cooldown": { "step": 88, - "type": "int" + "type": "int", + "displayName": "灵魂链接图腾", + "spellId": 98008, + "metric": "cooldown" }, - "升腾": { + "114052.cooldown": { "step": 89, - "type": "int" + "type": "int", + "displayName": "升腾", + "spellId": 114052, + "metric": "cooldown" }, - "治疗之潮图腾": { + "108280.cooldown": { "step": 90, - "type": "int" + "type": "int", + "displayName": "治疗之潮图腾", + "spellId": 108280, + "metric": "cooldown" }, - "治疗之雨": { + "73920.cooldown": { "step": 91, - "type": "int" + "type": "int", + "displayName": "治疗之雨", + "spellId": 73920, + "metric": "cooldown" }, - "净化术": { + "370.cooldown": { "step": 92, - "type": "int" + "type": "int", + "displayName": "净化术", + "spellId": 370, + "metric": "cooldown" }, - "狂风图腾": { + "192077.cooldown": { "step": 93, - "type": "int" + "type": "int", + "displayName": "狂风图腾", + "spellId": 192077, + "metric": "cooldown" } }, "group": { "start": 94, - "num": 6, + "num": 5, "生命值": { "step": 1, "type": "int" @@ -1284,17 +1797,28 @@ "step": 3, "type": "int" }, - "激流": { + "auras.61295.value": { "step": 4, - "type": "int" + "type": "int", + "displayName": "激流", + "spellId": 61295, + "scope": "group", + "metric": "value", + "spellIds": [ + 61295 + ] }, - "大地之盾": { + "auras.974.value": { "step": 5, - "type": "int" - }, - "救赎之魂": { - "step": 6, - "type": "int" + "type": "int", + "displayName": "大地之盾", + "spellId": 974, + "scope": "group", + "metric": "value", + "spellIds": [ + 974, + 383648 + ] } } } diff --git a/config/Warlock.json b/config/Warlock.json index 42a81e20..b090965f 100644 --- a/config/Warlock.json +++ b/config/Warlock.json @@ -1,96 +1,96 @@ { "keymap": "warlock.json", "一键法术": { - "1": "恐惧", - "2": "死亡缠绕", - "3": "暗影之怒", - "4": "内爆", - "5": "召唤恶魔暴君", - "6": "魔典:邪能破坏者", - "7": "召唤末日守卫", - "8": "古尔丹之手", - "9": "召唤恐惧猎犬", - "10": "召唤恶魔卫士", - "11": "恶魔之箭", - "12": "暗影箭", - "13": "召唤地狱猎犬", - "14": "召唤小鬼", - "15": "虚弱灾厄", - "16": "语言灾厄", - "17": "陨灭", - "18": "狱火箭", - "19": "灵魂石", - "20": "邪能统御", - "21": "黑暗契约", - "22": "恶魔之箭", - "23": "魔典:小鬼领主", - "24": "法术封锁", - "25": "吞噬魔法", - "26": "爆燃冲刺", - "27": "放逐术", - "28": "疲劳诅咒", - "29": "语言诅咒", - "30": "恶魔传送门", - "31": "灵魂燃烧", - "32": "恐惧嚎叫", - "33": "恶魔法阵", - "34": "恶魔法阵:传送", - "35": "制造灵魂之井", - "36": "召唤仪式", - "37": "腐蚀术", - "38": "吸取生命", - "39": "召唤黑眼", - "40": "痛苦无常", - "41": "幽冥收割", - "42": "腐蚀之种", - "43": "痛楚", - "44": "鬼影缠身", - "45": "枯萎", - "46": "怨毒", - "47": "召唤地狱火", - "48": "暗影灼烧", - "49": "混乱之箭", - "50": "火焰之雨", - "51": "灵魂之火", - "52": "烧尽", - "53": "燃烧", - "54": "献祭", - "55": "引导恶魔之火", - "56": "浩劫", - "57": "火焰之雨", - "58": "大灾变", - "59": "吸取灵魂", - "60": "召唤虚空行者", - "61": "召唤萨亚德", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 5782, + "2": 6789, + "3": 30283, + "4": 196277, + "5": 265187, + "6": 1276467, + "7": 1276672, + "8": 105174, + "9": 104316, + "10": 30146, + "11": 264178, + "12": 686, + "13": 691, + "14": 688, + "15": 1271748, + "16": 1271802, + "17": 434635, + "18": 434506, + "19": 20707, + "20": 333889, + "21": 108416, + "22": 264187, + "23": 1276452, + "24": 132409, + "25": 388215, + "26": 111400, + "27": 710, + "28": 334275, + "29": 1714, + "30": 111771, + "31": 385899, + "32": 5484, + "33": 48018, + "34": 48020, + "35": 29893, + "36": 698, + "37": 172, + "38": 234153, + "39": 205180, + "40": 1259790, + "41": 1257052, + "42": 27243, + "43": 980, + "44": 48181, + "45": 445468, + "46": 442726, + "47": 1122, + "48": 17877, + "49": 116858, + "50": 5740, + "51": 6353, + "52": 29722, + "53": 17962, + "54": 348, + "55": 196447, + "56": 80240, + "57": 1214467, + "58": 152108, + "59": 198590, + "60": 697, + "61": 366222, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -289,65 +289,110 @@ "category": "鼠标" }, "spells": { - "恐惧": { + "5782.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "恐惧", + "spellId": 5782, + "metric": "cooldown" }, - "死亡缠绕": { + "6789.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "死亡缠绕", + "spellId": 6789, + "metric": "cooldown" }, - "灵魂石": { + "20707.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "灵魂石", + "spellId": 20707, + "metric": "cooldown" }, - "暗影之怒": { + "30283.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "暗影之怒", + "spellId": 30283, + "metric": "cooldown" }, - "邪能统御": { + "333889.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "邪能统御", + "spellId": 333889, + "metric": "cooldown" }, - "黑暗契约": { + "108416.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "黑暗契约", + "spellId": 108416, + "metric": "cooldown" }, - "恶魔传送门": { + "111771.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "恶魔传送门", + "spellId": 111771, + "metric": "cooldown" }, - "虚弱灾厄": { + "127174.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "虚弱灾厄", + "spellId": 127174, + "metric": "cooldown" }, - "语言灾厄": { + "1271802.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "语言灾厄", + "spellId": 1271802, + "metric": "cooldown" }, - "恶魔法阵": { + "48018.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "恶魔法阵", + "spellId": 48018, + "metric": "cooldown" }, - "恶魔法阵:传送": { + "48020.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "恶魔法阵:传送", + "spellId": 48020, + "metric": "cooldown" }, - "召唤黑眼": { + "205180.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "召唤黑眼", + "spellId": 205180, + "metric": "cooldown" }, - "鬼影缠身": { + "48181.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "鬼影缠身", + "spellId": 48181, + "metric": "cooldown" }, - "幽冥收割": { + "1257052.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "幽冥收割", + "spellId": 1257052, + "metric": "cooldown" }, - "怨毒": { + "442726.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "怨毒", + "spellId": 442726, + "metric": "cooldown" } } }, @@ -558,94 +603,160 @@ "category": "鼠标" }, "spells": { - "恐惧": { + "5782.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "恐惧", + "spellId": 5782, + "metric": "cooldown" }, - "死亡缠绕": { + "6789.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "死亡缠绕", + "spellId": 6789, + "metric": "cooldown" }, - "灵魂石": { + "20707.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "灵魂石", + "spellId": 20707, + "metric": "cooldown" }, - "暗影之怒": { + "30283.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "暗影之怒", + "spellId": 30283, + "metric": "cooldown" }, - "邪能统御": { + "333889.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "邪能统御", + "spellId": 333889, + "metric": "cooldown" }, - "黑暗契约": { + "108416.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "黑暗契约", + "spellId": 108416, + "metric": "cooldown" }, - "恶魔传送门": { + "111771.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "恶魔传送门", + "spellId": 111771, + "metric": "cooldown" }, - "虚弱灾厄": { + "127174.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "虚弱灾厄", + "spellId": 127174, + "metric": "cooldown" }, - "语言灾厄": { + "1271802.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "语言灾厄", + "spellId": 1271802, + "metric": "cooldown" }, - "恶魔法阵": { + "48018.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "恶魔法阵", + "spellId": 48018, + "metric": "cooldown" }, - "恶魔法阵:传送": { + "48020.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "恶魔法阵:传送", + "spellId": 48020, + "metric": "cooldown" }, - "内爆": { + "196277.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "内爆", + "spellId": 196277, + "metric": "cooldown" }, - "内爆层数": { + "196277.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "内爆层数", + "spellId": 196277, + "metric": "count" }, - "召唤恶魔暴君": { + "265187.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "召唤恶魔暴君", + "spellId": 265187, + "metric": "cooldown" }, - "魔典:邪能破坏者": { + "1276467.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "魔典:邪能破坏者", + "spellId": 1276467, + "metric": "cooldown" }, - "古尔丹之手": { + "105174.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "古尔丹之手", + "spellId": 105174, + "metric": "cooldown" }, - "召唤末日守卫": { + "1276672.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "召唤末日守卫", + "spellId": 1276672, + "metric": "cooldown" }, - "召唤恐惧猎犬": { + "104316.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "召唤恐惧猎犬", + "spellId": 104316, + "metric": "cooldown" }, - "恶魔之箭": { + "264187.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "恶魔之箭", + "spellId": 264187, + "metric": "cooldown" }, - "魔典:小鬼领主": { + "1276452.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "魔典:小鬼领主", + "spellId": 1276452, + "metric": "cooldown" }, - "吞噬魔法": { + "388215.cooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "吞噬魔法", + "spellId": 388215, + "metric": "cooldown" }, - "召唤恶魔卫士": { + "30146.cooldown": { "step": 65, - "type": "int" + "type": "int", + "displayName": "召唤恶魔卫士", + "spellId": 30146, + "metric": "cooldown" } } }, @@ -846,65 +957,110 @@ "category": "鼠标" }, "spells": { - "恐惧": { + "5782.cooldown": { "step": 43, - "type": "int" + "type": "int", + "displayName": "恐惧", + "spellId": 5782, + "metric": "cooldown" }, - "死亡缠绕": { + "6789.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "死亡缠绕", + "spellId": 6789, + "metric": "cooldown" }, - "灵魂石": { + "20707.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "灵魂石", + "spellId": 20707, + "metric": "cooldown" }, - "暗影之怒": { + "30283.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "暗影之怒", + "spellId": 30283, + "metric": "cooldown" }, - "邪能统御": { + "333889.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "邪能统御", + "spellId": 333889, + "metric": "cooldown" }, - "黑暗契约": { + "108416.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "黑暗契约", + "spellId": 108416, + "metric": "cooldown" }, - "恶魔传送门": { + "111771.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "恶魔传送门", + "spellId": 111771, + "metric": "cooldown" }, - "虚弱灾厄": { + "127174.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "虚弱灾厄", + "spellId": 127174, + "metric": "cooldown" }, - "语言灾厄": { + "1271802.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "语言灾厄", + "spellId": 1271802, + "metric": "cooldown" }, - "恶魔法阵": { + "48018.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "恶魔法阵", + "spellId": 48018, + "metric": "cooldown" }, - "恶魔法阵:传送": { + "48020.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "恶魔法阵:传送", + "spellId": 48020, + "metric": "cooldown" }, - "召唤地狱火": { + "1122.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "召唤地狱火", + "spellId": 1122, + "metric": "cooldown" }, - "灵魂之火": { + "6353.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "灵魂之火", + "spellId": 6353, + "metric": "cooldown" }, - "燃烧": { + "17962.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "燃烧", + "spellId": 17962, + "metric": "cooldown" }, - "燃烧充能": { + "17962.chargeCooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "燃烧充能", + "spellId": 17962, + "metric": "chargeCooldown" } } } diff --git a/config/Warrior.json b/config/Warrior.json index 727118d1..0c2f092e 100644 --- a/config/Warrior.json +++ b/config/Warrior.json @@ -1,75 +1,75 @@ { "keymap": "warrior.json", "一键法术": { - "1": "胜利在望", - "2": "勇士之矛", - "3": "英勇飞跃", - "4": "集结呐喊", - "5": "震荡波", - "6": "风暴之锤", - "7": "破裂投掷", - "8": "碎裂投掷", - "9": "破胆怒吼", - "10": "盾牌冲锋", - "11": "英勇投掷", - "12": "战斗怒吼", - "13": "猛击", - "14": "撕裂", - "15": "斩杀", - "16": "剑刃风暴", - "17": "崩摧", - "18": "致死打击", - "19": "巨人打击", - "20": "顺劈斩", - "21": "压制", - "22": "横扫攻击", - "23": "天神下凡", - "24": "旋风斩", - "25": "斩杀", - "26": "嗜血", - "27": "暴怒", - "28": "奥丁之怒", - "29": "怒击", - "30": "雷霆一击", - "31": "雷霆轰击", - "32": "复仇", - "33": "盾牌猛击", - "34": "斩杀", - "35": "英勇打击", - "36": "浴血奋战", - "37": "碎甲猛击", - "38": "破坏者", - "39": "斩杀", - "40": "剑刃风暴", - "101": "奥术洪流", - "102": "石像形态", - "103": "影遁", - "104": "狂暴", - "105": "血性狂怒", - "106": "战争践踏", - "107": "生存意志", - "108": "亡灵意志", - "109": "逃命专家", - "110": "黑暗飞行", - "111": "火箭跳", - "112": "火箭弹幕", - "113": "空间裂隙", - "114": "圣光裁决", - "115": "先祖召唤", - "116": "烈焰之血", - "117": "蛮牛冲撞", - "118": "奥术脉冲", - "119": "袋里乾坤", - "120": "再生", - "121": "震山掌", - "122": "纳鲁的赐福", - "123": "重拳出击", - "124": "超有机光发起源", - "125": "扫尾", - "126": "翼击", - "127": "艾泽里特涌动", - "151": "切换天赋", - "152": "切换专精" + "1": 202168, + "2": 376079, + "3": 6544, + "4": 97462, + "5": 46968, + "6": 107570, + "7": 384110, + "8": 64382, + "9": 5246, + "10": 385952, + "11": 57755, + "12": 6673, + "13": 1464, + "14": 772, + "15": 281000, + "16": 227847, + "17": 436358, + "18": 12294, + "19": 167105, + "20": 845, + "21": 7384, + "22": 260708, + "23": 107574, + "24": 190411, + "25": 5308, + "26": 23881, + "27": 184367, + "28": 385059, + "29": 85288, + "30": 6343, + "31": 435222, + "32": 6572, + "33": 23922, + "34": 163201, + "35": 1269383, + "36": 335096, + "37": 335100, + "38": 228920, + "39": 280735, + "40": 446035, + "101": 28730, + "102": 20594, + "103": 58984, + "104": 26297, + "105": 20572, + "106": 20549, + "107": 59752, + "108": 7744, + "109": 20589, + "110": 68992, + "111": 69070, + "112": 69041, + "113": 256948, + "114": 255647, + "115": 274738, + "116": 265221, + "117": 255654, + "118": 260364, + "119": 312411, + "120": 291944, + "121": 107079, + "122": 28880, + "123": 287712, + "124": 312924, + "125": 368970, + "126": 357214, + "127": 436344, + "151": 384255, + "152": 200749 }, "1": { "队伍类型": { @@ -217,371 +217,703 @@ "type": "int", "category": "目标" }, - "目标施法": { - "step": 33, - "type": "int", - "category": "目标" - }, "焦点施法(倒计时)": { - "step": 34, + "step": 33, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 35, + "step": 34, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 36, + "step": 35, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 37, + "step": 36, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 38, + "step": 37, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 39, - "type": "int", - "category": "焦点" - }, - "焦点施法": { - "step": 40, + "step": 38, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 41, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 42, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 43, + "step": 41, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 44, + "step": 42, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 45, + "step": 43, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 46, + "step": 44, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 47, + "step": 45, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 48, + "step": 46, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 49, + "step": 47, "type": "int", "category": "鼠标" }, "auras": { - "天神下凡": { + "player.107574.value": { + "step": 48, + "type": "int", + "category": "玩家", + "displayName": "天神下凡", + "spellId": 107574, + "scope": "player", + "metric": "value", + "spellIds": [ + 107574 + ] + }, + "player.52437.value": { + "step": 49, + "type": "int", + "category": "玩家", + "displayName": "猝死", + "spellId": 52437, + "scope": "player", + "metric": "value", + "spellIds": [ + 52437 + ] + }, + "player.52437.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "猝死层数", + "spellId": 52437, + "scope": "player", + "metric": "apps", + "spellIds": [ + 52437 + ], + "bar": 2 + }, + "player.228920.value": { "step": 50, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "破坏者", + "spellId": 228920, + "scope": "player", + "metric": "value", + "spellIds": [ + 228920 + ] }, - "猝死": { + "player.334783.value": { "step": 51, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "间接伤害", + "spellId": 334783, + "scope": "player", + "metric": "value", + "spellIds": [ + 334783 + ] }, - "破坏者": { + "player.334783.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "间接伤害层数", + "spellId": 334783, + "scope": "player", + "metric": "apps", + "spellIds": [ + 334783 + ], + "bar": 3 + }, + "player.440989.value": { "step": 52, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "巨人神力", + "spellId": 440989, + "scope": "player", + "metric": "value", + "spellIds": [ + 440989 + ] }, - "间接伤害": { + "player.440989.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "巨人神力层数", + "spellId": 440989, + "scope": "player", + "metric": "apps", + "spellIds": [ + 440989 + ], + "bar": 4 + }, + "player.386633.value": { "step": 53, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "刽子手的精准", + "spellId": 386633, + "scope": "player", + "metric": "value", + "spellIds": [ + 386633 + ] }, - "巨人神力": { + "player.386633.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "刽子手的精准层数", + "spellId": 386633, + "scope": "player", + "metric": "apps", + "spellIds": [ + 386633 + ], + "bar": 5 + }, + "player.1292058.value": { "step": 54, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "英勇之力", + "spellId": 1292058, + "scope": "player", + "metric": "value", + "spellIds": [ + 1292058 + ] }, - "刽子手的精准": { + "player.1292058.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "英勇之力层数", + "spellId": 1292058, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1292058 + ], + "bar": 6 + }, + "player.1269394.value": { "step": 55, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "战争大师", + "spellId": 1269394, + "scope": "player", + "metric": "value", + "spellIds": [ + 1269394 + ] }, - "英勇之力": { + "player.1269394.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "战争大师层数", + "spellId": 1269394, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1269394 + ], + "bar": 7 + }, + "player.260708.value": { "step": 56, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "横扫攻击", + "spellId": 260708, + "scope": "player", + "metric": "value", + "spellIds": [ + 260708 + ] }, - "战争大师": { + "player.260708.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "横扫攻击层数", + "spellId": 260708, + "scope": "player", + "metric": "apps", + "spellIds": [ + 260708 + ], + "bar": 8 + }, + "player.1261189.value": { "step": 57, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "粉碎连击", + "spellId": 1261189, + "scope": "player", + "metric": "value", + "spellIds": [ + 1261189 + ] }, - "横扫攻击": { + "player.1261189.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "粉碎连击层数", + "spellId": 1261189, + "scope": "player", + "metric": "apps", + "spellIds": [ + 1261189 + ], + "bar": 9 + }, + "player.456120.value": { "step": 58, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "趁虚而入", + "spellId": 456120, + "scope": "player", + "metric": "value", + "spellIds": [ + 456120 + ] }, - "粉碎连击": { + "player.456120.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "趁虚而入层数", + "spellId": 456120, + "scope": "player", + "metric": "apps", + "spellIds": [ + 456120 + ], + "bar": 10 + }, + "player.445606.value": { "step": 59, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "殒命在即", + "spellId": 445606, + "scope": "player", + "metric": "value", + "spellIds": [ + 445606 + ] }, - "趁虚而入": { + "player.445606.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "殒命在即层数", + "spellId": 445606, + "scope": "player", + "metric": "apps", + "spellIds": [ + 445606 + ], + "bar": 11 + }, + "player.445584.value": { "step": 60, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "处刑者", + "spellId": 445584, + "scope": "player", + "metric": "value", + "spellIds": [ + 445584 + ] }, - "殒命在即": { + "player.445584.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "处刑者层数", + "spellId": 445584, + "scope": "player", + "metric": "apps", + "spellIds": [ + 445584 + ], + "bar": 12 + }, + "player.316440.value": { "step": 61, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "武技神威", + "spellId": 316440, + "scope": "player", + "metric": "value", + "spellIds": [ + 316440 + ] }, - "处刑者": { + "player.316440.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "武技神威层数", + "spellId": 316440, + "scope": "player", + "metric": "apps", + "spellIds": [ + 316440 + ], + "bar": 13 + }, + "player.446035.value": { "step": 62, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "剑刃风暴", + "spellId": 446035, + "scope": "player", + "metric": "value", + "spellIds": [ + 446035 + ] }, - "武技神威": { + "target.harmful.388539.value": { "step": 63, "type": "int", - "category": "玩家" + "category": "目标减益", + "displayName": "撕裂", + "spellId": 388539, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 388539 + ] }, - "剑刃风暴": { + "target.harmful.208086.value": { "step": 64, "type": "int", - "category": "玩家" + "category": "目标减益", + "displayName": "巨人打击", + "spellId": 208086, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 208086 + ] }, - "目标撕裂": { + "target.harmful.262115.value": { "step": 65, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "重伤", + "spellId": 262115, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 262115 + ] }, - "目标巨人打击": { + "target.harmful.447513.value": { "step": 66, "type": "int", - "category": "目标减益" + "category": "目标减益", + "displayName": "崩毁", + "spellId": 447513, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 447513 + ] }, - "目标重伤": { + "target.harmful.447513.apps": { + "step": "bar", + "type": "int", + "category": "目标减益", + "displayName": "崩毁层数", + "spellId": 447513, + "scope": "target.harmful", + "metric": "apps", + "spellIds": [ + 447513 + ], + "bar": 14 + }, + "focus.harmful.388539.value": { "step": 67, "type": "int", - "category": "目标减益" + "category": "焦点减益", + "displayName": "撕裂", + "spellId": 388539, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 388539 + ] }, - "目标崩毁": { + "focus.harmful.208086.value": { "step": 68, "type": "int", - "category": "目标减益" + "category": "焦点减益", + "displayName": "巨人打击", + "spellId": 208086, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 208086 + ] }, - "焦点撕裂": { + "focus.harmful.262115.value": { "step": 69, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "重伤", + "spellId": 262115, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 262115 + ] }, - "焦点巨人打击": { + "focus.harmful.447513.value": { "step": 70, "type": "int", - "category": "焦点减益" + "category": "焦点减益", + "displayName": "崩毁", + "spellId": 447513, + "scope": "focus.harmful", + "metric": "value", + "spellIds": [ + 447513 + ] }, - "焦点重伤": { - "step": 71, + "focus.harmful.447513.apps": { + "step": "bar", "type": "int", - "category": "焦点减益" - }, - "焦点崩毁": { - "step": 72, - "type": "int", - "category": "焦点减益" - }, - "猝死层数": { - "step": "bar", - "bar": 2, - "type": "int" - }, - "间接伤害层数": { - "step": "bar", - "bar": 3, - "type": "int" - }, - "巨人神力层数": { - "step": "bar", - "bar": 4, - "type": "int" - }, - "刽子手的精准层数": { - "step": "bar", - "bar": 5, - "type": "int" - }, - "英勇之力层数": { - "step": "bar", - "bar": 6, - "type": "int" - }, - "战争大师层数": { - "step": "bar", - "bar": 7, - "type": "int" - }, - "横扫攻击层数": { - "step": "bar", - "bar": 8, - "type": "int" - }, - "粉碎连击层数": { - "step": "bar", - "bar": 9, - "type": "int" - }, - "趁虚而入层数": { - "step": "bar", - "bar": 10, - "type": "int" - }, - "殒命在即层数": { - "step": "bar", - "bar": 11, - "type": "int" - }, - "处刑者层数": { - "step": "bar", - "bar": 12, - "type": "int" - }, - "武技神威层数": { - "step": "bar", - "bar": 13, - "type": "int" - }, - "目标崩毁层数": { - "step": "bar", - "bar": 14, - "type": "int" - }, - "焦点崩毁层数": { - "step": "bar", - "bar": 15, - "type": "int" + "category": "焦点减益", + "displayName": "崩毁层数", + "spellId": 447513, + "scope": "focus.harmful", + "metric": "apps", + "spellIds": [ + 447513 + ], + "bar": 15 } }, "spells": { - "胜利在望": { + "202168.cooldown": { + "step": 71, + "type": "int", + "displayName": "胜利在望", + "spellId": 202168, + "metric": "cooldown" + }, + "376079.cooldown": { + "step": 72, + "type": "int", + "displayName": "勇士之矛", + "spellId": 376079, + "metric": "cooldown" + }, + "6544.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "英勇飞跃", + "spellId": 6544, + "metric": "cooldown" }, - "勇士之矛": { + "97462.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "集结呐喊", + "spellId": 97462, + "metric": "cooldown" }, - "英勇飞跃": { + "46968.cooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "震荡波", + "spellId": 46968, + "metric": "cooldown" }, - "集结呐喊": { + "107570.cooldown": { "step": 76, - "type": "int" + "type": "int", + "displayName": "风暴之锤", + "spellId": 107570, + "metric": "cooldown" }, - "震荡波": { + "384110.cooldown": { "step": 77, - "type": "int" + "type": "int", + "displayName": "破裂投掷", + "spellId": 384110, + "metric": "cooldown" }, - "风暴之锤": { + "64382.cooldown": { "step": 78, - "type": "int" + "type": "int", + "displayName": "碎裂投掷", + "spellId": 64382, + "metric": "cooldown" }, - "破裂投掷": { + "5246.cooldown": { "step": 79, - "type": "int" + "type": "int", + "displayName": "破胆怒吼", + "spellId": 5246, + "metric": "cooldown" }, - "碎裂投掷": { + "7384.cooldown": { "step": 80, - "type": "int" + "type": "int", + "displayName": "压制", + "spellId": 7384, + "metric": "cooldown" }, - "破胆怒吼": { + "7384.chargeCooldown": { "step": 81, - "type": "int" + "type": "int", + "displayName": "压制充能", + "spellId": 7384, + "metric": "chargeCooldown" }, - "压制": { - "step": 82, - "type": "int" - }, - "压制充能": { - "step": 83, - "type": "int" - }, - "压制层数": { + "7384.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "压制层数", + "spellId": 7384, + "metric": "count" }, - "斩杀": { + "163201.cooldown": { + "step": 82, + "type": "int", + "displayName": "斩杀", + "spellId": 163201, + "metric": "cooldown" + }, + "845.cooldown": { + "step": 83, + "type": "int", + "displayName": "顺劈斩", + "spellId": 845, + "metric": "cooldown" + }, + "12294.cooldown": { "step": 84, - "type": "int" + "type": "int", + "displayName": "致死打击", + "spellId": 12294, + "metric": "cooldown" }, - "顺劈斩": { + "167105.cooldown": { "step": 85, - "type": "int" + "type": "int", + "displayName": "巨人打击", + "spellId": 167105, + "metric": "cooldown" }, - "致死打击": { + "436358.cooldown": { "step": 86, - "type": "int" + "type": "int", + "displayName": "崩摧", + "spellId": 436358, + "metric": "cooldown" }, - "巨人打击": { + "6552.cooldown": { "step": 87, - "type": "int" + "type": "int", + "displayName": "拳击", + "spellId": 6552, + "metric": "cooldown" }, - "崩摧": { + "118038.cooldown": { "step": 88, - "type": "int" + "type": "int", + "displayName": "剑在人在", + "spellId": 118038, + "metric": "cooldown" }, - "拳击": { + "107574.cooldown": { "step": 89, - "type": "int" + "type": "int", + "displayName": "天神下凡", + "spellId": 107574, + "metric": "cooldown" }, - "剑在人在": { + "227847.cooldown": { "step": 90, - "type": "int" + "type": "int", + "displayName": "剑刃风暴", + "spellId": 227847, + "metric": "cooldown" }, - "天神下凡": { + "260708.cooldown": { "step": 91, - "type": "int" + "type": "int", + "displayName": "横扫攻击", + "spellId": 260708, + "metric": "cooldown" }, - "剑刃风暴": { + "228920.cooldown": { "step": 92, - "type": "int" - }, - "横扫攻击": { - "step": 93, - "type": "int" - }, - "破坏者": { - "step": 94, - "type": "int" + "type": "int", + "displayName": "破坏者", + "spellId": 228920, + "metric": "cooldown" } } }, @@ -701,272 +1033,436 @@ "type": "int", "category": "目标" }, - "目标施法": { - "step": 27, - "type": "int", - "category": "目标" - }, "焦点施法(倒计时)": { - "step": 28, + "step": 27, "type": "int", "category": "焦点" }, "焦点施法(正计时)": { - "step": 29, + "step": 28, "type": "int", "category": "焦点" }, "焦点施法可打断": { - "step": 30, + "step": 29, "type": "int", "category": "焦点" }, "焦点引导": { - "step": 31, + "step": 30, "type": "int", "category": "焦点" }, "焦点引导可打断": { - "step": 32, + "step": 31, "type": "int", "category": "焦点" }, "焦点距离": { - "step": 33, - "type": "int", - "category": "焦点" - }, - "焦点施法": { - "step": 34, + "step": 32, "type": "int", "category": "焦点" }, "鼠标类型": { - "step": 35, + "step": 33, "type": "int", "category": "鼠标" }, "鼠标驱散类型": { - "step": 36, + "step": 34, "type": "int", "category": "鼠标" }, "鼠标生命值": { - "step": 37, + "step": 35, "type": "int", "category": "鼠标" }, "鼠标距离": { - "step": 38, + "step": 36, "type": "int", "category": "鼠标" }, "鼠标施法(倒计时)": { - "step": 39, + "step": 37, "type": "int", "category": "鼠标" }, "鼠标施法(正计时)": { - "step": 40, + "step": 38, "type": "int", "category": "鼠标" }, "鼠标施法可打断": { - "step": 41, + "step": 39, "type": "int", "category": "鼠标" }, "鼠标引导": { - "step": 42, + "step": 40, "type": "int", "category": "鼠标" }, "鼠标引导可打断": { - "step": 43, + "step": 41, "type": "int", "category": "鼠标" }, "auras": { - "狂暴": { + "player.184362.value": { + "step": 42, + "type": "int", + "category": "玩家", + "displayName": "狂暴", + "spellId": 184362, + "scope": "player", + "metric": "value", + "spellIds": [ + 184362 + ] + }, + "player.52437.value": { + "step": 43, + "type": "int", + "category": "玩家", + "displayName": "猝死", + "spellId": 52437, + "scope": "player", + "metric": "value", + "spellIds": [ + 52437 + ] + }, + "player.52437.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "猝死层数", + "spellId": 52437, + "scope": "player", + "metric": "apps", + "spellIds": [ + 52437 + ], + "bar": 4 + }, + "player.85739.value": { "step": 44, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "强化旋风斩", + "spellId": 85739, + "scope": "player", + "metric": "value", + "spellIds": [ + 85739 + ] }, - "猝死": { + "player.85739.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "强化旋风斩层数", + "spellId": 85739, + "scope": "player", + "metric": "apps", + "spellIds": [ + 85739 + ], + "bar": 5 + }, + "player.1719.value": { "step": 45, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "鲁莽", + "spellId": 1719, + "scope": "player", + "metric": "value", + "spellIds": [ + 1719 + ] }, - "强化旋风斩": { + "player.107574.value": { "step": 46, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "天神下凡", + "spellId": 107574, + "scope": "player", + "metric": "value", + "spellIds": [ + 107574 + ] }, - "鲁莽": { + "player.383873.value": { "step": 47, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "劈斩", + "spellId": 383873, + "scope": "player", + "metric": "value", + "spellIds": [ + 383873 + ] }, - "天神下凡": { + "player.437121.value": { "step": 48, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "能量爆发", + "spellId": 437121, + "scope": "player", + "metric": "value", + "spellIds": [ + 437121 + ] }, - "劈斩": { + "player.435615.value": { "step": 49, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "雷霆轰击", + "spellId": 435615, + "scope": "player", + "metric": "value", + "spellIds": [ + 435615 + ] }, - "能量爆发": { + "player.435615.apps": { + "step": "bar", + "type": "int", + "category": "玩家", + "displayName": "雷霆轰击层数", + "spellId": 435615, + "scope": "player", + "metric": "apps", + "spellIds": [ + 435615 + ], + "bar": 6 + }, + "target.harmful.772.value": { "step": 50, "type": "int", - "category": "玩家" - }, - "雷霆轰击": { - "step": 51, - "type": "int", - "category": "玩家" - }, - "目标撕裂": { - "step": 52, - "type": "int", - "category": "目标减益" - }, - "猝死层数": { - "step": "bar", - "bar": 4, - "type": "int" - }, - "强化旋风斩层数": { - "step": "bar", - "bar": 5, - "type": "int" - }, - "雷霆轰击层数": { - "step": "bar", - "bar": 6, - "type": "int" + "category": "目标减益", + "displayName": "撕裂", + "spellId": 772, + "scope": "target.harmful", + "metric": "value", + "spellIds": [ + 772 + ] } }, "spells": { - "胜利在望": { + "202168.cooldown": { + "step": 51, + "type": "int", + "displayName": "胜利在望", + "spellId": 202168, + "metric": "cooldown" + }, + "376079.cooldown": { + "step": 52, + "type": "int", + "displayName": "勇士之矛", + "spellId": 376079, + "metric": "cooldown" + }, + "6544.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "英勇飞跃", + "spellId": 6544, + "metric": "cooldown" }, - "勇士之矛": { + "97462.cooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "集结呐喊", + "spellId": 97462, + "metric": "cooldown" }, - "英勇飞跃": { + "46968.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "震荡波", + "spellId": 46968, + "metric": "cooldown" }, - "集结呐喊": { + "107570.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "风暴之锤", + "spellId": 107570, + "metric": "cooldown" }, - "震荡波": { + "384110.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "破裂投掷", + "spellId": 384110, + "metric": "cooldown" }, - "风暴之锤": { + "64382.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "碎裂投掷", + "spellId": 64382, + "metric": "cooldown" }, - "破裂投掷": { + "5246.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "破胆怒吼", + "spellId": 5246, + "metric": "cooldown" }, - "碎裂投掷": { + "1719.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "鲁莽", + "spellId": 1719, + "metric": "cooldown" }, - "破胆怒吼": { + "6552.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "拳击", + "spellId": 6552, + "metric": "cooldown" }, - "鲁莽": { + "23881.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "嗜血", + "spellId": 23881, + "metric": "cooldown" }, - "拳击": { + "85288.cooldown": { "step": 63, - "type": "int" + "type": "int", + "displayName": "怒击", + "spellId": 85288, + "metric": "cooldown" }, - "嗜血": { + "85288.chargeCooldown": { "step": 64, - "type": "int" + "type": "int", + "displayName": "怒击充能", + "spellId": 85288, + "metric": "chargeCooldown" }, - "怒击": { - "step": 65, - "type": "int" - }, - "怒击充能": { - "step": 66, - "type": "int" - }, - "怒击层数": { + "85288.count": { "step": "bar", "bar": 1, - "type": "int" + "type": "int", + "displayName": "怒击层数", + "spellId": 85288, + "metric": "count" }, - "暴怒": { + "184367.cooldown": { + "step": 65, + "type": "int", + "displayName": "暴怒", + "spellId": 184367, + "metric": "cooldown" + }, + "385059.cooldown": { + "step": 66, + "type": "int", + "displayName": "奥丁之怒", + "spellId": 385059, + "metric": "cooldown" + }, + "227847.cooldown": { "step": 67, - "type": "int" + "type": "int", + "displayName": "剑刃风暴", + "spellId": 227847, + "metric": "cooldown" }, - "奥丁之怒": { + "107574.cooldown": { "step": 68, - "type": "int" + "type": "int", + "displayName": "天神下凡", + "spellId": 107574, + "metric": "cooldown" }, - "剑刃风暴": { + "435222.cooldown": { "step": 69, - "type": "int" + "type": "int", + "displayName": "雷霆轰击", + "spellId": 435222, + "metric": "cooldown" }, - "天神下凡": { + "435222.chargeCooldown": { "step": 70, - "type": "int" + "type": "int", + "displayName": "雷霆轰击充能", + "spellId": 435222, + "metric": "chargeCooldown" }, - "雷霆轰击": { - "step": 71, - "type": "int" - }, - "雷霆轰击充能": { - "step": 72, - "type": "int" - }, - "雷霆轰击层数": { + "435222.count": { "step": "bar", "bar": 2, - "type": "int" + "type": "int", + "displayName": "雷霆轰击层数", + "spellId": 435222, + "metric": "count" }, - "雷霆一击": { + "6343.cooldown": { + "step": 71, + "type": "int", + "displayName": "雷霆一击", + "spellId": 6343, + "metric": "cooldown" + }, + "190411.cooldown": { + "step": 72, + "type": "int", + "displayName": "旋风斩", + "spellId": 190411, + "metric": "cooldown" + }, + "335096.cooldown": { "step": 73, - "type": "int" + "type": "int", + "displayName": "浴血奋战", + "spellId": 335096, + "metric": "cooldown" }, - "旋风斩": { + "335097.cooldown": { "step": 74, - "type": "int" + "type": "int", + "displayName": "碎甲猛击", + "spellId": 335097, + "metric": "cooldown" }, - "浴血奋战": { + "335097.chargeCooldown": { "step": 75, - "type": "int" + "type": "int", + "displayName": "碎甲猛击充能", + "spellId": 335097, + "metric": "chargeCooldown" }, - "碎甲猛击": { - "step": 76, - "type": "int" - }, - "碎甲猛击充能": { - "step": 77, - "type": "int" - }, - "碎甲猛击层数": { + "335097.count": { "step": "bar", "bar": 3, - "type": "int" + "type": "int", + "displayName": "碎甲猛击层数", + "spellId": 335097, + "metric": "count" }, - "斩杀": { - "step": 78, - "type": "int" + "5308.cooldown": { + "step": 76, + "type": "int", + "displayName": "斩杀", + "spellId": 5308, + "metric": "cooldown" } } }, @@ -1162,93 +1658,164 @@ "category": "鼠标" }, "auras": { - "盾牌格挡": { + "player.132404.value": { "step": 42, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "盾牌格挡", + "spellId": 132404, + "scope": "player", + "metric": "value", + "spellIds": [ + 132404 + ] }, - "无视苦痛": { + "player.190456.value": { "step": 43, "type": "int", - "category": "玩家" + "category": "玩家", + "displayName": "无视苦痛", + "spellId": 190456, + "scope": "player", + "metric": "value", + "spellIds": [ + 190456 + ] } }, "spells": { - "胜利在望": { + "202168.cooldown": { "step": 44, - "type": "int" + "type": "int", + "displayName": "胜利在望", + "spellId": 202168, + "metric": "cooldown" }, - "勇士之矛": { + "376079.cooldown": { "step": 45, - "type": "int" + "type": "int", + "displayName": "勇士之矛", + "spellId": 376079, + "metric": "cooldown" }, - "英勇飞跃": { + "6544.cooldown": { "step": 46, - "type": "int" + "type": "int", + "displayName": "英勇飞跃", + "spellId": 6544, + "metric": "cooldown" }, - "集结呐喊": { + "97462.cooldown": { "step": 47, - "type": "int" + "type": "int", + "displayName": "集结呐喊", + "spellId": 97462, + "metric": "cooldown" }, - "震荡波": { + "46968.cooldown": { "step": 48, - "type": "int" + "type": "int", + "displayName": "震荡波", + "spellId": 46968, + "metric": "cooldown" }, - "风暴之锤": { + "107570.cooldown": { "step": 49, - "type": "int" + "type": "int", + "displayName": "风暴之锤", + "spellId": 107570, + "metric": "cooldown" }, - "破裂投掷": { + "384110.cooldown": { "step": 50, - "type": "int" + "type": "int", + "displayName": "破裂投掷", + "spellId": 384110, + "metric": "cooldown" }, - "碎裂投掷": { + "64382.cooldown": { "step": 51, - "type": "int" + "type": "int", + "displayName": "碎裂投掷", + "spellId": 64382, + "metric": "cooldown" }, - "破胆怒吼": { + "5246.cooldown": { "step": 52, - "type": "int" + "type": "int", + "displayName": "破胆怒吼", + "spellId": 5246, + "metric": "cooldown" }, - "盾牌格挡": { + "2565.cooldown": { "step": 53, - "type": "int" + "type": "int", + "displayName": "盾牌格挡", + "spellId": 2565, + "metric": "cooldown" }, - "盾牌格挡充能": { + "2565.chargeCooldown": { "step": 54, - "type": "int" + "type": "int", + "displayName": "盾牌格挡充能", + "spellId": 2565, + "metric": "chargeCooldown" }, - "盾牌冲锋": { + "385952.cooldown": { "step": 55, - "type": "int" + "type": "int", + "displayName": "盾牌冲锋", + "spellId": 385952, + "metric": "cooldown" }, - "天神下凡": { + "107574.cooldown": { "step": 56, - "type": "int" + "type": "int", + "displayName": "天神下凡", + "spellId": 107574, + "metric": "cooldown" }, - "挫志怒吼": { + "1160.cooldown": { "step": 57, - "type": "int" + "type": "int", + "displayName": "挫志怒吼", + "spellId": 1160, + "metric": "cooldown" }, - "拳击": { + "6552.cooldown": { "step": 58, - "type": "int" + "type": "int", + "displayName": "拳击", + "spellId": 6552, + "metric": "cooldown" }, - "无视苦痛": { + "190456.cooldown": { "step": 59, - "type": "int" + "type": "int", + "displayName": "无视苦痛", + "spellId": 190456, + "metric": "cooldown" }, - "复仇": { + "6572.cooldown": { "step": 60, - "type": "int" + "type": "int", + "displayName": "复仇", + "spellId": 6572, + "metric": "cooldown" }, - "斩杀": { + "163201.cooldown": { "step": 61, - "type": "int" + "type": "int", + "displayName": "斩杀", + "spellId": 163201, + "metric": "cooldown" }, - "英勇投掷": { + "57755.cooldown": { "step": 62, - "type": "int" + "type": "int", + "displayName": "英勇投掷", + "spellId": 57755, + "metric": "cooldown" } } }