feedback5: merge CB3 — community reports (operator kits): 砾's normal attack hits twice at 50 % 伤害倍率 (a 频次 enemy loses 2), 乌尔比安's S3 moves only onto his own board (never behind the one-helper 联防 map's red gate nor onto a boss field's other half), the 「受到攻击时」 counters answer every enemy damage instance (菲莱 S2 on 深溟巢涌者's pulse, 星熊, 泡泡, 刺玫, 余, 玛恩纳, 年, 斩业星熊), an in-place 复活 restarts a deploy-timed skill so a 突袭 member jumps at once, 银灰's normal attack plays its own impact (and 雷蛇 / 初雪 / 圣约送葬人 drop a skill mode's sound); five reports pinned; §25.17 between CB2's §25.16 and CB4's §25.18; data/assets.json lists 银灰's impact (p_imp_spear_n.mp3 fetched); golden: vs feedback5 CB3's own rules — roster-002/004/005/008/010/012/016/024/033/044, bond-indomShip-low/high, bond-kazimierzShip-low/high, bond-lateranoShip-low, boss-boss_2-solo, boss-boss_4-pair/-solo, hidden-boss_8-pair/-solo, hidden-boss_9-solo, diy-051, matches solo-FUNNY-2, coop2-NORMAL-3, coop4-ABYSS-7, coop2-ABYSS-10-boosted; vs CB3 exactly what feedback5 changed since its base (CB2, CB4, CB5)

The merge:
- server/sim/battle/players.js: CB3's onOwnBoard hunk is byte-identical to CB4's (git kept one); its comment and
  docs/SIM.md's onOwnBoard row now name 乌尔比安's S3 【移动】 next to the 突袭 landing (DESIGN §25.17.2 / §25.18).
- test/sim/facing-invariance.test.js: CB3's scenario setup (onOwnBoard off on the open field) and the CB4 merge's
  突袭 test (its enemy inside the board) merged cleanly, both kept.
- data/assets.json: CB3 had regenerated it offline without 银灰's entry (his official impact file was not on disk);
  `node tools/fetch-assets.mjs --add-only` (shared public/assets, add-only) downloaded p_imp_spear_n.mp3 — 8.8 KB,
  the only new file (ok 1, skipped 7968; the 117 misses are the known upstream gaps) — and rewrote the manifest.
  Field-wise JSON compare with CB3's manifest: only audio.sfx.units.char_172_svrash = { hit: p_imp_spear_n } plus hash
  and stats (files / bytes / sfxUnits +1); against feedback5: CB3's four operators (银灰 now the spear impact and no
  S3 swing, 雷蛇 / 初雪 / 圣约送葬人 without the skill-mode impact) plus hash / stats. §25.17.6 says so.
- docs/history/0.2.0.md: §25.17 placed in order, the intro's per-stream list and workstream list name CB3.

Golden moves outside CB3's commit list: coop2-NORMAL-3 fields 砾 from round 3 (her double hit) and 刺玫 in rounds 4-7
(instrumented); solo-FUNNY-1 (in CB3's list through the counters) fields no counter operator on feedback5's path, only
砾, whose two half hits change no kill, leak, LP or end stat there, so its digest stays.

Gate: non-browser suites 5003 / 5003, 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:41:48 +08:00
commit d841d6ac22
33 files changed
+956 -245

No files matched your search

+4 -1
View File
@@ -206,7 +206,10 @@ All paths are URL paths relative to the site root, for example `/assets/char/ava
// units' attack / hit (tools/assets/audio.mjs pickUnitSfx): operators get normal-mode banks only — the plain
// `attack` / `combat` ability first, never a bank holding a skill-mode file (`_d` / `_h` / `_s`; the normal attack's end
// in `_n`) — with their own projectile banks (ON_PROJECTILE_BORN / _HIT.projectile_chr_<name>) as fallbacks
// (DESIGN §18.4: 纯烬艾雅法拉's S3 impact used to be her `hit`); enemies and tokens take the first attack-like bank
// (DESIGN §18.4: 纯烬艾雅法拉's S3 impact used to be her `hit`); an operator with such a plain bank (its default mode is
// the unsuffixed ability) never takes a numbered variant `attack.N` — a skill mode's, whatever its file name (银灰's S3
// swing p_atk_silver_n, community report of 2026-10-06); one that numbers its default mode (`attack.0` …) keeps the
// numbered order; enemies and tokens take the first attack-like bank
fonts: { css: '/fonts/fonts.css', faces: { [name]: { family, weight, woff2?, original } } }
}
```
+9 -4
View File
@@ -779,7 +779,7 @@ registration order. `battle.off(handle)` / `battle.off(name, fn)` / `battle.offO
| `damaged` | `{ source, target, amount, type, dmg, credit }` | after application (`amount` may be 0 when shielded); element fills too (with their source); 无来源: `source` null, `credit` set |
| `hpDamage` | `{ source, target, amount, dmg, credit }` | a damage instance after shields, before the HP loss (§4; not a 流失): lower `amount` only (a raise is ignored) — HP floors / reductions ordered after a barrier (kits/ops/op-huang.js, op-zuole.js) |
| `heal` | `{ source, target, amount, opts }` | mutable `amount` |
| `fatal` | `{ unit, source, credit, dmg, amount, prevented }` | HP would reach 0 — set `prevented` (substitutes, kit savers, 不死 / 复活 items, 埃芒加德; 不屈 is a `death` hook). Fired by every HP loss of a unit without a boss pool — hits of any type, element bursts, 无来源 damage, `loseHp` 流失. Order: kits' own savers (10 … −60) → items' 不死 (坚固维式重锤 — once per deployment: `items/battle.js deploymentOf`, a key every deploy changes and an in-place 复活 changes too; one battle-level hook holds the running windows (`holdsUndying`), so a window outlasts a lend, DESIGN §21.21 — the lock `PRIO_REVIVE` −100 after the substitutes (−100, registered first), the running windows `PRIO_UNDYING_HELD` −99 before them: a 傀儡师 holding 不死 does not switch, PRTS 分支特性信息 傀儡师 "未持有不死的情况下", DESIGN §22.11) → 淬羽赫默 S3's 不死 (−100.5: PRTS 衍生生命 "无畏者协议提供的不死效果仅在目标没有不死效果时才会触发"; its running windows held at −99 like the hammer's) → items' 复活 (M3茧甲, `PRIO_RESPAWN` −101: PRTS "复活" acts on a knock-out, which a 不死 prevents) → 埃芒加德 (−110); both 复活 revive in place and call `revivedInPlace` (a new deployment for the lock) |
| `fatal` | `{ unit, source, credit, dmg, amount, prevented }` | HP would reach 0 — set `prevented` (substitutes, kit savers, 不死 / 复活 items, 埃芒加德; 不屈 is a `death` hook). Fired by every HP loss of a unit without a boss pool — hits of any type, element bursts, 无来源 damage, `loseHp` 流失. Order: kits' own savers (10 … −60) → items' 不死 (坚固维式重锤 — once per deployment: `items/battle.js deploymentOf`, a key every deploy changes and an in-place 复活 changes too; one battle-level hook holds the running windows (`holdsUndying`), so a window outlasts a lend, DESIGN §21.21 — the lock `PRIO_REVIVE` −100 after the substitutes (−100, registered first), the running windows `PRIO_UNDYING_HELD` −99 before them: a 傀儡师 holding 不死 does not switch, PRTS 分支特性信息 傀儡师 "未持有不死的情况下", DESIGN §22.11) → 淬羽赫默 S3's 不死 (−100.5: PRTS 衍生生命 "无畏者协议提供的不死效果仅在目标没有不死效果时才会触发"; its running windows held at −99 like the hammer's) → items' 复活 (M3茧甲, `PRIO_RESPAWN` −101: PRTS "复活" acts on a knock-out, which a 不死 prevents) → 埃芒加德 (−110); both 复活 revive in place and call `revivedInPlace` (a new deployment for the lock, and a deploy-timed skill — `activateOnDeploy` — runs again from the next tick: started anew, or its window back to full; PRTS's 复活 is 退场 + a 0-time / 0-cost redeploy) |
| `dollSwitch` | `{ unit, reason, done }` | content switches a 傀儡师 to its <替身> now (归溟幽灵鲨 S2 "技能结束后立刻切换为<替身>": no lethal HP loss); its trait does it unless it already is one or is not on the field, and sets `done` |
| `dollSwap` | `{ unit, form }` | a 傀儡师 starts a switch — to its <替身> (`form` `'doll'`) or back to its <本体> (`null`); not when it is knocked out as the 替身 (不屈 rolls on it: "切换<替身>与<本体>时") |
| `kill` | `{ killer, victim }` | victim HP reached 0 (a handler may revive by restoring HP) |
@@ -803,7 +803,10 @@ registration order. `battle.off(handle)` / `battle.off(name, fn)` / `battle.offO
"bonus damage on hit") must not react to its own output or to other reactive damage, or two such effects ping-pong
until the nesting guard trips (the guard then skips *every* nested handler, including `kill`/`death` bookkeeping of
content). Respond only to `dmg.isAttack` (normal attacks), tag your damage (`tags: ['counter']`) and skip tagged damage,
or guard with a per-unit flag while dealing it. When the guard trips, the logged error names the open frames
or guard with a per-unit flag while dealing it. The "受到攻击时" counters take the second way: the official ones fire on
every damage instance from an enemy (ON_TAKE_DAMAGE — its attack, a skill hit, 深溟巢涌者's pulse; never a 流失), so they
answer `kits/shared/tier1.js byEnemyAttack` (星熊 S2, 泡泡, 刺玫 S2, 余 S1, 玛恩纳 无动于衷, 年 S2, 斩业星熊; 菲莱 S2 any
instance) and skip `'counter'` / `'reflect'` damage. When the guard trips, the logged error names the open frames
(`chain: hit(enemy_x→chess_y) > damaged(chess_y) > …`).
---
@@ -831,7 +834,7 @@ or guard with a per-unit flag while dealing it. When the guard trips, the logged
| `addLayers(playerId, bondId, n, reason, {source})`, `addCoins(playerId, n)` | layers are a no-op when `flags.layerGainsEnabled` is false (unite/boss); a gain adds at most the room left under `BOND_LAYER_CAP` (999, shared/constants.js `layerGainRoom`: the client's `AddBondCount` min(L + n, 999)) on the live copy — or, without one, on the battle's own gains — and returns what it added (0 at the cap: no hook, no event) |
| `getPlayer(playerId)` | `{ playerId, seat, side, colOffset, mirror, dir (default unit direction: RIGHT, mirrored side LEFT), facing (its sign), bonds (live copy, layers updated by addLayers), bandId, playerEffects, lpForBoss, dp, units }` |
| `mapTile(ps, row, col, abs?)` / `mapDir(ps, dir, abs?)` | board → field tile / direction of a player (the FA right-side mirror) |
| `onOwnBoard(ps, r, c)` | whether a field tile lies on the player's own board — GEO.FIELD (rows 9–12, cols 2–10) mapped onto this field: the 联防 right-hand helper's +8 columns, the boss field's rows 2–5 (never its hand / 临时整备区 rows 0–1), the mirrored right half; the 突袭 landing takes only such tiles (DESIGN §25.18) |
| `onOwnBoard(ps, r, c)` | whether a field tile lies on the player's own board — GEO.FIELD (rows 9–12, cols 2–10) mapped onto this field: the 联防 right-hand helper's +8 columns, the boss field's rows 2–5 (never its hand / 临时整备区 rows 0–1), the mirrored right half; the 突袭 landing takes only such tiles (DESIGN §25.18), and so does 乌尔比安's S3 【移动】 (DESIGN §25.17.2) |
| `addDp(playerId, n)`, `retreat(unit, {reason, permanent, dying})`, `relocate(unit, r, c)` | `relocate` only changes the tile (state kept, no event) |
| `moveRedeploy(unit, r, c, { clearSp })` | a 【移动】 (PRTS 术语释义: "不退场,以当前血量在目标位置部署", a special retreat + redeploy): `relocate`'s checks (false = refused, nothing changed), then a new deployment (`deploySeq` / `aggroSeq` / `deployedAt`) and `deploy {initial:false, move:true}` (deploy effects fire again); no `die` / `death`, timer or cost (不屈 / 阿戈尔's revive never see it); HP, buffs and a running skill are kept (owner's deviation, DESIGN §22.3); `clearSp` empties the SP before the deploy handlers run — 乌尔比安 S3's move (kits/ops/chess_char_5_05-ulpia.js) and 【返回】 (`clearSp`; also the 从不混淆的方向 fallback, content/tokens.js) |
| `redeploy(unit, { free=true, tile, keepSp })` | immediate (re)deployment of a dead/retreated ally (full HP, `deploy {initial:false}`); `free: false` pays `base.cost` DP (refused without it); without `tile` it lands on the unit's rest tile (`restTile`: where a knocked-out operator lies, else home); `tile: [r, c]` lands on that tile once (home unchanged; refused when off-rect, occupied or a knocked-out operator's tile, no fallback); `keepSp` keeps SP/charges (保留技力), restored before `deploy` fires — 突袭 raids, 阿戈尔 / 不屈 revives where the unit lies |
@@ -1214,7 +1217,9 @@ S3 未照耀的荣光 — its CUSTOM_RANGE trigger also counts flyers). A stun /
3.75 back = `BOOMERANG_RETURN_SPEED`, PRTS 跃跃; droneBomb 5 = 暴鸰's bomb, the official projectile_bombd); melee/`none` hits are
instant, and so are `'beam'` hits (a 锁定攻击范围 AoE without a projectile — `rangeAoe` profiles: "在攻击前摇结束时选取范围内的全体目标,同时造成伤害", PRTS 作战机制). Kit-settable profile flags beyond the
table: `hitSleep` (targets and damages sleeping enemies — "可以攻击沉睡的敌人"), `onEachHit(b, u, victim, hctx)`, `dmgMul`,
`afterHit`, `afterAttack`, `canAttack`, `hitsFn(b, u, info)`, `storeEnergy` / `releaseEnergy` (the 秘术师 store, below), `priority` (targeting.js PRIORITY_FNS — `'heaviest'`: the 攻城手 trait
`afterHit`, `afterAttack`, `canAttack`, `hitsFn(b, u, info)`, `hitDmgMul` (the 伤害倍率 of each of the `hits` instances on the
main target — DamageInfo `mul`, after DEF / RES; the later instances give no 受击回复: 砾's two 50 % hits, PRTS 砾 特性备注),
`storeEnergy` / `releaseEnergy` (the 秘术师 store, below), `priority` (targeting.js PRIORITY_FNS — `'heaviest'`: the 攻城手 trait
"优先攻击重量最重的敌人", the highest current 重量等级 first: 早露 / 提丰; `'elite'`: "优先攻击精英或领袖敌人", an ELITE / BOSS
rank enemy or a leader first: 薇薇安娜 S3), `blockFly`, `noHeal`, `skipEnemy(e)` (an enemy the unit never
selects — its attacks, the enemies it blocks and its skill-trigger targets: targeting.js canTargetEnemy; 嵯峨 "不攻击重伤
+1 -1
View File
@@ -100,7 +100,7 @@ Base stats (from data): `maxHp, atk, def, res` (0–100), `aspd` (100 base), `ba
| `hit` | `{ source, target, dmg }` | before mitigation; mutate `dmg` (DamageInfo) |
| `damaged` | `{ source, target, amount, type, dmg }` | after application |
| `heal` | `{ source, target, amount }` | before application (mutable amount) |
| `fatal` | `{ unit, source, credit, dmg, amount, prevented }` | HP would reach 0 — fired by every HP loss of a unit without a boss pool (hits of any type, element bursts, 无来源 damage, `loseHp`); set `prevented`. Order: kits' own savers (10 … −60) → items' 不死 (坚固维式重锤, once per deployment) `PRIO_REVIVE` −100 → items' 复活 (M3茧甲) `PRIO_RESPAWN` −101 → 埃芒加德 −110; the two 复活 revive in place and open a new deployment for the lock (§21.21); a running 坚固 window's hook sits at `PRIO_UNDYING_HELD` −99, before a 傀儡师's switch to its 替身 (−100, ahead of the lock — a 本体 holding 不死 does not switch, §22.11) |
| `fatal` | `{ unit, source, credit, dmg, amount, prevented }` | HP would reach 0 — fired by every HP loss of a unit without a boss pool (hits of any type, element bursts, 无来源 damage, `loseHp`); set `prevented`. Order: kits' own savers (10 … −60) → items' 不死 (坚固维式重锤, once per deployment) `PRIO_REVIVE` −100 → items' 复活 (M3茧甲) `PRIO_RESPAWN` −101 → 埃芒加德 −110; the two 复活 revive in place and open a new deployment for the lock (§21.21) and for a deploy-timed skill (`activateOnDeploy`, started again: §25.17.5); a running 坚固 window's hook sits at `PRIO_UNDYING_HELD` −99, before a 傀儡师's switch to its 替身 (−100, ahead of the lock — a 本体 holding 不死 does not switch, §22.11) |
| `kill` | `{ killer, victim }` | victim hp reached 0; a `killed` ability that keeps the enemy alive (a knock-out into a 重生 / form change, §21.4) hides it from every later handler, the kill count, credit and the bounty |
| `death` | `{ unit }` | unit removed (ops may redeploy later); the `die` event and the death hooks fire only on removal |
| `skillStart` / `skillEnd` | `{ unit, skill }` | |
+137 -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 / CB4 / CB5 (the community reports of 2026-10-06), W5AC
three GitHub issues and three community PRs), W5AA and CB2 / CB3 / CB4 / 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
@@ -31,10 +31,13 @@ bounty burned to death by the 活性源石, 枯朽之种 paying a bounty) → §
second batch of community reports of 2026-10-06, one section per stream: CB2, healers, summons, timers (刺玫's S2 heals,
琳琅诗怀雅 healing herself and her 破财消灾 cost after a redeploy, 赫默's drone at full SP, the countdown summons' 无敌 /
禁疗 / timer bar, stacked alchemy zones; the chain heal, DoT damage, 伺夜's 狼影 and the 吟游者 trait answered) → §25.16;
CB4, enemies, bosses, waves, movement (the 突袭 landing on the 临时整备区 row and the other half of the 联防 map, a
silenced 萨卡兹枯朽战士's death pollution, 萨卡兹穿刺手's speed after a stun and its first hit, 自制投石机 blocked on the
排气格栅; the briefing types' 7–9 waves, 新硎's 断刃, a freed prisoner in 联防 and 鸭爵's two swaps in one wave already
answered; the moving leaders' routes checked; 野鬃, 锏's pulls, 昆图斯's footprint and the leaders' attack rate not
CB3, operator kits and triggers (砾's double hit, 乌尔比安's S3 landing behind the 联防 red gate, the 「受到攻击时」
counters on every enemy damage instance, a 突袭 member's jump after an in-place 复活, 银灰's sound; 铃兰's trigger,
琳琅诗怀雅's champagne, the 突袭 玛恩纳, 归溟幽灵鲨 devoured and 荒芜拉普兰德 / 叙拉古 already answered; 乌尔比安's revive
tile a question) → §25.17; CB4, enemies, bosses, waves, movement (the 突袭 landing on the 临时整备区 row and the
other half of the 联防 map, a silenced 萨卡兹枯朽战士's death pollution, 萨卡兹穿刺手's speed after a stun and its first
hit, 自制投石机 blocked on the 排气格栅; the briefing types' 7–9 waves, 新硎's 断刃, a freed prisoner in 联防 and 鸭爵's two
swaps in one wave already answered; the moving leaders' routes checked; 野鬃, 锏's pulls, 昆图斯's footprint and the leaders' attack rate not
reproduced) → §25.18; CB5, match flow and UI (a module's 特性追加 line after the class trait, the new shop slot filled at
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
@@ -1204,6 +1207,135 @@ the evidence.
under 魔王 (pinned by `test/content/feedback5-regen.test.js`); 孤立 units stay out (PRTS 孤立). The countdown summons
cannot be refilled since §25.16.5.
### 25.17 Community reports of 2026-10-06, stream CB3: operator kits and triggers — `sim/ai.js resolveHit` (`hitDmgMul`), `kits/ops/chess_char_2_12-gravel.js`, `kits/ops/chess_char_5_05-ulpia.js`, `sim/battle/players.js onOwnBoard`, `kits/shared/tier1.js byEnemyAttack`, `content/items/battle.js revivedInPlace`, `tools/assets/audio.mjs pickUnitSfx`
The owner's second collection of community reports (2026-10-06/07) was split over five streams; CB3 took the items about
operator kits and skill triggers (items 2, 16.1, 16.4, 16.5, 17, 27, 28, 30, 44, 46, 54 of the list). Each was reproduced
on the 0.2.0 tree with a script first (where the report could be older, on the v0.1.1–v0.1.4 sources too), then checked
against the official data (character_table, skill_table, activity_table → act2autochess, audio_data, ArknightsGameData's
buff templates, the local client's charpacks and skill prefabs) and PRTS (备注 included). Five are real and fixed, one
commit each with its golden scenarios named; five were already answered or are not bugs (pinned by tests); one is a
question for the owner.
#### 25.17.1 「砾的平A是比较特殊的双判,是两次50%伤害倍率(不是攻击倍率)」 (item 16.5): two instances of 50 % 伤害倍率 per normal attack — `sim/ai.js resolveHit`, `sim/professions.js` (`hitDmgMul`), `kits/ops/chess_char_2_12-gravel.js`
- **Seen**: one damage instance per attack (measured: against DEF 300, ATK 352, one hit of 52), so a 频次 enemy lost 1.
- **Official**: PRTS 砾 特性备注 — in her attack animation every normal attack deals two instances, each 50 % of the final
damage (after DEF / damage reduction, before 重设伤害), and the second triggers no 受击回复.
- **Now**: the profile field `hitDmgMul` — the DamageInfo `mul` of each of the `hits` instances on the main target, applied
after DEF / RES and the damage multipliers, `noSp` on the later ones — and 砾's kit trait `{ hits: 2, hitDmgMul: 0.5 }`:
two hits of 26 in the example (the same total), 2 per attack against a 频次 enemy. Both her skills are passive, so every
attack she makes is a normal attack.
- [ASSUMED]: the two instances land at once, at her attack's damage frame (the animation's second hit is not timed).
- Golden: 7 scenarios with 砾 on the board — roster-004 / 005 / 024, bond-indomShip-low / -high, bond-kazimierzShip-low /
-high (two damage events per attack; in roster-024 and bond-kazimierzShip-high the last blow lands on another instance,
so kills move between her and her neighbours). Tests: `test/sim/feedback5-gravel-double-hit.test.js`. Docs: docs/SIM.md.
#### 25.17.2 「乌尔比安使用3技能会在联防阶段跳到红门后」 (item 27): the S3 【移动】 lands only on his own board — `kits/ops/chess_char_5_05-ulpia.js`, `sim/battle/players.js onOwnBoard`
- **Seen**: on the one-helper 联防 map (act1autochess_escaped_single: the lone helper on the left half, the enemies out of
the middle gate at col 10) an anchor that met no enemy flew on 6 tiles into the right half, where no enemy walks, and he
stood there behind the red gate for the whole skill (reproduced: (10,7) → (10,13); on a solo boss field (2,5) → (2,11)).
- **Official**: PRTS 乌尔比安 S3 备注 ③ — the anchor tile if it can be deployed on, else the tile one beyond, else his own
tile. "可部署" is a tile his player deploys on.
- **Cause**: "deployable" was any standable tile of the battle rect; UNITE_RECT spans both halves of the 联防 map and
BOSS_RECT the hand / 临时整备区 rows and the partner's half.
- **Now**: the landing must also lie on his board — `Battle.onOwnBoard(ps, r, c)`, the board region GEO.FIELD mapped onto
the field as `mapTile` maps the pieces (the helper stream CB4 adds for the 突袭 landing; the hunk is identical).
The anchor still flies its 6 tiles and blasts there; he stays when neither tile is his.
- [ASSUMED]: that the official "可部署" excludes the other half of a shared field (the level files mark both halves
buildable; no player deploys on the other's).
- Golden: 1 scenario — fields hidden-boss_9-solo (his first cast landed on the right half). Tests:
`test/sim/feedback5-ulpia-own-board.test.js`; `test/sim/facing-invariance.test.js` counts every tile of its open field
as the player's own (a board-position rule, like the deployment order it already avoids).
#### 25.17.3 「乌尔比安3技能期间死亡会留在3技能位移后的位置复活,应回到初始部署位复活」 (item 28): the sources say where he fell — a question for the owner, no change
- **Checked**: knocked out during S3 he lies on the landing tile and comes back there — the rule of every operator moved
off its board tile since 0.1.1 (§21.24, `Battle._layBody`): PRTS 卫戍协议/帮助 「原地留下一个“倒地干员”…自动部署至该位置」,
whose one exception (「若干员被击倒的位置为其他干员或召唤物的初始位置,则…尝试返回其自身的初始位置」) does not apply to his
landing tile. PRTS 乌尔比安 S3 备注 ④ (the 【返回】 at the skill's end) says nothing of a knock-out, and the client's S3
templates (`ulpia_s3_*`: the 【移动】 respawn clips and flags) carry no other rule. With §25.17.2 he can no longer fall
behind the red gate.
- **Question for the owner**: keep "where he fell" (the sources) or send him back to his deployment tile (the report)?
- Golden: unchanged.
#### 25.17.4 「退行的潮涌者的攻击无法触发菲莱2技能的受击反击(排查其他类似技能的干员)」 (item 30): the 「受到攻击时」 counters answer every damage instance from an enemy — `kits/shared/tier1.js byEnemyAttack`, `kits/ops/chess_char_3_06-philae.js` and the kits below
- **Seen**: the report's 退行的潮涌者 is the 巢涌者 (深溟 / 富营养的巢涌者 in this mode): no normal attack, its talent hurts
every operator in range once a second — and 菲莱 S2 never answered it (measured: 0 blasts).
- **Official** (ArknightsGameData buff_template_data): the pulse is an AdvancedApplyDamage with the enemy as its source
(`enemy_dsubrl_aoe[aura]`); the counters fire on ON_TAKE_DAMAGE — `philae_s_2` with no filter at all, and on a source of
the other side `inverse_damage` (星熊 S2, from its skill prefab), `inverse_damage[magic]` + `nian_s_2` (年 S2),
`bubble_s_2` / `bubble_t_1` (泡泡 S2, 尖刺盾), `vendla_s_2` (刺玫 S2), `yu_s_1[inverse_damage]` (余 S1), `hsgma2_s_1` /
`hsgma2_e_003_tr_take` (斩业星熊 S1, AST-X), `mlynar_t_2[inverse]` (玛恩纳 无动于衷). 棘刺 S2 (a 普通伤害 filter) and 信仰搅拌机
S3 (any damage) were already right.
- **Cause**: those kits required `dmg.isAttack`.
- **Now**: `byEnemyAttack` = any damage instance from an enemy but a 流失 (PRTS 作战机制: 流失 triggers no 受击 events), an
element 损伤, 无来源 damage or another counter / reflection (tags `counter` / `reflect`, no ping-pong); 菲莱 S2 takes any
instance but a 流失 or a counter. `test/content/op_nian.test.js` pinned "a non-attack hit returns nothing" for 年 S2 —
updated on purpose.
- [ASSUMED]: a hit fully absorbed by a shield still counts (ON_TAKE_DAMAGE fires on the damage instance); a dodged one does not.
- Found on the way, not changed: the pulse is `_ignoreForSp` officially (no 受击回复 SP, so it should not set off 雷蛇's
talent either) and still gives SP here; `content/generic.js`'s parsed counter still takes attacks only (no unit uses it).
- Golden: 19 scenarios where an enemy's non-attack damage reached one of these operators — roster-002 / 005 / 008 / 010 /
012 / 016 / 033 / 044; bond-lateranoShip-low; fields boss-boss_2-solo, boss-boss_4-pair / -solo, hidden-boss_8-pair /
-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`
- **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 宴, 缄默德克萨斯,
斯卡蒂, 耀骑士临光, 伊内丝).
- **Official**: PRTS 盟约记录 备注 — 「复活」 is 退场 + a 0-time / 0-cost redeploy, a new deployment, after which a deploy-timed
skill runs again; a 突袭 member counts that running window as 技能就绪 (`raidPoll`, GitHub #49 / #109).
- **Cause**: the remake revives in place (a `fatal` hook, §21.21): her window, over by then, stayed over and only the idle
trigger was left.
- **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.
- 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).
#### 25.17.6 「干员银灰的普通攻击的音效错误的使用了3技能期间的攻击音效」 (item 54): an operator whose default mode is the unsuffixed ability never takes a skill mode's sound — `tools/assets/audio.mjs pickUnitSfx`, data/assets.json
- **Seen**: 银灰's normal attack swung with p_atk_silver_n and hit with p_imp_sword_n.
- **Official** (audio_data, the local client's charpack): his normal attack is the Default mode's Combat — impact
`ON_ABILITY_HIT.char_172_svrash.combat` p_imp_spear_n, no swing bank; `.attack.2` (silver swing, sword impact) is his S3
mode, `.attack.1` his S2 mode.
- **Cause**: the picker's skill-mode test is by file name (`_d` / `_h` / `_s`), and those files end in `_n`.
- **Now**: an operator with a plain attack / combat bank (its default mode is the unsuffixed ability) never takes a
numbered variant; those that number their default mode (`attack.0` …) keep the order. Of the 209 operators it changes
4: 银灰, 雷蛇 (S2's lightning impact), 初雪 (her S1-2 mode's impact), 圣约送葬人 (S3_End's impact). data/assets.json was
regenerated offline (`fetch-assets --offline --add-only --allow-shrink`; JSON compare: those 4 entries, the hash and
stats). 银灰's official impact file was not on disk yet, so his entry stayed empty in the stream; at the merge one online
`node tools/fetch-assets.mjs --add-only` downloaded p_imp_spear_n.mp3 (8.8 KB, the only new file) and the manifest lists
his impact again (JSON compare with the stream's manifest: `char_172_svrash.hit`, the hash and stats).
- Golden: unchanged. Tests: `test/feedback5-operator-sfx.test.js`. Docs: docs/ASSETS.md.
#### 25.17.7 Already answered or not a bug: 铃兰's trigger, 琳琅诗怀雅's champagne, the 突袭 玛恩纳, 归溟幽灵鲨 devoured, 荒芜拉普兰德 and 叙拉古 (items 2, 17, 16.1, 16.4, 46) — no change
- **Item 2** 「敌人在干员…铃兰技能范围内没有开技能,在攻击范围才开」: her default S3 狐火渺然 (「攻击范围扩大」, no class or charId
row) was DEFAULT up to v0.1.4 — an enemy in her own 2-tile range; 0.2.0's ACTIVE_RANGE (§25.5, `resolveTrigger`) casts
it with an enemy in its running range y-8 (3 tiles ahead), as for 忍冬 (§25.14.2). data/chess.json already says so.
- **Item 17** 「琳琅诗怀雅的2技能的香槟只会在攻击范围内生成」: fixed by 0.2.0 WC (GitHub #116 item 2, §25.6): S2 “见面礼” throws
on the placeable, walkable ground tiles of range x-6 — her tile and two tiles up / down / left / right (PRTS 备注
「香槟炸弹放置范围:x-6」), onto an enemy's tile when one stands there. Pinned by `test/content/kits_t3.test.js`.
- **Item 16.1** 「突袭转职玛恩纳触发突袭的频率低很多…攻击范围里有怪的时候即使长时间没攻击也不会突袭」: the bond text itself —
「干员10秒内未进行攻击或技能就绪时,若范围内没有敌人」. A 解放者 never attacks with his skill off, so his 10 s are always met,
and an enemy in his range (one he does not block keeps walking through it) is what holds the jump, as for every member.
Should the owner have footage of the official game jumping with an enemy in range, that would be a new rule.
- **Item 16.4** 「归鲨被吃的时候不是变替身而是进了再部署」: not reproduced — an 阿戈尔 devour mark switches her to her 替身 on
normal, 联防 and boss fields; a sweep of 400 random chains (241 marked, 201 lethal) on this tree and on v0.1.2–v0.1.4:
never a knock-out. A player who does not own her fields her 补位 stand-in Sharp (近卫-无畏者, no 替身).
- **Item 46** 「荒芜拉普兰德开技能之后好像没有普攻了…叙拉古恐惧概率不高」: during her default S3 every drone is out chasing the
enemies nearest to it (PRTS 技能流程), so she makes no attack of her own — the drones hit — and her attacks come back
when it ends (measured). 叙拉古 6's true damage + fear is PRTS's rule: 0.139 % per 普通伤害 attempt, +0.139 % per miss,
a counter shared by the player's members (3 % on average; measured 3.0 %).
- Golden: unchanged. Pinned: `test/sim/feedback5-cb3-pins.test.js` (items 2, 16.1, 16.4, 46).
### 25.18 Community reports of 2026-10-06, stream CB4: enemies, bosses, waves, movement — `sim/battle/players.js onOwnBoard`, `content/bonds/addon/battle.js raidTile`, `content/enemies/archetypes.js kitPolluted`, `content/enemies/special.js kitRush`, `targeting.js canTargetAlly`
The owner's second collection of community reports (2026-10-06/07) was split over five streams; CB4 took the items about