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 @@
-
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 @@
-
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 @@
-
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 @@
-
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