feedback5: merge CB1 — community reports (bonds / strategies / items): a pair of colds on an enemy becomes the freeze and leaves no cold (the 谢拉格 wind no longer freezes for good), a 复活 (埃芒加德's 命结之秘, M3茧甲) is a knock-out and an immediate free redeploy where the operator lies (砾's and 瑕光's 被击倒时 / 部署时 layers fire), 佩佩's special refresh is paid, the result card hides the layers of 调和 / 协防干员 / 独行 / 绝技, the 炎佑 keeps off 外勤医疗's slot, 凯瑟琳's 定向投放 offers every shop item; 烛煌's 绝处重燃 before the hammer's lock and the 寻呼模块 / 简易通讯机 tier cap kept as they are (the owner's decisions of 2026-10-07); §25.15 → §25.21 (§25.15 is the shortcuts'); golden: vs feedback5 CB1's own rules — roster-005/009/010/012/014/015/016/018/026/029/031/033/036/040/042/046/047/049, bond-egirShip-high, bond-indomShip-low, bond-kjeragShip-high, bond-maniShip-high, bond-raidShip-low, bond-steadShip-high, bond-suntShip-low, boss-boss_2/3/4/6-pair, hidden-boss_8/9/10-pair, standin-07, matches solo-FUNNY-1, solo-NORMAL-1, solo-HARD-1, solo-ABYSS-1, coop3-ABYSS-5, coop4-FUNNY-6, coop4-ABYSS-7; vs CB1 what feedback5 changed since its base (CB2, CB3, CB4, CB5) plus roster-014

Conflicts resolved by hand:
- server/sim/content/items/battle.js: CB3 had extended `revivedInPlace` (an in-place 复活 restarts a deploy-timed
  skill, item 44); CB1 replaced the in-place revive by PRTS's form — `reviveNow`, a `death` hook that redeploys the
  operator at once, free, where it lies — and removed `revivedInPlace`. CB1's side is kept: its redeploy resets the
  skill, so an `activateOnDeploy` skill starts anew by itself; CB3's tests (test/sim/feedback5-raid-revive.test.js:
  the jump at once after M3茧甲 / 埃芒加德, the window back to full, 砾's fresh barrier) pass on it unchanged. Their
  header, bonds_core's comment, DESIGN §25.17.5 say so.
- docs/SIM.md, docs/design/engine.md: CB1's `fatal` rows (the 复活 are `death` hooks now); the `death` rows also say a
  deploy-timed skill starts anew (§25.17.5).
- data/choices.json: no conflict; `node tools/build-data.mjs --offline` on the merged tree rewrites all 15 data files
  byte-identically, and the JSON compare with feedback5 shows only pools.pool_equip_kathe.maxTier removed (CB1).
- docs/history/0.2.0.md: CB1's section renumbered §25.21 (its §25.15.1–10 and two self-citations; no citation of it
  elsewhere), placed last; the owner's decisions of 2026-10-07 on items 5 and 45 recorded there, in the intro and in the
  two pin tests' headers (feedback5-blaze-hammer, feedback5-cb1-pins).

