From d74665f0688141aca557aa3055beb9264fc74dba Mon Sep 17 00:00:00 2001 From: sganggs Date: Sat, 3 Oct 2026 23:40:13 +0800 Subject: [PATCH] =?UTF-8?q?feedback2:=20WF=20review=20=E2=80=94=20the=20?= =?UTF-8?q?=E9=AB=98=E5=8F=B0=20reading=20marked=20[ASSUMED]=20in=20the=20?= =?UTF-8?q?code=20comments;=20only=20=E6=AD=8C=E8=95=BE=E8=92=82=E5=A8=85?= =?UTF-8?q?=20is=20obtainable=20(=E5=B4=96=E5=BF=83=20/=20=E8=A7=81?= =?UTF-8?q?=E8=A1=8C=E8=80=85=20are=20hidden=20chess);=20=C2=A722.6=20note?= =?UTF-8?q?s=20the=20tile-based=20=E5=9C=B0=E9=9D=A2=E5=B9=B2=E5=91=98=20e?= =?UTF-8?q?ffects?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/DESIGN.md | 3 ++- docs/PLAYING.md | 2 +- public/js/ui/gameLogic.js | 2 +- server/match/board.js | 2 +- tools/build-data.mjs | 3 ++- 5 files changed, 7 insertions(+), 5 deletions(-) diff --git a/docs/DESIGN.md b/docs/DESIGN.md index 79cd338c..c6da0bbf 100644 --- a/docs/DESIGN.md +++ b/docs/DESIGN.md @@ -1505,6 +1505,7 @@ TBD-22.5 - **Cause**: build-data copied position MELEE and nothing read 可以放置于远程位; `board.js positionClass` mapped MELEE to 'melee' (melee tiles only), so `PlayerState._legal` refused the 高台 (`g.move` → `BAD_TILE`), and the client mirror (`gameLogic.js piecePosition` / `tileAllows`) agreed. - **Now**: build-data sets `placement: 'all'` on a chess whose branch trait without module (`branchTraitText`: the trait candidate's text, else the description) contains 可以放置于远程位 — exactly 崖心, 见行者 and 歌蕾蒂娅, normal and elite (6 records, the only data change; `validateAll` allows it on a MELEE record only; module-only text never counts). `positionClass` returns 'all' for them, so the server takes them on every deployable tile — `g.move`, swaps, a merge's elite (`mergeTile`), the terrain re-check (`_evictIllegal`), invariants and audit —, and the client's `piecePosition` 'ALL' lights the 高台 while dragging; every other melee unit keeps the refusal and its text. The battle keeps position MELEE: on a ground tile they block as before; on a 高台 (`unit.ground` false) they block nothing and attack from there — the sim needed no change (act2 m01, one 萨卡兹枯朽前锋 on the lower lane, 40 s: 歌蕾蒂娅 on (10,4) facing it 2 hits, no block, on (9,5) 12 hits, blocking; 崖心 and 见行者 alike; no errors). - **Bots** read the record's own position (`basePositionClass`): they still count these units as blockers (`isBlocker`; with the widened class they would not, and on act2 m01 the planner put 歌蕾蒂娅 and 崖心 on the 高台 as non-blockers, leaving 见行者 the only blocker on the road) and plan them on the ground tiles, as in 0.1.1 [ASSUMED]: offered the 高台, the planner still chose road tiles in the cases measured, but the lineup's blocker count assumes they block and a greedy 高台 pick could take a ranged dealer's tile — not benchmarked. `tools/balance.mjs` uses the same blocker test. Tokens are unchanged; the sim's automatic placements (the 突袭 landing tile, summon / device tiles) still treat them as melee, ground tiles only [ASSUMED]. -- **Players notice**: 歌蕾蒂娅, 崖心 and 见行者 can be dragged onto a 高台 (PLAYING §4); there they attack but block nothing. +- **Players notice**: 歌蕾蒂娅 can be dragged onto a 高台 (PLAYING §4); there she attacks but blocks nothing. 崖心 and 见行者 get the same rule but are hidden chess this season (`isHidden`, never in the pool, the shop or a 突变细胞 roll), so only 歌蕾蒂娅 is reachable in play; 见行者's elite PUS-X refund (half the DP of a redeploy onto a ranged tile, kits/tier3.js `!unit.ground`) is therefore moot. +- On a 高台 she is not a 地面干员 for the effects that read the tile (`unit.ground`: the 战栗维式重锤 proc, 休谟斯 回收利用, 不屈, the 只攻击地面单位 enemy, 污染秽蚀's 高地 rate), like a ranged operator up there; position-based effects keep her 近战 (精准 tier 2, 诗怀雅's talent) [ASSUMED: the official texts may mean the position class by 地面干员]. - Normative lines rewritten with it: §3 (placement), §6.6 (the bot); research 03 C2; DATA §2 (`placement`). - Tests: `test/match/feedback1-placement.test.js` (#32-4: the data rule, cross-checked against character_table when the cache exists; `g.move` onto (10,4) / (11,4) / (12,4) of 战场#01(下半) for the six records; a 重装 refused with its text; ranged unchanged; client highlights = the server's tiles; swaps; the merge's elite on the 高台; the battle input and the sim on / off the 高台; bots), `test/match/board.test.js` (`positionClass` / `basePositionClass`), `test/ui/gameLogic.test.js` (the client mirror). diff --git a/docs/PLAYING.md b/docs/PLAYING.md index 08924da9..7e970333 100644 --- a/docs/PLAYING.md +++ b/docs/PLAYING.md @@ -62,7 +62,7 @@ ## 4. 摆阵与朝向 -- 从整备区把干员拖到棋盘:近战位 / 远程位高亮为可放置格。**钩索师和推击手**(歌蕾蒂娅、崖心、见行者)的特性写着「可以放置于远程位」,地面和高台都能放;站在高台上时照常攻击,但不阻挡敌人。**水里不能部署**:战场#08(涨潮控制)中间的那条水池(深水区)和官方一样拒绝部署,任何干员和召唤物都放不上去;突袭盟约的干员再部署、战术家的援军自动选战术点时也只会落在岸上。松手后出现**方向轮盘**,向上 / 右 / 下 / 左滑动,棋盘上会用橙色条纹预览旋转后的攻击范围,松手确认;松在中心或点「✕ 点击取消」取消。 +- 从整备区把干员拖到棋盘:近战位 / 远程位高亮为可放置格。**钩索师和推击手**的特性写着「可以放置于远程位」,地面和高台都能放(本赛季卡池里只有歌蕾蒂娅,崖心、见行者是隐藏干员);站在高台上时照常攻击,但不阻挡敌人。**水里不能部署**:战场#08(涨潮控制)中间的那条水池(深水区)和官方一样拒绝部署,任何干员和召唤物都放不上去;突袭盟约的干员再部署、战术家的援军自动选战术点时也只会落在岸上。松手后出现**方向轮盘**,向上 / 右 / 下 / 左滑动,棋盘上会用橙色条纹预览旋转后的攻击范围,松手确认;松在中心或点「✕ 点击取消」取消。 - 想只改朝向:把干员拖回它自己所在的格子再选方向。朝向会一直保留到下一回合。 - **点选按地上的方格**:点哪个方格就选中站在那个方格上的单位,点空方格不选任何单位(点到后一格干员画出来的头部,算作点了后面那一格)。作战中友方同样按方格;敌人在格子之间走动,点它的身体或脚下附近(0.6 格内)即可,飞行敌人点它的身体。 - 拖动时模型一直在指针 / 手指下(脚在指针下方约半格,鼠标和触屏一样),**指针所在的格子**就是落点并高亮;装备拖到哪个格子,就配发给那个格子上的干员;在商店栏上松手则放回原位。 diff --git a/public/js/ui/gameLogic.js b/public/js/ui/gameLogic.js index 3717665b..488c249b 100644 --- a/public/js/ui/gameLogic.js +++ b/public/js/ui/gameLogic.js @@ -993,7 +993,7 @@ export function placementContext({ priv, stage, editable, field = 'normal', getC /** * Deploy position ('MELEE'|'RANGED'|'ALL') of a chess/token piece, or null for items. A MELEE operator whose branch * trait reads "可以放置于远程位" (钩索师, 推击手: chess.json `placement` 'all') is 'ALL': any deployable tile, the 高台 - * included (server/match/board.js positionClass; GitHub issue #32 item 4, DESIGN §22.6). + * included (server/match/board.js positionClass; GitHub issue #32 item 4, DESIGN §22.6 [ASSUMED]). */ export function piecePosition(ctx, piece) { if (!isObj(piece)) return null; diff --git a/server/match/board.js b/server/match/board.js index 363afcd6..340eb589 100644 --- a/server/match/board.js +++ b/server/match/board.js @@ -25,7 +25,7 @@ // // Chess follow their `position` (MELEE ⇒ melee tiles, RANGED ⇒ any deployable), except a MELEE operator whose branch // trait reads "可以放置于远程位" (钩索师, 推击手: chess.json `placement` 'all' ⇒ any deployable tile, `positionClass`; -// GitHub issue #32 item 4, DESIGN §22.6). +// GitHub issue #32 item 4, DESIGN §22.6 [ASSUMED]: the branch trait read as no 部署效果, which the mode would switch off). // Tokens follow their own `position` (ALL ⇒ any deployable tile, MELEE ⇒ melee tiles, RANGED ⇒ any deployable). // A token whose text reads "只能部署在召唤者攻击范围内" (tokens.json `ownerRange`: the tacticians' 援军 — 伺夜's 狼群, // 缪尔赛思's 流形; PRTS 狼群 特性) also needs a tile of its owner's attack range: `ownerRangeKeys` = the owner's range diff --git a/tools/build-data.mjs b/tools/build-data.mjs index cd10d6c9..4cf7f594 100644 --- a/tools/build-data.mjs +++ b/tools/build-data.mjs @@ -730,7 +730,8 @@ function hasE2Art(ctx, charId, kind) { * both branches "可部署在高台和地面"). Chess records get `placement: 'all'` (server/match/board.js positionClass); the * position stays MELEE for the battle. Only the no-module trait counts: the Y-module 教官's "可以额外部署在远程位" is a * module talent (buildable_type), a 部署效果 the mode switches off in the prep placement (PRTS 卫戍协议/帮助 §战斗部署 - * "携带Y模组的教官仍无法部署至高台位"). DESIGN §22.6. + * "携带Y模组的教官仍无法部署至高台位"). [ASSUMED] that the branch trait still applies in this prep: the 帮助 switches off + * only 部署效果 and no source names the 钩索师 / 推击手 case for 卫戍协议 (DESIGN §22.6). */ const PLACE_ON_RANGED_RE = /可以放置于远程位/;