diff --git a/docs/design/network.md b/docs/design/network.md index a24aea7a..0832bb9d 100644 --- a/docs/design/network.md +++ b/docs/design/network.md @@ -23,7 +23,7 @@ S→C: - NOTE: game time in `b.snap`/`b.ev` is carried as **`gt`** (the frame's `t` is the message type). - Active finite zero-SP timed skills display `sp=timeLeft`, `spMax=duration` and `UF.SKILL`; after end they display `0/0`. Snapshot display capacity does not change runtime SP/cost. -- `b.snap` — `{ fieldId, gt, units: [[id, x, y, hp, maxHp, sp, spMax, flags, anim]] , dp, killed, total, down?, elem? }` 20 Hz. Optional, only when non-empty (§18.3): `down: [[id, respawnAt (game s), respawnTime (s), state, row, col]]` — knocked-out operators waiting to redeploy, `state` 0 counting | 1 timer done, waiting for DP | 2 timer done, its tile taken — a safeguard, no ally deploys there (sim/constants.js `DOWN_STATE`); `row, col` = the tile it lies on and comes back on (§21.24); `elem: [[id, element, fill, cooldownEnd (game s), cooldown (s)]]` — the one gauge a unit shows: the fullest (ties by the official element id 神经 < 侵蚀 < 灼燃 < 凋亡), fill with 2 decimals rounded DOWN and kept at 0.01–0.99 outside a burst (§20.8); during a 爆发冷却 the bursting element with fill 1 and the cooldown numbers (else 0, 0) +- `b.snap` — `{ fieldId, gt, units: [[id, x, y, hp, maxHp, sp, spMax, flags, anim]] , dp, killed, total, down?, elem? }` 20 Hz (a countdown summon's `hp` is maxHp × the share of its life left, §25.16.5). Optional, only when non-empty (§18.3): `down: [[id, respawnAt (game s), respawnTime (s), state, row, col]]` — knocked-out operators waiting to redeploy, `state` 0 counting | 1 timer done, waiting for DP | 2 timer done, its tile taken — a safeguard, no ally deploys there (sim/constants.js `DOWN_STATE`); `row, col` = the tile it lies on and comes back on (§21.24); `elem: [[id, element, fill, cooldownEnd (game s), cooldown (s)]]` — the one gauge a unit shows: the fullest (ties by the official element id 神经 < 侵蚀 < 灼燃 < 凋亡), fill with 2 decimals rounded DOWN and kept at 0.01–0.99 outside a burst (§20.8); during a 爆发冷却 the bursting element with fill 1 and the cooldown numbers (else 0, 0) - `b.ev` — `{ fieldId, ev: [ ... ] }` event tuples: `['spawn', UnitInfo]`, `['atk', srcId, tgtId, projKind]`, `['dmg', tgtId, amount, type]`, `['heal', tgtId, amount]`, `['skill', id, on:0|1]`, `['die', id, reason]` (reason `'killed'`, `'retreat'`, `'expired'` …; only `'killed'` plays an operator's knock-down sound), `['status', id, key, on]`, `['fx', kind, x, y, extra]` (`'hitCap' {id, n}` = a cancelled 限伤 hit, drawn as nothing, §20.12; `extra.form` = the unit's model form from then on (an enemy's mode, a 傀儡师's 替身 §22.11) — `shared/protocol.js fxForm`, state like a spawn: never dropped by the client, §21.4), `['layer', playerId, bondId, n]`, `['bounty', playerId, coins]`, `['deploy', id]` - `m.toast {kind, text}` · `m.ticker {text, id, type, priority, playerId}` (the strip plays the highest priority first, §21.10) · `m.emote {playerId, id}` · `m.result {...}` - `m.unitStats {seq, round, units: [unitStatsEntry]}` — the answer to `g.unitStats` (`seq` echoed): every own board operator / summon by uid with `{id, uid, defId, hp, alive, maxHp, atk, def, res, interval, blockCnt, moveSpeed, range?, base: {…same}}` (shared/protocol.js `unitStatsEntry`; `range` = an ally's live range grid, facing RIGHT, never a target-selection grid, §21.16) as its next battle starts (§18.5) diff --git a/docs/history/0.2.0.md b/docs/history/0.2.0.md index ce61c9d8..fb1dd1e2 100644 --- a/docs/history/0.2.0.md +++ b/docs/history/0.2.0.md @@ -25,7 +25,10 @@ settled (泥岩's 闭锁; 忍冬, 深靛, 阿) → §25.11; release packaging an with no Spine model) → §25.12; round 18 — 拟态物质 at the copy cap (GitHub #207), 华法琳's 7 / 14 (GitHub #175, PR #192), a merged elite 拉普兰德 as a new one (GitHub #169), the leader pool per player alive (PR #209), the flying lift and two model quirks (PR #211) → §25.13; the community reports of 2026-10-06 (the 孤岛风云 prisoners drawn freed, 忍冬's trigger, a -bounty burned to death by the 活性源石, 枯朽之种 paying a bounty) → §25.14. +bounty burned to death by the 活性源石, 枯朽之种 paying a bounty) → §25.14; the second batch of community reports of +2026-10-06, 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. 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); @@ -1062,3 +1065,99 @@ 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.16 Community reports of 2026-10-06, stream CB2: healers, summons, timers — `kits/ops/chess_char_1_06-vendla.js`, `chess_char_3_04-swire2.js`, `chess_char_2_02-silent.js`, `content/tokens.js COUNTDOWN_SUMMONS / startCountdown`, `sim/snapshot.js unitTuple`, `render/fx/zones.js zoneAlpha` + +The owner's second collection of community reports (2026-10-06/07) was split over five streams; CB2 took the healers, +the summons and the timers (items 11, 12, 13, 14, 18, 26, 31, 32, 33, 34 of the list). Each was reproduced on the 0.2.0 +tree with a script first (on the v0.1.4 sources too where the report could be older), then checked against the official +data — the local client's battle prefabs (charpack, token and skill prefabs, projectiles; abnormal flag ids per PRTS 异常 +效果: 5 无敌, 7 禁疗), ArknightsGameData's buff templates, skill_table / character_table, PRTS (备注 included) — and the +earlier decisions. Six were real and are fixed, one commit each with its golden scenarios named; four are answered with +the evidence. + +#### 25.16.1 「刺玫开技能(装备源石药剂)之后不能治疗」 (item 12): only the S2 counter's trait heal goes to her protégé — `kits/ops/chess_char_1_06-vendla.js` + +- **Seen**: during 荆藤庇荫 every trait heal went to the protégé, usually at full HP — a 源石溶剂 carrier drained from 1017 to + 297 HP over the skill with all eight heals spent on a 9000 / 9000 ally. +- **Official**: 「该角色受到攻击时刺玫对目标造成攻击力20%的法术伤害并仅对该角色触发刺玫特性」 (en "…and activates her Trait on the + ally"); the client buff `vendla_tr` heals through the selector S2TraitHealRange (the `vendla_s_2` holder) only for a + damage whose modifier carries the key `vendla_s_2` — the counter, `vendla_s_2[extra_damage]` — else through + TraitHealRange (`_excludeOwner` 0, 禁疗 excluded). +- **Now**: the counter's damage names the protégé (`traitAlly`); every other damage she deals heals the lowest-HP ally of + her range, herself included, skill running or not. +- Golden: roster-001 / 002, bond-deputShip-low / -high, bond-suntShip-high, bond-victoriaShip-low / -high, the bot matches + solo-FUNNY-2, coop2-NORMAL-3, coop3-ABYSS-5, coop4-FUNNY-6, coop4-ABYSS-7. Tests: + `test/content/feedback5-vendla-heal.test.js`. + +#### 25.16.2 「琳琅诗怀雅不会治疗自己」 (item 18): S1 仗义疏财 heals her own tile too — `kits/ops/chess_char_3_04-swire2.js` + +- **Official**: the client charpack (char_1033_swire2, mode S1, ability HealAlly) selects with range x-4 — the 3×3 with her + own tile —, ally side, `_excludeOwner` 0, max HP ratio 0.7, one target. **Cause**: the kit skipped her and kept + Chebyshev distance 1 only. **Now**: the lowest HP ratio below 70 % of the 3×3, herself included (her own 禁疗 still + stops it); the owner's cadence of 2026-10-04 is unchanged. +- Golden: roster-027. Tests: `test/content/feedback5-swire2-self-heal.test.js`. + +#### 25.16.3 「进入联防阶段琳琅诗怀雅所需的复活费用应该重置,正常对局中死亡之后再部署复活费用也应该重置」 (item 33): 破财消灾 restarts at 5 DP with every deployment — `kits/ops/chess_char_3_04-swire2.js` + +- **Official**: PRTS 破财消灾 备注 「再部署时重置本天赋费用消耗」; the client buff `swire2_t_2` doubles the `cost` of its own + blackboard, rebuilt when she is deployed. **Cause**: the kit kept its save count for the whole battle (5 → 10 → 20 across + a redeploy). **Now**: reset at each of her deployments (battle start, redeploy, 突袭 再部署); a 联防 field is a battle of + its own, so it always started at 5 (pinned). +- Golden: roster-008 (a cheaper save after a redeploy), roster-049 (snapshots only). Tests: + `test/content/feedback5-swire2-revive-cost.test.js`. + +#### 25.16.4 「赫默的无人机在2技能好了之后应该秒放」 (item 34): S2 医疗无人机 casts at full SP — `kits/ops/chess_char_2_02-silent.js` + +- **Seen**: S2 full at 26 s and no cast while nobody was hurt; the drone came only once an ally in her range was injured. +- **Official**: the client skill `skchr_silent_2` (AUTO) has no `_trigger`, `_allowNoTarget` 1, `_checkHasTargetBeforeDoCast` + 0 and a RechargeToken action — no cast condition; `_stopSpWhenTokenIsFull` 1 = PRTS S2 备注 「库存达到上限后赫默获得阻回, + 直到库存被消耗为止」. +- **Now**: trigger SP_FULL — the placed drone takes its tile the moment S2 is ready; 阻回 (`noSp`) while her stock is full. +- Golden: roster-003 / 005, bond-visiShip-low / -high. Tests: `test/content/feedback5-silent-drone.test.js`. + +#### 25.16.5 「赫默的无人机、浊心斯卡蒂的海嗣等这种召唤物不会受到外来伤害(包括源石地板),也不会被干员治疗,血量随时间减少」 (item 26): the countdown summons — `content/tokens.js COUNTDOWN_SUMMONS / startCountdown`, `sim/snapshot.js unitTuple`, `sim/units.js` (`countdown`), the kits of 浊心斯卡蒂, 温蒂, 莱伊, 鸿雪, 酒神 + +- **Seen**: a 海嗣 on 活性源石 lost 70 of its 100 HP every second; a hurt drone drew every medic's heals and the 吟游者 + regeneration; their bars were plain HP. +- **Official / sources**: PRTS 斯卡蒂的海嗣 备注 「持有禁疗、无敌」; the token prefabs give 海嗣 and 沙地兽 the abnormal flags 5 + + 7, 工程蓄水炮 7; their lives are suicide buffs (`suicide_after_buff`, the drone's `skcom_withdraw`). The report describes + the official mode: no outside damage, no heal, a bar that runs down like a timer and the summon gone when it is empty. +- **Now**: the summons that "不会受到攻击" and leave after a fixed time — 医疗探机 (10 s), 诅咒娃娃 (15 s), 斯卡蒂的海嗣 (25 / 30 + s) and the 自选 工程蓄水炮 (20 s), 沙地兽 (25 s), “打字机” (25 s), 本能的召唤 (10 s) — hold 无敌 + 禁疗 from each deployment + (`startCountdown`, called where each lifetime is scheduled) and the snapshot's hp is maxHp × the share of the life left + (`unit.countdown`). The sim HP stays full, so no selector sees a low-HP summon. Summons that block and are attacked + (沙之碑, 战术装备, “小自在”, 结构性原理, 狼群 …) keep real HP. +- [ASSUMED]: 无敌 + 禁疗 for the four whose base prefabs carry no flag (医疗探机, 诅咒娃娃, “打字机”, 本能的召唤), and the bar as + a display of the time left — from the report; no HP-drain node exists in the client data. +- Golden: snapshot hashes only (the bar): roster-003 / 016 / 018 / 035 / 045 / 046, bond-visiShip-low / -high, + boss-boss_1 / 3 / 5 / 7-pair, unite-1; gameplay too: roster-005 (medics no longer heal the drone), roster-037 and + hidden-boss_9-pair (a 海嗣 / drone under damage stays up). Tests: `test/sim/feedback5-countdown-summons.test.js`. Docs: + docs/SIM.md (token pieces), docs/PLAYING.md. + +#### 25.16.6 「炼金师分支干员的炼金单元等范围持续性技能特效太亮(尤其是多层叠加以后)」 (item 14): stacked areas stay readable — `render/fx/zones.js zone / zoneAlpha`, `render/fx/simfx.js`, `kits/ops/chess_char_5_15-thorn2.js` + +- **Cause**: 引星棘刺 S2's drifting unit was re-sent every second and drawn as a new additive zone for the rest of its life — + up to twelve layers on one spot; overlapping units (锡人's charges, several alchemists) added up the same way. +- **Now**: the fx carries `key` and the client moves / resizes that one zone; a persistent area (> 3 real s) is drawn at + 0.16 / 0.5 (disc / edge) and ÷ √n among the n persistent areas overlapping it; short bursts and telegraphs unchanged. +- Golden: unchanged. Tests: `test/render/feedback5-zone-stack.test.js` (node; no browser suite draws zones). + +#### 25.16.7 Answered with the evidence: items 11, 13, 31, 32 — no change + +- **11 「链愈师…只能从周身8格里的干员开始,最远不会跳出攻击范围,…即使后续跳跃干员满血也会按照规则顺序跳跃」**: the x-4 jump + around the last one healed and full-HP allies jumped in order are 0.2.0's WE1 (§25.7.6; on v0.1.4 a full-HP ally was + never jumped). The main target is the lowest-HP ally of the whole attack range y-2 (PRTS 分支特性信息), and the client's + chain selector (`projectile_chr_papyrs`: `_rangeId` x-4 around the hit, `_maxTarget` 3) has no attack-range bound, so a + jump may leave the range — not implemented. +- **13 「有的持续造成伤害类的技能无伤害(如炼金师分支干员的炼金单元)」**: not reproduced — every DoT skill of the pool and of + the 自选 operators deals damage once its condition is met (a sweep with two layouts; on two real stages 锡人 S1 / S2 and + 引星棘刺 S2 / S3 deal 13 000–134 000, the same on v0.1.4). The only zero is the hidden 锡人 record chess_char_1_16 (never + in the shop) whose kit lacks S1. The stacked, over-bright zones (item 14) are the likely cause of the impression. +- **31 「伺夜的召唤物随时间增长的狼影最高能叠三只(即在新的狼影恢复前能受到三次致命伤害才死亡)」**: what the sim does (kit pack + and placed piece, this tree and v0.1.4): 2 狼影 at deployment, 3 after 25 s, lethal hits 3 → 2 → 1 at full HP, the third + into the 战术点形态 — PRTS 狼群 备注. Pinned by `test/content/tokens_devices.test.js`, `kits_alt_t3.test.js`. +- **32 「吟游者的特性能恢复战术家的召唤物、不屈者分支干员的血量…(但赫默的无人机、浊心斯卡蒂的海嗣这种的血量不可以恢复)」**: the + trait is 生命回复速度, which 禁疗 and 无法被友方治疗 do not stop (§25.6.8): 狼群 440 → 532 and 斥罪 1480 → 1618 HP in 3 s + under 魔王 (pinned by `test/content/feedback5-regen.test.js`); 孤立 units stay out (PRTS 孤立). The countdown summons + cannot be refilled since §25.16.5.