Golden: solo-FUNNY-1 (outside CB1's list) has 6 埃芒加德 revives and 85 freezes on feedback5's path (instrumented).
roster-014 differs from CB1's own digest by 玛恩纳's 无动于衷: CB3's rule (every enemy damage instance) answers the
萨卡兹枯朽战车's pollution that hits a 卡西米尔 operator in CB1's timeline — with that counter limited to attacks the merged
roster-014 equals CB1's digest exactly (checked).

Gate: non-browser suites 5021 / 5021, npm run golden ok, test/golden.test.js 9 / 9, lint 0 errors, check:imports ok,
typecheck ok.
This commit is contained in:
sganggs committed 2026-10-07 03:54:35 +08:00
commit 9ca52ba798
39 files changed
+1433 -861

No files matched your search

+133 -5
View File
@@ -10,7 +10,7 @@ after review with its golden scenarios named: R1–R6 (refactor, tooling), W5A (
K1–K3 / W5N (补位), W5H / W5K / O1–O24 (自选编队 and its operator kits), W5I / W5S (languages, phases 1 and 2), W5C /
W5E / W5F / W5J / W5L (fidelity, wave 1), WE1 / WE2 (the follow-ups the kit waves reported), W5M, W5R and the feedback4
merges (the 0.1.4 ports), W5V (the owner's items of 2026-10-06), W5U (packaging), W5T (the docs), W5Y (round 18:
three GitHub issues and three community PRs), W5AA and CB2 / CB3 / CB4 / CB5 (the community reports of 2026-10-06), W5AC
three GitHub issues and three community PRs), W5AA and CB1–CB5 (the community reports of 2026-10-06), W5AC
(rebindable shortcuts) and W5AD (language packs). Each rule was checked against the official data and PRTS; anything no
source backs is marked [ASSUMED].
The normative sections were rewritten with the streams: §0 (the DIY slots), §2 (the layout), §5.5 (the enemy damage
@@ -42,7 +42,9 @@ reproduced) → §25.18; CB5, match flow and UI (a module's 特性追加 line af
the upgrade, an eliminated player following a player through every round, the boss field and its leader in a watcher's
boss prep, the pair together in the boss prep with the official green frames; PRs #189 / #191 reused, not merged; the
battle-history and hotkey requests left to the owner) → §25.19; language packs, the first type of content packs (a
language is a file in the language folder) → §25.20.
language is a file in the language folder) → §25.20; the last stream of that batch, CB1, bonds, strategies and items (the
谢拉格 wind's endless freeze, 埃芒加德's and M3茧甲's 复活 as a knock-out and a free redeploy, 佩佩's paid refresh, the 炎佑 on
the medic's slot, 凯瑟琳's offer, the hidden layers on the result card; the official behaviours pinned) → §25.21.
Decisions of the owner: 2026-10-04 — the server stays on plain `node:http` + `ws`, no web framework (§25.1);
2026-10-05 — the 补位 plan (§25.3); the 自选编队 rules, the collab operators out of the pool, ISW-A refused (§25.4);
@@ -56,7 +58,8 @@ lock (§25.13.2); a newly merged elite 拉普兰德 counts as a new 拉普兰德
alive at the fight's start, adopting PR #209 and replacing 「保持固定血量」 (§25.13.4); flying units at 1.3 tiles and the two
model quirks of PR #211 (§25.13.5); the bounty pays whenever its enemy dies (relayed with the community
reports, §25.14.3); 2026-10-07 — the in-match shortcuts rebindable in 设置 (§25.15); a language is a file in the
language folder, and the language pack is the first type of a general content-pack mechanism (§25.20).
language folder, and the language pack is the first type of a general content-pack mechanism (§25.20); 烛煌's 绝处重燃
before 坚固维式重锤's lock and the official tier cap of 寻呼模块 / 简易通讯机 kept as they are (§25.21.1, §25.21.10).
### 25.1 Refactor and tooling: the big files split, golden results, lint, types, import boundaries (refactor plan; owner's decision of 2026-10-04: no web framework) — `server/http/`, `server/match/match/`, `server/match/player/`, `server/sim/battle/`, `content/enemies/`, `kits/ops/`, `public/js/ui/gameLogic/`, `render/fx/`, `render/app/`, `screens/game/`, `tools/golden.mjs`, `tools/check-imports.mjs`, `eslint.config.js`, `jsconfig.json`
@@ -1283,7 +1286,7 @@ question for the owner.
-solo; matches solo-FUNNY-1 / -2, coop4-ABYSS-7, coop2-ABYSS-10-boosted; diy-051. Tests:
`test/sim/feedback5-counters-any-damage.test.js`. Docs: docs/SIM.md (re-entrancy rule).
#### 25.17.5 「突袭盟约的干员如果带被动技能,复活之后不会立马突袭出去,还要等突袭CD」 (item 44): an in-place 复活 starts a deploy-timed skill again — `content/items/battle.js revivedInPlace`
#### 25.17.5 「突袭盟约的干员如果带被动技能,复活之后不会立马突袭出去,还要等突袭CD」 (item 44): a 复活 starts a deploy-timed skill again — `content/items/battle.js revivedInPlace` (since the CB1 merge `reviveNow`)
- **Seen**: 缄默德克萨斯 (S3) revived by M3茧甲 or 埃芒加德 with nothing in range jumped 10.00 s later; after 不屈's real
redeploy 0.23 s later. After a timed redeploy every passive member already jumped at once (measured for 宴, 缄默德克萨斯,
@@ -1295,7 +1298,10 @@ question for the owner.
- **Now**: `revivedInPlace` also restarts an `activateOnDeploy` skill on the next tick — anew when its window had ended,
back to its full duration when it still ran — so the member jumps at once; 砾 gets a fresh barrier, 缄默德克萨斯 a new
sword rain. The SP reset and the other 部署时 effects of PRTS's form stay unmodelled (§21.21).
- [ASSUMED]: none beyond §21.21's in-place form.
- **At the merge with CB1** (§25.21.3): CB1 models PRTS's form itself — the 复活 is a knock-out and an immediate free
redeploy (`reviveNow`), whose skill reset starts a deploy-timed skill anew — so `revivedInPlace` and its restart were
dropped; this item's tests (the jump at once, the window back to full, 砾's fresh barrier) pass on that model.
- [ASSUMED]: none (§21.21's in-place form is gone with CB1).
- Golden: 1 scenario — roster-012 (the elite 缄默德克萨斯 revived in place three times). Tests:
`test/sim/feedback5-raid-revive.test.js`. Docs: docs/SIM.md, DESIGN §5.4 (design/engine.md, the `fatal` hook).
@@ -1704,3 +1710,125 @@ one commit with its tests; two open community PRs were reused without merging th
not, the generated index), `test/ui/i18n.e2e.test.js` (`SP_E2E=1`: a pack file and a pack folder dropped in while the
server runs show in the menu and switch, English filling the gaps; a removed pack sends the stored choice back to
Chinese); `test/i18n.test.js`, `test/i18n-data.test.js`, `test/i18n-server.test.js` unchanged and green.
### 25.21 Community reports of 2026-10-06, stream CB1: bonds, strategies, items — `sim/battle/status.js applyStatus` (cold), `content/items/battle.js reviveNow`, `content/bands/battle.js` (埃芒加德), `content/bands/meta.js` (佩佩), `content/tokens.js airTile`, `screens/result.js resultBonds`, `tools/build-data.mjs` (pool_equip_kathe)
Fifteen of the owner's community reports of 2026-10-06 (items 5, 7, 8, 9 / 37, 15, 20, 21, 23, 25, 41, 42, 43, 45, 49,
50 of the list). Each was reproduced on this tree with a script, checked against the official data (bonds.json,
items.json, the client's buff templates), PRTS (卫戍协议:盟约 下半/PRTS盟约记录 and its 备注, 术语释义, 特殊机制) and the
earlier decisions. Seven were real and are fixed in six commits (7 and 8 share one; golden named in each); five are the
official behaviour (four pinned by tests); three could not be reproduced and need the reporters' cases; two questions
went to the owner (the order of §25.21.1, a fallback in §25.21.10) — the owner's decision of 2026-10-07 kept both as they
are.
#### 25.21.1 「维多利亚的锁血锤和烛煌的锁血只生效了一个」: both work, one after the other — no change
- **Measured**: 烛煌 (elite) carrying 坚固维式重锤, a lethal hit every 2 s: 倒地 at the first (绝处重燃, a kit `fatal` saver
−50), the hammer's lock at the hit that breaks the 6000 barrier while she is 倒地 (`PRIO_REVIVE` −100), death 8 s later;
without the hammer she falls at the second. The 蒸汽之心 path (another operator's hammer) behaves the same.
- **Why it looks like one**: PRTS 备注 「不处于【重燃】状态下,受到足以致命的伤害时,可触发此天赋效果,次数不限」 — the talent takes
every lethal hit outside 【重燃】, so the lock only ever shows when she is killed while 倒地. The order — kits' savers before
the consumable 不死 — is the documented [ASSUMED] (§21.21, §22.7's 余烬): the official talent fires on
ON_BEFORE_TRY_SET_HP_ZERO (buff template blaze2_t_2) and the autochess hammer's template is not in the client's buff
data, so no source gives an order. Asked whether the lock should take her first lethal hit instead, **the owner kept the
order** (the owner's decision of 2026-10-07): 绝处重燃 first, then the lock.
- Golden: unchanged. Pinned: `test/content/feedback5-blaze-hammer.test.js`.
#### 25.21.2 「谢拉格盟约冰冻时间没有随层数正确成长」 and 「…被在无法被任何干员攻击到的地方永控」: a pair of colds becomes the freeze — `sim/battle/status.js applyStatus`
- **Seen**: the 6-member wind (every 25 s, 寒冷 20 + 0.1 × layers s) froze an enemy for the rest of the battle from 51 layers
on, wherever it stood (at the gate too), and never below: measured, 60 layers → frozen from 50 s to the end; 40 → never.
- **Official**: PRTS 术语释义 寒冷 「友方寒冷始终需要两两一对产生友方冻结,持续时间取双方之中最高」; 异常效果 COLD
「在特定条件下转变为冻结」 — the pair turns into one freeze (a lone 友方 cold on a frozen enemy needs a partner, unlike the
敌方 rule 「…施加的敌方寒冷会变为敌方冻结」).
- **Cause**: the second cold froze for max(remaining, incoming) (§23.27) and the older cold stayed on, extended to the same
length, so the next cold before it ran out — the next gust — froze again.
- **Now**: on an enemy the pair becomes the freeze and no cold is left; on an operator (敌方寒冷) the old rule stays. The wind
alone freezes 20 + 0.1 × L s of every 50 s from 51 layers (60 → 26 s, 200 → 40 s, all of it from 300).
- [ASSUMED]: a paired cold emits no `statusApplied` 'cold' (the freeze does).
- Golden: every scenario where a second cold met a cold enemy (the commit lists 35). Tests:
`test/sim/feedback5-kjerag-cold.test.js`; `feedback3-cold-freeze` and 灵知 S2 (`kits_t4`) updated. Docs: docs/SIM.md
(`cold`), DESIGN §5 (design/engine.md).
#### 25.21.3 「卡西米尔和艾芒加德策略似乎有BUG:像砾和瑕光这种死亡和部署的叠层效果…无法触发」: a 复活 is a knock-out and a free redeploy — `content/items/battle.js reviveNow`, `content/bands/battle.js`, `content/bonds/core.js installEgir`
- **Seen**: with 埃芒加德's 命结之秘, 砾 (<部署时> 卡西米尔 +1, <被击倒时> 不屈 +2) gained nothing from his first three
knock-outs and stacked only on the 4th, real death; 瑕光's <部署时> +4 never fired on a revive.
- **Official**: PRTS 埃芒加德 (and M3茧甲, 阿戈尔) 备注 「“复活”的实现方式为:受益者因移动之外的原因退场时下次部署的再部署时间和
费用归零」 — the operator is knocked out and redeployed at once.
- **Cause**: both 复活 were `fatal` savers that kept the unit standing (a known simplification, §21.20's "not done"): no
`death`, no `deploy`.
- **Now**: `reviveNow`, a `death` hook (M3茧甲 `PRIO_RESPAWN` 13, 埃芒加德 `PRIO_BAND_REVIVE` 12, ahead of 阿戈尔 5 at 11 and
不屈 at 10): the knock-out stands (被击倒时 effects, 克莱门莎, 卡莱莎, 不屈's +5 SP …) and the operator redeploys where it
lies, free (full HP, SP reset, 部署时 effects, the 卡西米尔 deployment ATK, a new 坚固 lock — `revivedInPlace` is gone).
The ctx carries `revivedBy`, so 阿戈尔 5 does not count that knock-out as the member's first (the owner's decision of
2026-10-05, unchanged).
- [ASSUMED]: a revive whose tile is taken spends nothing (as 阿戈尔 5); with both, M3茧甲 answers first (as before).
- Golden: the battles with M3茧甲 or 埃芒加德 whose operators fell (11, the commit lists them). Tests:
`test/content/feedback5-revive-redeploy.test.js`; bands / bonds_core / feedback1f-hammer / op_lessng / op_zuole /
docs-consistency updated. Docs: docs/SIM.md (`fatal`, `death`), DESIGN §5 (design/engine.md), docs/PLAYING.md, research 04.
#### 25.21.4 「局内划掉被ban的盟约的实际效果有问题:只在标准模拟中生效」: the drawn bonds are the same in every difficulty — no change
- **Measured**: the drawn set D — 0 core + 1 add-on in 标准, 3 + 4 in 险境 / 绝境 / 终极 — removes only the operators whose
every bond is in it (23–25 banned, none in the pool); each drawn bond keeps 2–10 members through their other bond, 标准's
one included. Only 标准 also has the mode's static list (the official modeDataDict inactiveBondIdList, 10 bonds that never
activate, §21.7).
- **Official**: 帮助 「…以及不完整的盟约与不会进入调配池的干员」, the briefing badge 「部分盟约所含干员阵容不完整」, the
strategies' 「在<X>部分干员缺席时体验可能不完整」 (research 01 A2). The briefing legend already says it.
#### 25.21.5 「佩佩策略的特殊刷新也是要花钱的,不是免费」: the special refresh is paid — `content/bands/meta.js`
- **Seen**: reaching shop level 2 / 4 / 6 granted a free refresh; the special one cost 0.
- **Official**: 博学多通 「获得1次特殊刷新」 names no 免费 (德克萨斯's trait 「获得1次免费刷新」 does); the blackboard's `price`
0 had been read as its price.
- **Now**: the level-up marks the next manual refresh special — the usual refresh price, the chess slots filled with
<萨尔贡> first. [ASSUMED] `cnt` / `price` 0 change nothing. Golden: unchanged. Test: `test/content/bands.test.js`.
#### 25.21.6 「独行这种盟约是不能叠层的」: they stack, the game never shows them — `screens/result.js resultBonds`
- **Official**: PRTS 盟约记录's header 「下述盟约中部分盟约不会显示叠加层数,但是叠加层数的特质/策略/装备等效果仍然对其生效」 — the
four bonds.json `noStack` bonds (调和, 协防干员, 独行, 绝技) take layers like every other (GitHub #139's answer, 0.1.4
PR #66); their effects do not read them. The report asks for what the game does not do.
- **Now**: the one place still printing the hidden count — the result card (「独行 24」, ranked by it) — shows no number and
does not rank by it, as the bond strip since PR #66. Golden: unchanged. Test: `test/ui/feedback5-result-bonds.test.js`.
Docs: docs/PLAYING.md (层数), research 02 §2.2.
#### 25.21.7 「Touch策略给的医疗干员会跟炎盟约的炎祐冲突,无法同时出场」: the 炎佑 keeps off the map-character slot — `content/tokens.js airTile`
- **Seen** (every season map): on 战场#08 涨潮控制 (always) and 战场#07 排气格栅 (the second 炎佑 of 9 炎) the 外勤医疗 medic /
Touch never stood.
- **Cause**: both spawn at battle start; the 炎佑's tile (void tiles nearest the half's centre) took (10, 2), the medic's
stage slot (stages.json `mapChars`), first. The 联防 maps have no predefined medic in the official levels: none there.
- **Now**: `airTile` holds the map characters' positions. Golden: unchanged. Test: `test/content/feedback5-yanyou-touch.test.js`.
#### 25.21.8 Not reproduced — 「炎祐能错误的被空中单位阻挡」 (item 25), 「选pith策略的时候阿戈尔在联防时会出现加成被清空」 (item 41), 「源石溶剂在干员血量满的时候没生效」 (item 42) — no change
- 25: the 炎佑 never blocks (block 0) and is never blocked (only enemies are block candidates), as PRTS 特殊机制 我方单位
「敌人类我方单位不会被角色类单位阻挡」; it hovers on the top-aggro enemy, and an unblocked ranged enemy — a flyer included —
stands for each attack (GitHub #58), so a flyer shooting it looks held.
- 41: Pith's 盟约·辅助干员 (调和) with four 阿戈尔 (5 with 调和's +1): the same 阿戈尔 HP bonus in the normal battle and in 联防,
one or two helpers, either half; the 联防 input is the normal one plus the round's layers, HP ratio, SP and 倒地.
- 42: from full HP the drain ticks 60 / s and ATK +40 % holds. Noted for the owner: the official `periodic_damage` template
has `_ignoreForSp: true` (no 受击 SP), while §21.12 lets it charge 受击回复 SP.
- The reporters' cases (operators, items, screenshots) are needed.
#### 25.21.9 「凯瑟琳装备池没有超出商店等级的装备」: the 凯瑟琳 offer is every shop item — `tools/build-data.mjs`
- **Seen**: the 1 → 2 upgrade offered tiers I–II only (40 seeds: 55 × I, 65 × II).
- **Official**: the pool is server-side; the players' first-hand account 「原版凯瑟琳1升2都能有6本装备」.
- **Now**: `pool_equip_kathe` is every shop-eligible item, uniform [ASSUMED] (40 seeds: I 9 … VI 24); data/choices.json
rebuilt offline (only that pool's `maxTier` gone). Golden: coop4-ABYSS-7. Test: `test/match/feedback5-cathy-pool.test.js`.
#### 25.21.10 The official behaviour, pinned — 「寻呼模块和电话对干员缪尔赛思用不会给缪尔赛思」 (item 45), 「炎祐能吃到掉血道具的效果」 (item 49), 「两个空弦转职阿戈尔…最后面的空弦不能吃前面的空弦」 (item 50) — no change
- 45: 「电话」 is 简易通讯机 (its phone icon; 备注 「获得的干员等阶不高于当前调度中心等级」), like 寻呼模块 「(不高于当前调度中心
等级)」. 缪尔赛思's only bond is 调和, whose only operator in the pool is her, tier VI: below shop level 6 nothing qualifies
and the item is used up (as 拟态物质 at the copy cap, §25.13.1); at 6 she comes. Offered a fallback to any tier when
nothing qualifies (what the reporter expects), **the owner kept the official cap** (the owner's decision of 2026-10-07).
- 49: PRTS 源石溶剂 备注 「携带后,全场范围内的所有敌人类我方单位也会获得此装备的“每秒受到60真实伤害”效果」 — the 炎佑 is one
(600 HP in 10 s, no ATK bonus).
- 50: two operators made 阿戈尔 by 变形同构体 + 阿戈尔重刃 (two 空弦, 空弦 + 哈洛德) devour like any others, through the real
intents too (+3 layers, ATK, block). Two NORMAL copies of one item merge (the official rule), so two 空弦 need a normal
and an 进阶 set; and the pair counts once toward the 3 members.
- Pinned: `test/content/feedback5-cb1-pins.test.js`.