From f1df0d359d38e9ee1655952eac3ca9fb60f31ba2 Mon Sep 17 00:00:00 2001 From: sganggs Date: Wed, 7 Oct 2026 01:56:25 +0800 Subject: [PATCH] =?UTF-8?q?feedback5=20WAC:=20docs=20for=20the=20rebindabl?= =?UTF-8?q?e=20shortcuts=20=E2=80=94=20PLAYING=20=C2=A711=20(the=20shortcu?= =?UTF-8?q?t=20list=20and=20how=20to=20change=20it),=20README=20=E6=93=8D?= =?UTF-8?q?=E4=BD=9C=20(Q=20/=20X=20added,=20the=20settings=20named),=20DE?= =?UTF-8?q?SIGN=20=C2=A710=20(design/client.md),=20=C2=A725.15,=20I18N's?= =?UTF-8?q?=20stale=20hotkey-line=20example?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Golden unchanged (docs only). --- README.md | 2 +- docs/I18N.md | 4 ++-- docs/PLAYING.md | 20 +++++++++++++++++++- docs/design/client.md | 2 +- docs/history/0.2.0.md | 30 ++++++++++++++++++++++++++++++ 5 files changed, 53 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index e6c169d2..5a6e2df4 100644 --- a/README.md +++ b/README.md @@ -162,7 +162,7 @@ npm start # 启动服务器:http://localhost:3000 | 出售 / 撤退 / 销毁装备 | 点击单位所在的格子 → 底部按钮「出售 +1」「撤退」;也可以把棋盘上的干员拖回整备区撤退。整备区里的装备与法术只能「销毁」,已配发的装备锁定在干员身上(干员出售或合成精锐时退回整备区) | | 装备 | 把装备拖到干员所在的格子上(每人 2 件;满了会弹出替换窗口,被替换的一件会被销毁);法术拖到地块上并选方向 | | 查看详情 | 右键或长按单位 / 卡牌(属性为实时数值,高于基础值为绿色、低于为红色) | -| 快捷键 | `R` 刷新 · `F` 冻结 · `D` 升级 · `Space` 准备就绪 · `Esc` 取消 / 关闭 | +| 快捷键 | `R` 刷新 · `F` 冻结 · `D` 升级 · `Q` 撤退 / `X` 出售选中的干员 · `Space` 准备就绪 · `Esc` 取消 / 关闭;除 `Esc` 外都可以在「设置 → 快捷键」里改成别的键([玩法指南 §11](docs/PLAYING.md#11-快捷键)) | | 方向轮盘键盘操作 | 方向键预览 · `Enter` 确认 · `Esc` 取消 | | 暂停(独立模拟) | 作战中(含最终攻势 / 隐秘核心)点顶栏的「暂停」或按 `Space`,再点「继续作战」(或 `Space`)继续;同盟模拟的作战不能暂停 | | 表情 | 左下角「交流」,左右滑动(或方向键)换主题,冷却 1 秒 | diff --git a/docs/I18N.md b/docs/I18N.md index 7b3dcfbf..2da6ecd0 100644 --- a/docs/I18N.md +++ b/docs/I18N.md @@ -76,8 +76,8 @@ the official EN terms of the game (the EN client's own wording, e.g. its tips an `x.length` → `n`, else its position), nested strings in params included; adds the import. Module-level literals get `N_()` and are listed for a manual `t()` where they are shown; compared literals, object keys, string-method arguments, `console.*` and `Error` messages are left alone; a text run with a child that is not a plain value is split - into its static pieces. **Review the diff**: join fragments into whole sentences where it reads better (the settings - hotkey line is an example), check module-level tables. + into its static pieces. **Review the diff**: join fragments into whole sentences where it reads better (the settings' + one-line hotkey hint, before the 快捷键 section replaced it, was an example), check module-level tables. - `seed --from [--all] [--write]` — fills `en.json` from a flat `{ msgid: English }` map for the msgids the code uses (`--all`: also the literals not wrapped yet, under the msgid the codemod will give them). diff --git a/docs/PLAYING.md b/docs/PLAYING.md index 19b12245..65fec808 100644 --- a/docs/PLAYING.md +++ b/docs/PLAYING.md @@ -2,7 +2,7 @@ 「卫戍协议:盟约」是自走棋 + 塔防:休整期在调度中心招募干员、摆阵、配装备,作战期干员自动部署并迎击从红门涌来的敌人,漏过去的敌人扣目标生命值(LP)。同盟模拟中 1–4 人**合作**(没有 PvP),撑到第 14 回合打倒敌方领袖即胜利。 -本文数值来自官方数据表(`data/config.json` 等)与 [research](research/00-INDEX.md);游戏内左下角 📖「玩法说明」有官方教程图(随素材一起下载;没下载到时显示文字要点)。操作方式见 [README · 操作](../README.md#操作)。 +本文数值来自官方数据表(`data/config.json` 等)与 [research](research/00-INDEX.md);游戏内左下角 📖「玩法说明」有官方教程图(随素材一起下载;没下载到时显示文字要点)。操作方式见 [README · 操作](../README.md#操作),键盘快捷键和修改方法见 [§11](#11-快捷键)。 界面语言:默认中文;标题画面右上角或「设置」里可切换 **中文 / English**(会记住选择,不用刷新)。英文的干员、技能、盟约、装备、敌人等游戏文本取自官方英文服数据,界面文字全部有英文;切到英文后仍显示中文的只有玩家名字(人机的名字也是)、多轮悬赏改写过的「接下来两场作战」说明,以及官方英文服还没有的游戏文本(部分自选干员和较新的模组);「玩法说明」的教程图是官方的中文图片,标题有英文(docs/I18N.md)。 @@ -148,3 +148,21 @@ - 层数到 999 就满了,多余的叠层没有用,可以把资源转去别的盟约。 - 领袖战注意**限伤**:单次 30 万以上的伤害会被整次作废。盟约叠到 999 层后,再叠加额外的伤害倍率(例如 999 层谢拉格再点亮奥术)反而可能让大招打出 0 伤害;队友的奥术等减益也会放大你的伤害。 - **橙色围栏围起的地块**(官方「围墙」)可以部署干员,敌人走不进去:站在里面的干员照常攻击自己攻击范围内的敌人(摆放时选好朝向,让攻击范围对着敌人走的路),但**挡不住地面敌人**(被推、拉到围栏边的敌人也不会被它阻挡),也很少挨打——多数重装干员的手动技能要受到伤害才释放,在里面可能一直不放(深巡的二技能是例外,攻击范围内有敌人就会释放);只打自己脚下一格的干员(如角峰)在里面打不到任何敌人。 + +## 11. 快捷键 + +有键盘时可以用快捷键(下表是默认按键)。在输入框里打字时快捷键不起作用,弹窗或「玩法说明」打开时也不起作用;「本局信息 / 敌方情报」打开时只有 `Esc`(关闭它)有效。 + +| 默认按键 | 作用 | +|---|---| +| `R` | 刷新商店 | +| `F` | 冻结 / 解冻商店 | +| `D` | 升级调度中心 | +| `Q` | 撤退选中的棋盘干员(回到整备区) | +| `X` | 出售选中的干员 | +| `Space` | 准备就绪 / 取消准备;独立模拟的作战中暂停 / 继续 | +| `Esc` | 取消 / 关闭:依次关闭表情面板、敌人预览、盟约浮层、详情卡、本局信息 / 敌方情报(固定,不能修改) | + +刷新、冻结、升级、撤退、出售和准备只在休整期有效,撤退 / 出售要先点选一名干员。方向轮盘(方向键预览、`Enter` 确认、`Esc` 取消)、「玩法说明」和「干员调配」的翻页键是这些界面自己的按键,不能修改。 + +**修改快捷键**:标题画面右上角或对局左下角的「设置」→「快捷键」。点一下要改的按键(只用键盘时按 Tab 移到它上面再按 Enter),出现「按下新按键…」后按新的键;按 `Esc` 取消,设置窗口不会关闭。可以用字母、数字、空格、标点符号键和 Delete / Insert / Home / End / PageUp / PageDown;`Esc`、`Tab`、`Enter`、方向键和 F1–F12 留给界面使用,也不能搭配 Ctrl / Alt / ⌘。新按键已被另一个快捷键使用时两者互换,列表下方会写明(例如把「撤退选中干员」改成 `X`,「出售选中干员」就换成原来的 `Q`)。「恢复默认」改回上表的按键。修改立即生效,商店栏、准备按钮和单位底部「撤退 / 出售」按钮上显示的按键也跟着变;设置和音量等一起保存在当前浏览器里(换浏览器或清除网站数据后回到默认)。按键按键帽上印的字符识别(AZERTY 等键盘按印着的字母),俄文等非拉丁布局按键位识别。手机等纯触屏设备要连接键盘才能用快捷键,设置里的快捷键列表默认折叠。 diff --git a/docs/design/client.md b/docs/design/client.md index e4587ed4..d23e588a 100644 --- a/docs/design/client.md +++ b/docs/design/client.md @@ -43,7 +43,7 @@ Screens: **Title** (season art backdrop, 开始 → nickname), **Lobby** (独立 A bond the mode never activates (标准: official `inactiveBondIdList`) reads 本局禁用 on shop / reward cards (struck through), detail chips and the popup — no 在场 count, no 当前效果 (§21.7); a strategy built around one carries a 本局禁用 tag and note in the strategy draft and stays selectable (bands.json `bondIds`, §21.26). -Interactions (research 09 §1.2 / §5, which supersede the first draft): shop card, upgrade and 机变 card are two-tap (select → confirm, §18.2) — a tap anywhere on the card, its confirm strip included, is the card's tap (shop cards have no ⓘ corner; the armed bar sits above the detail card; a shop card that cannot be bought right now opens its detail on tap, §20.7); a press / drop goes by the tile under the pointer (§18.1); drag bench↔board — a legal board drop (also onto the piece's own tile) opens the 4-direction deploy wheel (swipe UP/RIGHT/DOWN/LEFT with the rotated range striped orange; release in the centre, ✕ 点击取消 or Esc cancels); tap a unit's tile ⇒ underframe with **出售 +N** (and **撤退** on the board; items/Arts in the hand / temp: **销毁** — equipped items are locked, §6.2) plus its rotated range; no drag-to-sell; drag an item onto a unit's tile ⇒ equip that unit (both slots used ⇒ the replace dialog `ui/equipReplace.js` shows the incoming and the two equipped items; the player picks the one to replace — it is destroyed — `g.equip replaceUid`; cancel changes nothing); Arts are dropped on a tile and get the direction step; right-click or long-press ⇒ detail (or a tap on a shop card while the bar is locked); `R` refresh, `F` freeze, `D` level-up, `Space` ready (in a solo battle: pause / resume, §14 Solo pause). All actions optimistic-free: UI waits for server state (latency is small). +Interactions (research 09 §1.2 / §5, which supersede the first draft): shop card, upgrade and 机变 card are two-tap (select → confirm, §18.2) — a tap anywhere on the card, its confirm strip included, is the card's tap (shop cards have no ⓘ corner; the armed bar sits above the detail card; a shop card that cannot be bought right now opens its detail on tap, §20.7); a press / drop goes by the tile under the pointer (§18.1); drag bench↔board — a legal board drop (also onto the piece's own tile) opens the 4-direction deploy wheel (swipe UP/RIGHT/DOWN/LEFT with the rotated range striped orange; release in the centre, ✕ 点击取消 or Esc cancels); tap a unit's tile ⇒ underframe with **出售 +N** (and **撤退** on the board; items/Arts in the hand / temp: **销毁** — equipped items are locked, §6.2) plus its rotated range; no drag-to-sell; drag an item onto a unit's tile ⇒ equip that unit (both slots used ⇒ the replace dialog `ui/equipReplace.js` shows the incoming and the two equipped items; the player picks the one to replace — it is destroyed — `g.equip replaceUid`; cancel changes nothing); Arts are dropped on a tile and get the direction step; right-click or long-press ⇒ detail (or a tap on a shop card while the bar is locked); keyboard shortcuts — the defaults, which each player rebinds in 设置 → 快捷键 (`ui/gameLogic/shortcuts.js`, saved with the settings; §25.15) — `R` refresh, `F` freeze, `D` level-up, `Q` retreat / `X` sell the selected operator, `Space` ready (in a solo battle: pause / resume, §14 Solo pause); `Esc` closes (fixed); none acts while a text field has the focus or a dialog is open. All actions optimistic-free: UI waits for server state (latency is small). Audio: autochess BGM per phase, UI SFX (buy/sell/refresh/level/merge/ready/timer), per-unit attack/hit SFX (throttled; an impact plays for a hostile attack's phys / arts / true damage only, never an operator's skill-mode file for a normal attack, ≤ 2 copies of one battle sound — §18.4), boss music in R14/15. diff --git a/docs/history/0.2.0.md b/docs/history/0.2.0.md index ce61c9d8..c986e7b3 100644 --- a/docs/history/0.2.0.md +++ b/docs/history/0.2.0.md @@ -1062,3 +1062,33 @@ fixed (W5AA's commits name every golden scenario moved); two were already fixed bounty 使徒 whose seeds leaked sent every seed into 联防 carrying the card — 15 of 16 re-entries paid it again — which is the report; on this tree only the 使徒's own leak carries it. - Golden: unchanged. Pinned: `test/sim/feedback5-community-pins.test.js`. + +### 25.15 Rebindable shortcuts (W5AC; the community request 「快捷键可不可以自己设置」, the owner's decision of 2026-10-07) — `ui/gameLogic/shortcuts.js`, `ui/gameLogic/settings.js sanitizeSettings`, `ui/settings.js` (`HotkeySection`, `hotkeyLabelOf`), `screens/game.js`, `ui/facingWheel.js` + +- **Asked**: players wanted to choose their own keys. +- **Before**: R 刷新, F 冻结, D 升级, Q 撤退 / X 出售 the selected operator (PR #114, 0.1.4), Space 准备就绪 (in a solo battle: + pause / resume) and Esc (close) were fixed in `shortcutFor`; the shop bar, the ready / pause button and the + underframe drew them as fixed text, the facing wheel swallowed Space and `KeyR` / `KeyF` / `KeyD`. No camera, speed or + panel keys exist; the other keys are the dialogs', the guide's, 干员调配's and the facing wheel's own (Esc, Enter, the + arrows, paging), listed with the shortcuts in docs/PLAYING.md §11. Nothing official to follow: the shortcuts are the + remake's. +- **Now**: the settings (localStorage `sp.pref.settings`) hold `keys`, action → `KeyboardEvent.code`; the defaults are the + keys of 0.1.4, so nothing changes for a player who never opens the section. `sanitizeSettings` keeps each saved key + that may be a shortcut and gives any other its default; not a map, or two actions on one key, gives the defaults. One + lookup, `actionForKey` — the action of the character typed (the keycap: AZERTY, Dvorak), else of the physical key (a + Russian layout, an IME), the 0.1.4 `code === 'KeyR' || key === 'r'` match generalised and identical for the defaults — + serves `shortcutFor(e, keys)` in game.js and the facing wheel's `facingSwallows`; the modifier, text-field, repeat and + overlay guards are unchanged. The key hints read `hotkeyLabelOf`. 设置 → 快捷键 (the one SettingsModal, in a match and + on the title screen): each action with its key; a click — or Enter on the focused key — waits, the next key binds; + Esc cancels and the dialog stays open, Tab leaves; a key held with Ctrl / Alt / ⌘ or one the interface keeps (Esc, + Tab, Enter, the arrows, F1–F12) is refused and the wait goes on; a key another action has is swapped (that action takes + the old key) and the line under the list names both; 恢复默认. Bindable: A–Z, 0–9, Space, the punctuation keys, Delete, + Insert, Home, End, PageUp, PageDown; Esc stays fixed. On a touch-only device the section says the keys need a + keyboard and folds the list; under 768 px it is one column. +- [ASSUMED]: a conflict swaps rather than refuses (the request names neither, a swap never leaves an action without a + key); Esc and the dialogs' own keys stay fixed; the bindable set; no modifier combinations (no shortcut used one). +- Golden: unchanged (client UI only). Tests: `test/ui/feedback5-hotkeys.test.js` (the map, sanitising, conflicts, the + lookup equal to 0.1.4 for the defaults on four layouts, capture, handlers and hints with a rebound key), + `test/ui/gameLogic.test.js` (sanitizeSettings), `test/ui/hotkeys.e2e.test.js` (SP_E2E=1: 撤退 rebound to W with the + keyboard only in the mock match — Q then does nothing, W retreats, the choice survives a reload; phone width). Docs: + docs/PLAYING.md §11, README 操作, DESIGN §10 (design/client.md).