合并宏键池 keys 与 extraKeys 为单一表

Lua 与 C# 都改回修饰符×主键一层循环,50 个主键仍为 350 槽。减号、导航键和方向键接在原主键末尾。

Co-authored-by: Wayne-Arasaka <waynebian01@users.noreply.github.com>
This commit is contained in:
Cursor Agent
2026-09-02 05:15:45 +00:00
parent ee8d3d854b
commit 56f3b291fc
7 changed files with 15 additions and 40 deletions

View File

@@ -98,7 +98,7 @@ wow_process.txt 目标游戏进程名列表;构建时复制,运行期间每
- **DynamicSpells**:每项占 30 热键槽位
- **StaticSpells / SpecialSpells**:顺序数组条目(`ArrayEntry`text + 可选行尾注释);空字符串保留槽位
保存后 [Infrastructure/FuyutsuiKeymapConverter.cs](Infrastructure/FuyutsuiKeymapConverter.cs)`.UpdateFromClassMacros` 将 Lua 宏表按 dynamic每项 30 槽)→ static → special 顺序转换为 `keymap/*.json`,把宏槽位映射到热键池(7 修饰符 × 39 键 = 273再追加 7 × 11 个导航/减号/方向键 = 350 组合/职业;不含 F4`DeriveSpellName` 解析 WoW 宏文本提取技能名。
保存后 [Infrastructure/FuyutsuiKeymapConverter.cs](Infrastructure/FuyutsuiKeymapConverter.cs)`.UpdateFromClassMacros` 将 Lua 宏表按 dynamic每项 30 槽)→ static → special 顺序转换为 `keymap/*.json`把宏槽位映射到热键池7 修饰符 × 50 键 = 350 组合/职业;不含 F4`DeriveSpellName` 解析 WoW 宏文本提取技能名。
### UI 编辑器

View File

@@ -15,12 +15,7 @@ local keys = {
"NUMPADDECIMAL", "NUMPADPLUS", "NUMPADMINUS", "NUMPADMULTIPLY", "NUMPADDIVIDE",
"F1", "F2", "F3", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
",", ".", "/", ";", "'", "[", "]", "\\",
"7", "8", "9", "0", "="
}
-- 接在原 273 槽之后,避免把新主键插入 keys 导致后续修饰组错位。
-- 不含 F4ALT-F4 关客户端、反引号、NUMPADENTER。
local extraKeys = {
"7", "8", "9", "0", "=",
"-", "INSERT", "DELETE", "HOME", "END", "PAGEUP", "PAGEDOWN",
"UP", "DOWN", "LEFT", "RIGHT"
}
@@ -33,12 +28,6 @@ do
i = i + 1
end
end
for _, m in ipairs(modifiers) do
for _, k in ipairs(extraKeys) do
macroKind[i] = m .. "-" .. k
i = i + 1
end
end
end

View File

@@ -32,19 +32,14 @@ internal static partial class FuyutsuiKeymapConverter
"NUMPADDECIMAL", "NUMPADPLUS", "NUMPADMINUS", "NUMPADMULTIPLY", "NUMPADDIVIDE",
"F1", "F2", "F3", "F5", "F6", "F7", "F8", "F9", "F10", "F11", "F12",
",", ".", "/", ";", "'", "[", "]", "\\",
"7", "8", "9", "0", "="
];
// 接在原 273 槽之后;不含 F4、反引号、NUMPADENTER。
private static readonly string[] ExtraKeys =
[
"7", "8", "9", "0", "=",
"-", "INSERT", "DELETE", "HOME", "END", "PAGEUP", "PAGEDOWN",
"UP", "DOWN", "LEFT", "RIGHT"
];
private static readonly string[] MacroKind = BuildMacroKind();
internal static int MacroSlotCapacity => Modifiers.Length * (Keys.Length + ExtraKeys.Length);
internal static int MacroSlotCapacity => Modifiers.Length * Keys.Length;
private static readonly Dictionary<string, int> ClassFileToId = new(StringComparer.OrdinalIgnoreCase)
{
@@ -654,14 +649,6 @@ internal static partial class FuyutsuiKeymapConverter
}
}
foreach (var modifier in Modifiers)
{
foreach (var key in ExtraKeys)
{
list[i++] = $"{modifier}-{key}";
}
}
return list;
}

View File

