Shigure
Shigure 是荒坂公司(Arasaka Corporation)开发的冲锋枪。有时人们只想把子弹全打出去,在硝烟过后品味眼前的一片狼藉。
仓库已内置冬月电子(Fuyutsuki Electronics)的 Fuyutsui 插件源码,无需另行下载或手动安装。
免责声明 (Disclaimer)
-
合规责任
Shigure 仅供技术研究、学习交流和个人实验使用。下载、安装、复制、修改、分发或使用本软件前,用户应自行确认相关行为符合所在地法律法规,以及目标软件、游戏平台或服务提供商的用户协议、服务条款和社区规则。
-
账号与处罚风险
本软件可能涉及窗口状态读取、按键发送或自动化辅助流程。此类行为可能被游戏运营商、反作弊系统或相关服务提供商认定为违规,并导致账号限制、角色封禁、数据丢失、收益回收或其他处罚。用户应充分了解并自行承担全部风险,开发者不对由此产生的任何后果负责。
-
无担保声明
本项目基于 MIT License 开源发布,详见 LICENSE。软件按“原样”(AS IS)提供,不对稳定性、准确性、完整性、安全性、兼容性、持续可用性或特定用途适用性作出任何明示或暗示保证。因使用或无法使用本软件导致的直接、间接、偶然、特殊或后续损失,均由用户自行承担。
-
商业使用与衍生版本
MIT License 允许在遵守许可证条件的前提下复制、修改、分发和商业使用本软件。任何第三方对本软件或其衍生版本的运营、销售、推广、技术支持或其他商业利用,均由该第三方独立负责。开发者不代表、不授权或保证任何第三方产品、服务或运营活动,也不对第三方的违法行为、违反平台规则的行为或由此产生的后果负责。
但本声明不限制适用法律所规定的责任,也不构成对任何具体行为合法性的保证。 -
使用即表示接受
使用者应在使用前阅读并理解本免责声明及 MIT License。开始使用本软件,表示使用者已获得必要授权,并将自行承担使用本软件产生的风险;但仅通过使用行为是否构成法律上的合同接受,应以适用法律及实际使用场景为准。
项目简介
Shigure 是一个 Windows WinForms 桌面程序。它从目标窗口读取 Fuyutsui 绘制的像素状态,按职业 keymap 和模块规则选择按键,并在界面中展示状态、光环、技能、队伍、动态单位、逻辑结果和运行日志。
当前版本:1.2.1
主要功能
- 扫描 510 格顶部状态行、左侧计数条和队伍治疗吸收数据。
- 按职业、专精、队伍类型和英雄天赋自动匹配模块,也可手动锁定符合条件的模块。
- 使用可视化编辑器维护规则、主/子条件、动态单位、数量字段、条件动态数值和公式动态数值。
- 以内置
Fuyutsui/为权威源编辑职业配置与宏,并按 SHA-256 将插件部署到已运行游戏的Interface\AddOns\Fuyutsui。 - 支持
switch、click、hold三种触发模式,以及除ALT外的键盘按键、XBUTTON1、XBUTTON2。
界面
- 置顶浮动条:显示程序名、当前职业图标颜色和逻辑状态,提供
开启/关闭、设置、✕按钮。窗口可拖动和缩放,显示后自动启动运行循环。 通用:设置触发键和发送模式;从项目 Fuyutsui 更新配置并同步游戏插件;按实时环境筛选、自动选择或手动指定模块。配置:直接编辑项目Fuyutsui/class/*.lua中的ClassBlocks,包括状态、光环、法术和队伍字段;技能列表页可编辑Fuyutsui.spellsList中索引 1–100 的法术 ID、索引和名称,也可输入 spellId 与名称并自动分配空闲索引。旧版稀疏索引格式只读,需先迁移到states/auras/spells/group格式。宏:编辑项目Fuyutsui/core/classmacros.lua中各职业的动态宏、静态宏和特殊宏。动态宏每项占用 30 个团队点名槽位。模块:新建、编辑、删除本地模块,维护作者、推荐天赋、匹配条件、动态字段和有序规则。规则支持拖拽、上移、下移、复制与插入。状态:分栏显示基础状态、auras、spells和模块计算出的动态单位/数值。队伍:显示group中当前队伍成员及扫描字段摘要。逻辑:显示命中模块、目标、按键和调试值。日志:记录启动、停止、职业识别、模块匹配、逻辑状态、施放步骤、配置同步和异常。关于:显示产品、公司、版本、模块目录和配置目录。
触发键、发送模式、模块选择、模块保存以及配置同步都会按需重启运行循环。窗口位置、大小、模块选择和表格列宽等 UI 状态保存在 cache/window-state.json。module/ 与 cache/ 都是本地数据,默认不提交到 Git。
环境要求
- Windows
- .NET 10 SDK
- 使用运行和插件部署功能时需要打开目标游戏窗口;Fuyutsui 无需手动安装,Shigure 会在启动或“更新配置”时部署项目内版本
运行
在仓库根目录执行:
dotnet run --project .\Shigure.csproj
可选启动参数:
dotnet run --project .\Shigure.csproj -- --toggle XBUTTON2 --mode switch --logic-ms 100 --render-ms 100
wow_process.txt:每行一个目标进程名(可带或不带.exe)。程序使用 Windows Z 顺序中最靠前的候选进程可见顶层窗口,切换窗口后会自动跟随。--toggle:触发键,默认XBUTTON2。--mode:发送模式,支持switch、click、hold。--logic-ms:逻辑循环间隔,默认100ms,最小50ms。--render-ms:UI 刷新间隔,默认100ms,最小100ms。
发送模式:
switch:按一次开启,再按一次关闭。click:每次按下只执行一轮逻辑。hold:按住时运行,松开后停止。
程序会直接从当前 EXE 所在目录运行,并从该目录读取 Fuyutsui/、config/、keymap/、module/ 和 wow_process.txt。
构建
dotnet build .\Shigure.csproj
应用图标为 Assets\arasaka-icon.ico。项目会把 Fuyutsui/**、config/*.json、keymap/*.json、本地 module/**/*.json 和 wow_process.txt 复制到输出/发布目录;图标、职业图和专精图作为嵌入资源打包。
项目结构
Shigure.csproj 项目文件与构建资源配置
App\ 程序入口、启动参数和依赖组装
UI\ WinForms 主界面、配置/宏/模块编辑器和主题
Runtime\ 像素扫描、状态构建、运行循环和快照
Modules\ 模块模型、匹配、条件、公式和动态字段
Input\ keymap 读取、按键发送和 Win32 API
Infrastructure\ 配置服务、Lua 读写、Fuyutsui 转换和路径定位
Assets\ 应用图标、品牌资源、职业图和专精图
Fuyutsui\ 权威插件源码、配置/宏编辑源及游戏部署源
config\ 由 Fuyutsui 职业配置生成的扫描映射
keymap\ 由 Fuyutsui 职业宏生成的按键映射
module\ 本地模块(运行后或在 UI 中保存时创建)
Tools\ 辅助脚本
Fuyutsui 配置同步
项目目录中的 Fuyutsui/ 是唯一权威源。通用 页的“更新配置”会读取:
Fuyutsui\class\*.lua→config/*.jsonFuyutsui\core\classmacros.lua→keymap/*.json
转换完成后会刷新模块编辑器的字段/keymap 目录并重启运行循环,同时递归同步整个插件到当前游戏的 Interface\AddOns\Fuyutsui。启动 Shigure 时也会执行同一全量同步:缺失文件会创建,SHA-256 不同的文件会覆盖,相同文件会跳过,游戏目录中的额外文件会保留。
配置 页和 宏 页保存时先写入项目内 Lua、重新生成 config/keymap,再只把当前修改的 Lua 文件部署到游戏目录。找不到游戏或目标文件不可写时,本地保存不会回滚;界面和日志会提示游戏同步未完成,可在游戏启动后再次点击“更新配置”。
config 结构
config 描述如何把像素数据翻译成运行时状态。字段对象包含:
step:顶部状态行的列索引,支持1~510;特殊值"bar"表示读取左侧计数条,并由bar指定段索引。type:字段类型,支持int、bool、string。
顶部状态行由 Fuyutsui 绘制为 510 个色块。Shigure 按两段颜色协议解码:1~255 使用 (0, i / 255, b, 1),256~510 使用 (1 / 255, (i - 255) / 255, b, 1),蓝色通道 b 是该 step 的原始值。左侧 "bar" 标记行使用独立计数条协议。
common.json 保存固定启动字段 锚点、职业、专精。其余文件按英文职业名命名,例如 Warrior.json、Priest.json,每个文件包含:
keymap:该职业使用的 keymap 文件名。一键法术:状态编号到技能名的映射。- 以专精 ID 为键的对象,包含普通状态字段,以及可选的
auras、spells、group。
运行时先读取 common.json 确定职业和专精,再合并对应专精配置。group.start 是队伍数据起始列,group.num 是每名成员占用的列数;组内字段的 step 是相对偏移。
keymap 与单位编号
每条 keymap 记录包含 unit、技能、热键 和可选的 宏条件。模块和 keymap 共用以下单位编号:
0:无目标。1~30:队伍/团队槽位。31:玩家。32:当前目标。33:焦点。34:地面。35:鼠标指向。
当前映射版本为 UnitMappingVersion = 3。版本 1 模块会迁移旧的 31/34 含义;版本 2 模块中的 36/37 会迁移为 unit 0,并分别补成 channeling / nochanneling 宏条件。
模块系统
模块以 模块名.json 保存在 module/。名称不能重复;加载时会递归扫描子目录,以兼容旧版布局。模块页保存时会写入当前 Shigure 版本。职业和专精均已指定时,模块还会携带该专精的 ClassBlocks、职业 spellsList,以及该职业的通用/专精动态宏、静态宏和特殊宏;旧模块没有这些依赖信息时仍可正常使用。
启动和“刷新模块”会把模块携带而本地缺少的配置与宏追加到项目 Fuyutsui/,不会覆盖或删除本地已有条目。发生新增后会自动重建 config/keymap、同步游戏插件并按需重启运行。导入前会按每项动态宏 30 个槽位、静态/特殊宏各 1 个槽位检查该职业所有受影响专精;合并结果超过 273 个槽位时,整个模块不会进入模块列表或运行时,本地 Lua 也不会被修改。模块文件仍保留在 module/,清理宏后可刷新重试。
模块匹配字段:
ClassId:职业 ID。SpecId:专精 ID。PartyType:0为单人、1-40为团队、46为队伍。HeroTalent:英雄天赋 ID。
任一字段留空(界面显示 任意 (*))即为通配。多个模块同时匹配时,优先选择具体匹配字段更多的模块,相同则按名称排序。RecommendedTalent 仅用于说明,不参与匹配。
模块文件示例:
{
"Id": "戒律-20260730120000000",
"Name": "戒律",
"Author": "模块作者",
"RecommendedTalent": "推荐天赋代码或说明",
"Version": "1.2.1",
"UnitMappingVersion": 3,
"Enabled": true,
"Match": {
"ClassId": 5,
"SpecId": 1,
"PartyType": "46",
"HeroTalent": 1
},
"Units": [],
"Counts": [],
"ValueAdjustments": [],
"Rules": [
{
"Enabled": true,
"Condition": "生命值 < 50 && spells.真言术:盾 == 0",
"Unit": 31,
"Spell": "真言术:盾",
"Hotkey": "",
"Step": "自保"
}
]
}
规则按顺序判断,第一条命中的规则会执行。Spell 通过当前职业 keymap 和目标单位查找热键;填写 Hotkey 时会直接发送该键。技能下拉还包含以下特殊动作:
暂停:命中后不发送按键,并停止继续匹配本轮后续规则。自动插入法术:读取状态字段插入法术,按职业配置映射到当前可用技能。一键法术:读取状态字段一键辅助,按职业配置映射到技能。
条件
支持的常见表达式:
- 状态:
生命值 < 50、战斗时间 > 0。 - 光环:
auras.圣光涌动 > 0。 - 技能:
spells.圣疗术 == 0。 - 队伍:
group.1.生命值 < 60。 - 列表:
目标类型 in (1, 2)、职业 not in (4, 9)。 - 组合:
生命值 < 50 && spells.圣疗术 == 0、目标类型 == 1 || 首领战 > 0。 - 布尔简写:
移动表示为真,!移动表示为假。 - 空条件:始终命中。
字符串可以使用单引号或双引号。true/yes/是、false/no/否、null/nil/空 会转换为对应字面量。&& 的优先级高于 ||,主表达式不支持括号嵌套。
规则还可添加多个“子条件”:主条件与子条件组是“且”关系,子条件之间是“或”关系,即 主条件 && (子条件 1 || 子条件 2)。这用于表达主编辑器无法用括号表示的逻辑。
可视化条件编辑器会按当前职业/专精提供状态、光环、技能和动态单位字段,并支持:
- 数字比较
==、!=、>、>=、<、<=。 - 文本/数字列表比较
in、not in。 延迟 (ms):限制同一规则两次实际发送的最小间隔。逻辑延迟 (ms):发送后暂停逻辑扫描指定时间;触发键检测和界面刷新仍继续。
缺失或非数字字段参与大小比较时视为不命中,不会中断运行。
动态单位、数量与动态数值
这些字段按 group 状态每帧重新计算。队伍统计会跳过 职责 == 0 或 生命值 == 0 的单位。
- 动态单位:可按最低生命值、最高治疗吸收、职责、光环、光环值或驱散类型选择
1~30的队伍槽位。可在规则目标中直接使用,也可用裸名称判断是否成功解析。 - 数量字段:统计低于生命值阈值、高于治疗吸收阈值或带/不带指定光环的单位数,只能用于条件。
- 条件动态数值:条件成立时对已有状态、光环、技能或动态字段加减一个整数。
- 公式动态数值:使用字段和算术表达式生成命名数值,支持
+ - * /、括号、一元正负号和int、round、floor、ceil、min、max。
动态单位和数量阈值既可使用固定值,也可引用其它动态数值。规则引用未解析出的动态目标时会跳过该规则,继续判断下一条。
模块 JSON 使用 Units、Counts、ValueAdjustments 保存这些定义;规则使用 UnitName 引用动态单位。名称不能是纯数字,不能包含 . 或 $,也不能与已有状态字段或其它动态名称冲突。
默认逻辑与 C# 扩展
如果没有匹配模块,LogicRegistry 会尝试使用按职业注册的 IClassLogic。当前没有注册项时会进入 DefaultClassLogic:仅当 一键辅助 == 10 且 keymap 中存在 一键辅助 时发送按键,否则显示“C# 职业逻辑尚未迁移”。
通常应优先在 模块 页维护逻辑。确实需要复杂算法时,可实现 IClassLogic 并在 LogicRegistry 中按职业 ID 注册:
public sealed class PriestLogic : IClassLogic
{
public LogicDecision Run(GameState state, string? specName)
{
var health = state.GetInt("生命值");
return new LogicDecision(
Hotkey: null,
Step: $"当前生命值: {health}",
UnitInfo: new Dictionary<string, object?>());
}
}
职业逻辑可通过 GameState.GetInt(...)、GameState.GetBool(...)、state.Auras、state.Spells、state.Group 读取数据,并返回 LogicDecision。也可以创建匹配字段全部留空的通配模块,覆盖默认逻辑。