diff --git a/Assets/arasaka-icon-128.png b/Assets/arasaka-icon-128.png new file mode 100644 index 00000000..a7265339 Binary files /dev/null and b/Assets/arasaka-icon-128.png differ diff --git a/Assets/arasaka-icon-16.png b/Assets/arasaka-icon-16.png new file mode 100644 index 00000000..a53fdb87 Binary files /dev/null and b/Assets/arasaka-icon-16.png differ diff --git a/Assets/arasaka-icon-24.png b/Assets/arasaka-icon-24.png new file mode 100644 index 00000000..7e9cf1aa Binary files /dev/null and b/Assets/arasaka-icon-24.png differ diff --git a/Assets/arasaka-icon-256.png b/Assets/arasaka-icon-256.png new file mode 100644 index 00000000..f6d90235 Binary files /dev/null and b/Assets/arasaka-icon-256.png differ diff --git a/Assets/arasaka-icon-32.png b/Assets/arasaka-icon-32.png new file mode 100644 index 00000000..44e93c30 Binary files /dev/null and b/Assets/arasaka-icon-32.png differ diff --git a/Assets/arasaka-icon-48.png b/Assets/arasaka-icon-48.png new file mode 100644 index 00000000..d7505b40 Binary files /dev/null and b/Assets/arasaka-icon-48.png differ diff --git a/Assets/arasaka-icon-64.png b/Assets/arasaka-icon-64.png new file mode 100644 index 00000000..5a8a9dc0 Binary files /dev/null and b/Assets/arasaka-icon-64.png differ diff --git a/Assets/arasaka-icon-transparent.png b/Assets/arasaka-icon-transparent.png new file mode 100644 index 00000000..956b05c6 Binary files /dev/null and b/Assets/arasaka-icon-transparent.png differ diff --git a/Assets/arasaka-icon.ico b/Assets/arasaka-icon.ico new file mode 100644 index 00000000..ced2c7ff Binary files /dev/null and b/Assets/arasaka-icon.ico differ diff --git a/Assets/arasaka-logo-transparent.png b/Assets/arasaka-logo-transparent.png new file mode 100644 index 00000000..fab50243 Binary files /dev/null and b/Assets/arasaka-logo-transparent.png differ diff --git a/Assets/shigure-emblem-arasaka.ico b/Assets/shigure-emblem-arasaka.ico deleted file mode 100644 index d9945346..00000000 Binary files a/Assets/shigure-emblem-arasaka.ico and /dev/null differ diff --git a/Assets/shigure-emblem-arasaka.png b/Assets/shigure-emblem-arasaka.png deleted file mode 100644 index 7cde374d..00000000 Binary files a/Assets/shigure-emblem-arasaka.png and /dev/null differ diff --git a/Assets/shigure-logo.svg b/Assets/shigure-logo.svg deleted file mode 100644 index a918e863..00000000 --- a/Assets/shigure-logo.svg +++ /dev/null @@ -1,67 +0,0 @@ - - Shigure logo - A dark futuristic sidearm silhouette with a cool backlight and the Shigure wordmark. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SHIGURE - STATE ASSIST UI - - - diff --git a/Assets/shigure-mark.svg b/Assets/shigure-mark.svg deleted file mode 100644 index 4949e06b..00000000 --- a/Assets/shigure-mark.svg +++ /dev/null @@ -1,37 +0,0 @@ - - Shigure mark - A compact dark mechanical weapon mark for Shigure. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/Infrastructure/ConfigService.cs b/Infrastructure/ConfigService.cs index d5d9d52c..fb266364 100644 --- a/Infrastructure/ConfigService.cs +++ b/Infrastructure/ConfigService.cs @@ -81,6 +81,34 @@ public sealed class ConfigService return string.IsNullOrWhiteSpace(value) ? "keymap.json" : value; } + public IReadOnlyDictionary GetFailedSpells(int? classId) + => GetClassSpellMap(classId, ModuleSpecialActions.FailedSpell); + + public IReadOnlyDictionary GetOneKeySpells(int? classId) + => GetClassSpellMap(classId, ModuleSpecialActions.OneKeySpell); + + 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(); + } + + 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)) + { + result[id] = spell.Trim(); + } + } + + return result; + } + private static void CopyInto(JsonObject target, JsonObject source) { foreach (var (key, value) in source) diff --git a/Input/KeymapCatalog.cs b/Input/KeymapCatalog.cs index ac31778d..8a291a7c 100644 --- a/Input/KeymapCatalog.cs +++ b/Input/KeymapCatalog.cs @@ -80,6 +80,11 @@ public sealed class KeymapCatalog return units.ToList(); } + public IReadOnlyCollection GetFailedSpellNames(int? classId) + { + return _config?.GetFailedSpells(classId).Values.ToList() ?? []; + } + private KeymapEntries GetEntries(int? classId) { var path = ResolveKeymapPath(classId); diff --git a/Input/KeymapService.cs b/Input/KeymapService.cs index a45fe4a4..6c66d417 100644 --- a/Input/KeymapService.cs +++ b/Input/KeymapService.cs @@ -82,5 +82,15 @@ public sealed class KeymapService var normalizedUnit = unit.GetValueOrDefault(); return _hotkeys.TryGetValue((normalizedUnit, spell), out var hotkey) ? hotkey : null; } + + public IReadOnlyDictionary GetCurrentFailedSpells() + { + return _config.GetFailedSpells(_currentClassId); + } + + public IReadOnlyDictionary GetCurrentOneKeySpells() + { + return _config.GetOneKeySpells(_currentClassId); + } } diff --git a/Modules/LogicRegistry.cs b/Modules/LogicRegistry.cs index cb3c4644..9c2b0d58 100644 --- a/Modules/LogicRegistry.cs +++ b/Modules/LogicRegistry.cs @@ -77,6 +77,23 @@ public sealed class DefaultClassLogic : IClassLogic public LogicDecision Run(GameState state, string? specName) { + var oneKeySpell = ModuleSpecialActions.GetOneKeySpell(state, _keymap.GetCurrentOneKeySpells()); + if (!string.IsNullOrWhiteSpace(oneKeySpell)) + { + var hotkey = _keymap.GetHotkey(0, oneKeySpell); + var info = new Dictionary + { + ["命中条件"] = $"一键辅助 == {state.GetInt("一键辅助")}", + ["动作技能"] = oneKeySpell, + ["动作按键"] = string.IsNullOrWhiteSpace(hotkey) ? "-" : hotkey, + ["动作单位"] = 0 + }; + var step = string.IsNullOrWhiteSpace(hotkey) + ? $"未找到按键 {oneKeySpell}" + : $"施放 {oneKeySpell}"; + return new LogicDecision(hotkey, step, info); + } + var oneKeyAssist = state.GetInt("一键辅助"); if (oneKeyAssist == 10) { diff --git a/Modules/ModuleSpecialActions.cs b/Modules/ModuleSpecialActions.cs index ad851598..41c87d2a 100644 --- a/Modules/ModuleSpecialActions.cs +++ b/Modules/ModuleSpecialActions.cs @@ -6,23 +6,7 @@ internal static class ModuleSpecialActions { public const string PauseSpell = "暂停"; public const string FailedSpell = "失败法术"; - - private static readonly Dictionary FailedSpellMap = new() - { - [1] = "心灵尖啸", - [2] = "群体驱散", - [3] = "真言术:障", - [4] = "终极苦修", - [5] = "神圣化身", - [6] = "光晕", - [7] = "神圣赞美诗", - [8] = "虚空形态", - [9] = "吸血鬼的拥抱", - [30] = "真言术:耀", - [35] = "福音" - }; - - public static IReadOnlyCollection FailedSpellNames => FailedSpellMap.Values; + public const string OneKeySpell = "一键法术"; public static bool IsPauseSpell(string? spell) { @@ -34,10 +18,15 @@ internal static class ModuleSpecialActions return string.Equals(spell?.Trim(), FailedSpell, StringComparison.Ordinal); } - public static string? GetFailedSpell(GameState state) + public static bool IsOneKeySpell(string? spell) + { + return string.Equals(spell?.Trim(), OneKeySpell, StringComparison.Ordinal); + } + + public static string? GetFailedSpell(GameState state, IReadOnlyDictionary? failedSpellMap) { var failedSpellId = state.GetInt("法术失败"); - if (!FailedSpellMap.TryGetValue(failedSpellId, out var spellName)) + if (failedSpellMap is null || !failedSpellMap.TryGetValue(failedSpellId, out var spellName)) { return null; } @@ -48,6 +37,14 @@ internal static class ModuleSpecialActions : null; } + public static string? GetOneKeySpell(GameState state, IReadOnlyDictionary? oneKeySpellMap) + { + var oneKeyAssist = state.GetInt("一键辅助"); + return oneKeySpellMap is not null && oneKeySpellMap.TryGetValue(oneKeyAssist, out var spellName) + ? spellName + : null; + } + private static bool IsZero(object? value) { return value switch diff --git a/Modules/ModuleStore.cs b/Modules/ModuleStore.cs index ce1b27ad..9d819a9c 100644 --- a/Modules/ModuleStore.cs +++ b/Modules/ModuleStore.cs @@ -557,10 +557,25 @@ public static class ModuleLogic { var info = CreateInfo(module, state); var unitSlots = ResolveDynamicFields(module, state); + var failedSpells = keymap.GetCurrentFailedSpells(); + var oneKeySpells = keymap.GetCurrentOneKeySpells(); + var oneKeySpell = ModuleSpecialActions.GetOneKeySpell(state, oneKeySpells); + if (!string.IsNullOrWhiteSpace(oneKeySpell)) + { + var hotkey = keymap.GetHotkey(0, oneKeySpell); + info["命中条件"] = $"一键辅助 == {state.GetInt("一键辅助")}"; + info["动作技能"] = oneKeySpell; + info["动作按键"] = string.IsNullOrWhiteSpace(hotkey) ? "-" : hotkey; + info["动作单位"] = 0; + var step = string.IsNullOrWhiteSpace(hotkey) + ? $"{module.Name}: 未找到按键 {oneKeySpell}" + : $"{module.Name}: 施放 {oneKeySpell}"; + return new LogicDecision(hotkey, step, info, module.Name); + } foreach (var rule in module.Rules.Where(rule => rule.Enabled)) { - if (!ModuleConditionEvaluator.TryEvaluate(rule.Condition, state, out var conditionMatched, out var error)) + if (!ModuleConditionEvaluator.TryEvaluate(rule.Condition, state, out var conditionMatched, out var error, failedSpells)) { info["条件错误"] = error; info["规则条件"] = rule.Condition; @@ -597,12 +612,22 @@ public static class ModuleLogic var actionSpell = rule.Spell; if (ModuleSpecialActions.IsFailedSpell(actionSpell)) { - actionSpell = ModuleSpecialActions.GetFailedSpell(state); + actionSpell = ModuleSpecialActions.GetFailedSpell(state, failedSpells); if (string.IsNullOrWhiteSpace(actionSpell)) { continue; } } + else if (ModuleSpecialActions.IsOneKeySpell(actionSpell)) + { + actionSpell = ModuleSpecialActions.GetOneKeySpell(state, oneKeySpells); + if (string.IsNullOrWhiteSpace(actionSpell)) + { + continue; + } + + resolvedUnit = 0; + } var hotkey = string.IsNullOrWhiteSpace(rule.Hotkey) ? string.IsNullOrWhiteSpace(actionSpell) ? null : keymap.GetHotkey(resolvedUnit, actionSpell) @@ -927,7 +952,12 @@ public static class ModuleConditionEvaluator @"^\s*(?.+?)\s*(?==|!=|>=|<=|>|<)\s*(?.+?)\s*$", RegexOptions.Compiled); - public static bool TryEvaluate(string? expression, GameState state, out bool matched, out string? error) + public static bool TryEvaluate( + string? expression, + GameState state, + out bool matched, + out string? error, + IReadOnlyDictionary? failedSpells = null) { matched = false; error = null; @@ -943,7 +973,7 @@ public static class ModuleConditionEvaluator var allAndMatched = true; foreach (var andPart in Regex.Split(orPart, @"\s*&&\s*")) { - if (!TryEvaluateTerm(andPart, state, out var termMatched, out error)) + if (!TryEvaluateTerm(andPart, state, out var termMatched, out error, failedSpells)) { return false; } @@ -981,7 +1011,12 @@ public static class ModuleConditionEvaluator public static bool TryResolveDouble(GameState state, string fieldName, out double value) => TryToDouble(ResolveValue(state, fieldName), out value); - private static bool TryEvaluateTerm(string term, GameState state, out bool matched, out string? error) + private static bool TryEvaluateTerm( + string term, + GameState state, + out bool matched, + out string? error, + IReadOnlyDictionary? failedSpells) { matched = false; error = null; @@ -995,7 +1030,7 @@ public static class ModuleConditionEvaluator var inMatch = InRegex.Match(trimmed); if (inMatch.Success) { - var inLeft = ResolveValue(state, inMatch.Groups["field"].Value.Trim()); + var inLeft = ResolveValue(state, inMatch.Groups["field"].Value.Trim(), failedSpells); var inOp = NormalizeOperator(inMatch.Groups["op"].Value); var values = ParseListLiterals(inMatch.Groups["value"].Value); return TryCompareIn(inLeft, inOp, values, out matched, out error); @@ -1006,18 +1041,21 @@ public static class ModuleConditionEvaluator { var invert = trimmed.StartsWith('!'); var fieldName = invert ? trimmed[1..].Trim() : trimmed; - var value = ResolveValue(state, fieldName); + var value = ResolveValue(state, fieldName, failedSpells); matched = invert ? !IsTruthy(value) : IsTruthy(value); return true; } - var left = ResolveValue(state, comparison.Groups["field"].Value.Trim()); + var left = ResolveValue(state, comparison.Groups["field"].Value.Trim(), failedSpells); var op = comparison.Groups["op"].Value; var right = ParseLiteral(comparison.Groups["value"].Value.Trim()); return TryCompare(left, op, right, out matched, out error); } - private static object? ResolveValue(GameState state, string fieldName) + private static object? ResolveValue( + GameState state, + string fieldName, + IReadOnlyDictionary? failedSpells = null) { var key = fieldName.Trim(); if (key.StartsWith("state.", StringComparison.OrdinalIgnoreCase)) @@ -1037,7 +1075,7 @@ public static class ModuleConditionEvaluator if (ModuleSpecialActions.IsFailedSpell(key)) { - return ModuleSpecialActions.GetFailedSpell(state); + return ModuleSpecialActions.GetFailedSpell(state, failedSpells); } if (key.StartsWith("group.", StringComparison.OrdinalIgnoreCase)) diff --git a/Shigure.csproj b/Shigure.csproj index 10718c14..f49de1f4 100644 --- a/Shigure.csproj +++ b/Shigure.csproj @@ -8,7 +8,7 @@ enable Shigure Shigure - Assets\shigure-emblem-arasaka.ico + Assets\arasaka-icon.ico diff --git a/Shigure.csproj.user b/Shigure.csproj.user index 8a95e908..b5309f2d 100644 --- a/Shigure.csproj.user +++ b/Shigure.csproj.user @@ -1,15 +1,5 @@  - - - Form - - - UserControl - - - Form - - + \ No newline at end of file diff --git a/UI/MainForm.cs b/UI/MainForm.cs index 5855157b..9c8180fc 100644 --- a/UI/MainForm.cs +++ b/UI/MainForm.cs @@ -5,6 +5,7 @@ namespace Shigure; public sealed class MainForm : Form, IMessageFilter { private const int ResizeGripSize = 8; + private const string HeaderIconPath = "Assets\\arasaka-icon-transparent.png"; private Button _toggleKeyButton = null!; private ComboBox _modeComboBox = null!; @@ -153,6 +154,19 @@ public sealed class MainForm : Form, IMessageFilter bar.ColumnStyles.Add(new ColumnStyle(SizeType.Percent, 100)); bar.ColumnStyles.Add(new ColumnStyle(SizeType.AutoSize)); + var brand = new FlowLayoutPanel + { + AutoSize = true, + Anchor = AnchorStyles.Left, + FlowDirection = FlowDirection.LeftToRight, + WrapContents = false, + BackColor = Color.Transparent, + Margin = new Padding(0, 0, 12, 0), + Padding = new Padding(0) + }; + + var headerIcon = CreateHeaderIcon(); + _titleLabel = new Label { Text = "Shigure", @@ -160,9 +174,12 @@ public sealed class MainForm : Form, IMessageFilter Anchor = AnchorStyles.Left, Font = new Font(Font.FontFamily, 13F, FontStyle.Bold), ForeColor = UiTheme.Text, - Margin = new Padding(2, 0, 12, 0) + Margin = new Padding(8, 0, 0, 0) }; + brand.Controls.Add(headerIcon); + brand.Controls.Add(_titleLabel); + _runtimeStatusLabel = new Label { Text = string.Empty, @@ -173,6 +190,8 @@ public sealed class MainForm : Form, IMessageFilter }; EnableDrag(bar); + EnableDrag(brand); + EnableDrag(headerIcon); EnableDrag(_titleLabel); EnableDrag(_runtimeStatusLabel); @@ -201,12 +220,35 @@ public sealed class MainForm : Form, IMessageFilter buttons.Controls.AddRange(new Control[] { _enableButton, _settingsButton, closeButton }); - bar.Controls.Add(_titleLabel, 0, 0); + bar.Controls.Add(brand, 0, 0); bar.Controls.Add(_runtimeStatusLabel, 1, 0); bar.Controls.Add(buttons, 2, 0); return bar; } + private static PictureBox CreateHeaderIcon() + { + var box = new PictureBox + { + Size = new Size(32, 32), + MinimumSize = new Size(32, 32), + MaximumSize = new Size(32, 32), + SizeMode = PictureBoxSizeMode.Zoom, + BackColor = Color.Transparent, + Margin = new Padding(0), + Anchor = AnchorStyles.Left + }; + + var path = Path.Combine(AppContext.BaseDirectory, HeaderIconPath); + if (File.Exists(path)) + { + using var image = Image.FromFile(path); + box.Image = new Bitmap(image); + } + + return box; + } + private Control BuildSettingsPanel() { var panel = new TableLayoutPanel diff --git a/UI/ModuleEditorControl.cs b/UI/ModuleEditorControl.cs index 48c24fe9..227a0e02 100644 --- a/UI/ModuleEditorControl.cs +++ b/UI/ModuleEditorControl.cs @@ -740,6 +740,7 @@ public sealed class ModuleEditorControl : UserControl _spellColumn.Items.Add(string.Empty); _spellColumn.Items.Add(ModuleSpecialActions.PauseSpell); _spellColumn.Items.Add(ModuleSpecialActions.FailedSpell); + _spellColumn.Items.Add(ModuleSpecialActions.OneKeySpell); foreach (var spell in _keymapCatalog.GetSpells(classId)) { if (!_spellColumn.Items.Contains(spell)) @@ -803,9 +804,16 @@ public sealed class ModuleEditorControl : UserControl return; } + if (ModuleSpecialActions.IsOneKeySpell(spell)) + { + cell.Items.Add("0"); + cell.Value = "0"; + return; + } + var classId = ReadMatchCombo(_classBox); var allowed = ModuleSpecialActions.IsFailedSpell(spell) - ? _keymapCatalog.GetUnitsForSpells(classId, ModuleSpecialActions.FailedSpellNames) + ? _keymapCatalog.GetUnitsForSpells(classId, _keymapCatalog.GetFailedSpellNames(classId)) : _keymapCatalog.GetUnitsForSpell(classId, spell); foreach (var unit in allowed) diff --git a/bin/Debug/net10.0-windows/Assets/shigure-emblem-arasaka.ico b/bin/Debug/net10.0-windows/Assets/shigure-emblem-arasaka.ico deleted file mode 100644 index d9945346..00000000 Binary files a/bin/Debug/net10.0-windows/Assets/shigure-emblem-arasaka.ico and /dev/null differ diff --git a/bin/Debug/net10.0-windows/Assets/shigure-emblem-arasaka.png b/bin/Debug/net10.0-windows/Assets/shigure-emblem-arasaka.png deleted file mode 100644 index 7cde374d..00000000 Binary files a/bin/Debug/net10.0-windows/Assets/shigure-emblem-arasaka.png and /dev/null differ diff --git a/bin/Debug/net10.0-windows/Assets/shigure-logo.svg b/bin/Debug/net10.0-windows/Assets/shigure-logo.svg deleted file mode 100644 index a918e863..00000000 --- a/bin/Debug/net10.0-windows/Assets/shigure-logo.svg +++ /dev/null @@ -1,67 +0,0 @@ - - Shigure logo - A dark futuristic sidearm silhouette with a cool backlight and the Shigure wordmark. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - SHIGURE - STATE ASSIST UI - - - diff --git a/bin/Debug/net10.0-windows/Assets/shigure-mark.svg b/bin/Debug/net10.0-windows/Assets/shigure-mark.svg deleted file mode 100644 index 4949e06b..00000000 --- a/bin/Debug/net10.0-windows/Assets/shigure-mark.svg +++ /dev/null @@ -1,37 +0,0 @@ - - Shigure mark - A compact dark mechanical weapon mark for Shigure. - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/bin/Debug/net10.0-windows/Shigure.dll b/bin/Debug/net10.0-windows/Shigure.dll index 06b1f0b1..0b6f83f5 100644 Binary files a/bin/Debug/net10.0-windows/Shigure.dll and b/bin/Debug/net10.0-windows/Shigure.dll differ diff --git a/bin/Debug/net10.0-windows/Shigure.exe b/bin/Debug/net10.0-windows/Shigure.exe index e6d57c21..03007f05 100644 Binary files a/bin/Debug/net10.0-windows/Shigure.exe and b/bin/Debug/net10.0-windows/Shigure.exe differ diff --git a/bin/Debug/net10.0-windows/Shigure.pdb b/bin/Debug/net10.0-windows/Shigure.pdb index 10852e47..0e41acc4 100644 Binary files a/bin/Debug/net10.0-windows/Shigure.pdb and b/bin/Debug/net10.0-windows/Shigure.pdb differ diff --git a/bin/Debug/net10.0-windows/config.json b/bin/Debug/net10.0-windows/config.json index 5e08fc1d..265deb7f 100644 --- a/bin/Debug/net10.0-windows/config.json +++ b/bin/Debug/net10.0-windows/config.json @@ -83,6 +83,7 @@ }, "1": { "keymap": "warrior.json", + "失败法术": {}, "1": { "目标生命值": { "step": 21, @@ -302,6 +303,7 @@ }, "2": { "keymap": "paladin.json", + "失败法术": {}, "1": { "神圣能量": { "step": 21, @@ -689,6 +691,7 @@ }, "3": { "keymap": "hunter.json", + "失败法术": {}, "1": { "敌人人数": { "step": 21, @@ -908,6 +911,7 @@ }, "4": { "keymap": "rogue.json", + "失败法术": {}, "1": { "spells": { "毒刃": { @@ -1175,6 +1179,34 @@ }, "5": { "keymap": "priest.json", + "失败法术": { + "1": "心灵尖啸", + "2": "群体驱散", + "3": "真言术:障", + "4": "终极苦修", + "5": "神圣化身", + "6": "光晕", + "7": "神圣赞美诗", + "8": "虚空形态", + "9": "吸血鬼的拥抱", + "30": "真言术:耀", + "35": "福音" + }, + "一键法术": { + "19": "吸血鬼之触", + "11": "心灵震爆", + "13": "暗言术:灭", + "14": "暗言术:痛", + "21": "暗言术:癫", + "22": "精神鞭笞", + "8": "虚空形态", + "23": "虚空洪流", + "24": "触须猛击", + "25": "虚空冲击", + "26": "虚空齐射", + "27": "精神鞭笞", + "28": "光晕" + }, "1": { "目标生命值": { "step": 21, @@ -1566,6 +1598,53 @@ }, "6": { "keymap": "deathknight.json", + "失败法术": { + "1": "反魔法领域", + "2": "窒息", + "3": "致盲冰雨", + "4": "亡者大军", + "23": "血魔之握", + "24": "憎恶附肢", + "39": "死亡之握" + }, + "一键法术": { + "4": "亡者大军", + "5": "心脏打击", + "6": "枯萎凋零", + "7": "死神的抚摸", + "8": "灵界打击", + "9": "符文刃舞", + "10": "精髓分裂", + "11": "血液沸腾", + "12": "心脏打击", + "13": "亡者复生", + "14": "凋零缠绕", + "15": "天灾打击", + "16": "扩散", + "17": "爆发", + "18": "脓疮打击", + "19": "腐化", + "20": "黑暗突变", + "21": "灵魂收割", + "22": "脓疮打击", + "25": "死神印记", + "26": "冰川突进", + "27": "冰霜巨龙之怒", + "28": "冷酷严冬", + "29": "冰霜之柱", + "30": "冰霜打击", + "31": "凛风冲击", + "32": "冰霜之镰", + "33": "冰龙吐息", + "34": "湮灭", + "35": "符文武器增效", + "36": "符文打击", + "37": "冰霜巨龙之怒", + "38": "冰霜打击", + "40": "吞噬", + "41": "扩散", + "42": "凋零缠绕" + }, "1": { "符文": { "step": 21, @@ -1860,6 +1939,7 @@ }, "7": { "keymap": "shaman.json", + "失败法术": {}, "1": { "目标生命值": { "step": 21, @@ -2261,6 +2341,7 @@ }, "8": { "keymap": "mage.json", + "失败法术": {}, "1": null, "2": null, "3": { @@ -2350,6 +2431,7 @@ }, "9": { "keymap": "warlock.json", + "失败法术": {}, "1": { "灵魂碎片": { "step": 23, @@ -2610,6 +2692,7 @@ }, "10": { "keymap": "monk.json", + "失败法术": {}, "1": { "酒池": { "step": 21, @@ -2936,6 +3019,7 @@ }, "11": { "keymap": "druid.json", + "失败法术": {}, "1": { "目标生命值": { "step": 21, @@ -3223,6 +3307,7 @@ }, "12": { "keymap": "demonhunter.json", + "失败法术": {}, "1": { "敌人人数": { "step": 21, @@ -3535,6 +3620,7 @@ }, "13": { "keymap": "evoker.json", + "失败法术": {}, "1": { "施法技能": { "step": 21, @@ -3728,4 +3814,4 @@ } } } -} +} \ No newline at end of file diff --git a/config.json b/config.json index 5e08fc1d..265deb7f 100644 --- a/config.json +++ b/config.json @@ -83,6 +83,7 @@ }, "1": { "keymap": "warrior.json", + "失败法术": {}, "1": { "目标生命值": { "step": 21, @@ -302,6 +303,7 @@ }, "2": { "keymap": "paladin.json", + "失败法术": {}, "1": { "神圣能量": { "step": 21, @@ -689,6 +691,7 @@ }, "3": { "keymap": "hunter.json", + "失败法术": {}, "1": { "敌人人数": { "step": 21, @@ -908,6 +911,7 @@ }, "4": { "keymap": "rogue.json", + "失败法术": {}, "1": { "spells": { "毒刃": { @@ -1175,6 +1179,34 @@ }, "5": { "keymap": "priest.json", + "失败法术": { + "1": "心灵尖啸", + "2": "群体驱散", + "3": "真言术:障", + "4": "终极苦修", + "5": "神圣化身", + "6": "光晕", + "7": "神圣赞美诗", + "8": "虚空形态", + "9": "吸血鬼的拥抱", + "30": "真言术:耀", + "35": "福音" + }, + "一键法术": { + "19": "吸血鬼之触", + "11": "心灵震爆", + "13": "暗言术:灭", + "14": "暗言术:痛", + "21": "暗言术:癫", + "22": "精神鞭笞", + "8": "虚空形态", + "23": "虚空洪流", + "24": "触须猛击", + "25": "虚空冲击", + "26": "虚空齐射", + "27": "精神鞭笞", + "28": "光晕" + }, "1": { "目标生命值": { "step": 21, @@ -1566,6 +1598,53 @@ }, "6": { "keymap": "deathknight.json", + "失败法术": { + "1": "反魔法领域", + "2": "窒息", + "3": "致盲冰雨", + "4": "亡者大军", + "23": "血魔之握", + "24": "憎恶附肢", + "39": "死亡之握" + }, + "一键法术": { + "4": "亡者大军", + "5": "心脏打击", + "6": "枯萎凋零", + "7": "死神的抚摸", + "8": "灵界打击", + "9": "符文刃舞", + "10": "精髓分裂", + "11": "血液沸腾", + "12": "心脏打击", + "13": "亡者复生", + "14": "凋零缠绕", + "15": "天灾打击", + "16": "扩散", + "17": "爆发", + "18": "脓疮打击", + "19": "腐化", + "20": "黑暗突变", + "21": "灵魂收割", + "22": "脓疮打击", + "25": "死神印记", + "26": "冰川突进", + "27": "冰霜巨龙之怒", + "28": "冷酷严冬", + "29": "冰霜之柱", + "30": "冰霜打击", + "31": "凛风冲击", + "32": "冰霜之镰", + "33": "冰龙吐息", + "34": "湮灭", + "35": "符文武器增效", + "36": "符文打击", + "37": "冰霜巨龙之怒", + "38": "冰霜打击", + "40": "吞噬", + "41": "扩散", + "42": "凋零缠绕" + }, "1": { "符文": { "step": 21, @@ -1860,6 +1939,7 @@ }, "7": { "keymap": "shaman.json", + "失败法术": {}, "1": { "目标生命值": { "step": 21, @@ -2261,6 +2341,7 @@ }, "8": { "keymap": "mage.json", + "失败法术": {}, "1": null, "2": null, "3": { @@ -2350,6 +2431,7 @@ }, "9": { "keymap": "warlock.json", + "失败法术": {}, "1": { "灵魂碎片": { "step": 23, @@ -2610,6 +2692,7 @@ }, "10": { "keymap": "monk.json", + "失败法术": {}, "1": { "酒池": { "step": 21, @@ -2936,6 +3019,7 @@ }, "11": { "keymap": "druid.json", + "失败法术": {}, "1": { "目标生命值": { "step": 21, @@ -3223,6 +3307,7 @@ }, "12": { "keymap": "demonhunter.json", + "失败法术": {}, "1": { "敌人人数": { "step": 21, @@ -3535,6 +3620,7 @@ }, "13": { "keymap": "evoker.json", + "失败法术": {}, "1": { "施法技能": { "step": 21, @@ -3728,4 +3814,4 @@ } } } -} +} \ No newline at end of file diff --git a/module/DK-官方一键.json b/module/DK-官方一键.json new file mode 100644 index 00000000..d05a2c71 --- /dev/null +++ b/module/DK-官方一键.json @@ -0,0 +1,21 @@ +{ + "Id": "新模块1-20260614114605703", + "Name": "DK 官方一键", + "Enabled": true, + "Match": { + "ClassId": 6 + }, + "Units": [], + "Counts": [], + "ValueAdjustments": [], + "Rules": [ + { + "Enabled": true, + "Condition": "一键辅助 > 0", + "Unit": 0, + "Spell": "一键法术", + "Hotkey": "", + "Step": "" + } + ] +} \ No newline at end of file diff --git a/module/戒律队伍神谕者-by-Wayne.json b/module/戒律队伍神谕者-by-Wayne.json index 7285d880..6b9c1bbc 100644 --- a/module/戒律队伍神谕者-by-Wayne.json +++ b/module/戒律队伍神谕者-by-Wayne.json @@ -91,37 +91,43 @@ "Enabled": true, "Condition": "施法技能 == 30", "Field": "耀层数", - "Delta": -1 + "Delta": -1, + "Formula": "" }, { "Enabled": true, "Condition": "施法技能 == 34", "Field": "暗影层数", - "Delta": -1 + "Delta": -1, + "Formula": "" }, { "Enabled": true, "Condition": "施法技能 == 34", "Field": "涌动层数", - "Delta": -1 + "Delta": -1, + "Formula": "" }, { "Enabled": true, "Condition": "施法技能 == 30", "Field": "耀90", - "Delta": -4 + "Delta": -4, + "Formula": "" }, { "Enabled": true, "Condition": "施法技能 == 30", "Field": "耀80", - "Delta": -4 + "Delta": -4, + "Formula": "" }, { "Enabled": true, "Condition": "施法技能 == 30", "Field": "有救赎数量", - "Delta": 4 + "Delta": 4, + "Formula": "" } ], "Rules": [ diff --git a/obj/Debug/net10.0-windows/Shigure.AssemblyInfo.cs b/obj/Debug/net10.0-windows/Shigure.AssemblyInfo.cs index 16e430ee..db9f279d 100644 --- a/obj/Debug/net10.0-windows/Shigure.AssemblyInfo.cs +++ b/obj/Debug/net10.0-windows/Shigure.AssemblyInfo.cs @@ -13,7 +13,7 @@ using System.Reflection; [assembly: System.Reflection.AssemblyCompanyAttribute("Shigure")] [assembly: System.Reflection.AssemblyConfigurationAttribute("Debug")] [assembly: System.Reflection.AssemblyFileVersionAttribute("1.0.0.0")] -[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+cd07b2dc8ccafab683552be422cce1434e6ac168")] +[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+82333279a8efc670d10c5b7e36d1e43c641bc28a")] [assembly: System.Reflection.AssemblyProductAttribute("Shigure")] [assembly: System.Reflection.AssemblyTitleAttribute("Shigure")] [assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")] diff --git a/obj/Debug/net10.0-windows/Shigure.AssemblyInfoInputs.cache b/obj/Debug/net10.0-windows/Shigure.AssemblyInfoInputs.cache index 3887b024..a18385ad 100644 --- a/obj/Debug/net10.0-windows/Shigure.AssemblyInfoInputs.cache +++ b/obj/Debug/net10.0-windows/Shigure.AssemblyInfoInputs.cache @@ -1 +1 @@ -bbaa96b963016e399d485c0350ab006ffaacb3b2c56b8716225899fbed389f6e +7cc2cff7abe08a28a6164485f486ecb0b4b3fc6b3a4b9bdce62396f67a15ced3 diff --git a/obj/Debug/net10.0-windows/Shigure.csproj.FileListAbsolute.txt b/obj/Debug/net10.0-windows/Shigure.csproj.FileListAbsolute.txt index f88be4a4..c24f95bb 100644 --- a/obj/Debug/net10.0-windows/Shigure.csproj.FileListAbsolute.txt +++ b/obj/Debug/net10.0-windows/Shigure.csproj.FileListAbsolute.txt @@ -31,10 +31,6 @@ C:\Users\bianw\OneDrive\VS Code\Shigure\Shigure\bin\Debug\net10.0-windows\Assets C:\Users\bianw\OneDrive\VS Code\Shigure\Shigure\bin\Debug\net10.0-windows\Assets\shigure-mark.svg C:\Users\bianw\OneDrive\VS Code\Shigure\Shigure\bin\Debug\net10.0-windows\Assets\shigure-emblem-arasaka.ico C:\Users\bianw\OneDrive\VS Code\Shigure\Shigure\bin\Debug\net10.0-windows\Assets\shigure-emblem-arasaka.png -C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\shigure-emblem-arasaka.ico -C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\shigure-emblem-arasaka.png -C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\shigure-logo.svg -C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\shigure-mark.svg C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\config.json C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\keymap\deathknight.json C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\keymap\demonhunter.json @@ -147,3 +143,14 @@ C:\Users\bianw\OneDrive\VS Code\Shigure\bin\CodexBuild\Shigure.runtimeconfig.jso C:\Users\bianw\OneDrive\VS Code\Shigure\bin\CodexBuild\Shigure.dll C:\Users\bianw\OneDrive\VS Code\Shigure\bin\CodexBuild\Shigure.pdb C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\module\戒律-单人神谕者-测试.json +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon.ico +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-128.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-16.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-24.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-256.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-32.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-48.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-64.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-icon-transparent.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Assets\arasaka-logo-transparent.png +C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\module\邪DK-官方一键.json diff --git a/obj/Debug/net10.0-windows/Shigure.dll b/obj/Debug/net10.0-windows/Shigure.dll index 06b1f0b1..0b6f83f5 100644 Binary files a/obj/Debug/net10.0-windows/Shigure.dll and b/obj/Debug/net10.0-windows/Shigure.dll differ diff --git a/obj/Debug/net10.0-windows/Shigure.pdb b/obj/Debug/net10.0-windows/Shigure.pdb index 10852e47..0e41acc4 100644 Binary files a/obj/Debug/net10.0-windows/Shigure.pdb and b/obj/Debug/net10.0-windows/Shigure.pdb differ diff --git a/obj/Debug/net10.0-windows/Shigure.sourcelink.json b/obj/Debug/net10.0-windows/Shigure.sourcelink.json index d4d44c6c..f13c9743 100644 --- a/obj/Debug/net10.0-windows/Shigure.sourcelink.json +++ b/obj/Debug/net10.0-windows/Shigure.sourcelink.json @@ -1 +1 @@ -{"documents":{"C:\\Users\\bianw\\OneDrive\\VS Code\\Shigure\\*":"https://raw.githubusercontent.com/waynebian01/Shigure/cd07b2dc8ccafab683552be422cce1434e6ac168/*"}} \ No newline at end of file +{"documents":{"C:\\Users\\bianw\\OneDrive\\VS Code\\Shigure\\*":"https://raw.githubusercontent.com/waynebian01/Shigure/82333279a8efc670d10c5b7e36d1e43c641bc28a/*"}} \ No newline at end of file diff --git a/obj/Debug/net10.0-windows/apphost.exe b/obj/Debug/net10.0-windows/apphost.exe index e6d57c21..03007f05 100644 Binary files a/obj/Debug/net10.0-windows/apphost.exe and b/obj/Debug/net10.0-windows/apphost.exe differ diff --git a/obj/Debug/net10.0-windows/ref/Shigure.dll b/obj/Debug/net10.0-windows/ref/Shigure.dll index ee6c3816..dbebd1b8 100644 Binary files a/obj/Debug/net10.0-windows/ref/Shigure.dll and b/obj/Debug/net10.0-windows/ref/Shigure.dll differ diff --git a/obj/Debug/net10.0-windows/refint/Shigure.dll b/obj/Debug/net10.0-windows/refint/Shigure.dll index ee6c3816..dbebd1b8 100644 Binary files a/obj/Debug/net10.0-windows/refint/Shigure.dll and b/obj/Debug/net10.0-windows/refint/Shigure.dll differ