From 1c4a84aef5cf406b8e22eb9997eeb67352f4c06d Mon Sep 17 00:00:00 2001 From: waynebian01 Date: Wed, 2 Sep 2026 20:40:13 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E7=89=88=E6=9C=AC=E8=87=B3?= =?UTF-8?q?=201.2.1.20=EF=BC=8C=E6=B7=BB=E5=8A=A0=E6=B2=B8=E7=82=B9?= =?UTF-8?q?=E7=8A=B6=E6=80=81=E6=94=AF=E6=8C=81=E5=B9=B6=E4=BC=98=E5=8C=96?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BE=9D=E8=B5=96=E5=BF=AB=E7=85=A7=E4=BF=9D?= =?UTF-8?q?=E5=AD=98=E9=80=BB=E8=BE=91=E3=80=82=E4=BF=AE=E5=A4=8D=E5=AE=8F?= =?UTF-8?q?=E9=94=AE=E6=B1=A0=E5=92=8C=E7=8A=B6=E6=80=81=E5=9D=97=E7=9A=84?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E5=8A=9F=E8=83=BD=EF=BC=8C=E7=A1=AE=E4=BF=9D?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=E4=BF=9D=E5=AD=98=E6=97=B6=E6=AD=A3=E7=A1=AE?= =?UTF-8?q?=E5=A4=84=E7=90=86=E4=BE=9D=E8=B5=96=E5=85=B3=E7=B3=BB=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- CLAUDE.md | 2 +- Fuyutsui/Fuyutsui.toc | 2 +- Fuyutsui/class/DeathKnight.lua | 1 + Fuyutsui/core/events.lua | 1 + Fuyutsui/core/macro.lua | 5 +- Fuyutsui/core/stateblocks.lua | 1 + Fuyutsui/unit/player.lua | 290 ++++++++++++---------- Infrastructure/ClassStateCatalog.cs | 2 +- Infrastructure/ModuleDependencyService.cs | 101 +------- README.md | 2 +- Shigure.csproj | 6 +- UI/MainForm.cs | 3 +- UI/SpellIconPackageDownloadService.cs | 2 +- UI/StatusForm.cs | 2 +- 14 files changed, 175 insertions(+), 245 deletions(-) diff --git a/CLAUDE.md b/CLAUDE.md index e20e4409..ab1257c2 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -63,7 +63,7 @@ wow_process.txt 目标游戏进程名列表;构建时复制,运行期间每 - 模块以 `{MyDocuments}/Shigure/module/模块名.json` 平铺保存(`ModuleStore.ResolveModuleDirectory()` 返回我的文档目录,`{MyDocuments}/{程序集名}/module`),**文件名取自模块名,故模块名不可重复**;加载递归扫描子目录。模型在 [Modules/ModuleStore.cs](Modules/ModuleStore.cs)(`ModuleDefinition`/`ModuleMatch`/`ModuleRule`/`ModuleUnit`/`ModuleCountField`/`ModuleValueAdjustment`)。`RecommendedTalent` 是 `ModuleDefinition` 上的纯展示字段,不参与匹配(`ModuleMatch.Specificity` 不计入)。 - `ModuleStore` 的 `Reload`/`Save`/`Delete` 会在同一个门锁内串行完整文件事务与内存快照更新;`Save` 通过同目录临时文件提交,重命名失败会回滚新文件。编辑器写入不要绕过它,避免运行时读到半次操作。运行时工厂不再自行 `Reload`:启动和模块刷新先由 `ModuleDependencyService` 导入依赖、拒绝宏容量超限模块,再把已验证的内存快照交给运行时。 -- 职业/专精明确的模块保存时会写入 `Dependencies` 快照。`ModuleDependencyService` 以本地为优先追加缺失的 ClassBlocks/spellsList/ClassMacros,按动态宏 30 槽、其它宏 1 槽检查所有受影响专精;任一专精超过 keymap 容量就拒绝整个模块且不写 Lua。依赖提交失败会恢复配置和宏原文。 +- 职业/专精明确的模块保存时会写入 `Dependencies` 快照。保存配置/宏或保存模块时,`Capture` 以当前本地 Lua **完全覆盖**模块 `Dependencies`(该专精 ClassBlocks、职业级 spellsList、ClassMacros),模块里多出来的配置和宏会被删掉。启动和刷新模块时 `Import` 仍以本地为优先追加缺失的 ClassBlocks/spellsList/ClassMacros,按动态宏 30 槽、其它宏 1 槽检查所有受影响专精;任一专精超过 keymap 容量就拒绝整个模块且不写 Lua。依赖提交失败会恢复配置和宏原文。 - 选择优先级:`ModuleStore.FindSelectedOrBestMatch` —— 先用 UI/参数选定的 `ModuleId`;否则取 `Match` 命中字段最多者(`ModuleMatch.Specificity` 越大越优先),并列按名称。`Match` 字段留空 = 任意。`PartyType` 数字会归一化为 `"1-40"`。 - 动态单位/数量/动态数值的语义见 [README.md](README.md#动态单位与数量字段);列表与编辑器的人类可读摘要统一走 [UI/UnitSummary.cs](UI/UnitSummary.cs)`.Describe(...)`(单一来源,勿再复制一份描述逻辑)。 diff --git a/Fuyutsui/Fuyutsui.toc b/Fuyutsui/Fuyutsui.toc index fcf384c7..0a7e87b2 100644 --- a/Fuyutsui/Fuyutsui.toc +++ b/Fuyutsui/Fuyutsui.toc @@ -1,7 +1,7 @@ ## Interface: 120100 ## Title: Fuyutsui -## Version: 1.2.1.19 +## Version: 1.2.1.20 ## Author: Wayne ## IconTexture: Interface\AddOns\Fuyutsui\core\Spell_Misc_EmotionHappy.blp ## OptionalDeps: LibRangeCheck-3.0 diff --git a/Fuyutsui/class/DeathKnight.lua b/Fuyutsui/class/DeathKnight.lua index f7011bf7..55270fdf 100644 --- a/Fuyutsui/class/DeathKnight.lua +++ b/Fuyutsui/class/DeathKnight.lua @@ -30,6 +30,7 @@ Fuyutsui.ClassBlocks = { "一键辅助", "施法技能", "吸血鬼打击", + "沸点", }, ["能量"] = { "符文能量", diff --git a/Fuyutsui/core/events.lua b/Fuyutsui/core/events.lua index d0e465e9..54857e24 100644 --- a/Fuyutsui/core/events.lua +++ b/Fuyutsui/core/events.lua @@ -214,6 +214,7 @@ function Fuyutsui:SPELL_UPDATE_COOLDOWN(_, spellID, baseSpellID) self:UpdatePlayerForbearance() end self:RecordKnightSpellState(spellID) + self:UpdateBoilingPoint(spellID) -- 沸点 end local potions = { diff --git a/Fuyutsui/core/macro.lua b/Fuyutsui/core/macro.lua index 3e59054a..3109e4d7 100644 --- a/Fuyutsui/core/macro.lua +++ b/Fuyutsui/core/macro.lua @@ -3,6 +3,7 @@ local format = string.format local macroList = {} local macroKind = {} local bindingOwner = CreateFrame("Frame") + local modifiers = { "CTRL", "ALT", "SHIFT", "ALT-CTRL", "ALT-SHIFT", "CTRL-SHIFT", @@ -15,8 +16,8 @@ local keys = { "NUMPADDECIMAL", "NUMPADPLUS", "NUMPADMINUS", "NUMPADMULTIPLY", "NUMPADDIVIDE", "F1", "F2", "F3", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12", ",", ".", "/", ";", "'", "[", "]", "\\", - "7", "8", "9", "0", "=", - "-", "INSERT", "DELETE", "HOME", "END", "PAGEUP", "PAGEDOWN", + "7", "8", "9", "0", "=", "-", + "INSERT", "DELETE", "HOME", "END", "PAGEUP", "PAGEDOWN", "UP", "DOWN", "LEFT", "RIGHT" } diff --git a/Fuyutsui/core/stateblocks.lua b/Fuyutsui/core/stateblocks.lua index 8323c1a1..afb7a033 100644 --- a/Fuyutsui/core/stateblocks.lua +++ b/Fuyutsui/core/stateblocks.lua @@ -138,6 +138,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.boilingPoint or 0 end, ["上个技能"] = function() return state.PreviousSkill or 0 end, ["公共冷却"] = function(self) return GetSpellCooldownPixel(61304, self.curveMs) end, diff --git a/Fuyutsui/unit/player.lua b/Fuyutsui/unit/player.lua index 0581509c..e2e95c1e 100644 --- a/Fuyutsui/unit/player.lua +++ b/Fuyutsui/unit/player.lua @@ -276,95 +276,6 @@ function Fuyutsui:RefreshPlayerConfigStateBlocks() end end -function Fuyutsui:UpdatePlayerStagger() - local unit = "player" - local damage = UnitStagger(unit) - local maxHealth = UnitHealthMax(unit) - if issecretvalue(damage) or issecretvalue(maxHealth) then - state.staggerPercent = 0 - self:UpdateStateBlock("状态", "酒池") - return - end - local staggerPercent = damage / maxHealth * 100 - state.staggerPercent = staggerPercent / 255 or 0 - self:UpdateStateBlock("状态", "酒池") -end - -local holyArmaments = { - [432459] = 1, -- 神圣壁垒 - [432472] = 2, -- 圣洁武器 -} - -function Fuyutsui:UpdateHolyArmaments(spellID) -- 神圣军备 - if not spellID or spellID ~= 375576 then return end - for spellId, index in pairs(holyArmaments) do - local overrideSpellID = C_Spell.GetOverrideSpell(375576) - if not overrideSpellID then return end - if overrideSpellID == spellId then - state.holyArmaments = index / 255 or 0 - self:UpdateStateBlock("状态", "神圣军备") - end - end -end - -function Fuyutsui:UpdateVampiricStrike(spellID) -- 吸血鬼打击 - if spellID == 206930 or spellID == 55090 then - local overrideSpellID1 = C_Spell.GetOverrideSpell(206930) - local overrideSpellID2 = C_Spell.GetOverrideSpell(55090) - - if overrideSpellID1 == 433895 or overrideSpellID2 == 433895 then - state.VampiricStrike = 1 / 255 - self:UpdateStateBlock("状态", "吸血鬼打击") - else - state.VampiricStrike = 0 - self:UpdateStateBlock("状态", "吸血鬼打击") - end - end -end - -function Fuyutsui:UpdateReaverGlaive(spellID) -- 收割者战刃 - if not spellID or spellID ~= 206930 then return end - local overrideSpellID = C_Spell.GetOverrideSpell(204157) - - if overrideSpellID == 433895 then - state.reaverGlaive = 1 / 255 - self:UpdateStateBlock("状态", "收割者战刃") - else - state.reaverGlaive = 0 - self:UpdateStateBlock("状态", "收割者战刃") - end -end - -local heroicStrikeTimer = nil - -function Fuyutsui:UpdateHeroicStrike(spellID) -- 英勇打击 - if not spellID or spellID ~= 1464 then return end - - if heroicStrikeTimer then - heroicStrikeTimer:Cancel() - heroicStrikeTimer = nil - end - - local overrideSpellID = C_Spell.GetOverrideSpell(1464) - if overrideSpellID == 1269383 then - local remaining = 15 - state.heroicStrike = remaining / 255 - self:UpdateStateBlock("状态", "英勇打击") - - heroicStrikeTimer = C_Timer.NewTicker(1, function() - remaining = remaining - 1 - state.heroicStrike = remaining > 0 and (remaining / 255) or 0 - self:UpdateStateBlock("状态", "英勇打击") - if remaining <= 0 then - heroicStrikeTimer = nil - end - end, 15) - else - state.heroicStrike = 0 - self:UpdateStateBlock("状态", "英勇打击") - end -end - function Fuyutsui:UpdateRune() local total = 0 for i = 1, 6 do @@ -407,45 +318,6 @@ function Fuyutsui:RefreshDrinkStatus(spellID) end end --- 死亡骑士天启骑士检测 -local ActiveKnightSpells = { - [454393] = 1, - [454389] = 2, - [454392] = 3, - [454390] = 4, -} -local InactiveKnightSpells = { - [444248] = 1, - [444251] = 2, - [444252] = 3, - [444254] = 4, -} -local ActiveKnights = { false, false, false, false } - -function Fuyutsui:RecordKnightSpellState(spellID) - if ActiveKnightSpells[spellID] then - ActiveKnights[ActiveKnightSpells[spellID]] = true - end - if InactiveKnightSpells[spellID] then - ActiveKnights[InactiveKnightSpells[spellID]] = false - end -end - -local function GetActiveKnightsCount() - local count = 0 - for i = 1, 4 do - if ActiveKnights[i] then - count = count + 1 - end - end - return count -end - -function Fuyutsui:RefreshActiveKnightCount() - state.knightCount = GetActiveKnightsCount() / 255 - self:UpdateStateBlock("状态", "天启骑士数量") -end - function Fuyutsui:HookChatFrameEditBox() for i = 1, NUM_CHAT_WINDOWS do local editBox = _G["ChatFrame" .. i .. "EditBox"] @@ -498,6 +370,45 @@ function Fuyutsui:SetMountSpellCasting(spellID, isCasting) end end +function Fuyutsui:PreviousSkill(spellId) + local spellIndex = spellsList[spellId] and spellsList[spellId].index or 0 + state.PreviousSkill = spellIndex / 255 or 0 + self:UpdateStateBlock("状态", "上个技能") +end + +-- ============================ 职业特殊状态 ============================ + +function Fuyutsui:UpdatePlayerStagger() + local unit = "player" + local damage = UnitStagger(unit) + local maxHealth = UnitHealthMax(unit) + if issecretvalue(damage) or issecretvalue(maxHealth) then + state.staggerPercent = 0 + self:UpdateStateBlock("状态", "酒池") + return + end + local staggerPercent = damage / maxHealth * 100 + state.staggerPercent = staggerPercent / 255 or 0 + self:UpdateStateBlock("状态", "酒池") +end + +local holyArmaments = { + [432459] = 1, -- 神圣壁垒 + [432472] = 2, -- 圣洁武器 +} + +function Fuyutsui:UpdateHolyArmaments(spellID) -- 神圣军备 + if not spellID or spellID ~= 375576 then return end + for spellId, index in pairs(holyArmaments) do + local overrideSpellID = C_Spell.GetOverrideSpell(375576) + if not overrideSpellID then return end + if overrideSpellID == spellId then + state.holyArmaments = index / 255 or 0 + self:UpdateStateBlock("状态", "神圣军备") + end + end +end + local forbearanceTimer = nil function Fuyutsui:UpdatePlayerForbearance() -- 25771 自律 @@ -520,8 +431,123 @@ function Fuyutsui:UpdatePlayerForbearance() -- 25771 自律 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("状态", "上个技能") +function Fuyutsui:UpdateVampiricStrike(spellID) -- 吸血鬼打击 + if spellID == 206930 or spellID == 55090 then + local overrideSpellID1 = C_Spell.GetOverrideSpell(206930) + local overrideSpellID2 = C_Spell.GetOverrideSpell(55090) + + if overrideSpellID1 == 433895 or overrideSpellID2 == 433895 then + state.VampiricStrike = 1 / 255 + self:UpdateStateBlock("状态", "吸血鬼打击") + else + state.VampiricStrike = 0 + self:UpdateStateBlock("状态", "吸血鬼打击") + end + end +end + +local boilingPointTimer = nil + +function Fuyutsui:UpdateBoilingPoint(spellID) -- 沸点 + if spellID ~= 1265982 then return end + + if boilingPointTimer then + boilingPointTimer:Cancel() + boilingPointTimer = nil + end + + local remaining = 3 + state.boilingPoint = remaining / 255 + self:UpdateStateBlock("状态", "沸点") + + boilingPointTimer = C_Timer.NewTicker(1, function() + remaining = remaining - 1 + state.boilingPoint = remaining > 0 and (remaining / 255) or 0 + self:UpdateStateBlock("状态", "沸点") + if remaining <= 0 then + boilingPointTimer = nil + end + end, 3) +end + +-- 死亡骑士天启骑士检测 +local ActiveKnightSpells = { + [454393] = 1, + [454389] = 2, + [454392] = 3, + [454390] = 4, +} +local InactiveKnightSpells = { + [444248] = 1, + [444251] = 2, + [444252] = 3, + [444254] = 4, +} +local ActiveKnights = { false, false, false, false } + +function Fuyutsui:RecordKnightSpellState(spellID) + if ActiveKnightSpells[spellID] then + ActiveKnights[ActiveKnightSpells[spellID]] = true + end + if InactiveKnightSpells[spellID] then + ActiveKnights[InactiveKnightSpells[spellID]] = false + end +end + +local function GetActiveKnightsCount() + local count = 0 + for i = 1, 4 do + if ActiveKnights[i] then + count = count + 1 + end + end + return count +end + +function Fuyutsui:RefreshActiveKnightCount() + state.knightCount = GetActiveKnightsCount() / 255 + self:UpdateStateBlock("状态", "天启骑士数量") +end + +function Fuyutsui:UpdateReaverGlaive(spellID) -- 收割者战刃 + if not spellID or spellID ~= 206930 then return end + local overrideSpellID = C_Spell.GetOverrideSpell(204157) + + if overrideSpellID == 433895 then + state.reaverGlaive = 1 / 255 + self:UpdateStateBlock("状态", "收割者战刃") + else + state.reaverGlaive = 0 + self:UpdateStateBlock("状态", "收割者战刃") + end +end + +local heroicStrikeTimer = nil + +function Fuyutsui:UpdateHeroicStrike(spellID) -- 英勇打击 + if not spellID or spellID ~= 1464 then return end + + if heroicStrikeTimer then + heroicStrikeTimer:Cancel() + heroicStrikeTimer = nil + end + + local overrideSpellID = C_Spell.GetOverrideSpell(1464) + if overrideSpellID == 1269383 then + local remaining = 15 + state.heroicStrike = remaining / 255 + self:UpdateStateBlock("状态", "英勇打击") + + heroicStrikeTimer = C_Timer.NewTicker(1, function() + remaining = remaining - 1 + state.heroicStrike = remaining > 0 and (remaining / 255) or 0 + self:UpdateStateBlock("状态", "英勇打击") + if remaining <= 0 then + heroicStrikeTimer = nil + end + end, 15) + else + state.heroicStrike = 0 + self:UpdateStateBlock("状态", "英勇打击") + end end diff --git a/Infrastructure/ClassStateCatalog.cs b/Infrastructure/ClassStateCatalog.cs index 2975dc28..36213612 100644 --- a/Infrastructure/ClassStateCatalog.cs +++ b/Infrastructure/ClassStateCatalog.cs @@ -56,7 +56,7 @@ internal static class ClassStateCatalog "首领战", "难度", "英雄天赋", "施法目标", "施法技能", "敌人数量", "敌人数-无仇恨", "敌人数-有仇恨", "施法(正计时)", "施法(倒计时)", "引导", "蓄力", "蓄力层数", - "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "公共冷却", "英勇打击", "吸血鬼打击", "收割者战刃", + "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "公共冷却", "英勇打击", "吸血鬼打击", "收割者战刃", "沸点", ]), (CategoryConfig, [ diff --git a/Infrastructure/ModuleDependencyService.cs b/Infrastructure/ModuleDependencyService.cs index 4376e77b..3e9f3661 100644 --- a/Infrastructure/ModuleDependencyService.cs +++ b/Infrastructure/ModuleDependencyService.cs @@ -74,8 +74,7 @@ internal sealed class ModuleDependencyService } EnsureMacroCapacity(classId.Value, macros); - var previous = module.Dependencies; - var captured = new ModuleDependencySnapshot + module.Dependencies = new ModuleDependencySnapshot { ClassId = classId.Value, SpecId = specId.Value, @@ -100,86 +99,9 @@ internal sealed class ModuleDependencyService SpecialSpells = CompactMacroSnapshots(macros.SpecialSpells.Select(CaptureMacro), isSpecial: true) } }; - 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, isSpecial: false); - PreserveMacros(captured.Macros.SpecialSpells, previous.Macros.SpecialSpells, isSpecial: true); - - 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; - } - } - } - } - public ModuleDependencyImportResult Import(IReadOnlyList modules) { lock (_gate) @@ -1111,27 +1033,6 @@ internal sealed class ModuleDependencyService } } - // 当前 Lua 已删除的静态/特殊宏不再从旧快照塞回;只把重叠条目上缺失的注释补回去。 - private static void PreserveMacros( - List local, - IEnumerable? incoming, - bool isSpecial) - { - foreach (var macro in incoming ?? []) - { - if (string.IsNullOrWhiteSpace(macro.Text)) - { - continue; - } - - var index = IndexOfOverlappingMacroSnapshot(local, macro, isSpecial); - if (index >= 0) - { - UpgradeMacroComment(local[index], macro); - } - } - } - private static List CompactMacroSnapshots( IEnumerable? entries, bool isSpecial) diff --git a/README.md b/README.md index 42f78abf..38d30954 100644 --- a/README.md +++ b/README.md @@ -32,7 +32,7 @@ Shigure 是一个 Windows WinForms 桌面程序。它从目标窗口读取 Fuyut 程序采用单实例运行;再次启动时会提示“Shigure 已经在运行”,随后退出新实例。 -当前版本:`1.2.1.19` +当前版本:`1.2.1.20` ## 主要功能 diff --git a/Shigure.csproj b/Shigure.csproj index f5e7ce1d..ff8d8ea6 100644 --- a/Shigure.csproj +++ b/Shigure.csproj @@ -9,9 +9,9 @@ Shigure Shigure Arasaka Corporation - 1.2.1.19 - 1.2.1.19 - 1.2.1.19 + 1.2.1.20 + 1.2.1.20 + 1.2.1.20 Assets\arasaka-icon.ico PerMonitorV2 diff --git a/UI/MainForm.cs b/UI/MainForm.cs index 314a0875..dbba62eb 100644 --- a/UI/MainForm.cs +++ b/UI/MainForm.cs @@ -1563,8 +1563,7 @@ public sealed class MainForm : Form, IMessageFilter private ClassModuleSaveResult SaveModulesForClass(int classId) { var modules = _moduleStore.GetModulesForDisplay() - .Where(module => module.Match.ClassId == classId - && ModuleStore.HasCompatibleVersion(module)) + .Where(module => module.Match.ClassId == classId) .ToList(); var warnings = new List(); var errors = new List(); diff --git a/UI/SpellIconPackageDownloadService.cs b/UI/SpellIconPackageDownloadService.cs index d250dd44..b7185d55 100644 --- a/UI/SpellIconPackageDownloadService.cs +++ b/UI/SpellIconPackageDownloadService.cs @@ -474,7 +474,7 @@ internal sealed class SpellIconPackageDownloadService : IDisposable var version = typeof(SpellIconPackageDownloadService).Assembly.GetName().Version; if (version is null || version.Build < 0 || version.Revision < 0) { - return "1.2.1.19"; + return "1.2.1.20"; } return $"{version.Major}.{version.Minor}.{version.Build}.{version.Revision}"; diff --git a/UI/StatusForm.cs b/UI/StatusForm.cs index b8960ebf..b113de88 100644 --- a/UI/StatusForm.cs +++ b/UI/StatusForm.cs @@ -1387,7 +1387,7 @@ public sealed class StatusForm : Form "队伍类型", "队伍人数", "首领战", "难度", "英雄天赋", "施法目标", "施法技能", "敌人数量", "敌人数-无仇恨", "敌人数-有仇恨", "施法(正计时)", "施法(倒计时)", "引导", "蓄力", "蓄力层数", - "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "公共冷却", "英勇打击", "吸血鬼打击", "收割者战刃" + "酒池", "符文", "姿态", "神圣军备", "自律", "上个技能", "公共冷却", "英勇打击", "吸血鬼打击", "收割者战刃", "沸点" ], 150), 0, 0); fields.Controls.Add(CreateCommonFieldCard(