This commit is contained in:
waynebian01
2026-06-14 23:21:35 +08:00
parent 5f9443308a
commit 49bbe8315c
28 changed files with 983 additions and 110 deletions

View File

@@ -15,12 +15,19 @@ internal static class Program
return;
}
if (RandomizedExecutableLauncher.TryRelaunch(args))
ApplicationConfiguration.Initialize();
var relaunchResult = RandomizedExecutableLauncher.TryRelaunch(args);
if (relaunchResult == RandomizedRelaunchResult.Started)
{
return;
}
if (relaunchResult == RandomizedRelaunchResult.Failed)
{
return;
}
ApplicationConfiguration.Initialize();
Application.Run(new MainForm(AppOptions.FromArgs(args)));
}
}

View File

@@ -14,44 +14,46 @@ internal static class RandomizedExecutableLauncher
private static readonly byte[] RandomSuffixMarkerBytes = System.Text.Encoding.UTF8.GetBytes(RandomSuffixMarker);
private static readonly char[] FileNameChars = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789".ToCharArray();
public static bool TryRelaunch(string[] args)
public static RandomizedRelaunchResult TryRelaunch(string[] args)
{
if (Environment.GetEnvironmentVariable(RelaunchedEnvironmentKey) == "1")
{
return false;
return RandomizedRelaunchResult.AlreadyRelaunched;
}
var currentExecutable = Environment.ProcessPath;
if (string.IsNullOrWhiteSpace(currentExecutable) || !File.Exists(currentExecutable))
{
return false;
return RandomizedRelaunchResult.Failed;
}
var extension = Path.GetExtension(currentExecutable);
if (!string.Equals(extension, ".exe", StringComparison.OrdinalIgnoreCase))
{
return false;
return RandomizedRelaunchResult.Failed;
}
try
{
CleanupOldTemporaryDirectories(currentExecutable);
CleanupTemporaryRoot(currentExecutable);
var randomizedExecutable = CreateRandomizedExecutable(currentExecutable);
var randomizedDirectory = Path.GetDirectoryName(randomizedExecutable);
var startInfo = new ProcessStartInfo(randomizedExecutable)
{
UseShellExecute = false,
WorkingDirectory = Path.GetDirectoryName(randomizedExecutable) ?? Environment.CurrentDirectory
WorkingDirectory = randomizedDirectory ?? Environment.CurrentDirectory
};
startInfo.Environment[RelaunchedEnvironmentKey] = "1";
startInfo.Environment[AppPaths.OriginalBaseDirectoryEnvironmentKey] = Path.GetDirectoryName(currentExecutable) ?? AppContext.BaseDirectory;
startInfo.Environment[AppPaths.RandomizedDisplayNameEnvironmentKey] = Path.GetFileNameWithoutExtension(randomizedExecutable);
foreach (var arg in args)
{
startInfo.ArgumentList.Add(arg);
}
Process.Start(startInfo);
return true;
return Process.Start(startInfo) is null
? RandomizedRelaunchResult.Failed
: RandomizedRelaunchResult.Started;
}
catch (Exception ex)
{
@@ -60,11 +62,11 @@ internal static class RandomizedExecutableLauncher
"Shigure",
MessageBoxButtons.OK,
MessageBoxIcon.Error);
return false;
return RandomizedRelaunchResult.Failed;
}
}
private static void CleanupOldTemporaryDirectories(string sourcePath)
private static void CleanupTemporaryRoot(string sourcePath)
{
var tempRoot = GetTemporaryRoot(sourcePath);
if (!Directory.Exists(tempRoot))
@@ -72,6 +74,20 @@ internal static class RandomizedExecutableLauncher
return;
}
try
{
Directory.Delete(tempRoot, recursive: true);
return;
}
catch (IOException)
{
// A previous randomized run may still be active; clean what is safe below.
}
catch (UnauthorizedAccessException)
{
// A previous randomized run may still be active; clean what is safe below.
}
foreach (var directory in Directory.EnumerateDirectories(tempRoot))
{
if (!IsRandomizedDirectoryName(directory) || !ContainsRandomizedExecutable(directory))
@@ -231,3 +247,10 @@ internal static class RandomizedExecutableLauncher
writer.Write(randomBytes);
}
}
internal enum RandomizedRelaunchResult
{
Started,
AlreadyRelaunched,
Failed
}

View File

