From 8701a2d71bd5e395161d87175a215e51f137056d Mon Sep 17 00:00:00 2001 From: Cursor Agent Date: Tue, 1 Sep 2026 12:59:31 +0000 Subject: [PATCH] =?UTF-8?q?=E6=9D=A1=E4=BB=B6=E7=BC=96=E8=BE=91=E5=B0=86?= =?UTF-8?q?=E6=8A=80=E8=83=BD=E6=94=B9=E4=B8=BA=E5=86=B7=E5=8D=B4=E5=B9=B6?= =?UTF-8?q?=E5=88=86=E5=87=BA=E6=8A=80=E8=83=BD/=E7=89=A9=E5=93=81?= =?UTF-8?q?=E5=88=86=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 类型下拉由「技能」改为「冷却」;分类提供「技能」与「物品」,分别列出法术冷却与物品冷却字段。 Co-authored-by: Wayne-Arasaka --- Modules/ConditionFieldCatalog.cs | 40 +++++++++++++++++++++++++++----- README.md | 2 +- UI/ConditionEditorForm.cs | 35 ++++++++++++++++++++-------- UI/ModuleEditorControl.cs | 9 +++++++ 4 files changed, 69 insertions(+), 17 deletions(-) diff --git a/Modules/ConditionFieldCatalog.cs b/Modules/ConditionFieldCatalog.cs index d2e5ebcb..d4643652 100644 --- a/Modules/ConditionFieldCatalog.cs +++ b/Modules/ConditionFieldCatalog.cs @@ -47,6 +47,12 @@ public sealed record ConditionItem(long ItemId, int Index, string Name) public string DisplayName => $"{Name} / {ItemId}"; } +public static class CooldownConditionClassifications +{ + public const string Spell = "技能"; + public const string Item = "物品"; +} + public static class SpellIdConditionFields { public const string OneKeyAssist = "一键辅助"; @@ -161,6 +167,25 @@ public sealed class ConditionFieldCatalog if (node is JsonObject field && field.ContainsKey("step")) { + var classification = ReadClassification(field) + ?? sourceClassifications.GetValueOrDefault(key) + ?? InferStateClassification(key); + var itemId = ReadItemId(field); + if (IsItemCooldownField(itemId, classification)) + { + var displayName = ReadDisplayName(field) ?? key; + AddField( + fields, + seen, + key, + itemId is > 0 ? $"{displayName} / {itemId}" : displayName, + ReadType(field), + ConditionFieldCategory.Spell, + CooldownConditionClassifications.Item, + itemId); + continue; + } + AddField( fields, seen, @@ -168,10 +193,8 @@ public sealed class ConditionFieldCatalog key, ReadType(field), ConditionFieldCategory.State, - ReadClassification(field) - ?? sourceClassifications.GetValueOrDefault(key) - ?? InferStateClassification(key), - ReadItemId(field)); + classification, + itemId); } } @@ -207,9 +230,10 @@ public sealed class ConditionFieldCatalog fields, seen, $"spells.{spellName}", - $"技能: {displayName} / {ReadSpellId(field)?.ToString() ?? "?"}", + $"{displayName} / {ReadSpellId(field)?.ToString() ?? "?"}", ReadType(field), - ConditionFieldCategory.Spell); + ConditionFieldCategory.Spell, + CooldownConditionClassifications.Spell); } } } @@ -344,6 +368,10 @@ public sealed class ConditionFieldCatalog } } + private static bool IsItemCooldownField(long? itemId, string? classification) + => itemId is > 0 + || string.Equals(classification, ClassStateCatalog.CategoryItem, StringComparison.Ordinal); + private static void AddField( List fields, HashSet seen, diff --git a/README.md b/README.md index 4fc53d33..efb920ee 100644 --- a/README.md +++ b/README.md @@ -249,7 +249,7 @@ Tools\ 辅助脚本 规则还可添加多个“子条件”:主条件与子条件组是“且”关系,子条件之间是“或”关系,即 `主条件 && (子条件 1 || 子条件 2)`。这用于表达主编辑器无法用括号表示的逻辑。 -可视化条件编辑器会按当前职业/专精提供状态、光环、技能和动态单位字段,并支持: +可视化条件编辑器会按当前职业/专精提供状态、光环、冷却(技能/物品)和动态单位字段,并支持: - 数字比较 `==`、`!=`、`>`、`>=`、`<`、`<=`。 - 文本/数字列表比较 `in`、`not in`。 diff --git a/UI/ConditionEditorForm.cs b/UI/ConditionEditorForm.cs index 6f4b9c8f..2040c286 100644 --- a/UI/ConditionEditorForm.cs +++ b/UI/ConditionEditorForm.cs @@ -158,7 +158,7 @@ public sealed class ConditionEditorForm : Form new("状态", ConditionFieldCategory.State), new("Shigure", ConditionFieldCategory.Shigure), new("光环", ConditionFieldCategory.Aura), - new("技能", ConditionFieldCategory.Spell), + new("冷却", ConditionFieldCategory.Spell), new("动态单位", ConditionFieldCategory.DynamicUnit), new("动态数值", ConditionFieldCategory.DynamicValue) ]; @@ -1241,7 +1241,9 @@ public sealed class ConditionEditorForm : Form { var cell = (DataGridViewComboBoxCell)row.Cells[ClassificationColumn]; cell.Items.Clear(); - var enabled = category is ConditionFieldCategory.State or ConditionFieldCategory.Aura; + var enabled = category is ConditionFieldCategory.State + or ConditionFieldCategory.Aura + or ConditionFieldCategory.Spell; cell.ReadOnly = !enabled; cell.DisplayStyle = enabled ? DataGridViewComboBoxDisplayStyle.DropDownButton @@ -1254,12 +1256,18 @@ public sealed class ConditionEditorForm : Form var options = category == ConditionFieldCategory.State ? ClassStateCatalog.TopCategories.ToList() - : _fields - .Where(field => field.Category == category) - .Select(field => NormalizeClassification(field.Classification)) - .Distinct(StringComparer.Ordinal) - .ToList(); - if (category == ConditionFieldCategory.State) + : category == ConditionFieldCategory.Spell + ? new List + { + CooldownConditionClassifications.Spell, + CooldownConditionClassifications.Item + } + : _fields + .Where(field => field.Category == category) + .Select(field => NormalizeClassification(field.Classification)) + .Distinct(StringComparer.Ordinal) + .ToList(); + if (category is ConditionFieldCategory.State or ConditionFieldCategory.Spell) { // 固定分类之后仍保留配置中出现的扩展分类。 foreach (var classification in _fields @@ -1308,7 +1316,9 @@ public sealed class ConditionEditorForm : Form foreach (var field in _fields.Where(field => field.Category == category - && (category is not (ConditionFieldCategory.State or ConditionFieldCategory.Aura) + && (category is not (ConditionFieldCategory.State + or ConditionFieldCategory.Aura + or ConditionFieldCategory.Spell) || string.Equals( NormalizeClassification(field.Classification), classification, @@ -1395,7 +1405,12 @@ public sealed class ConditionEditorForm : Form : fieldName?.StartsWith("auras.焦点", StringComparison.OrdinalIgnoreCase) == true ? "焦点光环" : "玩家" - : ClassStateCatalog.CategoryState); + : category == ConditionFieldCategory.Spell + ? fieldName?.StartsWith("spells.", StringComparison.OrdinalIgnoreCase) == true + || fieldName?.StartsWith("spell.", StringComparison.OrdinalIgnoreCase) == true + ? CooldownConditionClassifications.Spell + : CooldownConditionClassifications.Item + : ClassStateCatalog.CategoryState); } private ConditionField? FindField(string? fieldName) diff --git a/UI/ModuleEditorControl.cs b/UI/ModuleEditorControl.cs index d2de85dd..1ce0e1ad 100644 --- a/UI/ModuleEditorControl.cs +++ b/UI/ModuleEditorControl.cs @@ -1703,6 +1703,15 @@ public sealed class ModuleEditorControl : UserControl { AddAdjustmentField(fields, seen, field.Name, field.DisplayName, ConditionFieldCategory.State); } + else if (field.Category == ConditionFieldCategory.Spell + && string.Equals( + field.Classification, + CooldownConditionClassifications.Item, + StringComparison.Ordinal) + && field.Type == ConditionFieldType.Int) + { + AddAdjustmentField(fields, seen, field.Name, field.DisplayName, ConditionFieldCategory.State); + } else if (field.Category is ConditionFieldCategory.Spell or ConditionFieldCategory.Aura) { AddAdjustmentField(fields, seen, field.Name, field.DisplayName, field.Category);