@@ -43,7 +43,7 @@ verified_at: 2026-08-09
## AI 快速摘要
> `ReadKeybindings()` 延迟 0.5 秒扫描动作槽 1..180,把可识别的 macro/spell 记录为 `Fuyutsui.keybindings[spellID] = {key, slot, keycode, icon, name}`。这是游戏内诊断缓存Shigure 的实际发送映射来自 `ClassMacros` 转换出的 keymap而不是读取该 Lua 表。插件自己的安全宏按钮先按 7 种修饰键×39 个基础键生成 273 槽,再追加 7×11 个导航/减号/方向键,共 350 个顺序槽。
> `ReadKeybindings()` 延迟 0.5 秒扫描动作槽 1..180,把可识别的 macro/spell 记录为 `Fuyutsui.keybindings[spellID] = {key, slot, keycode, icon, name}`。这是游戏内诊断缓存Shigure 的实际发送映射来自 `ClassMacros` 转换出的 keymap而不是读取该 Lua 表。插件自己的安全宏按钮使用 7 种修饰键×50 个基础键,共 350 个顺序槽。
## 范围与非范围
@@ -93,12 +93,11 @@ OnEnable / UPDATE_BINDINGS / SPELLS_CHANGED / ACTIONBAR_*GRID
## 安全宏键池
`core/macro.lua` 分两段生成固定键池:
`core/macro.lua` 生成固定键池:
- 修饰键顺序:`CTRL``ALT``SHIFT``ALT-CTRL``ALT-SHIFT``CTRL-SHIFT``ALT-CTRL-SHIFT`
- 第一段基础键 39 个,包括小键盘、F 键(无 F4、标点部分数字键,形成槽 1273
- 第二段在末尾追加 `-``INSERT``DELETE``HOME``END``PAGEUP``PAGEDOWN``UP``DOWN``LEFT``RIGHT`,再乘 7 种修饰符,形成槽 274350。不加反引号、`NUMPADENTER`
- 总容量 `273 + 7 × 11 = 350`
- 基础键 50 个:小键盘、F 键(无 F4、标点部分数字,以及末尾的 `-``INSERT``DELETE``HOME``END``PAGEUP``PAGEDOWN``UP``DOWN``LEFT``RIGHT`。不加反引号、`NUMPADENTER`
- 总容量 `7 × 50 = 350`
-`i` 槽创建名为 `s{i}``SecureActionButtonTemplate`,通过 `SetOverrideBindingClick()` 绑定对应按键。
宏体解析顺序:先查 `Fuyutsui.MacroBodies` 的命名宏体;字符串以 `/` 开头则原样使用;否则包装为 `/cast <字符串>`
@@ -134,7 +133,7 @@ OnEnable / UPDATE_BINDINGS / SPELLS_CHANGED / ACTIONBAR_*GRID
## 修改影响
- 修改 `modifiers``keys``extraKeys` 或三段展开顺序时,必须同步 [[40-跨项目/03-Shigure-ClassMacros到keymap与按键契约]] 与 Shigure 转换器。
- 修改 `modifiers``keys` 或三段展开顺序时,必须同步 [[40-跨项目/03-Shigure-ClassMacros到keymap与按键契约]] 与 Shigure 转换器。
- 修改 `ClassMacros` 后使用 Shigure 的配置/宏同步流程,见 [[30-Shigure/09-Shigure-Fuyutsui配置宏编辑与同步]]。
- 修复动作条宏识别时应按 WoW 当前 API 先解析宏信息/宏体或宏所示技能,再调用 Spell API。
- 若要让游戏内缓存成为外部契约,需新增明确序列化与版本字段;当前没有这条链路。

View File

@@ -117,7 +117,7 @@ verified_at: 2026-08-10
## ClassMacros → keymap
- 固定键池先按 7 个修饰组合 × 39 个主键生成 **273**主键序列刻意不含 F4再在末尾追加 7 × 11 项(`-`、导航六键四个方向键),共 **350** 项。不含反引号和 `NUMPADENTER`。Lua `macroKind` 与 C# `FuyutsuiKeymapConverter` 必须逐项相同。
- 固定键池 7 个修饰组合 × 50 个主键 = **350**主键含原小键盘/F 键/标点/数字,末尾追加 `-`、导航六键四个方向键;刻意不含 F4、反引号和 `NUMPADENTER`。Lua `macroKind` 与 C# `FuyutsuiKeymapConverter` 必须逐项相同。
- 动态宏项每项预留/消耗 30 个单位位置,然后是静态宏和特殊宏;超过容量会警告并截断。
- 旧 flat 格式或 common+spec 格式都可转换专精输出是“common + 当前 spec + static + special”的完整映射以适配运行时不合并顶层的语义。
- party1..4 映射组员槽 2..5;原始 `@player` 动态语义映射组员槽 1显式中文/player 保留单位 31raid1..30 映射 1..30。
@@ -167,7 +167,7 @@ verified_at: 2026-08-10
- `Infrastructure/ClassBlocksStore.cs:102-207`modern 判定、替换保存与 legacy 行为。
- `Infrastructure/ClassMacrosStore.cs:63-354`:宏表加载、直接写回和 canonical 序列化。
- `Infrastructure/FuyutsuiConfigConverter.cs:44-483`13 职业、步骤顺序、组员与字段规范化。
- `Infrastructure/FuyutsuiKeymapConverter.cs`350 键池(前 273 不变)、单位映射、宏/注释解析。
- `Infrastructure/FuyutsuiKeymapConverter.cs`350 键池、单位映射、宏/注释解析。
- `UI/MainForm.cs:624-867`:启动部署、串行更新尾、转换、全量/单文件部署、刷新和告警。
- `UI/MainForm.cs:781-958`:运行前等待队列并重启会话。

View File

@@ -56,7 +56,7 @@ dynamicSpells每项展开 30 个团队槽)
→ specialSpells
```
`dynamicSpells` 支持 `common + [specIndex]`Fuyutsui 运行时和 Shigure 转换器必须按相同专精解析。宏键池容量由 Fuyutsui 预设组合决定:7 组修饰符 × 39主键273再追加 7 × 11 个主键(减号、导航六键、四个方向键)共 350 个组合。不含 F4、反引号、NUMPADENTER。新增内容必须先做容量预算,且只能往键池末尾追加,不能插入原 39 键中间
`dynamicSpells` 支持 `common + [specIndex]`Fuyutsui 运行时和 Shigure 转换器必须按相同专精解析。宏键池容量由 Fuyutsui 预设组合决定7 组修饰符 × 50 个主键共 350 个组合(原 39 键末尾追加减号、导航六键、四个方向键)。不含 F4、反引号、NUMPADENTER。新增主键只能往 `keys` 末尾追加,插入中间会平移后续槽位
## 范围

View File

@@ -102,11 +102,11 @@ macro.lua:CreateMacro(dynamic, static, special)
| 修饰键顺序 | 基础键 |
|---|---|
| `CTRL``ALT``SHIFT``ALT-CTRL``ALT-SHIFT``CTRL-SHIFT``ALT-CTRL-SHIFT` | **第一段 39 键(槽 1273**小键盘 09 / 小数点 / + / / × / ÷;`F1F3,F5F12`**无 F4**`, . / ; ' [ ] \``7 8 9 0 =`。**第二段 11 键(槽 274350**`-``INSERT` `DELETE` `HOME` `END` `PAGEUP` `PAGEDOWN``UP` `DOWN` `LEFT` `RIGHT`。不加反引号、`NUMPADENTER`。 |
| `CTRL``ALT``SHIFT``ALT-CTRL``ALT-SHIFT``CTRL-SHIFT``ALT-CTRL-SHIFT` | 小键盘 09 / 小数点 / + / / × / ÷;`F1F3,F5F12`**无 F4**`, . / ; ' [ ] \``7 8 9 0 =`;末尾 `-``INSERT` `DELETE` `HOME` `END` `PAGEUP` `PAGEDOWN``UP` `DOWN` `LEFT` `RIGHT`。不加反引号、`NUMPADENTER`。 |
- 总槽位数 = `273 + 7 × 11 = 350`
- 总槽位数 = `7 × 50 = 350`
- 按钮名:`s1``s2`、…(与 `macroKind` 下标一致)。
- 当前键池定义直接见 `Fuyutsui/core/macro.lua`ID 1 = `CTRL-NUMPAD1`,以此类推;新键从槽 274 的 `CTRL--`)。
- 当前键池定义直接见 `Fuyutsui/core/macro.lua`ID 1 = `CTRL-NUMPAD1`,以此类推)。
**AI 改宏时**:关心的是解析后的 `dynamic` 占用多少槽、以及 static/special 数组下标对应的全局热键;不必手算,除非要核对外部程序按键映射。