@@ -3,6 +3,7 @@ namespace Shigure;
internal static class AppPaths
{
public const string OriginalBaseDirectoryEnvironmentKey = "SHIGURE_ORIGINAL_BASE_DIRECTORY";
public const string RandomizedDisplayNameEnvironmentKey = "SHIGURE_RANDOMIZED_DISPLAY_NAME";
public static string BaseDirectory
{

View File

@@ -77,23 +77,6 @@ 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<string, object?>
{
["命中条件"] = $"一键辅助 == {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)
{

View File

@@ -5,7 +5,7 @@ namespace Shigure;
internal static class ModuleSpecialActions
{
public const string PauseSpell = "暂停";
public const string FailedSpell = "失败法术";
public const string FailedSpell = "插入法术";
public const string OneKeySpell = "一键法术";
public static bool IsPauseSpell(string? spell)

View File

@@ -559,19 +559,6 @@ public static class ModuleLogic
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))
{

View File

@@ -8,13 +8,16 @@
<ImplicitUsings>enable</ImplicitUsings>
<AssemblyName>Shigure</AssemblyName>
<RootNamespace>Shigure</RootNamespace>
<Version>1.0.0</Version>
<AssemblyVersion>1.0.0.0</AssemblyVersion>
<FileVersion>1.0.0.0</FileVersion>
<ApplicationIcon>Assets\arasaka-icon.ico</ApplicationIcon>
</PropertyGroup>
<ItemGroup>
<None Include="Assets\*.ico" CopyToOutputDirectory="PreserveNewest" />
<None Include="Assets\*.png" CopyToOutputDirectory="PreserveNewest" />
<None Include="Assets\*.svg" CopyToOutputDirectory="PreserveNewest" />
<EmbeddedResource Include="Assets\*.ico" />
<EmbeddedResource Include="Assets\*.png" />
<EmbeddedResource Include="Assets\*.svg" />
<None Include="config.json" CopyToOutputDirectory="PreserveNewest" />
<None Include="keymap\*.json" CopyToOutputDirectory="PreserveNewest" />
<None Include="module\**\*.json" CopyToOutputDirectory="PreserveNewest" />

View File

@@ -5,8 +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 const string HeaderIconResourceName = "Shigure.Assets.arasaka-icon-transparent.png";
private Button _toggleKeyButton = null!;
private ComboBox _modeComboBox = null!;
private ComboBox _moduleComboBox = null!;
@@ -113,7 +112,7 @@ public sealed class MainForm : Form, IMessageFilter
{
SuspendLayout();
Text = "Shigure";
Text = GetWindowTitle();
StartPosition = FormStartPosition.CenterScreen;
FormBorderStyle = FormBorderStyle.None;
@@ -239,10 +238,10 @@ public sealed class MainForm : Form, IMessageFilter
Anchor = AnchorStyles.Left
};
var path = Path.Combine(AppPaths.BaseDirectory, HeaderIconPath);
if (File.Exists(path))
using var stream = typeof(MainForm).Assembly.GetManifestResourceStream(HeaderIconResourceName);
if (stream is not null)
{
using var image = Image.FromFile(path);
using var image = Image.FromStream(stream);
box.Image = new Bitmap(image);
}
@@ -1104,6 +1103,12 @@ public sealed class MainForm : Form, IMessageFilter
};
}
private static string GetWindowTitle()
{
var randomizedName = Environment.GetEnvironmentVariable(AppPaths.RandomizedDisplayNameEnvironmentKey);
return string.IsNullOrWhiteSpace(randomizedName) ? "Shigure" : randomizedName;
}
private void EnableDrag(Control control)
{
control.MouseDown += (_, e) =>

View File

@@ -83,7 +83,7 @@
},
"1": {
"keymap": "warrior.json",
"失败法术": {},
"插入法术": {},
"1": {
"目标生命值": {
"step": 21,
@@ -303,7 +303,7 @@
},
"2": {
"keymap": "paladin.json",
"失败法术": {},
"插入法术": {},
"1": {
"神圣能量": {
"step": 21,
@@ -691,7 +691,7 @@
},
"3": {
"keymap": "hunter.json",
"失败法术": {},
"插入法术": {},
"1": {
"敌人人数": {
"step": 21,
@@ -911,7 +911,7 @@
},
"4": {
"keymap": "rogue.json",
"失败法术": {},
"插入法术": {},
"1": {
"spells": {
"毒刃": {
@@ -1179,7 +1179,7 @@
},
"5": {
"keymap": "priest.json",
"失败法术": {
"插入法术": {
"1": "心灵尖啸",
"2": "群体驱散",
"3": "真言术:障",
@@ -1598,7 +1598,7 @@
},
"6": {
"keymap": "deathknight.json",
"失败法术": {
"插入法术": {
"1": "反魔法领域",
"2": "窒息",
"3": "致盲冰雨",
@@ -1939,7 +1939,7 @@
},
"7": {
"keymap": "shaman.json",
"失败法术": {},
"插入法术": {},
"1": {
"目标生命值": {
"step": 21,
@@ -2341,7 +2341,7 @@
},
"8": {
"keymap": "mage.json",
"失败法术": {},
"插入法术": {},
"1": null,
"2": null,
"3": {
@@ -2431,7 +2431,7 @@
},
"9": {
"keymap": "warlock.json",
"失败法术": {},
"插入法术": {},
"1": {
"灵魂碎片": {
"step": 23,
@@ -2692,7 +2692,7 @@
},
"10": {
"keymap": "monk.json",
"失败法术": {},
"插入法术": {},
"1": {
"酒池": {
"step": 21,
@@ -3019,7 +3019,7 @@
},
"11": {
"keymap": "druid.json",
"失败法术": {},
"插入法术": {},
"1": {
"目标生命值": {
"step": 21,
@@ -3307,7 +3307,7 @@
},
"12": {
"keymap": "demonhunter.json",
"失败法术": {},
"插入法术": {},
"1": {
"敌人人数": {
"step": 21,
@@ -3620,7 +3620,7 @@
},
"13": {
"keymap": "evoker.json",
"失败法术": {},
"插入法术": {},
"1": {
"施法技能": {
"step": 21,

View File

@@ -83,7 +83,49 @@
},
"1": {
"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": "斩杀"
},
"1": {
"目标生命值": {
"step": 21,
@@ -303,7 +345,35 @@
},
"2": {
"keymap": "paladin.json",
"失败法术": {},
"插入法术": {
"1": "盲目之光",
"2": "光环掌握",
"3": "自由祝福",
"4": "制裁之锤",
"5": "保护祝福",
"6": "圣盾术",
"7": "圣洁鸣钟",
"16": "灰烬觉醒",
"24": "美德道标"
},
"一键法术": {
"7": "圣洁鸣钟",
"8": "复仇者之盾",
"9": "奉献",
"10": "审判",
"11": "正义盾击",
"12": "十字军打击",
"19": "审判",
"21": "审判",
"13": "公正之剑",
"14": "审判",
"15": "最终审判",
"16": "灰烬觉醒",
"17": "神圣风暴",
"18": "灰烬觉醒",
"20": "处决宣判",
"26": "十字军打击"
},
"1": {
"神圣能量": {
"step": 21,
@@ -691,7 +761,51 @@
},
"3": {
"keymap": "hunter.json",
"失败法术": {},
"插入法术": {
"1": "意气风发",
"2": "胁迫"
},
"一键法术": {
"2": "杀戮命令",
"1": "倒刺射击",
"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": "牺牲咆哮",
"46": "猛禽一击"
},
"1": {
"敌人人数": {
"step": 21,
@@ -911,7 +1025,69 @@
},
"4": {
"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": "致命一击"
},
"1": {
"spells": {
"毒刃": {
@@ -1179,7 +1355,7 @@
},
"5": {
"keymap": "priest.json",
"失败法术": {
"插入法术": {
"1": "心灵尖啸",
"2": "群体驱散",
"3": "真言术:障",
@@ -1598,7 +1774,7 @@
},
"6": {
"keymap": "deathknight.json",
"失败法术": {
"插入法术": {
"1": "反魔法领域",
"2": "窒息",
"3": "致盲冰雨",
@@ -1939,7 +2115,47 @@
},
"7": {
"keymap": "shaman.json",
"失败法术": {},
"插入法术": {
"13": "涌动图腾",
"14": "电能图腾",
"15": "阵风",
"16": "灵魂链接图腾",
"17": "土元素",
"18": "战栗图腾",
"19": "清毒图腾",
"20": "图腾投射",
"21": "升腾",
"22": "治疗之潮图腾",
"45": "治疗之雨"
},
"一键法术": {
"1": "唤潮者的护卫",
"2": "大地生命武器",
"3": "天怒",
"4": "水之护盾",
"5": "烈焰震击",
"6": "熔岩爆裂",
"7": "闪电箭",
"8": "闪电链",
"11": "先祖迅捷",
"13": "涌动图腾",
"23": "毁灭闪电",
"24": "流电炽焰",
"25": "火舌武器",
"26": "熔岩猛击",
"27": "裂地术",
"28": "始源风暴",
"29": "风切",
"30": "风怒武器",
"31": "风暴打击",
"32": "闪电箭",
"33": "元素冲击",
"34": "地震术",
"35": "大地震击",
"36": "风暴守护者",
"37": "闪电之盾",
"45": "治疗之雨"
},
"1": {
"目标生命值": {
"step": 21,
@@ -2341,7 +2557,68 @@
},
"8": {
"keymap": "mage.json",
"失败法术": {},
"插入法术": {
"18": "强化隐形术",
"19": "冰霜新星",
"20": "龙息术"
},
"一键法术": {
"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": "造餐术"
},
"1": null,
"2": null,
"3": {
@@ -2431,7 +2708,77 @@
},
"9": {
"keymap": "warlock.json",
"失败法术": {},
"插入法术": {
"1": "死亡缠绕",
"2": "暗影之怒",
"3": "暗影之怒",
"4": "内爆",
"5": "召唤恶魔暴君",
"6": "魔典:邪能破坏者"
},
"一键法术": {
"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": "召唤萨亚德"
},
"1": {
"灵魂碎片": {
"step": 23,
@@ -2692,7 +3039,35 @@
},
"10": {
"keymap": "monk.json",
"失败法术": {},
"插入法术": {
"1": "轮回之触",
"2": "扫堂腿",
"3": "魂体双分",
"4": "魂体双分:转移",
"5": "还魂术",
"6": "平心之环",
"7": "分筋错骨",
"8": "玄牛下凡"
},
"一键法术": {
"1": "轮回之触",
"9": "猛虎掌",
"10": "神鹤引项踢",
"11": "幻灭踢",
"12": "爆炸酒桶",
"13": "真气爆裂",
"14": "醉酿投",
"15": "火焰之息",
"16": "碧玉疾风",
"19": "幻灭踢",
"20": "怒雷破",
"21": "旭日东升踢",
"17": "碎玉闪电",
"18": "神鹤引项踢",
"22": "风领主之击",
"23": "旭日东升踢",
"24": "升龙霸"
},
"1": {
"酒池": {
"step": 21,
@@ -3019,7 +3394,58 @@
},
"11": {
"keymap": "druid.json",
"失败法术": {},
"插入法术": {
"1": "台风",
"2": "夺魂咆哮",
"3": "乌索尔旋风",
"4": "自然迅捷"
},
"一键法术": {
"7": "摧折",
"8": "明月普照",
"5": "月火术",
"9": "横扫",
"10": "熊形态",
"11": "痛击",
"12": "裂伤",
"6": "野性印记",
"13": "月火术",
"14": "摧折",
"15": "凶猛撕咬",
"16": "割裂",
"17": "撕碎",
"18": "斜掠",
"23": "愤怒",
"24": "星涌术",
"25": "星火术",
"26": "万灵之召",
"27": "星辰坠落",
"28": "自然之力",
"29": "日蚀",
"30": "超凡之盟",
"32": "化身:艾露恩之眷",
"33": "艾露恩之怒",
"34": "新月",
"35": "枭兽形态",
"36": "阳炎术",
"37": "月蚀",
"38": "猎豹形态",
"39": "化身:阿莎曼之灵",
"40": "原始之怒",
"41": "迎头痛击",
"42": "怒意狂乱",
"43": "猛虎之怒",
"44": "生存本能",
"45": "野性冲锋",
"46": "群体缠绕",
"47": "狂暴",
"48": "啃噬",
"49": "野性狂乱",
"50": "横扫",
"51": "凶猛撕咬",
"52": "碎甲咆哮",
"53": "重殴"
},
"1": {
"目标生命值": {
"step": 21,
@@ -3307,7 +3733,76 @@
},
"12": {
"keymap": "demonhunter.json",
"失败法术": {},
"插入法术": {
"3": "悲苦咒符",
"4": "禁锢",
"6": "混乱新星",
"16": "恶魔变形",
"26": "邪能毁灭",
"27": "沉默咒符",
"28": "虚空新星",
"29": "虚空变形",
"43": "黑暗",
"45": "虚空变形"
},
"一键法术": {
"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": "献祭光环"
},
"1": {
"敌人人数": {
"step": 21,
@@ -3620,7 +4115,26 @@
},
"13": {
"keymap": "evoker.json",
"失败法术": {},
"插入法术": {
"1": "黑曜鳞片",
"2": "灼烧之焰"
},
"一键法术": {
"2": "火焰吐息",
"3": "青铜龙的祝福",
"8": "碧蓝打击",
"12": "活化烈焰",
"13": "裂解",
"16": "永恒之涌",
"17": "葬火",
"25": "碧蓝打击",
"26": "火焰吐息",
"27": "永恒之涌",
"28": "喷发",
"29": "地壳激变",
"30": "先知先觉",
"31": "黑檀之力"
},
"1": {
"施法技能": {
"step": 21,

View File

@@ -11,11 +11,19 @@
"Rules": [
{
"Enabled": true,
"Condition": "一键辅助 > 0",
"Condition": "",
"Unit": 0,
"Spell": "插入法术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "一键辅助 > 0 && 战斗 == true",
"Unit": 0,
"Spell": "一键法术",
"Hotkey": "",
"Step": ""
}
]
}
}

View File

@@ -0,0 +1,351 @@
{
"Id": "奶骑大秘境-20260614103400001",
"Name": "奶骑大秘境 by Laoer",
"Enabled": true,
"Match": {
"ClassId": 2,
"SpecId": 1,
"PartyType": "46"
},
"Units": [
{
"Name": "最低单位",
"HealthName": "最低血量",
"Kind": "LowestHealth",
"HealthThreshold": 100,
"Reverse": false
},
{
"Name": "无火最低",
"HealthName": "无火血量",
"Kind": "LowestHealthWithoutAura",
"HealthThreshold": 101,
"Reverse": false,
"AuraNames": [
"永恒之火"
]
},
{
"Name": "驱散-魔法",
"Kind": "UnitWithDispelType",
"Reverse": false,
"DispelType": 1
},
{
"Name": "驱散-疾病",
"Kind": "UnitWithDispelType",
"Reverse": false,
"DispelType": 3
},
{
"Name": "驱散-中毒",
"Kind": "UnitWithDispelType",
"Reverse": false,
"DispelType": 4
}
],
"Counts": [
{
"Name": "HP90",
"Kind": "UnitsBelowHealth",
"HealthThreshold": 90
},
{
"Name": "HP80",
"Kind": "UnitsBelowHealth",
"HealthThreshold": 80
},
{
"Name": "HP75",
"Kind": "UnitsBelowHealth",
"HealthThreshold": 75
},
{
"Name": "HP60",
"Kind": "UnitsBelowHealth",
"HealthThreshold": 60
}
],
"ValueAdjustments": [],
"Rules": [
{
"Enabled": true,
"Condition": "引导 > 0 || spells.延迟 > 0",
"Spell": "暂停",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 1 && spells.盲目之光 == 0",
"Unit": 0,
"Spell": "盲目之光",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 2 && spells.光环掌握 == 0",
"Unit": 0,
"Spell": "光环掌握",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 3 && spells.自由祝福 == 0",
"Unit": 0,
"Spell": "自由祝福",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 4 && spells.制裁之锤 == 0",
"Unit": 0,
"Spell": "制裁之锤",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 5 && spells.保护祝福 == 0",
"Unit": 0,
"Spell": "保护祝福",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 6 && spells.圣盾术 == 0",
"Unit": 0,
"Spell": "圣盾术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 7 && spells.圣洁鸣钟 == 0",
"Unit": 1,
"Spell": "圣洁鸣钟",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 16 && spells.灰烬觉醒 == 0",
"Unit": 0,
"Spell": "灰烬觉醒",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "法术失败 == 24 && spells.美德道标 == 0",
"Unit": 0,
"Spell": "美德道标",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.清洁术 == 0 && 驱散-魔法 && 首领战 != 64",
"UnitName": "驱散-魔法",
"Spell": "清毒术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.清洁术 == 0 && 驱散-疾病",
"UnitName": "驱散-疾病",
"Spell": "清毒术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.清洁术 == 0 && 驱散-中毒",
"UnitName": "驱散-中毒",
"Spell": "清毒术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.清洁术 == 0 && 目标类型 in (12, 13, 15)",
"Unit": 0,
"Spell": "清毒术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.大红冷却 == 0 && 生命值 < 30",
"Unit": 0,
"Spell": "银月城生命药水",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.圣疗术 == 0 && spells.大红冷却 > 1 && 生命值 < 25",
"Unit": 1,
"Spell": "圣疗术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.圣疗术 == 0 && spells.大红冷却 == 0 && 最低血量 < 20",
"UnitName": "最低单位",
"Spell": "圣疗术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.美德道标 == 0 && HP75 >= 3 && 爆发开关 == 1",
"Unit": 0,
"Spell": "美德道标",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "!施法 && 神性层数 > 0 && 最低血量 < 50",
"UnitName": "最低单位",
"Spell": "圣光术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "美德道标 > 0 && spells.圣洁鸣钟 == 0 && 神圣能量 <= 2 && HP80 >= 3",
"Unit": 1,
"Spell": "圣洁鸣钟",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "美德道标 == 0 && spells.圣洁鸣钟 == 0 && 神圣能量 <= 2 && HP75 >= 3",
"Unit": 1,
"Spell": "圣洁鸣钟",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "spells.圣洁鸣钟 == 0 && 神圣能量 < 2 && HP60 >= 2",
"Unit": 1,
"Spell": "圣洁鸣钟",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 >= 3 && 无火血量 <= 80 || 神圣意志 > 0 && 无火血量 <= 80",
"UnitName": "无火最低",
"Spell": "荣耀圣令",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 >= 3 && 最低血量 <= 75 || 神圣意志 > 0 && 最低血量 <= 75",
"UnitName": "最低单位",
"Spell": "荣耀圣令",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 >= 3 && HP90 >= 3 || 神圣意志 > 0 && HP90 >= 3",
"Unit": 0,
"Spell": "黎明之光",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 == 5 && 战斗 && 目标类型 in (1, 2, 3) && 目标距离 <= 5 && 圣光灌注 > 0 || 神圣能量 == 5 && 战斗 && 目标类型 in (1, 2, 3) && 目标距离 <= 5 && 神圣意志 > 0 || 神圣能量 == 5 && 战斗 && 目标类型 in (1, 2, 3) && 目标距离 <= 5 && spells.神圣震击 == 0 && spells.震击充能 == 0",
"Unit": 0,
"Spell": "正义盾击",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 <= 4 && 神圣意志 == 0 && !施法 && !移动 && 最低血量 < 50 && 能量值 >= 60 && 神圣能量 <= 1 || 神圣能量 <= 4 && 神圣意志 == 0 && !施法 && !移动 && 最低血量 < 50 && 能量值 >= 60 && 神圣能量 == 2 && spells.审判 >= 1",
"UnitName": "最低单位",
"Spell": "圣光术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 <= 4 && 神圣意志 == 0 && !施法 && 圣光灌注 > 0 && 最低血量 <= 90",
"UnitName": "最低单位",
"Spell": "圣光闪现",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 <= 4 && 神圣意志 == 0 && spells.神圣震击 == 0 && !施法 && 圣光灌注 == 0 && 最低血量 < 90",
"UnitName": "最低单位",
"Spell": "神圣震击",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 <= 4 && 神圣意志 == 0 && !施法 && !移动 && 最低血量 < 50 && 能量值 >= 60",
"UnitName": "最低单位",
"Spell": "圣光术",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 <= 4 && 神圣意志 == 0 && 战斗 && 目标类型 in (1, 2, 3) && 神圣能量 == 2 && spells.审判 == 0",
"Unit": 0,
"Spell": "审判",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "神圣能量 <= 4 && 神圣意志 == 0 && !施法 && !移动 && 最低血量 <= 90 && 圣光灌注 == 0",
"UnitName": "最低单位",
"Spell": "圣光闪现",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "战斗 && 目标类型 in (1, 2, 3) && 神圣能量 <= 4 && spells.审判 == 0",
"Unit": 0,
"Spell": "审判",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "战斗 && 目标类型 in (1, 2, 3) && 神圣能量 <= 4 && !施法 && spells.神圣震击 == 0 && 神圣能量 >= 2",
"Unit": 0,
"Spell": "神圣震击",
"Hotkey": "",
"Step": ""
},
{
"Enabled": true,
"Condition": "战斗 && 目标类型 in (1, 2, 3) && 神圣能量 <= 4 && !施法 && spells.神圣震击 == 0 && spells.震击充能 == 0",
"Unit": 0,
"Spell": "神圣震击",
"Hotkey": "",
"Step": ""
}
]
}

View File

@@ -179,9 +179,9 @@
},
{
"Enabled": true,
"Condition": "失败法术 != \"\"",
"Condition": "插入法术 != \"\"",
"Unit": 0,
"Spell": "失败法术",
"Spell": "插入法术",
"Hotkey": "",
"Step": ""
},

View File

@@ -179,9 +179,9 @@
},
{
"Enabled": true,
"Condition": "失败法术 != \"\"",
"Condition": "插入法术 != \"\"",
"Unit": 0,
"Spell": "失败法术",
"Spell": "插入法术",
"Hotkey": "",
"Step": ""
},

View File

@@ -172,9 +172,9 @@
},
{
"Enabled": true,
"Condition": "失败法术 != \"\"",
"Condition": "插入法术 != \"\"",
"Unit": 0,
"Spell": "失败法术",
"Spell": "插入法术",
"Hotkey": "",
"Step": ""
},

View File

@@ -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+37171a1e629aced94e5da08b5136287b9548fa8d")]
[assembly: System.Reflection.AssemblyInformationalVersionAttribute("1.0.0+5f9443308aa65e17ab805ea8ec3427b05ea01b12")]
[assembly: System.Reflection.AssemblyProductAttribute("Shigure")]
[assembly: System.Reflection.AssemblyTitleAttribute("Shigure")]
[assembly: System.Reflection.AssemblyVersionAttribute("1.0.0.0")]

View File

@@ -1 +1 @@
46eba4f04095c5a8a9a7075f971927eb9e0e238e46b9d51caa7d881ac1a6442d
3b2ec559cc14b595cf49bd559769e332340c6cd00239b053ee63f2378347ae1a

View File

@@ -1 +1 @@
629dce2e97f32c56007fd5dbd3972018ba06cc9b8fd35d780c6d48a049179fdd
59db15cbceefcfe509d182457958e207cdd83202dc6795fe99227c99cad2576c

View File

@@ -46,19 +46,11 @@ C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\keymap\rogue.j
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\keymap\shaman.json
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\keymap\warlock.json
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\keymap\warrior.json
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.deps.json
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.runtimeconfig.json
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.pdb
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.GeneratedMSBuildEditorConfig.editorconfig
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.AssemblyInfoInputs.cache
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.AssemblyInfo.cs
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.csproj.CoreCompileInputs.cache
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\refint\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.pdb
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.genruntimeconfig.cache
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\ref\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.MainForm.resources
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.csproj.GenerateResource.cache
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.sourcelink.json
@@ -88,7 +80,6 @@ C:\Users\bianw\OneDrive\VS Code\Shigure\artifacts\verify-build\Shigure.deps.json
C:\Users\bianw\OneDrive\VS Code\Shigure\artifacts\verify-build\Shigure.runtimeconfig.json
C:\Users\bianw\OneDrive\VS Code\Shigure\artifacts\verify-build\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\artifacts\verify-build\Shigure.pdb
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.exe
C:\Users\bianw\OneDrive\VS Code\Shigure\artifacts\verify-about\Assets\shigure-emblem-arasaka.ico
C:\Users\bianw\OneDrive\VS Code\Shigure\artifacts\verify-about\Assets\shigure-emblem-arasaka.png
C:\Users\bianw\OneDrive\VS Code\Shigure\artifacts\verify-about\Assets\shigure-logo.svg
@@ -143,14 +134,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
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.exe
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.deps.json
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.runtimeconfig.json
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\Shigure.pdb
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\refint\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\Shigure.pdb
C:\Users\bianw\OneDrive\VS Code\Shigure\obj\Debug\net10.0-windows\ref\Shigure.dll
C:\Users\bianw\OneDrive\VS Code\Shigure\bin\Debug\net10.0-windows\module\奶骑大秘境-by-Laoer.json

View File

@@ -1 +1 @@
{"documents":{"C:\\Users\\bianw\\OneDrive\\VS Code\\Shigure\\*":"https://raw.githubusercontent.com/waynebian01/Shigure/37171a1e629aced94e5da08b5136287b9548fa8d/*"}}
{"documents":{"C:\\Users\\bianw\\OneDrive\\VS Code\\Shigure\\*":"https://raw.githubusercontent.com/waynebian01/Shigure/5f9443308aa65e17ab805ea8ec3427b05ea01b12/*"}}